@satoshai/kit 0.3.1 → 0.4.0

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/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { WalletConnect, setSelectedProviderId, request, getSelectedProvider, clearSelectedProviderId } from '@stacks/connect';
1
+ import { WalletConnect, DEFAULT_PROVIDERS, WALLET_CONNECT_PROVIDER, clearSelectedProviderId, request, getSelectedProviderId, getSelectedProvider, setSelectedProviderId } from '@stacks/connect';
2
2
  import { createContext, useState, useRef, useEffect, useCallback, useMemo, useContext } from 'react';
3
3
  import { jsx } from 'react/jsx-runtime';
4
4
  import { PostConditionMode, postConditionToHex, cvToHex } from '@stacks/transactions';
@@ -8,10 +8,17 @@ import { getPrimaryName } from 'bns-v2-sdk';
8
8
  var STACKS_TO_STACKS_CONNECT_PROVIDERS = {
9
9
  xverse: "XverseProviders.BitcoinProvider",
10
10
  leather: "LeatherProvider",
11
+ okx: "OkxStacksProvider",
11
12
  asigna: "AsignaProvider",
12
13
  fordefi: "FordefiProviders.UtxoProvider",
13
14
  "wallet-connect": "WalletConnectProvider"
14
15
  };
16
+ var STACKS_CONNECT_TO_STACKS_PROVIDERS = Object.fromEntries(
17
+ Object.entries(STACKS_TO_STACKS_CONNECT_PROVIDERS).map(([kit, connect]) => [
18
+ connect,
19
+ kit
20
+ ])
21
+ );
15
22
 
16
23
  // src/constants/storage-keys.ts
17
24
  var LOCAL_STORAGE_STACKS = "@satoshai/kit";
@@ -20,10 +27,10 @@ var LOCAL_STORAGE_STACKS = "@satoshai/kit";
20
27
  var SUPPORTED_STACKS_WALLETS = [
21
28
  "xverse",
22
29
  "leather",
23
- "okx",
24
30
  "asigna",
25
31
  "fordefi",
26
- "wallet-connect"
32
+ "wallet-connect",
33
+ "okx"
27
34
  ];
28
35
 
29
36
  // src/utils/get-stacks-wallets.ts
@@ -35,7 +42,7 @@ var getStacksWallets = () => {
35
42
  return { supported, installed };
36
43
  };
