@satoshai/kit 0.2.0 → 0.3.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.cjs +127 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -1
- package/dist/index.d.ts +24 -1
- package/dist/index.js +127 -30
- package/dist/index.js.map +1 -1
- package/package.json +7 -4
package/dist/index.cjs
CHANGED
|
@@ -461,37 +461,108 @@ var useAddress = () => {
|
|
|
461
461
|
}, [address, status, provider]);
|
|
462
462
|
};
|
|
463
463
|
var useConnect = () => {
|
|
464
|
-
const {
|
|
464
|
+
const {
|
|
465
|
+
connect: contextConnect,
|
|
466
|
+
reset: contextReset,
|
|
467
|
+
status: walletStatus
|
|
468
|
+
} = useStacksWalletContext();
|
|
469
|
+
const [error, setError] = react.useState(null);
|
|
470
|
+
const [mutationStatus, setMutationStatus] = react.useState("idle");
|
|
471
|
+
const connect = react.useCallback(
|
|
472
|
+
async (providerId, options) => {
|
|
473
|
+
setError(null);
|
|
474
|
+
setMutationStatus("pending");
|
|
475
|
+
let settled = false;
|
|
476
|
+
try {
|
|
477
|
+
await contextConnect(providerId, {
|
|
478
|
+
onSuccess: (address, provider) => {
|
|
479
|
+
settled = true;
|
|
480
|
+
setMutationStatus("success");
|
|
481
|
+
options?.onSuccess?.(address, provider);
|
|
482
|
+
},
|
|
483
|
+
onError: (err) => {
|
|
484
|
+
settled = true;
|
|
485
|
+
setError(err);
|
|
486
|
+
setMutationStatus("error");
|
|
487
|
+
options?.onError?.(err);
|
|
488
|
+
}
|
|
489
|
+
});
|
|
490
|
+
} finally {
|
|
491
|
+
if (!settled) {
|
|
492
|
+
setMutationStatus("idle");
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
},
|
|
496
|
+
[contextConnect]
|
|
497
|
+
);
|
|
498
|
+
const reset = react.useCallback(() => {
|
|
499
|
+
setError(null);
|
|
500
|
+
setMutationStatus("idle");
|
|
501
|
+
contextReset();
|
|
502
|
+
}, [contextReset]);
|
|
465
503
|
const value = react.useMemo(
|
|
466
504
|
() => ({
|
|
467
505
|
connect,
|
|
468
506
|
reset,
|
|
469
|
-
|
|
507
|
+
error,
|
|
508
|
+
isError: mutationStatus === "error",
|
|
509
|
+
isIdle: mutationStatus === "idle",
|
|
510
|
+
isPending: mutationStatus === "pending" || walletStatus === "connecting",
|
|
511
|
+
isSuccess: mutationStatus === "success",
|
|
512
|
+
status: mutationStatus
|
|
470
513
|
}),
|
|
471
|
-
[connect, reset,
|
|
514
|
+
[connect, reset, error, mutationStatus, walletStatus]
|
|
472
515
|
);
|
|
473
516
|
return value;
|
|
474
517
|
};
|
|
475
518
|
var useDisconnect = () => {
|
|
476
|
-
const { disconnect } = useStacksWalletContext();
|
|
477
|
-
|
|
519
|
+
const { disconnect: contextDisconnect } = useStacksWalletContext();
|
|
520
|
+
const [error, setError] = react.useState(null);
|
|
521
|
+
const [mutationStatus, setMutationStatus] = react.useState("idle");
|
|
522
|
+
const disconnect = react.useCallback(
|
|
523
|
+
(callback) => {
|
|
524
|
+
setError(null);
|
|
525
|
+
try {
|
|
526
|
+
contextDisconnect(callback);
|
|
527
|
+
setMutationStatus("success");
|
|
528
|
+
} catch (err) {
|
|
529
|
+
const normalizedError = err instanceof Error ? err : new Error(String(err));
|
|
530
|
+
setError(normalizedError);
|
|
531
|
+
setMutationStatus("error");
|
|
532
|
+
}
|
|
533
|
+
},
|
|
534
|
+
[contextDisconnect]
|
|
535
|
+
);
|
|
536
|
+
const reset = react.useCallback(() => {
|
|
537
|
+
setError(null);
|
|
538
|
+
setMutationStatus("idle");
|
|
539
|
+
}, []);
|
|
540
|
+
const value = react.useMemo(
|
|
478
541
|
() => ({
|
|
479
|
-
disconnect
|
|
542
|
+
disconnect,
|
|
543
|
+
reset,
|
|
544
|
+
error,
|
|
545
|
+
isError: mutationStatus === "error",
|
|
546
|
+
isIdle: mutationStatus === "idle",
|
|
547
|
+
isPending: mutationStatus === "pending",
|
|
548
|
+
isSuccess: mutationStatus === "success",
|
|
549
|
+
status: mutationStatus
|
|
480
550
|
}),
|
|
481
|
-
[disconnect]
|
|
551
|
+
[disconnect, reset, error, mutationStatus]
|
|
482
552
|
);
|
|
553
|
+
return value;
|
|
483
554
|
};
|
|
484
555
|
var useSignMessage = () => {
|
|
485
556
|
const { isConnected, provider } = useAddress();
|
|
486
557
|
const [data, setData] = react.useState(void 0);
|
|
487
558
|
const [error, setError] = react.useState(null);
|
|
488
|
-
const [
|
|
559
|
+
const [status, setStatus] = react.useState("idle");
|
|
489
560
|
const signMessageAsync = react.useCallback(
|
|
490
561
|
async (variables) => {
|
|
491
562
|
if (!isConnected) {
|
|
492
563
|
throw new Error("Wallet is not connected");
|
|
493
564
|
}
|
|
494
|
-
|
|
565
|
+
setStatus("pending");
|
|
495
566
|
setError(null);
|
|
496
567
|
setData(void 0);
|
|
497
568
|
try {
|
|
@@ -512,12 +583,12 @@ var useSignMessage = () => {
|
|
|
512
583
|
});
|
|
513
584
|
}
|
|
514
585
|
setData(result);
|
|
515
|
-
|
|
586
|
+
setStatus("success");
|
|
516
587
|
return result;
|
|
517
588
|
} catch (err) {
|
|
518
589
|
const error2 = err instanceof Error ? err : new Error(String(err));
|
|
519
590
|
setError(error2);
|
|
520
|
-
|
|
591
|
+
setStatus("error");
|
|
521
592
|
throw error2;
|
|
522
593
|
}
|
|
523
594
|
},
|
|
@@ -535,13 +606,26 @@ var useSignMessage = () => {
|
|
|
535
606
|
},
|
|
536
607
|
[signMessageAsync]
|
|
537
608
|
);
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
609
|
+
const reset = react.useCallback(() => {
|
|
610
|
+
setData(void 0);
|
|
611
|
+
setError(null);
|
|
612
|
+
setStatus("idle");
|
|
613
|
+
}, []);
|
|
614
|
+
return react.useMemo(
|
|
615
|
+
() => ({
|
|
616
|
+
signMessage,
|
|
617
|
+
signMessageAsync,
|
|
618
|
+
reset,
|
|
619
|
+
data,
|
|
620
|
+
error,
|
|
621
|
+
isError: status === "error",
|
|
622
|
+
isIdle: status === "idle",
|
|
623
|
+
isPending: status === "pending",
|
|
624
|
+
isSuccess: status === "success",
|
|
625
|
+
status
|
|
626
|
+
}),
|
|
627
|
+
[signMessage, signMessageAsync, reset, data, error, status]
|
|
628
|
+
);
|
|
545
629
|
};
|
|
546
630
|
|
|
547
631
|
// src/utils/get-network-from-address.ts
|
|
@@ -562,13 +646,13 @@ var useWriteContract = () => {
|
|
|
562
646
|
const { isConnected, address, provider } = useAddress();
|
|
563
647
|
const [data, setData] = react.useState(void 0);
|
|
564
648
|
const [error, setError] = react.useState(null);
|
|
565
|
-
const [
|
|
649
|
+
const [status, setStatus] = react.useState("idle");
|
|
566
650
|
const writeContractAsync = react.useCallback(
|
|
567
651
|
async (variables) => {
|
|
568
652
|
if (!isConnected || !address) {
|
|
569
653
|
throw new Error("Wallet is not connected");
|
|
570
654
|
}
|
|
571
|
-
|
|
655
|
+
setStatus("pending");
|
|
572
656
|
setError(null);
|
|
573
657
|
setData(void 0);
|
|
574
658
|
try {
|
|
@@ -590,7 +674,7 @@ var useWriteContract = () => {
|
|
|
590
674
|
anchorMode: 3
|
|
591
675
|
});
|
|
592
676
|
setData(response2.txHash);
|
|
593
|
-
|
|
677
|
+
setStatus("success");
|
|
594
678
|
return response2.txHash;
|
|
595
679
|
}
|
|
596
680
|
const response = await connect.request("stx_callContract", {
|
|
@@ -606,12 +690,12 @@ var useWriteContract = () => {
|
|
|
606
690
|
throw new Error("No transaction ID returned");
|
|
607
691
|
}
|
|
608
692
|
setData(response.txid);
|
|
609
|
-
|
|
693
|
+
setStatus("success");
|
|
610
694
|
return response.txid;
|
|
611
695
|
} catch (err) {
|
|
612
696
|
const error2 = err instanceof Error ? err : new Error(String(err));
|
|
613
697
|
setError(error2);
|
|
614
|
-
|
|
698
|
+
setStatus("error");
|
|
615
699
|
throw error2;
|
|
616
700
|
}
|
|
617
701
|
},
|
|
@@ -629,13 +713,26 @@ var useWriteContract = () => {
|
|
|
629
713
|
},
|
|
630
714
|
[writeContractAsync]
|
|
631
715
|
);
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
716
|
+
const reset = react.useCallback(() => {
|
|
717
|
+
setData(void 0);
|
|
718
|
+
setError(null);
|
|
719
|
+
setStatus("idle");
|
|
720
|
+
}, []);
|
|
721
|
+
return react.useMemo(
|
|
722
|
+
() => ({
|
|
723
|
+
writeContract,
|
|
724
|
+
writeContractAsync,
|
|
725
|
+
reset,
|
|
726
|
+
data,
|
|
727
|
+
error,
|
|
728
|
+
isError: status === "error",
|
|
729
|
+
isIdle: status === "idle",
|
|
730
|
+
isPending: status === "pending",
|
|
731
|
+
isSuccess: status === "success",
|
|
732
|
+
status
|
|
733
|
+
}),
|
|
734
|
+
[writeContract, writeContractAsync, reset, data, error, status]
|
|
735
|
+
);
|
|
639
736
|
};
|
|
640
737
|
var useBnsName = (address) => {
|
|
641
738
|
const [bnsName, setBnsName] = react.useState(null);
|
package/dist/index.cjs.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":["WalletConnect","getSelectedProvider","connect","useState","useEffect","createContext","useRef","setSelectedProviderId","useCallback","data","request","clearSelectedProviderId","useMemo","jsx","useContext","error","postConditionToHex","cvToHex","response","PostConditionMode","getPrimaryName"],"mappings":"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","file":"index.cjs","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 walletInfos = useMemo(() => {\n const { installed } = getStacksWallets();\n const configured = wallets ?? [...SUPPORTED_STACKS_WALLETS];\n\n return configured.map((w) => ({\n id: w,\n available:\n w === 'wallet-connect'\n ? !!walletConnect?.projectId\n : installed.includes(w),\n }));\n }, [walletsKey, walletConnect?.projectId]);\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 { useMemo } from \"react\";\n\nimport { useStacksWalletContext } from \"../provider/stacks-wallet-provider\";\n\nexport const useConnect = () => {\n const { connect, reset, status } = useStacksWalletContext();\n\n const value = useMemo(\n () => ({\n connect,\n reset,\n isPending: status === \"connecting\",\n }),\n [connect, reset, status]\n );\n\n return value;\n};\n","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { useStacksWalletContext } from \"../provider/stacks-wallet-provider\";\n\nexport const useDisconnect = () => {\n const { disconnect } = useStacksWalletContext();\n\n return useMemo(\n () => ({\n disconnect,\n }),\n [disconnect]\n );\n};\n","'use client';\n\nimport { request } from '@stacks/connect';\nimport { useCallback, useState } from 'react';\n\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 [isPending, setIsPending] = useState(false);\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 setIsPending(true);\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 setIsPending(false);\n return result;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsPending(false);\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 return {\n signMessage,\n signMessageAsync,\n data,\n error,\n isPending,\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, useState } from 'react';\n\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 [isPending, setIsPending] = useState(false);\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 setIsPending(true);\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 setIsPending(false);\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 setIsPending(false);\n return response.txid;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsPending(false);\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 return {\n writeContract,\n writeContractAsync,\n data,\n error,\n isPending,\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":["WalletConnect","getSelectedProvider","connect","useState","useEffect","createContext","useRef","setSelectedProviderId","useCallback","data","request","clearSelectedProviderId","useMemo","jsx","useContext","error","postConditionToHex","cvToHex","response","PostConditionMode","getPrimaryName"],"mappings":"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","file":"index.cjs","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 walletInfos = useMemo(() => {\n const { installed } = getStacksWallets();\n const configured = wallets ?? [...SUPPORTED_STACKS_WALLETS];\n\n return configured.map((w) => ({\n id: w,\n available:\n w === 'wallet-connect'\n ? !!walletConnect?.projectId\n : installed.includes(w),\n }));\n }, [walletsKey, walletConnect?.projectId]);\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"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -5,6 +5,7 @@ declare const SUPPORTED_STACKS_WALLETS: readonly ["xverse", "leather", "okx", "a
|
|
|
5
5
|
type SupportedStacksWallet = (typeof SUPPORTED_STACKS_WALLETS)[number];
|
|
6
6
|
|
|
7
7
|
type StacksChain = 'mainnet' | 'testnet';
|
|
8
|
+
type MutationStatus = 'idle' | 'pending' | 'error' | 'success';
|
|
8
9
|
interface WalletConnectMetadata {
|
|
9
10
|
name: string;
|
|
10
11
|
description: string;
|
|
@@ -71,11 +72,23 @@ declare const useAddress: () => UseAddressReturn;
|
|
|
71
72
|
declare const useConnect: () => {
|
|
72
73
|
connect: (providerId: SupportedStacksWallet, options?: ConnectOptions) => Promise<void>;
|
|
73
74
|
reset: () => void;
|
|
75
|
+
error: Error | null;
|
|
76
|
+
isError: boolean;
|
|
77
|
+
isIdle: boolean;
|
|
74
78
|
isPending: boolean;
|
|
79
|
+
isSuccess: boolean;
|
|
80
|
+
status: MutationStatus;
|
|
75
81
|
};
|
|
76
82
|
|
|
77
83
|
declare const useDisconnect: () => {
|
|
78
84
|
disconnect: (callback?: () => void) => void;
|
|
85
|
+
reset: () => void;
|
|
86
|
+
error: Error | null;
|
|
87
|
+
isError: boolean;
|
|
88
|
+
isIdle: boolean;
|
|
89
|
+
isPending: boolean;
|
|
90
|
+
isSuccess: boolean;
|
|
91
|
+
status: MutationStatus;
|
|
79
92
|
};
|
|
80
93
|
|
|
81
94
|
interface SignMessageVariables {
|
|
@@ -94,9 +107,14 @@ interface SignMessageOptions {
|
|
|
94
107
|
declare const useSignMessage: () => {
|
|
95
108
|
signMessage: (variables: SignMessageVariables, options?: SignMessageOptions) => void;
|
|
96
109
|
signMessageAsync: (variables: SignMessageVariables) => Promise<SignMessageData>;
|
|
110
|
+
reset: () => void;
|
|
97
111
|
data: SignMessageData | undefined;
|
|
98
112
|
error: Error | null;
|
|
113
|
+
isError: boolean;
|
|
114
|
+
isIdle: boolean;
|
|
99
115
|
isPending: boolean;
|
|
116
|
+
isSuccess: boolean;
|
|
117
|
+
status: MutationStatus;
|
|
100
118
|
};
|
|
101
119
|
|
|
102
120
|
interface PostConditionConfig {
|
|
@@ -119,9 +137,14 @@ interface WriteContractOptions {
|
|
|
119
137
|
declare const useWriteContract: () => {
|
|
120
138
|
writeContract: (variables: WriteContractVariables, options?: WriteContractOptions) => void;
|
|
121
139
|
writeContractAsync: (variables: WriteContractVariables) => Promise<string>;
|
|
140
|
+
reset: () => void;
|
|
122
141
|
data: string | undefined;
|
|
123
142
|
error: Error | null;
|
|
143
|
+
isError: boolean;
|
|
144
|
+
isIdle: boolean;
|
|
124
145
|
isPending: boolean;
|
|
146
|
+
isSuccess: boolean;
|
|
147
|
+
status: MutationStatus;
|
|
125
148
|
};
|
|
126
149
|
|
|
127
150
|
declare const useBnsName: (address?: string) => {
|
|
@@ -146,4 +169,4 @@ interface StacksWallets {
|
|
|
146
169
|
}
|
|
147
170
|
declare const getStacksWallets: () => StacksWallets;
|
|
148
171
|
|
|
149
|
-
export { type ConnectOptions, type PostConditionConfig, SUPPORTED_STACKS_WALLETS, type SignMessageData, type SignMessageOptions, type SignMessageVariables, type StacksChain, StacksWalletProvider, type StacksWallets, type SupportedStacksWallet, type WalletConnectMetadata, type WalletContextValue, type WalletInfo, type WalletState, type WriteContractOptions, type WriteContractVariables, getLocalStorageWallet, getNetworkFromAddress, getStacksWallets, useAddress, useBnsName, useConnect, useDisconnect, useSignMessage, useWallets, useWriteContract };
|
|
172
|
+
export { type ConnectOptions, type MutationStatus, type PostConditionConfig, SUPPORTED_STACKS_WALLETS, type SignMessageData, type SignMessageOptions, type SignMessageVariables, type StacksChain, StacksWalletProvider, type StacksWallets, type SupportedStacksWallet, type WalletConnectMetadata, type WalletContextValue, type WalletInfo, type WalletState, type WriteContractOptions, type WriteContractVariables, getLocalStorageWallet, getNetworkFromAddress, getStacksWallets, useAddress, useBnsName, useConnect, useDisconnect, useSignMessage, useWallets, useWriteContract };
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ declare const SUPPORTED_STACKS_WALLETS: readonly ["xverse", "leather", "okx", "a
|
|
|
5
5
|
type SupportedStacksWallet = (typeof SUPPORTED_STACKS_WALLETS)[number];
|
|
6
6
|
|
|
7
7
|
type StacksChain = 'mainnet' | 'testnet';
|
|
8
|
+
type MutationStatus = 'idle' | 'pending' | 'error' | 'success';
|
|
8
9
|
interface WalletConnectMetadata {
|
|
9
10
|
name: string;
|
|
10
11
|
description: string;
|
|
@@ -71,11 +72,23 @@ declare const useAddress: () => UseAddressReturn;
|
|
|
71
72
|
declare const useConnect: () => {
|
|
72
73
|
connect: (providerId: SupportedStacksWallet, options?: ConnectOptions) => Promise<void>;
|
|
73
74
|
reset: () => void;
|
|
75
|
+
error: Error | null;
|
|
76
|
+
isError: boolean;
|
|
77
|
+
isIdle: boolean;
|
|
74
78
|
isPending: boolean;
|
|
79
|
+
isSuccess: boolean;
|
|
80
|
+
status: MutationStatus;
|
|
75
81
|
};
|
|
76
82
|
|
|
77
83
|
declare const useDisconnect: () => {
|
|
78
84
|
disconnect: (callback?: () => void) => void;
|
|
85
|
+
reset: () => void;
|
|
86
|
+
error: Error | null;
|
|
87
|
+
isError: boolean;
|
|
88
|
+
isIdle: boolean;
|
|
89
|
+
isPending: boolean;
|
|
90
|
+
isSuccess: boolean;
|
|
91
|
+
status: MutationStatus;
|
|
79
92
|
};
|
|
80
93
|
|
|
81
94
|
interface SignMessageVariables {
|
|
@@ -94,9 +107,14 @@ interface SignMessageOptions {
|
|
|
94
107
|
declare const useSignMessage: () => {
|
|
95
108
|
signMessage: (variables: SignMessageVariables, options?: SignMessageOptions) => void;
|
|
96
109
|
signMessageAsync: (variables: SignMessageVariables) => Promise<SignMessageData>;
|
|
110
|
+
reset: () => void;
|
|
97
111
|
data: SignMessageData | undefined;
|
|
98
112
|
error: Error | null;
|
|
113
|
+
isError: boolean;
|
|
114
|
+
isIdle: boolean;
|
|
99
115
|
isPending: boolean;
|
|
116
|
+
isSuccess: boolean;
|
|
117
|
+
status: MutationStatus;
|
|
100
118
|
};
|
|
101
119
|
|
|
102
120
|
interface PostConditionConfig {
|
|
@@ -119,9 +137,14 @@ interface WriteContractOptions {
|
|
|
119
137
|
declare const useWriteContract: () => {
|
|
120
138
|
writeContract: (variables: WriteContractVariables, options?: WriteContractOptions) => void;
|
|
121
139
|
writeContractAsync: (variables: WriteContractVariables) => Promise<string>;
|
|
140
|
+
reset: () => void;
|
|
122
141
|
data: string | undefined;
|
|
123
142
|
error: Error | null;
|
|
143
|
+
isError: boolean;
|
|
144
|
+
isIdle: boolean;
|
|
124
145
|
isPending: boolean;
|
|
146
|
+
isSuccess: boolean;
|
|
147
|
+
status: MutationStatus;
|
|
125
148
|
};
|
|
126
149
|
|
|
127
150
|
declare const useBnsName: (address?: string) => {
|
|
@@ -146,4 +169,4 @@ interface StacksWallets {
|
|
|
146
169
|
}
|
|
147
170
|
declare const getStacksWallets: () => StacksWallets;
|
|
148
171
|
|
|
149
|
-
export { type ConnectOptions, type PostConditionConfig, SUPPORTED_STACKS_WALLETS, type SignMessageData, type SignMessageOptions, type SignMessageVariables, type StacksChain, StacksWalletProvider, type StacksWallets, type SupportedStacksWallet, type WalletConnectMetadata, type WalletContextValue, type WalletInfo, type WalletState, type WriteContractOptions, type WriteContractVariables, getLocalStorageWallet, getNetworkFromAddress, getStacksWallets, useAddress, useBnsName, useConnect, useDisconnect, useSignMessage, useWallets, useWriteContract };
|
|
172
|
+
export { type ConnectOptions, type MutationStatus, type PostConditionConfig, SUPPORTED_STACKS_WALLETS, type SignMessageData, type SignMessageOptions, type SignMessageVariables, type StacksChain, StacksWalletProvider, type StacksWallets, type SupportedStacksWallet, type WalletConnectMetadata, type WalletContextValue, type WalletInfo, type WalletState, type WriteContractOptions, type WriteContractVariables, getLocalStorageWallet, getNetworkFromAddress, getStacksWallets, useAddress, useBnsName, useConnect, useDisconnect, useSignMessage, useWallets, useWriteContract };
|
package/dist/index.js
CHANGED
|
@@ -459,37 +459,108 @@ var useAddress = () => {
|
|
|
459
459
|
}, [address, status, provider]);
|
|
460
460
|
};
|
|
461
461
|
var useConnect = () => {
|
|
462
|
-
const {
|
|
462
|
+
const {
|
|
463
|
+
connect: contextConnect,
|
|
464
|
+
reset: contextReset,
|
|
465
|
+
status: walletStatus
|
|
466
|
+
} = useStacksWalletContext();
|
|
467
|
+
const [error, setError] = useState(null);
|
|
468
|
+
const [mutationStatus, setMutationStatus] = useState("idle");
|
|
469
|
+
const connect = useCallback(
|
|
470
|
+
async (providerId, options) => {
|
|
471
|
+
setError(null);
|
|
472
|
+
setMutationStatus("pending");
|
|
473
|
+
let settled = false;
|
|
474
|
+
try {
|
|
475
|
+
await contextConnect(providerId, {
|
|
476
|
+
onSuccess: (address, provider) => {
|
|
477
|
+
settled = true;
|
|
478
|
+
setMutationStatus("success");
|
|
479
|
+
options?.onSuccess?.(address, provider);
|
|
480
|
+
},
|
|
481
|
+
onError: (err) => {
|
|
482
|
+
settled = true;
|
|
483
|
+
setError(err);
|
|
484
|
+
setMutationStatus("error");
|
|
485
|
+
options?.onError?.(err);
|
|
486
|
+
}
|
|
487
|
+
});
|
|
488
|
+
} finally {
|
|
489
|
+
if (!settled) {
|
|
490
|
+
setMutationStatus("idle");
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
},
|
|
494
|
+
[contextConnect]
|
|
495
|
+
);
|
|
496
|
+
const reset = useCallback(() => {
|
|
497
|
+
setError(null);
|
|
498
|
+
setMutationStatus("idle");
|
|
499
|
+
contextReset();
|
|
500
|
+
}, [contextReset]);
|
|
463
501
|
const value = useMemo(
|
|
464
502
|
() => ({
|
|
465
503
|
connect,
|
|
466
504
|
reset,
|
|
467
|
-
|
|
505
|
+
error,
|
|
506
|
+
isError: mutationStatus === "error",
|
|
507
|
+
isIdle: mutationStatus === "idle",
|
|
508
|
+
isPending: mutationStatus === "pending" || walletStatus === "connecting",
|
|
509
|
+
isSuccess: mutationStatus === "success",
|
|
510
|
+
status: mutationStatus
|
|
468
511
|
}),
|
|
469
|
-
[connect, reset,
|
|
512
|
+
[connect, reset, error, mutationStatus, walletStatus]
|
|
470
513
|
);
|
|
471
514
|
return value;
|
|
472
515
|
};
|
|
473
516
|
var useDisconnect = () => {
|
|
474
|
-
const { disconnect } = useStacksWalletContext();
|
|
475
|
-
|
|
517
|
+
const { disconnect: contextDisconnect } = useStacksWalletContext();
|
|
518
|
+
const [error, setError] = useState(null);
|
|
519
|
+
const [mutationStatus, setMutationStatus] = useState("idle");
|
|
520
|
+
const disconnect = useCallback(
|
|
521
|
+
(callback) => {
|
|
522
|
+
setError(null);
|
|
523
|
+
try {
|
|
524
|
+
contextDisconnect(callback);
|
|
525
|
+
setMutationStatus("success");
|
|
526
|
+
} catch (err) {
|
|
527
|
+
const normalizedError = err instanceof Error ? err : new Error(String(err));
|
|
528
|
+
setError(normalizedError);
|
|
529
|
+
setMutationStatus("error");
|
|
530
|
+
}
|
|
531
|
+
},
|
|
532
|
+
[contextDisconnect]
|
|
533
|
+
);
|
|
534
|
+
const reset = useCallback(() => {
|
|
535
|
+
setError(null);
|
|
536
|
+
setMutationStatus("idle");
|
|
537
|
+
}, []);
|
|
538
|
+
const value = useMemo(
|
|
476
539
|
() => ({
|
|
477
|
-
disconnect
|
|
540
|
+
disconnect,
|
|
541
|
+
reset,
|
|
542
|
+
error,
|
|
543
|
+
isError: mutationStatus === "error",
|
|
544
|
+
isIdle: mutationStatus === "idle",
|
|
545
|
+
isPending: mutationStatus === "pending",
|
|
546
|
+
isSuccess: mutationStatus === "success",
|
|
547
|
+
status: mutationStatus
|
|
478
548
|
}),
|
|
479
|
-
[disconnect]
|
|
549
|
+
[disconnect, reset, error, mutationStatus]
|
|
480
550
|
);
|
|
551
|
+
return value;
|
|
481
552
|
};
|
|
482
553
|
var useSignMessage = () => {
|
|
483
554
|
const { isConnected, provider } = useAddress();
|
|
484
555
|
const [data, setData] = useState(void 0);
|
|
485
556
|
const [error, setError] = useState(null);
|
|
486
|
-
const [
|
|
557
|
+
const [status, setStatus] = useState("idle");
|
|
487
558
|
const signMessageAsync = useCallback(
|
|
488
559
|
async (variables) => {
|
|
489
560
|
if (!isConnected) {
|
|
490
561
|
throw new Error("Wallet is not connected");
|
|
491
562
|
}
|
|
492
|
-
|
|
563
|
+
setStatus("pending");
|
|
493
564
|
setError(null);
|
|
494
565
|
setData(void 0);
|
|
495
566
|
try {
|
|
@@ -510,12 +581,12 @@ var useSignMessage = () => {
|
|
|
510
581
|
});
|
|
511
582
|
}
|
|
512
583
|
setData(result);
|
|
513
|
-
|
|
584
|
+
setStatus("success");
|
|
514
585
|
return result;
|
|
515
586
|
} catch (err) {
|
|
516
587
|
const error2 = err instanceof Error ? err : new Error(String(err));
|
|
517
588
|
setError(error2);
|
|
518
|
-
|
|
589
|
+
setStatus("error");
|
|
519
590
|
throw error2;
|
|
520
591
|
}
|
|
521
592
|
},
|
|
@@ -533,13 +604,26 @@ var useSignMessage = () => {
|
|
|
533
604
|
},
|
|
534
605
|
[signMessageAsync]
|
|
535
606
|
);
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
607
|
+
const reset = useCallback(() => {
|
|
608
|
+
setData(void 0);
|
|
609
|
+
setError(null);
|
|
610
|
+
setStatus("idle");
|
|
611
|
+
}, []);
|
|
612
|
+
return useMemo(
|
|
613
|
+
() => ({
|
|
614
|
+
signMessage,
|
|
615
|
+
signMessageAsync,
|
|
616
|
+
reset,
|
|
617
|
+
data,
|
|
618
|
+
error,
|
|
619
|
+
isError: status === "error",
|
|
620
|
+
isIdle: status === "idle",
|
|
621
|
+
isPending: status === "pending",
|
|
622
|
+
isSuccess: status === "success",
|
|
623
|
+
status
|
|
624
|
+
}),
|
|
625
|
+
[signMessage, signMessageAsync, reset, data, error, status]
|
|
626
|
+
);
|
|
543
627
|
};
|
|
544
628
|
|
|
545
629
|
// src/utils/get-network-from-address.ts
|
|
@@ -560,13 +644,13 @@ var useWriteContract = () => {
|
|
|
560
644
|
const { isConnected, address, provider } = useAddress();
|
|
561
645
|
const [data, setData] = useState(void 0);
|
|
562
646
|
const [error, setError] = useState(null);
|
|
563
|
-
const [
|
|
647
|
+
const [status, setStatus] = useState("idle");
|
|
564
648
|
const writeContractAsync = useCallback(
|
|
565
649
|
async (variables) => {
|
|
566
650
|
if (!isConnected || !address) {
|
|
567
651
|
throw new Error("Wallet is not connected");
|
|
568
652
|
}
|
|
569
|
-
|
|
653
|
+
setStatus("pending");
|
|
570
654
|
setError(null);
|
|
571
655
|
setData(void 0);
|
|
572
656
|
try {
|
|
@@ -588,7 +672,7 @@ var useWriteContract = () => {
|
|
|
588
672
|
anchorMode: 3
|
|
589
673
|
});
|
|
590
674
|
setData(response2.txHash);
|
|
591
|
-
|
|
675
|
+
setStatus("success");
|
|
592
676
|
return response2.txHash;
|
|
593
677
|
}
|
|
594
678
|
const response = await request("stx_callContract", {
|
|
@@ -604,12 +688,12 @@ var useWriteContract = () => {
|
|
|
604
688
|
throw new Error("No transaction ID returned");
|
|
605
689
|
}
|
|
606
690
|
setData(response.txid);
|
|
607
|
-
|
|
691
|
+
setStatus("success");
|
|
608
692
|
return response.txid;
|
|
609
693
|
} catch (err) {
|
|
610
694
|
const error2 = err instanceof Error ? err : new Error(String(err));
|
|
611
695
|
setError(error2);
|
|
612
|
-
|
|
696
|
+
setStatus("error");
|
|
613
697
|
throw error2;
|
|
614
698
|
}
|
|
615
699
|
},
|
|
@@ -627,13 +711,26 @@ var useWriteContract = () => {
|
|
|
627
711
|
},
|
|
628
712
|
[writeContractAsync]
|
|
629
713
|
);
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
714
|
+
const reset = useCallback(() => {
|
|
715
|
+
setData(void 0);
|
|
716
|
+
setError(null);
|
|
717
|
+
setStatus("idle");
|
|
718
|
+
}, []);
|
|
719
|
+
return useMemo(
|
|
720
|
+
() => ({
|
|
721
|
+
writeContract,
|
|
722
|
+
writeContractAsync,
|
|
723
|
+
reset,
|
|
724
|
+
data,
|
|
725
|
+
error,
|
|
726
|
+
isError: status === "error",
|
|
727
|
+
isIdle: status === "idle",
|
|
728
|
+
isPending: status === "pending",
|
|
729
|
+
isSuccess: status === "success",
|
|
730
|
+
status
|
|
731
|
+
}),
|
|
732
|
+
[writeContract, writeContractAsync, reset, data, error, status]
|
|
733
|
+
);
|
|
637
734
|
};
|
|
638
735
|
var useBnsName = (address) => {
|
|
639
736
|
const [bnsName, setBnsName] = useState(null);
|
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 walletInfos = useMemo(() => {\n const { installed } = getStacksWallets();\n const configured = wallets ?? [...SUPPORTED_STACKS_WALLETS];\n\n return configured.map((w) => ({\n id: w,\n available:\n w === 'wallet-connect'\n ? !!walletConnect?.projectId\n : installed.includes(w),\n }));\n }, [walletsKey, walletConnect?.projectId]);\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 { useMemo } from \"react\";\n\nimport { useStacksWalletContext } from \"../provider/stacks-wallet-provider\";\n\nexport const useConnect = () => {\n const { connect, reset, status } = useStacksWalletContext();\n\n const value = useMemo(\n () => ({\n connect,\n reset,\n isPending: status === \"connecting\",\n }),\n [connect, reset, status]\n );\n\n return value;\n};\n","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { useStacksWalletContext } from \"../provider/stacks-wallet-provider\";\n\nexport const useDisconnect = () => {\n const { disconnect } = useStacksWalletContext();\n\n return useMemo(\n () => ({\n disconnect,\n }),\n [disconnect]\n );\n};\n","'use client';\n\nimport { request } from '@stacks/connect';\nimport { useCallback, useState } from 'react';\n\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 [isPending, setIsPending] = useState(false);\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 setIsPending(true);\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 setIsPending(false);\n return result;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsPending(false);\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 return {\n signMessage,\n signMessageAsync,\n data,\n error,\n isPending,\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, useState } from 'react';\n\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 [isPending, setIsPending] = useState(false);\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 setIsPending(true);\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 setIsPending(false);\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 setIsPending(false);\n return response.txid;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsPending(false);\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 return {\n writeContract,\n writeContractAsync,\n data,\n error,\n isPending,\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","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 walletInfos = useMemo(() => {\n const { installed } = getStacksWallets();\n const configured = wallets ?? [...SUPPORTED_STACKS_WALLETS];\n\n return configured.map((w) => ({\n id: w,\n available:\n w === 'wallet-connect'\n ? !!walletConnect?.projectId\n : installed.includes(w),\n }));\n }, [walletsKey, walletConnect?.projectId]);\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@satoshai/kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Typesafe Stacks wallet & contract interaction library for React",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -27,15 +27,18 @@
|
|
|
27
27
|
"bns-v2-sdk": "^2.1.0"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
30
|
+
"@stacks/transactions": ">=7.0.0",
|
|
30
31
|
"react": "^18.0.0 || ^19.0.0",
|
|
31
|
-
"react-dom": "^18.0.0 || ^19.0.0"
|
|
32
|
-
"@stacks/transactions": ">=7.0.0"
|
|
32
|
+
"react-dom": "^18.0.0 || ^19.0.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@stacks/transactions": "^7.2.0",
|
|
36
|
+
"@testing-library/react": "^16.3.2",
|
|
37
|
+
"@types/node": "^22.0.0",
|
|
36
38
|
"@types/react": "^19.2.2",
|
|
37
39
|
"@types/react-dom": "^19.2.2",
|
|
38
|
-
"@
|
|
40
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
41
|
+
"happy-dom": "^20.7.0",
|
|
39
42
|
"react": "^19.0.0",
|
|
40
43
|
"react-dom": "^19.0.0",
|
|
41
44
|
"tsup": "^8.3.0",
|