@naculus/connect-appkit-react 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/LICENSE +21 -0
  2. package/api-extractor.json +21 -0
  3. package/dist/client.cjs +2 -0
  4. package/dist/client.cjs.map +1 -0
  5. package/dist/client.js +2 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/index.cjs +2 -0
  8. package/dist/index.cjs.map +1 -0
  9. package/dist/index.js +2 -0
  10. package/dist/index.js.map +1 -0
  11. package/package.json +39 -0
  12. package/src/chain-abstraction/index.ts +8 -0
  13. package/src/chain-abstraction/useCompareCosts.ts +137 -0
  14. package/src/chain-abstraction/useExecuteRoute.ts +129 -0
  15. package/src/chain-abstraction/useRouteQuote.ts +168 -0
  16. package/src/client.test.ts +242 -0
  17. package/src/client.ts +265 -0
  18. package/src/hooks/useAccount.test.ts +67 -0
  19. package/src/hooks/useAccount.ts +37 -0
  20. package/src/hooks/useBalance.test.ts +459 -0
  21. package/src/hooks/useBalance.ts +170 -0
  22. package/src/hooks/useChain.test.ts +160 -0
  23. package/src/hooks/useChain.ts +53 -0
  24. package/src/hooks/useConnect.test.ts +112 -0
  25. package/src/hooks/useConnect.ts +29 -0
  26. package/src/hooks/useDisconnect.test.ts +75 -0
  27. package/src/hooks/useDisconnect.ts +32 -0
  28. package/src/hooks/useERC20Allowance.ts +93 -0
  29. package/src/hooks/useERC20Approve.ts +220 -0
  30. package/src/hooks/useERC20Transfer.ts +134 -0
  31. package/src/hooks/useERC20TransferSimulation.ts +147 -0
  32. package/src/hooks/useEmbeddedWallet.test.ts +266 -0
  33. package/src/hooks/useEmbeddedWallet.ts +181 -0
  34. package/src/hooks/useLastTx.test.ts +117 -0
  35. package/src/hooks/useLastTx.ts +73 -0
  36. package/src/hooks/useLookupAddress.ts +131 -0
  37. package/src/hooks/useNotification.ts +308 -0
  38. package/src/hooks/useResolveName.ts +128 -0
  39. package/src/hooks/useSIWxLogin.test.ts +307 -0
  40. package/src/hooks/useSIWxLogin.ts +163 -0
  41. package/src/hooks/useSIWxSession.test.ts +481 -0
  42. package/src/hooks/useSIWxSession.ts +290 -0
  43. package/src/hooks/useSendCalls.ts +103 -0
  44. package/src/hooks/useSendTransaction.test.ts +175 -0
  45. package/src/hooks/useSendTransaction.ts +80 -0
  46. package/src/hooks/useSendUserOperation.ts +313 -0
  47. package/src/hooks/useSession.ts +96 -0
  48. package/src/hooks/useSessionKeys.ts +356 -0
  49. package/src/hooks/useSignInWithEthereum.test.ts +224 -0
  50. package/src/hooks/useSignInWithEthereum.ts +46 -0
  51. package/src/hooks/useSignInWithX.test.ts +210 -0
  52. package/src/hooks/useSignInWithX.ts +141 -0
  53. package/src/hooks/useSignMessage.test.ts +151 -0
  54. package/src/hooks/useSignMessage.ts +65 -0
  55. package/src/hooks/useSimulateTransfer.ts +165 -0
  56. package/src/hooks/useSiwxAuthSession.test.ts +456 -0
  57. package/src/hooks/useSiwxAuthSession.ts +163 -0
  58. package/src/hooks/useSmartAccount.ts +194 -0
  59. package/src/hooks/useSwitchChain.ts +68 -0
  60. package/src/hooks/useTokenBalance.test.ts +337 -0
  61. package/src/hooks/useTokenBalance.ts +210 -0
  62. package/src/hooks/useTransactionSimulation.ts +401 -0
  63. package/src/hooks/useTxHistory.test.ts +108 -0
  64. package/src/hooks/useTxHistory.ts +83 -0
  65. package/src/hooks/useTxMonitor.test.ts +127 -0
  66. package/src/hooks/useTxMonitor.ts +178 -0
  67. package/src/hooks/useUserOpStatus.ts +245 -0
  68. package/src/hooks/useValidateDestination.test.ts +96 -0
  69. package/src/hooks/useValidateDestination.ts +72 -0
  70. package/src/hooks/useViemClient.test.ts +155 -0
  71. package/src/hooks/useViemClient.ts +65 -0
  72. package/src/hooks/useWallet.test.ts +133 -0
  73. package/src/hooks/useWallet.ts +39 -0
  74. package/src/hooks/useWeb3ErrorHandler.ts +102 -0
  75. package/src/index.ts +186 -0
  76. package/src/provider/Web3ConnectProvider.test.tsx +178 -0
  77. package/src/provider/Web3ConnectProvider.tsx +530 -0
  78. package/src/token-list/TokenSelector.tsx +351 -0
  79. package/src/token-list/defaults.ts +39 -0
  80. package/src/token-list/index.ts +14 -0
  81. package/src/token-list/useTokenList.ts +119 -0
  82. package/src/token-list/useTokenSearch.ts +99 -0
  83. package/src/types/index.ts +99 -0
  84. package/src/utils/chains.ts +115 -0
  85. package/src/utils/errorMessages.ts +142 -0
  86. package/src/utils/i18n.ts +90 -0
  87. package/src/wc-generated/components.ts +377 -0
  88. package/test/setup.ts +17 -0
  89. package/test/test-utils.tsx +78 -0
  90. package/tsup.config.ts +18 -0