37
44
  var checkIfStacksProviderIsInstalled = (wallet) => {
38
- if (typeof window === "undefined") return true;
45
+ if (typeof window === "undefined") return wallet === "wallet-connect";
39
46
  switch (wallet) {
40
47
  case "xverse":
41
48
  return !!window.XverseProviders;
@@ -90,6 +97,38 @@ var getOKXStacksAddress = async () => {
90
97
  provider: "okx"
91
98
  };
92
99
  };
100
+ var OKX_PROVIDER_META = {
101
+ id: "OkxStacksProvider",
102
+ name: "OKX Wallet",
103
+ icon: "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiICAgICB4bWxuczp4b2RtPSJodHRwOi8vd3d3LmNvcmVsLmNvbS9jb3JlbGRyYXcvb2RtLzIwMDMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjUwMCAyNTAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNTAwIDI1MDA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgIC5zdDB7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7fQogICAgLnN0MXtmaWxsOiNGRkZGRkY7fQo8L3N0eWxlPgo8ZyBpZD0iTGF5ZXJfeDAwMjBfMSI+CiAgICA8ZyBpZD0iXzIxODczODEzMjM4NTYiPgogICAgICAgIDxyZWN0IHk9IjAiIGNsYXNzPSJzdDAiIHdpZHRoPSIyNTAwIiBoZWlnaHQ9IjI1MDAiPjwvcmVjdD4KICAgICAgICA8Zz4KICAgICAgICAgICAgPHBhdGggY2xhc3M9InN0MSIgZD0iTTE0NjMsMTAxNWgtNDA0Yy0xNywwLTMxLDE0LTMxLDMxdjQwNGMwLDE3LDE0LDMxLDMxLDMxaDQwNGMxNywwLDMxLTE0LDMxLTMxdi00MDQgICAgIEMxNDk0LDEwMjksMTQ4MCwxMDE1LDE0NjMsMTAxNXoiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggY2xhc3M9InN0MSIgZD0iTTk5Niw1NDlINTkyYy0xNywwLTMxLDE0LTMxLDMxdjQwNGMwLDE3LDE0LDMxLDMxLDMxaDQwNGMxNywwLDMxLTE0LDMxLTMxVjU4MEMxMDI3LDU2MywxMDEzLDU0OSw5OTYsNTQ5eiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBjbGFzcz0ic3QxIiBkPSJNMTkzMCw1NDloLTQwNGMtMTcsMC0zMSwxNC0zMSwzMXY0MDRjMCwxNywxNCwzMSwzMSwzMWg0MDRjMTcsMCwzMS0xNCwzMS0zMVY1ODAgICAgIEMxOTYxLDU2MywxOTQ3LDU0OSwxOTMwLDU0OXoiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggY2xhc3M9InN0MSIgZD0iTTk5NiwxNDgySDU5MmMtMTcsMC0zMSwxNC0zMSwzMXY0MDRjMCwxNywxNCwzMSwzMSwzMWg0MDRjMTcsMCwzMS0xNCwzMS0zMXYtNDA0ICAgICBDMTAyNywxNDk2LDEwMTMsMTQ4Miw5OTYsMTQ4MnoiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggY2xhc3M9InN0MSIgZD0iTTE5MzAsMTQ4MmgtNDA0Yy0xNywwLTMxLDE0LTMxLDMxdjQwNGMwLDE3LDE0LDMxLDMxLDMxaDQwNGMxNywwLDMxLTE0LDMxLTMxdi00MDQgICAgIEMxOTYxLDE0OTYsMTk0NywxNDgyLDE5MzAsMTQ4MnoiPjwvcGF0aD4KICAgICAgICA8L2c+CiAgICA8L2c+CjwvZz4KPC9zdmc+",
104
+ webUrl: "https://www.okx.com/"
105
+ };
106
+ var registerOkxProvider = () => {
107
+ if (typeof window === "undefined") return;
108
+ if (!window.OkxStacksProvider) {
109
+ window.OkxStacksProvider = {
110
+ request: async (method) => {
111
+ if (method === "getAddresses") {
112
+ const data = await getOKXStacksAddress();
113
+ return {
114
+ result: {
115
+ addresses: [
116
+ { address: data.address, symbol: "STX" }
117
+ ]
118
+ }
119
+ };
120
+ }
121
+ throw new Error(
122
+ `OKX adapter: unsupported method "${method}". Use connect('okx') for direct OKX SDK access.`
123
+ );
124
+ }
125
+ };
126
+ }
127
+ };
128
+ var unregisterOkxProvider = () => {
129
+ if (typeof window === "undefined") return;
130
+ delete window.OkxStacksProvider;
131
+ };
93
132
  var extractStacksAddress = (typedProvider, addresses) => {
94
133
  if (!addresses.length) {
95
134
  throw new Error(`No addresses provided for ${typedProvider} wallet`);
@@ -221,12 +260,21 @@ var getLocalStorageWallet = () => {
221
260
  return null;
222
261
  }
223
262
  };
263
+ var PROVIDER_META_BY_KIT_ID = Object.fromEntries(
264
+ [...DEFAULT_PROVIDERS, WALLET_CONNECT_PROVIDER, OKX_PROVIDER_META].map(
265
+ (p) => [
266
+ STACKS_CONNECT_TO_STACKS_PROVIDERS[p.id],
267
+ { name: p.name, icon: p.icon ?? "", webUrl: p.webUrl ?? "" }
268
+ ]
269
+ )
270
+ );
224
271
  var StacksWalletContext = createContext(
225
272
  void 0
226
273
  );
227
274
  var StacksWalletProvider = ({
228
275
  children,
229
276
  wallets,
277
+ connectModal = true,
230
278
  walletConnect,
231
279
  onConnect,
232
280
  onAddressChange,
@@ -237,14 +285,21 @@ var StacksWalletProvider = ({
237
285
  const [isConnecting, setIsConnecting] = useState(false);
238
286
  const connectGenRef = useRef(0);
239
287
  const wcInitRef = useRef(null);
288
+ const walletConnectRef = useRef(walletConnect);
289
+ walletConnectRef.current = walletConnect;
240
290
  const walletsKey = wallets?.join(",");
291
+ if (wallets?.includes("wallet-connect") && !walletConnect?.projectId) {
292
+ throw new Error(
293
+ 'StacksWalletProvider: "wallet-connect" is listed in wallets but no walletConnect.projectId was provided.'
294
+ );
295
+ }
241
296
  useEffect(() => {
242
- if (wallets?.includes("wallet-connect") && !walletConnect?.projectId) {
243
- throw new Error(
244
- 'StacksWalletProvider: "wallet-connect" is listed in wallets but no walletConnect.projectId was provided.'
245
- );
297
+ const okxConfigured = !wallets || wallets.includes("okx");
298
+ if (connectModal && okxConfigured) {
299
+ registerOkxProvider();
300
+ return () => unregisterOkxProvider();
246
301
  }
247
- }, [walletsKey, walletConnect?.projectId]);
302
+ }, [connectModal, walletsKey]);
248
303
  useEffect(() => {
249
304
  const loadPersistedWallet = async () => {
250
305
  const persisted = getLocalStorageWallet();
@@ -284,6 +339,65 @@ var StacksWalletProvider = ({
284
339
  }, [walletConnect?.projectId]);
285
340
  const connect = useCallback(
286
341
  async (providerId, options) => {
342
+ if (connectModal && !providerId) {
343
+ const gen2 = ++connectGenRef.current;
344
+ setIsConnecting(true);
345
+ try {
346
+ clearSelectedProviderId();
347
+ const requestOptions = {
348
+ forceWalletSelect: true,
349
+ // OKX at the end so it appears last among installed wallets
350
+ defaultProviders: [
351
+ ...DEFAULT_PROVIDERS,
352
+ OKX_PROVIDER_META
353
+ ]
354
+ };
355
+ if (wallets) {
356
+ requestOptions.approvedProviderIds = wallets.map(
357
+ (w) => STACKS_TO_STACKS_CONNECT_PROVIDERS[w]
358
+ );
359
+ }
360
+ const wc2 = walletConnectRef.current;
361
+ if (wc2?.projectId) {
362
+ requestOptions.walletConnect = buildWalletConnectConfig(
363
+ wc2.projectId,
364
+ wc2.metadata,
365
+ wc2.chains
366
+ );
367
+ }
368
+ const data = await request(
369
+ requestOptions,
370
+ "getAddresses",
371
+ {}
372
+ );
373
+ if (connectGenRef.current !== gen2) return;
374
+ const selectedId = getSelectedProviderId();
375
+ const resolvedProvider = selectedId ? STACKS_CONNECT_TO_STACKS_PROVIDERS[selectedId] : void 0;
376
+ if (!resolvedProvider) {
377
+ throw new Error(
378
+ `Unknown provider returned from @stacks/connect modal: ${selectedId ?? "none"}`
379
+ );
380
+ }
381
+ const extractedAddress = extractStacksAddress(
382
+ resolvedProvider,
383
+ data.addresses
384
+ );
385
+ setAddress(extractedAddress);
386
+ setProvider(resolvedProvider);
387
+ options?.onSuccess?.(extractedAddress, resolvedProvider);
388
+ } catch (error) {
389
+ if (connectGenRef.current !== gen2) return;
390
+ console.error("Failed to connect wallet:", error);
391
+ getSelectedProvider()?.disconnect?.();
392
+ clearSelectedProviderId();
393
+ options?.onError?.(error);
394
+ } finally {
395
+ if (connectGenRef.current === gen2) {
396
+ setIsConnecting(false);
397
+ }
398
+ }
399
+ return;
400
+ }
287
401
  const typedProvider = SUPPORTED_STACKS_WALLETS.find(
288
402
  (wallet) => wallet === providerId
289
403
  );
@@ -303,7 +417,8 @@ var StacksWalletProvider = ({
303
417
  options?.onError?.(error);
304
418
  return;
305
419
  }
306
- if (typedProvider === "wallet-connect" && !walletConnect?.projectId) {
420
+ const wc = walletConnectRef.current;
421
+ if (typedProvider === "wallet-connect" && !wc?.projectId) {
307
422
  const error = new Error(
308
423
  "WalletConnect requires a project ID. Please provide walletConnect.projectId to the StacksWalletProvider."
309
424
  );
@@ -325,10 +440,10 @@ var StacksWalletProvider = ({
325
440
  setSelectedProviderId(
326
441
  STACKS_TO_STACKS_CONNECT_PROVIDERS[typedProvider]
327
442
  );
328
- const wcConfig = typedProvider === "wallet-connect" && walletConnect ? buildWalletConnectConfig(
329
- walletConnect.projectId,
330
- walletConnect.metadata,
331
- walletConnect.chains
443
+ const wcConfig = typedProvider === "wallet-connect" && wc ? buildWalletConnectConfig(
444
+ wc.projectId,
445
+ wc.metadata,
446
+ wc.chains
332
447
  ) : void 0;
333
448
  if (wcConfig) {
334
449
  if (wcInitRef.current) await wcInitRef.current;
@@ -365,7 +480,7 @@ var StacksWalletProvider = ({
365
480
  }
366
481
  }
367
482
  },
368
- [walletConnect]
483
+ [connectModal, walletsKey]
369
484
  );
370
485
  const reset = useCallback(() => {
371
486
  connectGenRef.current++;
@@ -395,21 +510,29 @@ var StacksWalletProvider = ({
395
510
  if (!address || !provider || !onConnect) return;
396
511
  onConnect(provider, address);
397
512
  }, [address, provider, onConnect]);
398
- useXverse({
399
- address,
400
- provider,
401
- onAddressChange: (newAddress) => {
513
+ const handleAddressChange = useCallback(
514
+ (newAddress) => {
402
515
  setAddress(newAddress);
403
516
  onAddressChange?.(newAddress);
404
517
  },
518
+ [onAddressChange]
519
+ );
520
+ useXverse({
521
+ address,
522
+ provider,
523
+ onAddressChange: handleAddressChange,
405
524
  connect
406
525
  });
407
526
  const { installed } = getStacksWallets();
408
527
  const configured = wallets ?? [...SUPPORTED_STACKS_WALLETS];
409
528
  const walletInfos = configured.map((w) => ({
410
529
  id: w,
530
+ name: PROVIDER_META_BY_KIT_ID[w]?.name ?? w,
531
+ icon: PROVIDER_META_BY_KIT_ID[w]?.icon ?? "",
532
+ webUrl: PROVIDER_META_BY_KIT_ID[w]?.webUrl ?? "",
411
533
  available: w === "wallet-connect" ? !!walletConnect?.projectId : installed.includes(w)
412
534
  }));
535
+ const walletInfosKey = walletInfos.map((w) => `${w.id}:${w.available}`).join(",");
413
536
  const value = useMemo(() => {
414
537
  const walletState = isConnecting ? { status: "connecting", address: void 0, provider: void 0 } : address && provider ? { status: "connected", address, provider } : {
415
538
  status: "disconnected",
@@ -423,7 +546,7 @@ var StacksWalletProvider = ({
423
546
  reset,
424
547
  wallets: walletInfos
425
548
  };
426
- }, [address, provider, isConnecting, connect, disconnect, reset, walletInfos]);
549
+ }, [address, provider, isConnecting, connect, disconnect, reset, walletInfosKey]);
427
550
  return /* @__PURE__ */ jsx(StacksWalletContext.Provider, { value, children });
428
551
  };
429
552
  var useStacksWalletContext = () => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants/stacks-provider-mapping.ts","../src/constants/storage-keys.ts","../src/constants/wallets.ts","../src/utils/get-stacks-wallets.ts","../src/provider/stacks-wallet-provider.helpers.ts","../src/hooks/use-xverse/use-xverse.helpers.ts","../src/hooks/use-xverse/use-xverse.ts","../src/utils/get-local-storage-wallet.ts","../src/provider/stacks-wallet-provider.tsx","../src/hooks/use-address.ts","../src/hooks/use-connect.ts","../src/hooks/use-disconnect.ts","../src/hooks/use-sign-message.ts","../src/utils/get-network-from-address.ts","../src/hooks/use-write-contract/use-write-contract.helpers.ts","../src/hooks/use-write-contract/use-write-contract.ts","../src/hooks/use-bns-name.ts","../src/hooks/use-wallets.ts"],"names":["getSelectedProvider","useState","useEffect","WalletConnect","data","useMemo","useCallback","request","error","response"],"mappings":"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","file":"index.js","sourcesContent":["import type { SupportedStacksWallet } from \"./wallets\";\n\nexport const STACKS_TO_STACKS_CONNECT_PROVIDERS: Record<\n Exclude<SupportedStacksWallet, \"okx\">,\n | \"LeatherProvider\"\n | \"XverseProviders.BitcoinProvider\"\n | \"AsignaProvider\"\n | \"FordefiProviders.UtxoProvider\"\n | \"WalletConnectProvider\"\n> = {\n xverse: \"XverseProviders.BitcoinProvider\",\n leather: \"LeatherProvider\",\n asigna: \"AsignaProvider\",\n fordefi: \"FordefiProviders.UtxoProvider\",\n \"wallet-connect\": \"WalletConnectProvider\",\n};\n","export const LOCAL_STORAGE_STACKS = \"@satoshai/kit\";\n","export const SUPPORTED_STACKS_WALLETS = [\n \"xverse\",\n \"leather\",\n \"okx\",\n \"asigna\",\n \"fordefi\",\n \"wallet-connect\",\n] as const;\n\nexport type SupportedStacksWallet = (typeof SUPPORTED_STACKS_WALLETS)[number];\n","import {\n SUPPORTED_STACKS_WALLETS,\n type SupportedStacksWallet,\n} from '../constants/wallets';\n\nexport interface StacksWallets {\n supported: SupportedStacksWallet[];\n installed: SupportedStacksWallet[];\n}\n\nexport const getStacksWallets = (): StacksWallets => {\n const supported = [...SUPPORTED_STACKS_WALLETS];\n const installed = supported.filter((wallet) =>\n checkIfStacksProviderIsInstalled(wallet)\n );\n\n return { supported, installed };\n};\n\nexport const checkIfStacksProviderIsInstalled = (\n wallet: SupportedStacksWallet\n): boolean => {\n if (typeof window === 'undefined') return true;\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n switch (wallet) {\n case 'xverse':\n return !!(window as any).XverseProviders;\n case 'leather':\n return (\n !!(window as any).LeatherProvider ||\n !!(window as any).HiroWalletProvider\n );\n case 'asigna':\n return !!(window as any).AsignaProvider;\n case 'okx':\n return !!(window as any).okxwallet;\n case 'fordefi':\n return !!(window as any).FordefiProviders?.UtxoProvider;\n case 'wallet-connect':\n return true;\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n};\n","import type { SupportedStacksWallet } from '../constants/wallets';\nimport type {\n WalletConnectMetadata,\n StacksChain,\n} from './stacks-wallet-provider.types';\nimport { WalletConnect } from '@stacks/connect';\n\nconst STACKS_CHAIN_MAPPING = {\n mainnet: WalletConnect.Chains.Stacks.Mainnet,\n testnet: WalletConnect.Chains.Stacks.Testnet,\n} as const;\n\nexport const buildWalletConnectConfig = (\n projectId: string,\n metadata?: Partial<WalletConnectMetadata>,\n chains?: StacksChain[]\n): {\n projectId: string;\n metadata: WalletConnectMetadata;\n networks: (typeof WalletConnect.Networks.Stacks)[];\n} => {\n const selectedChains = chains ?? ['mainnet'];\n const walletConnectChains = selectedChains.map(\n (chain) => STACKS_CHAIN_MAPPING[chain]\n );\n\n return {\n projectId,\n metadata: {\n name: 'Universal Connector',\n description: 'Universal Connector',\n url: 'https://appkit.reown.com',\n icons: ['https://appkit.reown.com/icon.png'],\n ...metadata,\n },\n networks: [\n {\n ...WalletConnect.Networks.Stacks,\n chains: walletConnectChains,\n },\n ],\n };\n};\n\nexport const getOKXStacksAddress = async () => {\n if (!window.okxwallet) {\n throw new Error('🚨 OKX Wallet is not installed');\n }\n\n const stacksResponse = await window.okxwallet.stacks.connect();\n\n if (!stacksResponse) {\n throw new Error('🚨 Failed to connect with OKX Wallet');\n }\n\n return {\n address: stacksResponse.address,\n provider: 'okx' as const,\n };\n};\n\nexport const extractStacksAddress = (\n typedProvider: SupportedStacksWallet,\n addresses: { address?: string; symbol?: string }[]\n) => {\n if (!addresses.length) {\n throw new Error(`No addresses provided for ${typedProvider} wallet`);\n }\n\n if (typedProvider === 'leather' || typedProvider === 'asigna') {\n const stxAddress = addresses.find(\n (addr) => addr.symbol === 'STX'\n )?.address;\n\n if (stxAddress) return stxAddress;\n }\n\n const stacksAddress = addresses.find((addr) =>\n addr.address?.startsWith('S')\n )?.address;\n\n if (stacksAddress) return stacksAddress;\n\n const legacyAddress = addresses[2]?.address;\n\n if (legacyAddress?.startsWith('S')) return legacyAddress;\n\n throw new Error(\n `No valid Stacks address found for ${typedProvider} wallet`\n );\n};\n","import { getSelectedProvider } from '@stacks/connect';\n\nexport const getXverseProductInfo = async (): Promise<{\n version?: string;\n name?: string;\n} | null> =>\n (await window.XverseProviders?.StacksProvider?.getProductInfo?.()) ?? null;\n\nexport const shouldSupportAccountChange = (\n version: string | undefined\n): boolean => version !== undefined && version !== '1.0.0';\n\nexport const waitForXverseProvider = async (\n maxAttempts = 10,\n initialDelay = 200\n): Promise<boolean> => {\n for (let i = 0; i < maxAttempts; i++) {\n const provider = getSelectedProvider();\n\n if (provider?.request && provider?.addListener) return true;\n\n await new Promise((resolve) =>\n setTimeout(resolve, initialDelay * Math.min(i + 1, 5))\n );\n }\n\n return false;\n};\n\nexport const extractAndValidateStacksAddress = (\n addresses:\n | {\n address: string;\n addressType: string;\n purpose: string;\n }[]\n | undefined,\n currentAddress: string | undefined,\n onAddressChange: (address: string) => void,\n connect: () => Promise<void>\n) => {\n if (!addresses || !Array.isArray(addresses)) {\n void connect();\n return;\n }\n\n const stacksAccount = addresses.find(\n (acc) => acc.purpose === 'stacks' || acc.addressType === 'stacks'\n );\n\n if (!stacksAccount?.address) {\n void connect();\n return;\n }\n\n if (stacksAccount.address !== currentAddress) {\n onAddressChange(stacksAccount.address);\n }\n};\n","import { getSelectedProvider } from '@stacks/connect';\nimport { useEffect, useState } from 'react';\n\nimport type { SupportedStacksWallet } from '../../constants/wallets';\nimport type { ConnectOptions } from '../../provider/stacks-wallet-provider.types';\nimport type { XverseAccountChangeEvent } from './use-xverse.types';\nimport {\n extractAndValidateStacksAddress,\n getXverseProductInfo,\n shouldSupportAccountChange,\n waitForXverseProvider,\n} from './use-xverse.helpers';\n\nexport const useXverse = ({\n address,\n provider,\n onAddressChange,\n connect,\n}: {\n address: string | undefined;\n provider: SupportedStacksWallet | undefined;\n onAddressChange: (newAddress: string) => void;\n connect: (\n providerId: SupportedStacksWallet,\n options?: ConnectOptions\n ) => Promise<void>;\n}) => {\n const [isProviderReady, setIsProviderReady] = useState(false);\n\n useEffect(() => {\n if (provider !== 'xverse') return;\n\n const checkProvider = async () => {\n const ready = await waitForXverseProvider();\n\n setIsProviderReady(ready);\n\n if (!ready) {\n console.error('Xverse provider failed to initialize');\n }\n };\n\n void checkProvider();\n }, [provider]);\n\n useEffect(() => {\n if (provider !== 'xverse' || !address || !isProviderReady) return;\n\n let cancelled = false;\n let removeListener: (() => void) | undefined;\n\n const setupXverse = async () => {\n try {\n const productInfo = await getXverseProductInfo();\n\n if (cancelled) return;\n\n if (!shouldSupportAccountChange(productInfo?.version)) return;\n\n const response = await getSelectedProvider()?.request(\n 'wallet_connect',\n null\n );\n\n if (cancelled) return;\n\n extractAndValidateStacksAddress(\n response?.result?.addresses,\n address,\n onAddressChange,\n () => connect('xverse')\n );\n\n removeListener = getSelectedProvider()?.addListener(\n 'accountChange',\n (event: XverseAccountChangeEvent) => {\n extractAndValidateStacksAddress(\n event?.addresses,\n address,\n onAddressChange,\n () => connect('xverse')\n );\n }\n );\n } catch (error) {\n console.error('Failed to setup Xverse:', error);\n }\n };\n\n void setupXverse();\n\n return () => {\n cancelled = true;\n\n if (!removeListener) return;\n\n try {\n removeListener();\n } catch (error) {\n console.error('Failed to remove Xverse listener:', error);\n }\n };\n }, [address, isProviderReady, onAddressChange, connect, provider]);\n};\n","import { LOCAL_STORAGE_STACKS } from '../constants/storage-keys';\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { SUPPORTED_STACKS_WALLETS } from '../constants/wallets';\n\nexport const getLocalStorageWallet = (): {\n address: string;\n provider: SupportedStacksWallet;\n} | null => {\n if (typeof window === 'undefined') return null;\n\n const stored = localStorage.getItem(LOCAL_STORAGE_STACKS);\n\n if (!stored) return null;\n\n try {\n const data = JSON.parse(stored) as {\n address: string;\n provider: SupportedStacksWallet;\n };\n\n const isValid = SUPPORTED_STACKS_WALLETS.find(\n (wallet) => wallet === data.provider\n );\n\n return isValid ? data : null;\n } catch {\n return null;\n }\n};\n","'use client';\n\nimport {\n clearSelectedProviderId,\n setSelectedProviderId,\n request,\n getSelectedProvider,\n WalletConnect,\n} from '@stacks/connect';\nimport {\n createContext,\n useContext,\n useCallback,\n useEffect,\n useRef,\n useState,\n useMemo,\n} from 'react';\n\nimport { STACKS_TO_STACKS_CONNECT_PROVIDERS } from '../constants/stacks-provider-mapping';\nimport { LOCAL_STORAGE_STACKS } from '../constants/storage-keys';\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { SUPPORTED_STACKS_WALLETS } from '../constants/wallets';\nimport {\n checkIfStacksProviderIsInstalled,\n getStacksWallets,\n} from '../utils/get-stacks-wallets';\n\nimport {\n getOKXStacksAddress,\n extractStacksAddress,\n buildWalletConnectConfig,\n} from './stacks-wallet-provider.helpers';\nimport type {\n WalletContextValue,\n WalletState,\n ConnectOptions,\n StacksWalletProviderProps,\n} from './stacks-wallet-provider.types';\nimport { useXverse } from '../hooks/use-xverse/use-xverse';\nimport { getLocalStorageWallet } from '../utils/get-local-storage-wallet';\n\nconst StacksWalletContext = createContext<WalletContextValue | undefined>(\n undefined\n);\n\nexport const StacksWalletProvider = ({\n children,\n wallets,\n walletConnect,\n onConnect,\n onAddressChange,\n onDisconnect,\n}: StacksWalletProviderProps) => {\n const [address, setAddress] = useState<string | undefined>();\n const [provider, setProvider] = useState<\n SupportedStacksWallet | undefined\n >();\n const [isConnecting, setIsConnecting] = useState(false);\n\n // Generation counter — incremented by reset() to invalidate in-flight connect promises\n const connectGenRef = useRef(0);\n\n // Guard against concurrent WalletConnect.initializeProvider calls\n const wcInitRef = useRef<Promise<void> | null>(null);\n\n // Serialize wallets to a stable string for use as a dependency,\n // so inline arrays like wallets={['xverse', 'leather']} don't\n // invalidate memos on every render. (Fixes #5)\n const walletsKey = wallets?.join(',');\n\n // Fix #1: runtime guard in useEffect instead of render body\n useEffect(() => {\n if (wallets?.includes('wallet-connect') && !walletConnect?.projectId) {\n throw new Error(\n 'StacksWalletProvider: \"wallet-connect\" is listed in wallets but no walletConnect.projectId was provided.'\n );\n }\n }, [walletsKey, walletConnect?.projectId]);\n\n useEffect(() => {\n const loadPersistedWallet = async () => {\n const persisted = getLocalStorageWallet();\n\n if (!persisted) return;\n\n setIsConnecting(true);\n\n try {\n if (persisted.provider === 'okx') {\n const data = await getOKXStacksAddress();\n setAddress(data.address);\n setProvider(data.provider);\n return;\n }\n\n if (\n persisted.provider === 'wallet-connect' &&\n walletConnect?.projectId\n ) {\n const initPromise = WalletConnect.initializeProvider(\n buildWalletConnectConfig(\n walletConnect.projectId,\n walletConnect.metadata,\n walletConnect.chains\n )\n );\n wcInitRef.current = initPromise;\n await initPromise;\n wcInitRef.current = null;\n }\n\n setAddress(persisted.address);\n setProvider(persisted.provider);\n setSelectedProviderId(\n STACKS_TO_STACKS_CONNECT_PROVIDERS[persisted.provider]\n );\n } catch (error) {\n console.error('Failed to restore wallet connection:', error);\n } finally {\n setIsConnecting(false);\n }\n };\n\n void loadPersistedWallet();\n }, [walletConnect?.projectId]);\n\n const connect = useCallback(\n async (providerId: SupportedStacksWallet, options?: ConnectOptions) => {\n const typedProvider = SUPPORTED_STACKS_WALLETS.find(\n (wallet) => wallet === providerId\n );\n\n if (!typedProvider) {\n const error = new Error(\n 'The wallet provider selected is not supported!'\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n if (!checkIfStacksProviderIsInstalled(typedProvider)) {\n const error = new Error(\n `${typedProvider} wallet is not installed. Please install the wallet extension to continue.`\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n if (\n typedProvider === 'wallet-connect' &&\n !walletConnect?.projectId\n ) {\n const error = new Error(\n 'WalletConnect requires a project ID. Please provide walletConnect.projectId to the StacksWalletProvider.'\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n // Capture generation so we can detect if reset() was called during await\n const gen = ++connectGenRef.current;\n setIsConnecting(true);\n\n try {\n if (typedProvider === 'okx') {\n const data = await getOKXStacksAddress();\n if (connectGenRef.current !== gen) return;\n setAddress(data.address);\n setProvider(data.provider);\n options?.onSuccess?.(data.address, data.provider);\n return;\n }\n\n setSelectedProviderId(\n STACKS_TO_STACKS_CONNECT_PROVIDERS[typedProvider]\n );\n\n const wcConfig =\n typedProvider === 'wallet-connect' && walletConnect\n ? buildWalletConnectConfig(\n walletConnect.projectId,\n walletConnect.metadata,\n walletConnect.chains\n )\n : undefined;\n\n if (wcConfig) {\n // Wait for any in-flight init, then start ours\n if (wcInitRef.current) await wcInitRef.current;\n const initPromise =\n WalletConnect.initializeProvider(wcConfig);\n wcInitRef.current = initPromise;\n await initPromise;\n wcInitRef.current = null;\n }\n\n if (connectGenRef.current !== gen) return;\n\n const data = wcConfig\n ? await request(\n { walletConnect: wcConfig },\n 'getAddresses',\n {}\n )\n : await request('getAddresses');\n\n if (connectGenRef.current !== gen) return;\n\n const extractedAddress = extractStacksAddress(\n typedProvider,\n data.addresses\n );\n\n setAddress(extractedAddress);\n setProvider(typedProvider);\n options?.onSuccess?.(extractedAddress, typedProvider);\n } catch (error) {\n if (connectGenRef.current !== gen) return;\n console.error('Failed to connect wallet:', error);\n // OKX uses its own SDK and never calls setSelectedProviderId,\n // so getSelectedProvider() would return the previously connected\n // provider — disconnecting the wrong wallet.\n if (typedProvider !== 'okx') {\n getSelectedProvider()?.disconnect?.();\n clearSelectedProviderId();\n }\n options?.onError?.(error as Error);\n } finally {\n if (connectGenRef.current === gen) {\n setIsConnecting(false);\n }\n }\n },\n [walletConnect]\n );\n\n const reset = useCallback(() => {\n connectGenRef.current++;\n setIsConnecting(false);\n clearSelectedProviderId();\n }, []);\n\n const disconnect = useCallback(\n (callback?: () => void) => {\n localStorage.removeItem(LOCAL_STORAGE_STACKS);\n setAddress(undefined);\n setProvider(undefined);\n getSelectedProvider()?.disconnect?.();\n clearSelectedProviderId();\n callback?.();\n onDisconnect?.();\n },\n [onDisconnect]\n );\n\n useEffect(() => {\n if (!address || !provider) return;\n\n localStorage.setItem(\n LOCAL_STORAGE_STACKS,\n JSON.stringify({ address, provider })\n );\n }, [address, provider]);\n\n useEffect(() => {\n if (!address || !provider || !onConnect) return;\n\n onConnect(provider, address);\n }, [address, provider, onConnect]);\n\n useXverse({\n address,\n provider,\n onAddressChange: (newAddress: string) => {\n setAddress(newAddress);\n onAddressChange?.(newAddress);\n },\n connect,\n });\n\n const { installed } = getStacksWallets();\n const configured = wallets ?? [...SUPPORTED_STACKS_WALLETS];\n const walletInfos = configured.map((w) => ({\n id: w,\n available:\n w === 'wallet-connect'\n ? !!walletConnect?.projectId\n : installed.includes(w),\n }));\n\n const value = useMemo((): WalletContextValue => {\n const walletState: WalletState = isConnecting\n ? { status: 'connecting', address: undefined, provider: undefined }\n : address && provider\n ? { status: 'connected', address, provider }\n : {\n status: 'disconnected',\n address: undefined,\n provider: undefined,\n };\n\n return {\n ...walletState,\n connect,\n disconnect,\n reset,\n wallets: walletInfos,\n };\n }, [address, provider, isConnecting, connect, disconnect, reset, walletInfos]);\n\n return (\n <StacksWalletContext.Provider value={value}>\n {children}\n </StacksWalletContext.Provider>\n );\n};\n\nexport const useStacksWalletContext = () => {\n const context = useContext(StacksWalletContext);\n\n if (context === undefined) {\n throw new Error(\n '🚨 Stacks wallet hooks must be used within StacksWalletProvider'\n );\n }\n\n return context;\n};\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\ntype UseAddressReturn =\n | {\n address: undefined;\n isConnected: false;\n isConnecting: boolean;\n isDisconnected: boolean;\n provider: undefined;\n }\n | {\n address: string;\n isConnected: true;\n isConnecting: false;\n isDisconnected: false;\n provider: SupportedStacksWallet;\n };\n\nexport const useAddress = (): UseAddressReturn => {\n const { address, status, provider } = useStacksWalletContext();\n\n return useMemo(() => {\n if (status === 'connected' && address && provider) {\n return {\n address,\n isConnected: true as const,\n isConnecting: false as const,\n isDisconnected: false as const,\n provider,\n };\n }\n\n return {\n address: undefined,\n isConnected: false as const,\n isConnecting: status === 'connecting',\n isDisconnected: status === 'disconnected',\n provider: undefined,\n };\n }, [address, status, provider]);\n};\n","'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport type { ConnectOptions, MutationStatus } from '../provider/stacks-wallet-provider.types';\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\nexport const useConnect = () => {\n const {\n connect: contextConnect,\n reset: contextReset,\n status: walletStatus,\n } = useStacksWalletContext();\n\n const [error, setError] = useState<Error | null>(null);\n const [mutationStatus, setMutationStatus] =\n useState<MutationStatus>('idle');\n\n const connect = useCallback(\n async (\n providerId: SupportedStacksWallet,\n options?: ConnectOptions\n ) => {\n setError(null);\n setMutationStatus('pending');\n\n let settled = false;\n\n try {\n await contextConnect(providerId, {\n onSuccess: (address, provider) => {\n settled = true;\n setMutationStatus('success');\n options?.onSuccess?.(address, provider);\n },\n onError: (err) => {\n settled = true;\n setError(err);\n setMutationStatus('error');\n options?.onError?.(err);\n },\n });\n } finally {\n if (!settled) {\n // connect returned without calling onSuccess or onError\n // (e.g., cancelled by reset or stale generation)\n setMutationStatus('idle');\n }\n }\n },\n [contextConnect]\n );\n\n const reset = useCallback(() => {\n setError(null);\n setMutationStatus('idle');\n contextReset();\n }, [contextReset]);\n\n const value = useMemo(\n () => ({\n connect,\n reset,\n error,\n isError: mutationStatus === 'error',\n isIdle: mutationStatus === 'idle',\n isPending:\n mutationStatus === 'pending' ||\n walletStatus === 'connecting',\n isSuccess: mutationStatus === 'success',\n status: mutationStatus,\n }),\n [connect, reset, error, mutationStatus, walletStatus]\n );\n\n return value;\n};\n","'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { MutationStatus } from '../provider/stacks-wallet-provider.types';\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\nexport const useDisconnect = () => {\n const { disconnect: contextDisconnect } = useStacksWalletContext();\n\n const [error, setError] = useState<Error | null>(null);\n const [mutationStatus, setMutationStatus] =\n useState<MutationStatus>('idle');\n\n const disconnect = useCallback(\n (callback?: () => void) => {\n setError(null);\n\n try {\n contextDisconnect(callback);\n setMutationStatus('success');\n } catch (err) {\n const normalizedError =\n err instanceof Error ? err : new Error(String(err));\n setError(normalizedError);\n setMutationStatus('error');\n }\n },\n [contextDisconnect]\n );\n\n const reset = useCallback(() => {\n setError(null);\n setMutationStatus('idle');\n }, []);\n\n const value = useMemo(\n () => ({\n disconnect,\n reset,\n error,\n isError: mutationStatus === 'error',\n isIdle: mutationStatus === 'idle',\n isPending: mutationStatus === 'pending',\n isSuccess: mutationStatus === 'success',\n status: mutationStatus,\n }),\n [disconnect, reset, error, mutationStatus]\n );\n\n return value;\n};\n","'use client';\n\nimport { request } from '@stacks/connect';\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { MutationStatus } from '../provider/stacks-wallet-provider.types';\nimport { useAddress } from './use-address';\n\nexport interface SignMessageVariables {\n message: string;\n publicKey?: string;\n}\n\nexport interface SignMessageData {\n publicKey: string;\n signature: string;\n}\n\nexport interface SignMessageOptions {\n onSuccess?: (data: SignMessageData) => void;\n onError?: (error: Error) => void;\n onSettled?: (\n data: SignMessageData | undefined,\n error: Error | null\n ) => void;\n}\n\nexport const useSignMessage = () => {\n const { isConnected, provider } = useAddress();\n const [data, setData] = useState<SignMessageData | undefined>(undefined);\n const [error, setError] = useState<Error | null>(null);\n const [status, setStatus] = useState<MutationStatus>('idle');\n\n const signMessageAsync = useCallback(\n async (variables: SignMessageVariables): Promise<SignMessageData> => {\n if (!isConnected) {\n throw new Error('Wallet is not connected');\n }\n\n setStatus('pending');\n setError(null);\n setData(undefined);\n\n try {\n let result: SignMessageData;\n\n if (provider === 'okx') {\n if (!window.okxwallet) {\n throw new Error('OKX wallet not found');\n }\n\n result = await window.okxwallet.stacks.signMessage({\n message: variables.message,\n });\n } else {\n result = await request('stx_signMessage', {\n message: variables.message,\n ...(variables.publicKey && {\n publicKey: variables.publicKey,\n }),\n });\n }\n\n setData(result);\n setStatus('success');\n return result;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [isConnected, provider]\n );\n\n const signMessage = useCallback(\n (variables: SignMessageVariables, options?: SignMessageOptions) => {\n signMessageAsync(variables)\n .then((data) => {\n options?.onSuccess?.(data);\n options?.onSettled?.(data, null);\n })\n .catch((error) => {\n options?.onError?.(error);\n options?.onSettled?.(undefined, error);\n });\n },\n [signMessageAsync]\n );\n\n const reset = useCallback(() => {\n setData(undefined);\n setError(null);\n setStatus('idle');\n }, []);\n\n return useMemo(\n () => ({\n signMessage,\n signMessageAsync,\n reset,\n data,\n error,\n isError: status === 'error',\n isIdle: status === 'idle',\n isPending: status === 'pending',\n isSuccess: status === 'success',\n status,\n }),\n [signMessage, signMessageAsync, reset, data, error, status]\n );\n};\n","export const getNetworkFromAddress = (address: string) => {\n if (address.startsWith('SP') || address.startsWith('SM')) {\n return 'mainnet';\n }\n\n if (address.startsWith('ST') || address.startsWith('SN')) {\n return 'testnet';\n }\n\n throw new Error(`Invalid Stacks address: ${address}`);\n};\n","import type { ClarityValue, PostCondition } from \"@stacks/transactions\";\nimport { cvToHex, postConditionToHex } from \"@stacks/transactions\";\n\nexport const preparePostConditionsForOKX = (postConditions: PostCondition[]) =>\n postConditions.map((pc) => postConditionToHex(pc));\n\nexport const prepareArgsForOKX = (args: ClarityValue[]) =>\n args.map((arg) => cvToHex(arg));\n","'use client';\n\nimport { request } from '@stacks/connect';\nimport { PostConditionMode } from '@stacks/transactions';\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { MutationStatus } from '../../provider/stacks-wallet-provider.types';\nimport { useAddress } from '../use-address';\nimport { getNetworkFromAddress } from '../../utils/get-network-from-address';\n\nimport {\n preparePostConditionsForOKX,\n prepareArgsForOKX,\n} from './use-write-contract.helpers';\nimport type {\n WriteContractVariables,\n WriteContractOptions,\n} from './use-write-contract.types';\n\nexport const useWriteContract = () => {\n const { isConnected, address, provider } = useAddress();\n\n const [data, setData] = useState<string | undefined>(undefined);\n const [error, setError] = useState<Error | null>(null);\n const [status, setStatus] = useState<MutationStatus>('idle');\n\n const writeContractAsync = useCallback(\n async (variables: WriteContractVariables): Promise<string> => {\n if (!isConnected || !address) {\n throw new Error('Wallet is not connected');\n }\n\n setStatus('pending');\n setError(null);\n setData(undefined);\n\n try {\n if (provider === 'okx') {\n if (!window.okxwallet) {\n throw new Error('OKX wallet not found');\n }\n\n const response =\n await window.okxwallet.stacks.signTransaction({\n contractAddress: variables.address,\n contractName: variables.contract,\n functionName: variables.functionName,\n functionArgs: prepareArgsForOKX(variables.args),\n postConditions: preparePostConditionsForOKX(\n variables.pc.postConditions\n ),\n postConditionMode: variables.pc.mode,\n stxAddress: address,\n txType: 'contract_call',\n anchorMode: 3,\n });\n\n setData(response.txHash);\n setStatus('success');\n return response.txHash;\n }\n\n const response = await request('stx_callContract', {\n address,\n contract: `${variables.address}.${variables.contract}`,\n functionName: variables.functionName,\n functionArgs: variables.args,\n postConditions: variables.pc.postConditions,\n postConditionMode:\n variables.pc.mode === PostConditionMode.Allow\n ? 'allow'\n : 'deny',\n network: getNetworkFromAddress(address),\n });\n\n if (!response.txid) {\n throw new Error('No transaction ID returned');\n }\n\n setData(response.txid);\n setStatus('success');\n return response.txid;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [isConnected, address, provider]\n );\n\n const writeContract = useCallback(\n (variables: WriteContractVariables, options?: WriteContractOptions) => {\n writeContractAsync(variables)\n .then((data) => {\n options?.onSuccess?.(data);\n options?.onSettled?.(data, null);\n })\n .catch((error) => {\n options?.onError?.(error);\n options?.onSettled?.(undefined, error);\n });\n },\n [writeContractAsync]\n );\n\n const reset = useCallback(() => {\n setData(undefined);\n setError(null);\n setStatus('idle');\n }, []);\n\n return useMemo(\n () => ({\n writeContract,\n writeContractAsync,\n reset,\n data,\n error,\n isError: status === 'error',\n isIdle: status === 'idle',\n isPending: status === 'pending',\n isSuccess: status === 'success',\n status,\n }),\n [writeContract, writeContractAsync, reset, data, error, status]\n );\n};\n\nexport type {\n WriteContractVariables,\n WriteContractOptions,\n PostConditionConfig,\n} from './use-write-contract.types';\n","'use client';\n\nimport { getPrimaryName } from 'bns-v2-sdk';\nimport { useEffect, useState } from 'react';\n\nimport { getNetworkFromAddress } from '../utils/get-network-from-address';\n\nexport const useBnsName = (address?: string) => {\n const [bnsName, setBnsName] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n\n useEffect(() => {\n if (!address) {\n setBnsName(null);\n setIsLoading(false);\n return;\n }\n\n const fetchBnsName = async () => {\n setIsLoading(true);\n\n try {\n const network = getNetworkFromAddress(address);\n const result = await getPrimaryName({ address, network });\n\n const fullName = result\n ? `${result.name}.${result.namespace}`\n : null;\n\n setBnsName(fullName);\n } catch {\n setBnsName(null);\n } finally {\n setIsLoading(false);\n }\n };\n\n void fetchBnsName();\n }, [address]);\n\n return { bnsName, isLoading };\n};\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\nexport const useWallets = () => {\n const { wallets } = useStacksWalletContext();\n\n return useMemo(() => ({ wallets }), [wallets]);\n};\n"]}
1
+ {"version":3,"sources":["../src/constants/stacks-provider-mapping.ts","../src/constants/storage-keys.ts","../src/constants/wallets.ts","../src/utils/get-stacks-wallets.ts","../src/provider/stacks-wallet-provider.helpers.ts","../src/hooks/use-xverse/use-xverse.helpers.ts","../src/hooks/use-xverse/use-xverse.ts","../src/utils/get-local-storage-wallet.ts","../src/provider/stacks-wallet-provider.tsx","../src/hooks/use-address.ts","../src/hooks/use-connect.ts","../src/hooks/use-disconnect.ts","../src/hooks/use-sign-message.ts","../src/utils/get-network-from-address.ts","../src/hooks/use-write-contract/use-write-contract.helpers.ts","../src/hooks/use-write-contract/use-write-contract.ts","../src/hooks/use-bns-name.ts","../src/hooks/use-wallets.ts"],"names":["getSelectedProvider","useState","useEffect","WalletConnect","gen","wc","data","useMemo","useCallback","request","error","response"],"mappings":"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","file":"index.js","sourcesContent":["import type { SupportedStacksWallet } from \"./wallets\";\n\nexport const STACKS_TO_STACKS_CONNECT_PROVIDERS: Record<\n SupportedStacksWallet,\n | \"LeatherProvider\"\n | \"XverseProviders.BitcoinProvider\"\n | \"AsignaProvider\"\n | \"FordefiProviders.UtxoProvider\"\n | \"WalletConnectProvider\"\n | \"OkxStacksProvider\"\n> = {\n xverse: \"XverseProviders.BitcoinProvider\",\n leather: \"LeatherProvider\",\n okx: \"OkxStacksProvider\",\n asigna: \"AsignaProvider\",\n fordefi: \"FordefiProviders.UtxoProvider\",\n \"wallet-connect\": \"WalletConnectProvider\",\n};\n\nexport const STACKS_CONNECT_TO_STACKS_PROVIDERS = Object.fromEntries(\n Object.entries(STACKS_TO_STACKS_CONNECT_PROVIDERS).map(([kit, connect]) => [\n connect,\n kit,\n ])\n) as Record<string, SupportedStacksWallet>;\n","export const LOCAL_STORAGE_STACKS = \"@satoshai/kit\";\n","export const SUPPORTED_STACKS_WALLETS = [\n \"xverse\",\n \"leather\",\n \"asigna\",\n \"fordefi\",\n \"wallet-connect\",\n \"okx\",\n] as const;\n\nexport type SupportedStacksWallet = (typeof SUPPORTED_STACKS_WALLETS)[number];\n","import {\n SUPPORTED_STACKS_WALLETS,\n type SupportedStacksWallet,\n} from '../constants/wallets';\n\nexport interface StacksWallets {\n supported: SupportedStacksWallet[];\n installed: SupportedStacksWallet[];\n}\n\nexport const getStacksWallets = (): StacksWallets => {\n const supported = [...SUPPORTED_STACKS_WALLETS];\n const installed = supported.filter((wallet) =>\n checkIfStacksProviderIsInstalled(wallet)\n );\n\n return { supported, installed };\n};\n\nexport const checkIfStacksProviderIsInstalled = (\n wallet: SupportedStacksWallet\n): boolean => {\n if (typeof window === 'undefined') return wallet === 'wallet-connect';\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n switch (wallet) {\n case 'xverse':\n return !!(window as any).XverseProviders;\n case 'leather':\n return (\n !!(window as any).LeatherProvider ||\n !!(window as any).HiroWalletProvider\n );\n case 'asigna':\n return !!(window as any).AsignaProvider;\n case 'okx':\n return !!(window as any).okxwallet;\n case 'fordefi':\n return !!(window as any).FordefiProviders?.UtxoProvider;\n case 'wallet-connect':\n return true;\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n};\n","import type { SupportedStacksWallet } from '../constants/wallets';\nimport type { WbipProvider } from '@stacks/connect';\nimport type {\n WalletConnectMetadata,\n StacksChain,\n} from './stacks-wallet-provider.types';\nimport { WalletConnect } from '@stacks/connect';\n\nconst STACKS_CHAIN_MAPPING = {\n mainnet: WalletConnect.Chains.Stacks.Mainnet,\n testnet: WalletConnect.Chains.Stacks.Testnet,\n} as const;\n\nexport const buildWalletConnectConfig = (\n projectId: string,\n metadata?: Partial<WalletConnectMetadata>,\n chains?: StacksChain[]\n): {\n projectId: string;\n metadata: WalletConnectMetadata;\n networks: (typeof WalletConnect.Networks.Stacks)[];\n} => {\n const selectedChains = chains ?? ['mainnet'];\n const walletConnectChains = selectedChains.map(\n (chain) => STACKS_CHAIN_MAPPING[chain]\n );\n\n return {\n projectId,\n metadata: {\n name: 'Universal Connector',\n description: 'Universal Connector',\n url: 'https://appkit.reown.com',\n icons: ['https://appkit.reown.com/icon.png'],\n ...metadata,\n },\n networks: [\n {\n ...WalletConnect.Networks.Stacks,\n chains: walletConnectChains,\n },\n ],\n };\n};\n\nexport const getOKXStacksAddress = async () => {\n if (!window.okxwallet) {\n throw new Error('🚨 OKX Wallet is not installed');\n }\n\n const stacksResponse = await window.okxwallet.stacks.connect();\n\n if (!stacksResponse) {\n throw new Error('🚨 Failed to connect with OKX Wallet');\n }\n\n return {\n address: stacksResponse.address,\n provider: 'okx' as const,\n };\n};\n\n/**\n * OKX provider metadata for @stacks/connect's modal. Passed via\n * `defaultProviders` so @stacks/connect places it after natively-registered\n * wallets (i.e. last in the modal).\n */\nexport const OKX_PROVIDER_META: WbipProvider = {\n id: 'OkxStacksProvider',\n name: 'OKX Wallet',\n icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiICAgICB4bWxuczp4b2RtPSJodHRwOi8vd3d3LmNvcmVsLmNvbS9jb3JlbGRyYXcvb2RtLzIwMDMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjUwMCAyNTAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNTAwIDI1MDA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgIC5zdDB7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7fQogICAgLnN0MXtmaWxsOiNGRkZGRkY7fQo8L3N0eWxlPgo8ZyBpZD0iTGF5ZXJfeDAwMjBfMSI+CiAgICA8ZyBpZD0iXzIxODczODEzMjM4NTYiPgogICAgICAgIDxyZWN0IHk9IjAiIGNsYXNzPSJzdDAiIHdpZHRoPSIyNTAwIiBoZWlnaHQ9IjI1MDAiPjwvcmVjdD4KICAgICAgICA8Zz4KICAgICAgICAgICAgPHBhdGggY2xhc3M9InN0MSIgZD0iTTE0NjMsMTAxNWgtNDA0Yy0xNywwLTMxLDE0LTMxLDMxdjQwNGMwLDE3LDE0LDMxLDMxLDMxaDQwNGMxNywwLDMxLTE0LDMxLTMxdi00MDQgICAgIEMxNDk0LDEwMjksMTQ4MCwxMDE1LDE0NjMsMTAxNXoiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggY2xhc3M9InN0MSIgZD0iTTk5Niw1NDlINTkyYy0xNywwLTMxLDE0LTMxLDMxdjQwNGMwLDE3LDE0LDMxLDMxLDMxaDQwNGMxNywwLDMxLTE0LDMxLTMxVjU4MEMxMDI3LDU2MywxMDEzLDU0OSw5OTYsNTQ5eiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBjbGFzcz0ic3QxIiBkPSJNMTkzMCw1NDloLTQwNGMtMTcsMC0zMSwxNC0zMSwzMXY0MDRjMCwxNywxNCwzMSwzMSwzMWg0MDRjMTcsMCwzMS0xNCwzMS0zMVY1ODAgICAgIEMxOTYxLDU2MywxOTQ3LDU0OSwxOTMwLDU0OXoiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggY2xhc3M9InN0MSIgZD0iTTk5NiwxNDgySDU5MmMtMTcsMC0zMSwxNC0zMSwzMXY0MDRjMCwxNywxNCwzMSwzMSwzMWg0MDRjMTcsMCwzMS0xNCwzMS0zMXYtNDA0ICAgICBDMTAyNywxNDk2LDEwMTMsMTQ4Miw5OTYsMTQ4MnoiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggY2xhc3M9InN0MSIgZD0iTTE5MzAsMTQ4MmgtNDA0Yy0xNywwLTMxLDE0LTMxLDMxdjQwNGMwLDE3LDE0LDMxLDMxLDMxaDQwNGMxNywwLDMxLTE0LDMxLTMxdi00MDQgICAgIEMxOTYxLDE0OTYsMTk0NywxNDgyLDE5MzAsMTQ4MnoiPjwvcGF0aD4KICAgICAgICA8L2c+CiAgICA8L2c+CjwvZz4KPC9zdmc+',\n webUrl: 'https://www.okx.com/',\n};\n\n/**\n * Mount a minimal WBIP adapter at `window.OkxStacksProvider` so\n * @stacks/connect's `getProviderFromId()` detects OKX as installed.\n * Only `getAddresses` is handled — after connection the kit routes\n * signMessage / callContract through `window.okxwallet.stacks` directly.\n */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const registerOkxProvider = () => {\n if (typeof window === 'undefined') return;\n\n if (!(window as any).OkxStacksProvider) {\n (window as any).OkxStacksProvider = {\n request: async (method: string) => {\n if (method === 'getAddresses') {\n const data = await getOKXStacksAddress();\n return {\n result: {\n addresses: [\n { address: data.address, symbol: 'STX' },\n ],\n },\n };\n }\n throw new Error(\n `OKX adapter: unsupported method \"${method}\". Use connect('okx') for direct OKX SDK access.`\n );\n },\n };\n }\n};\n\nexport const unregisterOkxProvider = () => {\n if (typeof window === 'undefined') return;\n delete (window as any).OkxStacksProvider;\n};\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\nexport const extractStacksAddress = (\n typedProvider: SupportedStacksWallet,\n addresses: { address?: string; symbol?: string }[]\n) => {\n if (!addresses.length) {\n throw new Error(`No addresses provided for ${typedProvider} wallet`);\n }\n\n if (typedProvider === 'leather' || typedProvider === 'asigna') {\n const stxAddress = addresses.find(\n (addr) => addr.symbol === 'STX'\n )?.address;\n\n if (stxAddress) return stxAddress;\n }\n\n const stacksAddress = addresses.find((addr) =>\n addr.address?.startsWith('S')\n )?.address;\n\n if (stacksAddress) return stacksAddress;\n\n const legacyAddress = addresses[2]?.address;\n\n if (legacyAddress?.startsWith('S')) return legacyAddress;\n\n throw new Error(\n `No valid Stacks address found for ${typedProvider} wallet`\n );\n};\n","import { getSelectedProvider } from '@stacks/connect';\n\nexport const getXverseProductInfo = async (): Promise<{\n version?: string;\n name?: string;\n} | null> =>\n (await window.XverseProviders?.StacksProvider?.getProductInfo?.()) ?? null;\n\nexport const shouldSupportAccountChange = (\n version: string | undefined\n): boolean => version !== undefined && version !== '1.0.0';\n\nexport const waitForXverseProvider = async (\n maxAttempts = 10,\n initialDelay = 200\n): Promise<boolean> => {\n for (let i = 0; i < maxAttempts; i++) {\n const provider = getSelectedProvider();\n\n if (provider?.request && provider?.addListener) return true;\n\n await new Promise((resolve) =>\n setTimeout(resolve, initialDelay * Math.min(i + 1, 5))\n );\n }\n\n return false;\n};\n\nexport const extractAndValidateStacksAddress = (\n addresses:\n | {\n address: string;\n addressType: string;\n purpose: string;\n }[]\n | undefined,\n currentAddress: string | undefined,\n onAddressChange: (address: string) => void,\n connect: () => Promise<void>\n) => {\n if (!addresses || !Array.isArray(addresses)) {\n void connect();\n return;\n }\n\n const stacksAccount = addresses.find(\n (acc) => acc.purpose === 'stacks' || acc.addressType === 'stacks'\n );\n\n if (!stacksAccount?.address) {\n void connect();\n return;\n }\n\n if (stacksAccount.address !== currentAddress) {\n onAddressChange(stacksAccount.address);\n }\n};\n","import { getSelectedProvider } from '@stacks/connect';\nimport { useEffect, useState } from 'react';\n\nimport type { SupportedStacksWallet } from '../../constants/wallets';\nimport type { ConnectOptions } from '../../provider/stacks-wallet-provider.types';\nimport type { XverseAccountChangeEvent } from './use-xverse.types';\nimport {\n extractAndValidateStacksAddress,\n getXverseProductInfo,\n shouldSupportAccountChange,\n waitForXverseProvider,\n} from './use-xverse.helpers';\n\nexport const useXverse = ({\n address,\n provider,\n onAddressChange,\n connect,\n}: {\n address: string | undefined;\n provider: SupportedStacksWallet | undefined;\n onAddressChange: (newAddress: string) => void;\n connect: (\n providerId?: SupportedStacksWallet,\n options?: ConnectOptions\n ) => Promise<void>;\n}) => {\n const [isProviderReady, setIsProviderReady] = useState(false);\n\n useEffect(() => {\n if (provider !== 'xverse') return;\n\n const checkProvider = async () => {\n const ready = await waitForXverseProvider();\n\n setIsProviderReady(ready);\n\n if (!ready) {\n console.error('Xverse provider failed to initialize');\n }\n };\n\n void checkProvider();\n }, [provider]);\n\n useEffect(() => {\n if (provider !== 'xverse' || !address || !isProviderReady) return;\n\n let cancelled = false;\n let removeListener: (() => void) | undefined;\n\n const setupXverse = async () => {\n try {\n const productInfo = await getXverseProductInfo();\n\n if (cancelled) return;\n\n if (!shouldSupportAccountChange(productInfo?.version)) return;\n\n const response = await getSelectedProvider()?.request(\n 'wallet_connect',\n null\n );\n\n if (cancelled) return;\n\n extractAndValidateStacksAddress(\n response?.result?.addresses,\n address,\n onAddressChange,\n () => connect('xverse')\n );\n\n removeListener = getSelectedProvider()?.addListener(\n 'accountChange',\n (event: XverseAccountChangeEvent) => {\n extractAndValidateStacksAddress(\n event?.addresses,\n address,\n onAddressChange,\n () => connect('xverse')\n );\n }\n );\n } catch (error) {\n console.error('Failed to setup Xverse:', error);\n }\n };\n\n void setupXverse();\n\n return () => {\n cancelled = true;\n\n if (!removeListener) return;\n\n try {\n removeListener();\n } catch (error) {\n console.error('Failed to remove Xverse listener:', error);\n }\n };\n }, [address, isProviderReady, onAddressChange, connect, provider]);\n};\n","import { LOCAL_STORAGE_STACKS } from '../constants/storage-keys';\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { SUPPORTED_STACKS_WALLETS } from '../constants/wallets';\n\nexport const getLocalStorageWallet = (): {\n address: string;\n provider: SupportedStacksWallet;\n} | null => {\n if (typeof window === 'undefined') return null;\n\n const stored = localStorage.getItem(LOCAL_STORAGE_STACKS);\n\n if (!stored) return null;\n\n try {\n const data = JSON.parse(stored) as {\n address: string;\n provider: SupportedStacksWallet;\n };\n\n const isValid = SUPPORTED_STACKS_WALLETS.find(\n (wallet) => wallet === data.provider\n );\n\n return isValid ? data : null;\n } catch {\n return null;\n }\n};\n","'use client';\n\nimport {\n clearSelectedProviderId,\n getSelectedProviderId,\n setSelectedProviderId,\n request,\n getSelectedProvider,\n DEFAULT_PROVIDERS,\n WALLET_CONNECT_PROVIDER,\n WalletConnect,\n} from '@stacks/connect';\nimport {\n createContext,\n useContext,\n useCallback,\n useEffect,\n useRef,\n useState,\n useMemo,\n} from 'react';\n\nimport {\n STACKS_TO_STACKS_CONNECT_PROVIDERS,\n STACKS_CONNECT_TO_STACKS_PROVIDERS,\n} from '../constants/stacks-provider-mapping';\nimport { LOCAL_STORAGE_STACKS } from '../constants/storage-keys';\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { SUPPORTED_STACKS_WALLETS } from '../constants/wallets';\nimport {\n checkIfStacksProviderIsInstalled,\n getStacksWallets,\n} from '../utils/get-stacks-wallets';\n\nimport {\n getOKXStacksAddress,\n extractStacksAddress,\n buildWalletConnectConfig,\n registerOkxProvider,\n unregisterOkxProvider,\n OKX_PROVIDER_META,\n} from './stacks-wallet-provider.helpers';\nimport type {\n WalletContextValue,\n WalletState,\n ConnectOptions,\n StacksWalletProviderProps,\n} from './stacks-wallet-provider.types';\nimport { useXverse } from '../hooks/use-xverse/use-xverse';\nimport { getLocalStorageWallet } from '../utils/get-local-storage-wallet';\n\n// Static lookup — built once at module load from @stacks/connect metadata\nconst PROVIDER_META_BY_KIT_ID = Object.fromEntries(\n [...DEFAULT_PROVIDERS, WALLET_CONNECT_PROVIDER, OKX_PROVIDER_META].map(\n (p) => [\n STACKS_CONNECT_TO_STACKS_PROVIDERS[p.id],\n { name: p.name, icon: p.icon ?? '', webUrl: p.webUrl ?? '' },\n ]\n )\n) as Record<string, { name: string; icon: string; webUrl: string }>;\n\nconst StacksWalletContext = createContext<WalletContextValue | undefined>(\n undefined\n);\n\nexport const StacksWalletProvider = ({\n children,\n wallets,\n connectModal = true,\n walletConnect,\n onConnect,\n onAddressChange,\n onDisconnect,\n}: StacksWalletProviderProps) => {\n const [address, setAddress] = useState<string | undefined>();\n const [provider, setProvider] = useState<\n SupportedStacksWallet | undefined\n >();\n const [isConnecting, setIsConnecting] = useState(false);\n\n // Generation counter — incremented by reset() to invalidate in-flight connect promises\n const connectGenRef = useRef(0);\n\n // Guard against concurrent WalletConnect.initializeProvider calls\n const wcInitRef = useRef<Promise<void> | null>(null);\n\n // Keep walletConnect in a ref so the connect callback always reads the\n // latest config without needing the object in its dependency array\n // (inline walletConnect={{ projectId: '...' }} would cause a new ref\n // each render, recreating connect on every render).\n const walletConnectRef = useRef(walletConnect);\n walletConnectRef.current = walletConnect;\n\n // Serialize wallets to a stable string for use as a dependency,\n // so inline arrays like wallets={['xverse', 'leather']} don't\n // invalidate memos on every render. (Fixes #5)\n const walletsKey = wallets?.join(',');\n\n // Validate in render body so React error boundaries can catch it (#21)\n if (wallets?.includes('wallet-connect') && !walletConnect?.projectId) {\n throw new Error(\n 'StacksWalletProvider: \"wallet-connect\" is listed in wallets but no walletConnect.projectId was provided.'\n );\n }\n\n // Register the OKX WBIP adapter so it appears in the @stacks/connect modal.\n // Only when connectModal is enabled and OKX is in the configured wallets\n // (or wallets is undefined, meaning all wallets are configured).\n useEffect(() => {\n const okxConfigured = !wallets || wallets.includes('okx');\n if (connectModal && okxConfigured) {\n registerOkxProvider();\n return () => unregisterOkxProvider();\n }\n }, [connectModal, walletsKey]);\n\n useEffect(() => {\n const loadPersistedWallet = async () => {\n const persisted = getLocalStorageWallet();\n\n if (!persisted) return;\n\n setIsConnecting(true);\n\n try {\n if (persisted.provider === 'okx') {\n const data = await getOKXStacksAddress();\n setAddress(data.address);\n setProvider(data.provider);\n return;\n }\n\n if (\n persisted.provider === 'wallet-connect' &&\n walletConnect?.projectId\n ) {\n const initPromise = WalletConnect.initializeProvider(\n buildWalletConnectConfig(\n walletConnect.projectId,\n walletConnect.metadata,\n walletConnect.chains\n )\n );\n wcInitRef.current = initPromise;\n await initPromise;\n wcInitRef.current = null;\n }\n\n setAddress(persisted.address);\n setProvider(persisted.provider);\n setSelectedProviderId(\n STACKS_TO_STACKS_CONNECT_PROVIDERS[persisted.provider]\n );\n } catch (error) {\n console.error('Failed to restore wallet connection:', error);\n } finally {\n setIsConnecting(false);\n }\n };\n\n void loadPersistedWallet();\n }, [walletConnect?.projectId]);\n\n const connect = useCallback(\n async (\n providerId?: SupportedStacksWallet,\n options?: ConnectOptions\n ) => {\n // --- Modal branch: delegate wallet selection to @stacks/connect ---\n if (connectModal && !providerId) {\n const gen = ++connectGenRef.current;\n setIsConnecting(true);\n\n try {\n clearSelectedProviderId();\n\n const requestOptions: Parameters<typeof request>[0] = {\n forceWalletSelect: true,\n // OKX at the end so it appears last among installed wallets\n defaultProviders: [\n ...DEFAULT_PROVIDERS,\n OKX_PROVIDER_META,\n ],\n };\n\n if (wallets) {\n requestOptions.approvedProviderIds = wallets.map(\n (w) => STACKS_TO_STACKS_CONNECT_PROVIDERS[w]\n );\n }\n\n const wc = walletConnectRef.current;\n if (wc?.projectId) {\n requestOptions.walletConnect =\n buildWalletConnectConfig(\n wc.projectId,\n wc.metadata,\n wc.chains\n );\n }\n\n const data = await request(\n requestOptions,\n 'getAddresses',\n {}\n );\n\n if (connectGenRef.current !== gen) return;\n\n const selectedId = getSelectedProviderId();\n const resolvedProvider = selectedId\n ? STACKS_CONNECT_TO_STACKS_PROVIDERS[selectedId]\n : undefined;\n\n if (!resolvedProvider) {\n throw new Error(\n `Unknown provider returned from @stacks/connect modal: ${selectedId ?? 'none'}`\n );\n }\n\n const extractedAddress = extractStacksAddress(\n resolvedProvider,\n data.addresses\n );\n\n setAddress(extractedAddress);\n setProvider(resolvedProvider);\n options?.onSuccess?.(extractedAddress, resolvedProvider);\n } catch (error) {\n if (connectGenRef.current !== gen) return;\n console.error('Failed to connect wallet:', error);\n getSelectedProvider()?.disconnect?.();\n clearSelectedProviderId();\n options?.onError?.(error as Error);\n } finally {\n if (connectGenRef.current === gen) {\n setIsConnecting(false);\n }\n }\n return;\n }\n\n // --- Explicit provider branch (existing behavior) ---\n const typedProvider = SUPPORTED_STACKS_WALLETS.find(\n (wallet) => wallet === providerId\n );\n\n if (!typedProvider) {\n const error = new Error(\n 'The wallet provider selected is not supported!'\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n if (!checkIfStacksProviderIsInstalled(typedProvider)) {\n const error = new Error(\n `${typedProvider} wallet is not installed. Please install the wallet extension to continue.`\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n const wc = walletConnectRef.current;\n\n if (\n typedProvider === 'wallet-connect' &&\n !wc?.projectId\n ) {\n const error = new Error(\n 'WalletConnect requires a project ID. Please provide walletConnect.projectId to the StacksWalletProvider.'\n );\n console.error('🚨', error.message);\n options?.onError?.(error);\n return;\n }\n\n // Capture generation so we can detect if reset() was called during await\n const gen = ++connectGenRef.current;\n setIsConnecting(true);\n\n try {\n if (typedProvider === 'okx') {\n const data = await getOKXStacksAddress();\n if (connectGenRef.current !== gen) return;\n setAddress(data.address);\n setProvider(data.provider);\n options?.onSuccess?.(data.address, data.provider);\n return;\n }\n\n setSelectedProviderId(\n STACKS_TO_STACKS_CONNECT_PROVIDERS[typedProvider]\n );\n\n const wcConfig =\n typedProvider === 'wallet-connect' && wc\n ? buildWalletConnectConfig(\n wc.projectId,\n wc.metadata,\n wc.chains\n )\n : undefined;\n\n if (wcConfig) {\n // Wait for any in-flight init, then start ours\n if (wcInitRef.current) await wcInitRef.current;\n const initPromise =\n WalletConnect.initializeProvider(wcConfig);\n wcInitRef.current = initPromise;\n await initPromise;\n wcInitRef.current = null;\n }\n\n if (connectGenRef.current !== gen) return;\n\n const data = wcConfig\n ? await request(\n { walletConnect: wcConfig },\n 'getAddresses',\n {}\n )\n : await request('getAddresses');\n\n if (connectGenRef.current !== gen) return;\n\n const extractedAddress = extractStacksAddress(\n typedProvider,\n data.addresses\n );\n\n setAddress(extractedAddress);\n setProvider(typedProvider);\n options?.onSuccess?.(extractedAddress, typedProvider);\n } catch (error) {\n if (connectGenRef.current !== gen) return;\n console.error('Failed to connect wallet:', error);\n // OKX uses its own SDK and never calls setSelectedProviderId,\n // so getSelectedProvider() would return the previously connected\n // provider — disconnecting the wrong wallet.\n if (typedProvider !== 'okx') {\n getSelectedProvider()?.disconnect?.();\n clearSelectedProviderId();\n }\n options?.onError?.(error as Error);\n } finally {\n if (connectGenRef.current === gen) {\n setIsConnecting(false);\n }\n }\n },\n [connectModal, walletsKey]\n );\n\n const reset = useCallback(() => {\n connectGenRef.current++;\n setIsConnecting(false);\n clearSelectedProviderId();\n }, []);\n\n const disconnect = useCallback(\n (callback?: () => void) => {\n localStorage.removeItem(LOCAL_STORAGE_STACKS);\n setAddress(undefined);\n setProvider(undefined);\n getSelectedProvider()?.disconnect?.();\n clearSelectedProviderId();\n callback?.();\n onDisconnect?.();\n },\n [onDisconnect]\n );\n\n useEffect(() => {\n if (!address || !provider) return;\n\n localStorage.setItem(\n LOCAL_STORAGE_STACKS,\n JSON.stringify({ address, provider })\n );\n }, [address, provider]);\n\n useEffect(() => {\n if (!address || !provider || !onConnect) return;\n\n onConnect(provider, address);\n }, [address, provider, onConnect]);\n\n const handleAddressChange = useCallback(\n (newAddress: string) => {\n setAddress(newAddress);\n onAddressChange?.(newAddress);\n },\n [onAddressChange]\n );\n\n useXverse({\n address,\n provider,\n onAddressChange: handleAddressChange,\n connect,\n });\n\n // Computed in render body (not memoized) so it picks up wallet extensions\n // injected after hydration. The context value useMemo below uses\n // walletInfosKey so the reference stays stable when nothing changes.\n const { installed } = getStacksWallets();\n const configured = wallets ?? [...SUPPORTED_STACKS_WALLETS];\n const walletInfos = configured.map((w) => ({\n id: w,\n name: PROVIDER_META_BY_KIT_ID[w]?.name ?? w,\n icon: PROVIDER_META_BY_KIT_ID[w]?.icon ?? '',\n webUrl: PROVIDER_META_BY_KIT_ID[w]?.webUrl ?? '',\n available:\n w === 'wallet-connect'\n ? !!walletConnect?.projectId\n : installed.includes(w),\n }));\n\n // Serialize for stable dependency — only changes when the actual data changes\n const walletInfosKey = walletInfos\n .map((w) => `${w.id}:${w.available}`)\n .join(',');\n\n const value = useMemo((): WalletContextValue => {\n const walletState: WalletState = isConnecting\n ? { status: 'connecting', address: undefined, provider: undefined }\n : address && provider\n ? { status: 'connected', address, provider }\n : {\n status: 'disconnected',\n address: undefined,\n provider: undefined,\n };\n\n return {\n ...walletState,\n connect,\n disconnect,\n reset,\n wallets: walletInfos,\n };\n }, [address, provider, isConnecting, connect, disconnect, reset, walletInfosKey]);\n\n return (\n <StacksWalletContext.Provider value={value}>\n {children}\n </StacksWalletContext.Provider>\n );\n};\n\nexport const useStacksWalletContext = () => {\n const context = useContext(StacksWalletContext);\n\n if (context === undefined) {\n throw new Error(\n '🚨 Stacks wallet hooks must be used within StacksWalletProvider'\n );\n }\n\n return context;\n};\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\ntype UseAddressReturn =\n | {\n address: undefined;\n isConnected: false;\n isConnecting: boolean;\n isDisconnected: boolean;\n provider: undefined;\n }\n | {\n address: string;\n isConnected: true;\n isConnecting: false;\n isDisconnected: false;\n provider: SupportedStacksWallet;\n };\n\nexport const useAddress = (): UseAddressReturn => {\n const { address, status, provider } = useStacksWalletContext();\n\n return useMemo(() => {\n if (status === 'connected' && address && provider) {\n return {\n address,\n isConnected: true as const,\n isConnecting: false as const,\n isDisconnected: false as const,\n provider,\n };\n }\n\n return {\n address: undefined,\n isConnected: false as const,\n isConnecting: status === 'connecting',\n isDisconnected: status === 'disconnected',\n provider: undefined,\n };\n }, [address, status, provider]);\n};\n","'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { SupportedStacksWallet } from '../constants/wallets';\nimport type { ConnectOptions, MutationStatus } from '../provider/stacks-wallet-provider.types';\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\nexport const useConnect = () => {\n const {\n connect: contextConnect,\n reset: contextReset,\n status: walletStatus,\n } = useStacksWalletContext();\n\n const [error, setError] = useState<Error | null>(null);\n const [mutationStatus, setMutationStatus] =\n useState<MutationStatus>('idle');\n\n const connect = useCallback(\n async (\n providerId?: SupportedStacksWallet,\n options?: ConnectOptions\n ) => {\n setError(null);\n setMutationStatus('pending');\n\n let settled = false;\n\n try {\n await contextConnect(providerId, {\n onSuccess: (address, provider) => {\n settled = true;\n setMutationStatus('success');\n options?.onSuccess?.(address, provider);\n },\n onError: (err) => {\n settled = true;\n setError(err);\n setMutationStatus('error');\n options?.onError?.(err);\n },\n });\n } finally {\n if (!settled) {\n // connect returned without calling onSuccess or onError\n // (e.g., cancelled by reset or stale generation)\n setMutationStatus('idle');\n }\n }\n },\n [contextConnect]\n );\n\n const reset = useCallback(() => {\n setError(null);\n setMutationStatus('idle');\n contextReset();\n }, [contextReset]);\n\n const value = useMemo(\n () => ({\n connect,\n reset,\n error,\n isError: mutationStatus === 'error',\n isIdle: mutationStatus === 'idle',\n isPending:\n mutationStatus === 'pending' ||\n walletStatus === 'connecting',\n isSuccess: mutationStatus === 'success',\n status: mutationStatus,\n }),\n [connect, reset, error, mutationStatus, walletStatus]\n );\n\n return value;\n};\n","'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { MutationStatus } from '../provider/stacks-wallet-provider.types';\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\nexport const useDisconnect = () => {\n const { disconnect: contextDisconnect } = useStacksWalletContext();\n\n const [error, setError] = useState<Error | null>(null);\n const [mutationStatus, setMutationStatus] =\n useState<MutationStatus>('idle');\n\n const disconnect = useCallback(\n (callback?: () => void) => {\n setError(null);\n\n try {\n contextDisconnect(callback);\n setMutationStatus('success');\n } catch (err) {\n const normalizedError =\n err instanceof Error ? err : new Error(String(err));\n setError(normalizedError);\n setMutationStatus('error');\n }\n },\n [contextDisconnect]\n );\n\n const reset = useCallback(() => {\n setError(null);\n setMutationStatus('idle');\n }, []);\n\n const value = useMemo(\n () => ({\n disconnect,\n reset,\n error,\n isError: mutationStatus === 'error',\n isIdle: mutationStatus === 'idle',\n isPending: mutationStatus === 'pending',\n isSuccess: mutationStatus === 'success',\n status: mutationStatus,\n }),\n [disconnect, reset, error, mutationStatus]\n );\n\n return value;\n};\n","'use client';\n\nimport { request } from '@stacks/connect';\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { MutationStatus } from '../provider/stacks-wallet-provider.types';\nimport { useAddress } from './use-address';\n\nexport interface SignMessageVariables {\n message: string;\n publicKey?: string;\n}\n\nexport interface SignMessageData {\n publicKey: string;\n signature: string;\n}\n\nexport interface SignMessageOptions {\n onSuccess?: (data: SignMessageData) => void;\n onError?: (error: Error) => void;\n onSettled?: (\n data: SignMessageData | undefined,\n error: Error | null\n ) => void;\n}\n\nexport const useSignMessage = () => {\n const { isConnected, provider } = useAddress();\n const [data, setData] = useState<SignMessageData | undefined>(undefined);\n const [error, setError] = useState<Error | null>(null);\n const [status, setStatus] = useState<MutationStatus>('idle');\n\n const signMessageAsync = useCallback(\n async (variables: SignMessageVariables): Promise<SignMessageData> => {\n if (!isConnected) {\n throw new Error('Wallet is not connected');\n }\n\n setStatus('pending');\n setError(null);\n setData(undefined);\n\n try {\n let result: SignMessageData;\n\n if (provider === 'okx') {\n if (!window.okxwallet) {\n throw new Error('OKX wallet not found');\n }\n\n result = await window.okxwallet.stacks.signMessage({\n message: variables.message,\n });\n } else {\n result = await request('stx_signMessage', {\n message: variables.message,\n ...(variables.publicKey && {\n publicKey: variables.publicKey,\n }),\n });\n }\n\n setData(result);\n setStatus('success');\n return result;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [isConnected, provider]\n );\n\n const signMessage = useCallback(\n (variables: SignMessageVariables, options?: SignMessageOptions) => {\n signMessageAsync(variables)\n .then((data) => {\n options?.onSuccess?.(data);\n options?.onSettled?.(data, null);\n })\n .catch((error) => {\n options?.onError?.(error);\n options?.onSettled?.(undefined, error);\n });\n },\n [signMessageAsync]\n );\n\n const reset = useCallback(() => {\n setData(undefined);\n setError(null);\n setStatus('idle');\n }, []);\n\n return useMemo(\n () => ({\n signMessage,\n signMessageAsync,\n reset,\n data,\n error,\n isError: status === 'error',\n isIdle: status === 'idle',\n isPending: status === 'pending',\n isSuccess: status === 'success',\n status,\n }),\n [signMessage, signMessageAsync, reset, data, error, status]\n );\n};\n","export const getNetworkFromAddress = (address: string) => {\n if (address.startsWith('SP') || address.startsWith('SM')) {\n return 'mainnet';\n }\n\n if (address.startsWith('ST') || address.startsWith('SN')) {\n return 'testnet';\n }\n\n throw new Error(`Invalid Stacks address: ${address}`);\n};\n","import type { ClarityValue, PostCondition } from \"@stacks/transactions\";\nimport { cvToHex, postConditionToHex } from \"@stacks/transactions\";\n\nexport const preparePostConditionsForOKX = (postConditions: PostCondition[]) =>\n postConditions.map((pc) => postConditionToHex(pc));\n\nexport const prepareArgsForOKX = (args: ClarityValue[]) =>\n args.map((arg) => cvToHex(arg));\n","'use client';\n\nimport { request } from '@stacks/connect';\nimport { PostConditionMode } from '@stacks/transactions';\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { MutationStatus } from '../../provider/stacks-wallet-provider.types';\nimport { useAddress } from '../use-address';\nimport { getNetworkFromAddress } from '../../utils/get-network-from-address';\n\nimport {\n preparePostConditionsForOKX,\n prepareArgsForOKX,\n} from './use-write-contract.helpers';\nimport type {\n WriteContractVariables,\n WriteContractOptions,\n} from './use-write-contract.types';\n\nexport const useWriteContract = () => {\n const { isConnected, address, provider } = useAddress();\n\n const [data, setData] = useState<string | undefined>(undefined);\n const [error, setError] = useState<Error | null>(null);\n const [status, setStatus] = useState<MutationStatus>('idle');\n\n const writeContractAsync = useCallback(\n async (variables: WriteContractVariables): Promise<string> => {\n if (!isConnected || !address) {\n throw new Error('Wallet is not connected');\n }\n\n setStatus('pending');\n setError(null);\n setData(undefined);\n\n try {\n if (provider === 'okx') {\n if (!window.okxwallet) {\n throw new Error('OKX wallet not found');\n }\n\n const response =\n await window.okxwallet.stacks.signTransaction({\n contractAddress: variables.address,\n contractName: variables.contract,\n functionName: variables.functionName,\n functionArgs: prepareArgsForOKX(variables.args),\n postConditions: preparePostConditionsForOKX(\n variables.pc.postConditions\n ),\n postConditionMode: variables.pc.mode,\n stxAddress: address,\n txType: 'contract_call',\n anchorMode: 3,\n });\n\n setData(response.txHash);\n setStatus('success');\n return response.txHash;\n }\n\n const response = await request('stx_callContract', {\n address,\n contract: `${variables.address}.${variables.contract}`,\n functionName: variables.functionName,\n functionArgs: variables.args,\n postConditions: variables.pc.postConditions,\n postConditionMode:\n variables.pc.mode === PostConditionMode.Allow\n ? 'allow'\n : 'deny',\n network: getNetworkFromAddress(address),\n });\n\n if (!response.txid) {\n throw new Error('No transaction ID returned');\n }\n\n setData(response.txid);\n setStatus('success');\n return response.txid;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(String(err));\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [isConnected, address, provider]\n );\n\n const writeContract = useCallback(\n (variables: WriteContractVariables, options?: WriteContractOptions) => {\n writeContractAsync(variables)\n .then((data) => {\n options?.onSuccess?.(data);\n options?.onSettled?.(data, null);\n })\n .catch((error) => {\n options?.onError?.(error);\n options?.onSettled?.(undefined, error);\n });\n },\n [writeContractAsync]\n );\n\n const reset = useCallback(() => {\n setData(undefined);\n setError(null);\n setStatus('idle');\n }, []);\n\n return useMemo(\n () => ({\n writeContract,\n writeContractAsync,\n reset,\n data,\n error,\n isError: status === 'error',\n isIdle: status === 'idle',\n isPending: status === 'pending',\n isSuccess: status === 'success',\n status,\n }),\n [writeContract, writeContractAsync, reset, data, error, status]\n );\n};\n\nexport type {\n WriteContractVariables,\n WriteContractOptions,\n PostConditionConfig,\n} from './use-write-contract.types';\n","'use client';\n\nimport { getPrimaryName } from 'bns-v2-sdk';\nimport { useEffect, useState } from 'react';\n\nimport { getNetworkFromAddress } from '../utils/get-network-from-address';\n\nexport const useBnsName = (address?: string) => {\n const [bnsName, setBnsName] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n\n useEffect(() => {\n if (!address) {\n setBnsName(null);\n setIsLoading(false);\n return;\n }\n\n const fetchBnsName = async () => {\n setIsLoading(true);\n\n try {\n const network = getNetworkFromAddress(address);\n const result = await getPrimaryName({ address, network });\n\n const fullName = result\n ? `${result.name}.${result.namespace}`\n : null;\n\n setBnsName(fullName);\n } catch {\n setBnsName(null);\n } finally {\n setIsLoading(false);\n }\n };\n\n void fetchBnsName();\n }, [address]);\n\n return { bnsName, isLoading };\n};\n","'use client';\n\nimport { useMemo } from 'react';\n\nimport { useStacksWalletContext } from '../provider/stacks-wallet-provider';\n\nexport const useWallets = () => {\n const { wallets } = useStacksWalletContext();\n\n return useMemo(() => ({ wallets }), [wallets]);\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@satoshai/kit",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "Typesafe Stacks wallet & contract interaction library for React",
5
5
  "license": "MIT",
6
6
  "type": "module",