package/src/index.ts ADDED
@@ -0,0 +1,186 @@
1
+ export { Web3ConnectProvider, useWeb3 } from "./provider/Web3ConnectProvider";
2
+ export type { Web3ConnectProviderProps } from "./provider/Web3ConnectProvider";
3
+
4
+ export { useWallet } from "./hooks/useWallet";
5
+ export { useConnect } from "./hooks/useConnect";
6
+ export { useDisconnect } from "./hooks/useDisconnect";
7
+ export { useAccount } from "./hooks/useAccount";
8
+ export { useChain } from "./hooks/useChain";
9
+ export { useSignMessage } from "./hooks/useSignMessage";
10
+ export { useSendTransaction } from "./hooks/useSendTransaction";
11
+ export { useSendCalls } from "./hooks/useSendCalls";
12
+ export type { SendCallsStatus } from "./hooks/useSendCalls";
13
+ export { useBalance } from "./hooks/useBalance";
14
+ export { useTokenBalance } from "./hooks/useTokenBalance";
15
+ export type { TokenInfo, UseTokenBalanceOptions, TokenBalanceResult } from "./hooks/useTokenBalance";
16
+ export { useERC20Transfer } from "./hooks/useERC20Transfer";
17
+ export type { UseERC20TransferOptions, UseERC20TransferReturn } from "./hooks/useERC20Transfer";
18
+ export { useERC20Approve } from "./hooks/useERC20Approve";
19
+ export type { UseERC20ApproveOptions, UseERC20ApproveReturn } from "./hooks/useERC20Approve";
20
+ export { useERC20Allowance } from "./hooks/useERC20Allowance";
21
+ export type { UseERC20AllowanceOptions, UseERC20AllowanceReturn } from "./hooks/useERC20Allowance";
22
+ export { useViemClient } from "./hooks/useViemClient";
23
+ export { useEmbeddedWallet } from "./hooks/useEmbeddedWallet";
24
+ export type { UseEmbeddedWalletReturn } from "./hooks/useEmbeddedWallet";
25
+ export { useValidateDestination, validateDestination } from "./hooks/useValidateDestination";
26
+ export type { UseValidateDestinationOptions, UseValidateDestinationReturn, AddressValidationLevel, AddressValidationResult } from "./hooks/useValidateDestination";
27
+ export { t, setLocale, getLocale } from "./utils/i18n";
28
+ export type { Locale } from "./utils/i18n";
29
+ export { useSignInWithX } from "./hooks/useSignInWithX";
30
+ export type { UseSignInWithXOptions, UseSignInWithXReturn } from "./hooks/useSignInWithX";
31
+ export { useSignInWithEthereum } from "./hooks/useSignInWithEthereum";
32
+ export type { UseSignInWithEthereumOptions, UseSignInWithEthereumReturn } from "./hooks/useSignInWithEthereum";
33
+ export { useSiwxAuthSession } from "./hooks/useSiwxAuthSession";
34
+ export type { UseSiwxAuthSessionOptions, UseSiwxAuthSessionReturn } from "./hooks/useSiwxAuthSession";
35
+ export { useSIWxLogin } from "./hooks/useSIWxLogin";
36
+ export type { UseSIWxLoginOptions, UseSIWxLoginReturn } from "./hooks/useSIWxLogin";
37
+ export { useSIWxSession } from "./hooks/useSIWxSession";
38
+ export type { UseSIWxSessionOptions, UseSIWxSessionReturn } from "./hooks/useSIWxSession";
39
+ export { useSessionKeys, useCreateSessionKey, useRevokeSession, useSendWithSession, resetSessionKeyManager } from "./hooks/useSessionKeys";
40
+ export type { UseSessionKeysReturn, UseCreateSessionKeyReturn, UseRevokeSessionReturn, UseSendWithSessionReturn } from "./hooks/useSessionKeys";
41
+ export { useResolveName } from "./hooks/useResolveName";
42
+ export type { UseResolveNameOptions, UseResolveNameResult } from "./hooks/useResolveName";
43
+ export { useLookupAddress } from "./hooks/useLookupAddress";
44
+ export type { UseLookupAddressOptions, UseLookupAddressResult } from "./hooks/useLookupAddress";
45
+ export { useSession } from "./hooks/useSession";
46
+ export type { UseSessionReturn } from "./hooks/useSession";
47
+ export { useSwitchChain } from "./hooks/useSwitchChain";
48
+ export type { UseSwitchChainReturn } from "./hooks/useSwitchChain";
49
+ export { createClient, getClient, clearClient } from "./client";
50
+ export type { ClientConfig, Web3Client } from "./client";
51
+ export { DEFAULT_EVM_CHAINS, getDefaultChains, getChainById } from "./utils/chains";
52
+ export type {
53
+ WalletChain,
54
+ ConnectionStatus,
55
+ Web3ConnectConfig,
56
+ Web3State,
57
+ Web3Actions,
58
+ UseWalletReturn,
59
+ EvmTransaction,
60
+ ChainInfo,
61
+ SIWxConfig,
62
+ } from "./types";
63
+ export { Web3Context } from "./provider/Web3ConnectProvider";
64
+ export { useWeb3ErrorHandler } from "./hooks/useWeb3ErrorHandler";
65
+ export { useTxMonitor, TxMonitorContext } from "./hooks/useTxMonitor";
66
+ export type { UseTxMonitorResult, TxMonitorLike, TxStatus, TxStatusEntry } from "./hooks/useTxMonitor";
67
+ export { useTxHistory } from "./hooks/useTxHistory";
68
+ export type { UseTxHistoryResult } from "./hooks/useTxHistory";
69
+ export { useTransactionSimulation } from "./hooks/useTransactionSimulation";
70
+ export type {
71
+ UseTransactionSimulationReturn,
72
+ SimulationResult,
73
+ SimulationStatus,
74
+ RiskLevel,
75
+ BalanceChange,
76
+ ApprovalChange,
77
+ RiskAssessment,
78
+ RiskWarning,
79
+ GasInfo,
80
+ } from "./hooks/useTransactionSimulation";
81
+ export { useERC20TransferSimulation } from "./hooks/useERC20TransferSimulation";
82
+ export type { UseERC20TransferSimulationOptions, UseERC20TransferSimulationReturn } from "./hooks/useERC20TransferSimulation";
83
+ export { useLastTx } from "./hooks/useLastTx";
84
+ export type { UseLastTxResult } from "./hooks/useLastTx";
85
+ export type { UseWeb3ErrorHandlerReturn, UserFriendlyError } from "./hooks/useWeb3ErrorHandler";
86
+ export {
87
+ getUserFriendlyError,
88
+ isRetryableError,
89
+ WALLET_ERROR_TITLES,
90
+ WALLET_ERROR_DESCRIPTIONS,
91
+ } from "./utils/errorMessages";
92
+ export { useSmartAccount } from "./hooks/useSmartAccount";
93
+ export type { UseSmartAccountOptions, UseSmartAccountReturn } from "./hooks/useSmartAccount";
94
+ export { useSendUserOperation } from "./hooks/useSendUserOperation";
95
+ export type { UseSendUserOperationOptions, UseSendUserOperationReturn } from "./hooks/useSendUserOperation";
96
+ export { useUserOpStatus } from "./hooks/useUserOpStatus";
97
+ export type { UseUserOpStatusOptions, UseUserOpStatusReturn, UserOpStatus } from "./hooks/useUserOpStatus";
98
+ export { useTokenList, useTokenSearch, TokenSelector } from "./token-list";
99
+ export type { UseTokenListOptions, UseTokenListReturn } from "./token-list";
100
+ export type { UseTokenSearchReturn } from "./token-list";
101
+ export type { TokenSelectorProps } from "./token-list";
102
+ export { useNotification } from "./hooks/useNotification";
103
+ export { useSimulateTransfer } from "./hooks/useSimulateTransfer";
104
+ export type {
105
+ UseSimulateTransferOptions,
106
+ UseSimulateTransferReturn,
107
+ } from "./hooks/useSimulateTransfer";
108
+ export { useRouteQuote, useExecuteRoute, useCompareCosts } from "./chain-abstraction";
109
+ export type {
110
+ UseRouteQuoteInput,
111
+ UseRouteQuoteReturn,
112
+ Quote,
113
+ QuoteOptions,
114
+ UseExecuteRouteReturn,
115
+ ExecuteError,
116
+ ExecuteRouteResult,
117
+ ExecuteOptions,
118
+ UseCompareCostsInput,
119
+ UseCompareCostsReturn,
120
+ CostComparison,
121
+ CostComparisonOperation,
122
+ CostComparisonOptions,
123
+ } from "./chain-abstraction";
124
+
125
+ // ── Stencil WC React wrappers ───────────────────────────────────
126
+
127
+ export {
128
+ AppkitAccordion,
129
+ AppkitAccountButton,
130
+ AppkitAlertDialog,
131
+ AppkitAvatar,
132
+ AppkitBadge,
133
+ AppkitButton,
134
+ AppkitCard,
135
+ AppkitCardContent,
136
+ AppkitCardDescription,
137
+ AppkitCardFooter,
138
+ AppkitCardHeader,
139
+ AppkitCardTitle,
140
+ AppkitCheckbox,
141
+ AppkitCollapsible,
142
+ AppkitConnectButton,
143
+ AppkitDialog,
144
+ AppkitDropdownMenu,
145
+ AppkitInput,
146
+ AppkitPopover,
147
+ AppkitProgress,
148
+ AppkitScrollArea,
149
+ AppkitSelect,
150
+ AppkitSeparator,
151
+ AppkitSkeleton,
152
+ AppkitSwitch,
153
+ AppkitTabs,
154
+ AppkitToggleGroup,
155
+ AppkitTooltip,
156
+ } from "./wc-generated/components"
157
+ export type {
158
+ AppkitAccordionEvents,
159
+ AppkitAccountButtonEvents,
160
+ AppkitAlertDialogEvents,
161
+ AppkitAvatarEvents,
162
+ AppkitBadgeEvents,
163
+ AppkitButtonEvents,
164
+ AppkitCardEvents,
165
+ AppkitCardContentEvents,
166
+ AppkitCardDescriptionEvents,
167
+ AppkitCardFooterEvents,
168
+ AppkitCardHeaderEvents,
169
+ AppkitCardTitleEvents,
170
+ AppkitCheckboxEvents,
171
+ AppkitCollapsibleEvents,
172
+ AppkitConnectButtonEvents,
173
+ AppkitDialogEvents,
174
+ AppkitDropdownMenuEvents,
175
+ AppkitInputEvents,
176
+ AppkitPopoverEvents,
177
+ AppkitProgressEvents,
178
+ AppkitScrollAreaEvents,
179
+ AppkitSelectEvents,
180
+ AppkitSeparatorEvents,
181
+ AppkitSkeletonEvents,
182
+ AppkitSwitchEvents,
183
+ AppkitTabsEvents,
184
+ AppkitToggleGroupEvents,
185
+ AppkitTooltipEvents,
186
+ } from "./wc-generated/components"
@@ -0,0 +1,178 @@
1
+ /// @vitest-environment jsdom
2
+
3
+ import { describe, it, expect, vi, beforeEach } from "vitest";
4
+ import { renderHook, act } from "@testing-library/react";
5
+ import React from "react";
6
+
7
+ // ── Hoisted mocks ──────────────────────────────────────────────────
8
+
9
+ const { mockClient } = vi.hoisted(() => ({
10
+ mockClient: {
11
+ connect: vi.fn(),
12
+ connectEmbedded: vi.fn(),
13
+ connectPasskeys: vi.fn(),
14
+ completePairing: vi.fn(),
15
+ signMessage: vi.fn(),
16
+ startPairing: vi.fn(),
17
+ connector: { onSessionExpiry: vi.fn() },
18
+ solanaConnector: null,
19
+ disconnect: vi.fn(),
20
+ reconnect: vi.fn(),
21
+ connectInjected: vi.fn(),
22
+ },
23
+ }));
24
+
25
+ vi.mock("../client", () => ({
26
+ createClient: vi.fn(() => mockClient),
27
+ }));
28
+
29
+ vi.mock("@naculus/connector-evm-injected", () => ({
30
+ eip6963Connector: { startDiscovery: vi.fn(), switchChain: vi.fn() },
31
+ }));
32
+
33
+ const { MockStorage } = vi.hoisted(() => {
34
+ return {
35
+ MockStorage: class {
36
+ save = vi.fn();
37
+ load = vi.fn();
38
+ clear = vi.fn();
39
+ },
40
+ };
41
+ });
42
+
43
+ vi.mock("@naculus/connect-core", () => ({
44
+ LocalStorageSessionStorage: MockStorage,
45
+ createConnectorManager: vi.fn(() => ({ register: vi.fn() })),
46
+ createSessionManager: vi.fn(() => ({
47
+ on: vi.fn(),
48
+ off: vi.fn(),
49
+ connect: vi.fn(),
50
+ disconnect: vi.fn(),
51
+ restoreFromPersistence: vi.fn(),
52
+ switchChain: vi.fn(),
53
+ })),
54
+ SessionManager: class {},
55
+ ConnectorManager: class {},
56
+ WalletError: class WalletError extends Error {
57
+ code: string;
58
+ constructor(code: string, message?: string) {
59
+ super(message ?? code);
60
+ this.name = "WalletError";
61
+ this.code = code;
62
+ }
63
+ },
64
+ logger: { warn: vi.fn(), error: vi.fn(), info: vi.fn() },
65
+ }));
66
+
67
+ vi.mock("../utils/chains", () => ({
68
+ getDefaultChains: vi.fn(() => []),
69
+ }));
70
+
71
+ import { Web3ConnectProvider, useWeb3 } from "./Web3ConnectProvider";
72
+
73
+ // ── Fixtures ───────────────────────────────────────────────────────
74
+
75
+ const mockSession = {
76
+ id: "test-session",
77
+ walletType: "eip155",
78
+ namespaces: {
79
+ "eip155": {
80
+ chains: ["eip155:1"],
81
+ accounts: ["eip155:1:0x1234567890abcdef"],
82
+ },
83
+ },
84
+ };
85
+
86
+ const siwxConfig = {
87
+ createMessage: vi.fn().mockResolvedValue("Sign this message"),
88
+ handleSignComplete: vi.fn().mockResolvedValue(undefined),
89
+ required: true,
90
+ };
91
+
92
+ const baseConfig = {
93
+ projectId: "test-project-id",
94
+ metadata: {
95
+ name: "Test",
96
+ description: "Test",
97
+ url: "https://test.com",
98
+ icons: ["https://test.com/icon.png"],
99
+ },
100
+ };
101
+
102
+ function renderWithProvider(config: Record<string, unknown> = {}) {
103
+ const wrapper = ({ children }: { children: React.ReactNode }) => (
104
+ <Web3ConnectProvider config={{ ...baseConfig, ...config } as any} autoConnect={false}>
105
+ {children}
106
+ </Web3ConnectProvider>
107
+ );
108
+ return renderHook(() => useWeb3(), { wrapper });
109
+ }
110
+
111
+ describe("Web3ConnectProvider — SIWx", () => {
112
+ beforeEach(() => {
113
+ vi.clearAllMocks();
114
+ mockClient.connect.mockReset().mockResolvedValue(mockSession);
115
+ mockClient.completePairing.mockReset().mockResolvedValue(mockSession);
116
+ mockClient.signMessage.mockReset().mockResolvedValue("0xsignature");
117
+ });
118
+
119
+ it("runSiwx is called after successful connection when config.siwx is set", async () => {
120
+ const { result } = renderWithProvider({ siwx: siwxConfig });
121
+
122
+ await act(async () => {
123
+ await result.current.connect();
124
+ });
125
+
126
+ expect(siwxConfig.createMessage).toHaveBeenCalledWith({
127
+ address: "0x1234567890abcdef",
128
+ chainId: "eip155:1",
129
+ });
130
+ expect(mockClient.signMessage).toHaveBeenCalled();
131
+ });
132
+
133
+ it("status becomes connected when SIWx succeeds", async () => {
134
+ const { result } = renderWithProvider({ siwx: siwxConfig });
135
+
136
+ await act(async () => {
137
+ await result.current.connect();
138
+ });
139
+
140
+ expect(result.current.status).toBe("connected");
141
+ });
142
+
143
+ it("status stays disconnected when SIWx is required and fails", async () => {
144
+ mockClient.signMessage.mockRejectedValue(new Error("SIWx failed"));
145
+ const { result } = renderWithProvider({ siwx: siwxConfig });
146
+
147
+ await act(async () => {
148
+ await result.current.connect();
149
+ });
150
+
151
+ expect(result.current.status).toBe("disconnected");
152
+ expect(result.current.session).toBeNull();
153
+ expect(result.current.error).toBeTruthy();
154
+ });
155
+
156
+ it("status becomes connected normally when siwx is not configured", async () => {
157
+ const { result } = renderWithProvider();
158
+
159
+ await act(async () => {
160
+ await result.current.connect();
161
+ });
162
+
163
+ expect(result.current.status).toBe("connected");
164
+ });
165
+
166
+ it("completePairing returns the session even when SIWx fails", async () => {
167
+ mockClient.signMessage.mockRejectedValue(new Error("SIWx failed"));
168
+ const { result } = renderWithProvider({ siwx: siwxConfig });
169
+
170
+ let session: unknown;
171
+ await act(async () => {
172
+ session = await result.current.completePairing();
173
+ });
174
+
175
+ expect(session).toBe(mockSession);
176
+ expect(result.current.status).toBe("disconnected");
177
+ });
178
+ });