thirdweb 5.73.0 → 5.74.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.
Files changed (121) hide show
  1. package/dist/cjs/adapters/eip1193/from-eip1193.js +2 -0
  2. package/dist/cjs/adapters/eip1193/from-eip1193.js.map +1 -1
  3. package/dist/cjs/adapters/eip1193/to-eip1193.js +2 -0
  4. package/dist/cjs/adapters/eip1193/to-eip1193.js.map +1 -1
  5. package/dist/cjs/exports/wallets/smart.js +2 -1
  6. package/dist/cjs/exports/wallets/smart.js.map +1 -1
  7. package/dist/cjs/extensions/erc20/read/isERC20.js +8 -1
  8. package/dist/cjs/extensions/erc20/read/isERC20.js.map +1 -1
  9. package/dist/cjs/react/web/ui/ConnectWallet/screens/SignatureScreen.js +12 -10
  10. package/dist/cjs/react/web/ui/ConnectWallet/screens/SignatureScreen.js.map +1 -1
  11. package/dist/cjs/react/web/ui/ConnectWallet/useConnectModal.js.map +1 -1
  12. package/dist/cjs/react/web/wallets/shared/ConnectWalletSocialOptions.js +1 -1
  13. package/dist/cjs/react/web/wallets/shared/ConnectWalletSocialOptions.js.map +1 -1
  14. package/dist/cjs/utils/any-evm/zksync/isZkSyncChain.js +4 -1
  15. package/dist/cjs/utils/any-evm/zksync/isZkSyncChain.js.map +1 -1
  16. package/dist/cjs/version.js +1 -1
  17. package/dist/cjs/wallets/ecosystem/is-ecosystem-wallet.js +1 -1
  18. package/dist/cjs/wallets/in-app/core/users/getUser.js +6 -1
  19. package/dist/cjs/wallets/in-app/core/users/getUser.js.map +1 -1
  20. package/dist/cjs/wallets/in-app/core/wallet/in-app-core.js +8 -4
  21. package/dist/cjs/wallets/in-app/core/wallet/in-app-core.js.map +1 -1
  22. package/dist/cjs/wallets/in-app/web/ecosystem.js +1 -1
  23. package/dist/cjs/wallets/in-app/web/in-app.js +2 -2
  24. package/dist/cjs/wallets/smart/index.js +19 -12
  25. package/dist/cjs/wallets/smart/index.js.map +1 -1
  26. package/dist/cjs/wallets/smart/lib/bundler.js +2 -1
  27. package/dist/cjs/wallets/smart/lib/bundler.js.map +1 -1
  28. package/dist/cjs/wallets/smart/lib/constants.js +21 -1
  29. package/dist/cjs/wallets/smart/lib/constants.js.map +1 -1
  30. package/dist/cjs/wallets/smart/lib/userop.js +19 -4
  31. package/dist/cjs/wallets/smart/lib/userop.js.map +1 -1
  32. package/dist/cjs/wallets/smart/smart-wallet.js +1 -1
  33. package/dist/cjs/wallets/smart/types.js.map +1 -1
  34. package/dist/esm/adapters/eip1193/from-eip1193.js +2 -0
  35. package/dist/esm/adapters/eip1193/from-eip1193.js.map +1 -1
  36. package/dist/esm/adapters/eip1193/to-eip1193.js +2 -0
  37. package/dist/esm/adapters/eip1193/to-eip1193.js.map +1 -1
  38. package/dist/esm/exports/wallets/smart.js +1 -1
  39. package/dist/esm/exports/wallets/smart.js.map +1 -1
  40. package/dist/esm/extensions/erc20/read/isERC20.js +8 -1
  41. package/dist/esm/extensions/erc20/read/isERC20.js.map +1 -1
  42. package/dist/esm/react/web/ui/ConnectWallet/screens/SignatureScreen.js +12 -10
  43. package/dist/esm/react/web/ui/ConnectWallet/screens/SignatureScreen.js.map +1 -1
  44. package/dist/esm/react/web/ui/ConnectWallet/useConnectModal.js.map +1 -1
  45. package/dist/esm/react/web/wallets/shared/ConnectWalletSocialOptions.js +1 -1
  46. package/dist/esm/react/web/wallets/shared/ConnectWalletSocialOptions.js.map +1 -1
  47. package/dist/esm/utils/any-evm/zksync/isZkSyncChain.js +4 -1
  48. package/dist/esm/utils/any-evm/zksync/isZkSyncChain.js.map +1 -1
  49. package/dist/esm/version.js +1 -1
  50. package/dist/esm/wallets/ecosystem/is-ecosystem-wallet.js +1 -1
  51. package/dist/esm/wallets/in-app/core/users/getUser.js +6 -1
  52. package/dist/esm/wallets/in-app/core/users/getUser.js.map +1 -1
  53. package/dist/esm/wallets/in-app/core/wallet/in-app-core.js +9 -5
  54. package/dist/esm/wallets/in-app/core/wallet/in-app-core.js.map +1 -1
  55. package/dist/esm/wallets/in-app/web/ecosystem.js +1 -1
  56. package/dist/esm/wallets/in-app/web/in-app.js +2 -2
  57. package/dist/esm/wallets/smart/index.js +20 -13
  58. package/dist/esm/wallets/smart/index.js.map +1 -1
  59. package/dist/esm/wallets/smart/lib/bundler.js +2 -1
  60. package/dist/esm/wallets/smart/lib/bundler.js.map +1 -1
  61. package/dist/esm/wallets/smart/lib/constants.js +20 -0
  62. package/dist/esm/wallets/smart/lib/constants.js.map +1 -1
  63. package/dist/esm/wallets/smart/lib/userop.js +20 -5
  64. package/dist/esm/wallets/smart/lib/userop.js.map +1 -1
  65. package/dist/esm/wallets/smart/smart-wallet.js +1 -1
  66. package/dist/esm/wallets/smart/types.js.map +1 -1
  67. package/dist/types/adapters/eip1193/from-eip1193.d.ts +2 -0
  68. package/dist/types/adapters/eip1193/from-eip1193.d.ts.map +1 -1
  69. package/dist/types/adapters/eip1193/to-eip1193.d.ts +2 -0
  70. package/dist/types/adapters/eip1193/to-eip1193.d.ts.map +1 -1
  71. package/dist/types/exports/wallets/smart.d.ts +1 -1
  72. package/dist/types/exports/wallets/smart.d.ts.map +1 -1
  73. package/dist/types/extensions/erc20/read/isERC20.d.ts +8 -1
  74. package/dist/types/extensions/erc20/read/isERC20.d.ts.map +1 -1
  75. package/dist/types/react/web/ui/ConnectWallet/screens/SignatureScreen.d.ts.map +1 -1
  76. package/dist/types/react/web/ui/ConnectWallet/useConnectModal.d.ts +0 -8
  77. package/dist/types/react/web/ui/ConnectWallet/useConnectModal.d.ts.map +1 -1
  78. package/dist/types/utils/any-evm/zksync/isZkSyncChain.d.ts.map +1 -1
  79. package/dist/types/version.d.ts +1 -1
  80. package/dist/types/wallets/ecosystem/get-ecosystem-wallet-auth-options.d.ts +1 -1
  81. package/dist/types/wallets/ecosystem/get-ecosystem-wallet-auth-options.d.ts.map +1 -1
  82. package/dist/types/wallets/in-app/core/users/getUser.d.ts.map +1 -1
  83. package/dist/types/wallets/in-app/core/wallet/in-app-core.d.ts.map +1 -1
  84. package/dist/types/wallets/in-app/web/ecosystem.d.ts +1 -1
  85. package/dist/types/wallets/in-app/web/in-app.d.ts +2 -2
  86. package/dist/types/wallets/smart/index.d.ts.map +1 -1
  87. package/dist/types/wallets/smart/lib/bundler.d.ts +6 -0
  88. package/dist/types/wallets/smart/lib/bundler.d.ts.map +1 -1
  89. package/dist/types/wallets/smart/lib/constants.d.ts +4 -0
  90. package/dist/types/wallets/smart/lib/constants.d.ts.map +1 -1
  91. package/dist/types/wallets/smart/lib/userop.d.ts.map +1 -1
  92. package/dist/types/wallets/smart/smart-wallet.d.ts +1 -1
  93. package/dist/types/wallets/smart/types.d.ts +7 -4
  94. package/dist/types/wallets/smart/types.d.ts.map +1 -1
  95. package/package.json +1 -1
  96. package/src/adapters/eip1193/from-eip1193.ts +2 -0
  97. package/src/adapters/eip1193/to-eip1193.ts +2 -0
  98. package/src/exports/wallets/smart.ts +1 -0
  99. package/src/extensions/erc20/read/isERC20.ts +8 -1
  100. package/src/react/web/ui/ConnectWallet/screens/SignatureScreen.test.tsx +287 -0
  101. package/src/react/web/ui/ConnectWallet/screens/SignatureScreen.tsx +13 -5
  102. package/src/react/web/ui/ConnectWallet/useConnectModal.tsx +0 -9
  103. package/src/react/web/wallets/shared/ConnectWalletSocialOptions.test.tsx +87 -0
  104. package/src/react/web/wallets/shared/ConnectWalletSocialOptions.tsx +1 -1
  105. package/src/utils/any-evm/zksync/isZkSyncChain.ts +4 -1
  106. package/src/version.ts +1 -1
  107. package/src/wallets/ecosystem/get-ecosystem-wallet-auth-options.ts +1 -1
  108. package/src/wallets/ecosystem/is-ecosystem-wallet.ts +1 -1
  109. package/src/wallets/in-app/core/users/getUser.test.ts +216 -0
  110. package/src/wallets/in-app/core/users/getUser.ts +6 -1
  111. package/src/wallets/in-app/core/wallet/in-app-core.test.ts +270 -0
  112. package/src/wallets/in-app/core/wallet/in-app-core.ts +16 -5
  113. package/src/wallets/in-app/web/ecosystem.ts +1 -1
  114. package/src/wallets/in-app/web/in-app.ts +2 -2
  115. package/src/wallets/smart/index.ts +37 -17
  116. package/src/wallets/smart/lib/bundler.ts +14 -4
  117. package/src/wallets/smart/lib/constants.ts +23 -0
  118. package/src/wallets/smart/lib/userop.ts +31 -8
  119. package/src/wallets/smart/smart-wallet-tokenpaymaster.test.ts +117 -0
  120. package/src/wallets/smart/smart-wallet.ts +1 -1
  121. package/src/wallets/smart/types.ts +8 -4
@@ -0,0 +1,287 @@
1
+ import { userEvent } from "@testing-library/user-event";
2
+ import { beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { TEST_ACCOUNT_A } from "~test/test-wallets.js";
4
+ import { render, waitFor } from "../../../../../../test/src/react-render.js";
5
+ import { TEST_CLIENT } from "../../../../../../test/src/test-clients.js";
6
+ import { createWallet } from "../../../../../wallets/create-wallet.js";
7
+ import { useActiveWallet } from "../../../../core/hooks/wallets/useActiveWallet.js";
8
+ import type { ConnectLocale } from "../locale/types.js";
9
+ import { SignatureScreen } from "./SignatureScreen.js";
10
+
11
+ const mockAuth = vi.hoisted(() => ({
12
+ doLogin: vi.fn().mockResolvedValue(undefined),
13
+ doLogout: vi.fn().mockResolvedValue(undefined),
14
+ getLoginPayload: vi.fn().mockResolvedValue(undefined),
15
+ isLoggedIn: vi.fn().mockResolvedValue(true),
16
+ }));
17
+
18
+ vi.mock("../../../../core/hooks/auth/useSiweAuth", () => ({
19
+ useSiweAuth: () => mockAuth,
20
+ }));
21
+
22
+ vi.mock("../../../../core/hooks/wallets/useActiveWallet", () => ({
23
+ useActiveWallet: vi.fn().mockReturnValue(createWallet("io.metamask")),
24
+ }));
25
+
26
+ vi.mock("../../../../core/hooks/wallets/useActiveAccount", () => ({
27
+ useActiveAccount: () => vi.fn().mockReturnValue(TEST_ACCOUNT_A),
28
+ }));
29
+
30
+ vi.mock("../../../../core/hooks/wallets/useAdminWallet", () => ({
31
+ useAdminWallet: () => vi.fn().mockReturnValue(null),
32
+ }));
33
+
34
+ const mockConnectLocale = {
35
+ signatureScreen: {
36
+ title: "Sign In",
37
+ instructionScreen: {
38
+ title: "Sign Message",
39
+ instruction: "Please sign the message",
40
+ signInButton: "Sign In",
41
+ disconnectWallet: "Disconnect",
42
+ },
43
+ signingScreen: {
44
+ title: "Signing",
45
+ inProgress: "Signing in progress...",
46
+ failedToSignIn: "Failed to sign in",
47
+ prompt: "Please check your wallet",
48
+ tryAgain: "Try Again",
49
+ },
50
+ },
51
+ agreement: {
52
+ prefix: "By connecting, you agree to our",
53
+ termsOfService: "Terms of Service",
54
+ and: "and",
55
+ privacyPolicy: "Privacy Policy",
56
+ },
57
+ } as unknown as ConnectLocale;
58
+
59
+ describe("SignatureScreen", () => {
60
+ beforeEach(() => {
61
+ vi.clearAllMocks();
62
+ mockAuth.doLogin.mockResolvedValue(undefined);
63
+ });
64
+
65
+ it("renders initial state correctly", () => {
66
+ const { getByTestId } = render(
67
+ <SignatureScreen
68
+ onDone={() => {}}
69
+ modalSize="wide"
70
+ connectLocale={mockConnectLocale}
71
+ client={TEST_CLIENT}
72
+ auth={mockAuth}
73
+ />,
74
+ { setConnectedWallet: true },
75
+ );
76
+
77
+ expect(getByTestId("sign-in-button")).toBeInTheDocument();
78
+ expect(getByTestId("disconnect-button")).toBeInTheDocument();
79
+ });
80
+
81
+ it("handles signing flow", async () => {
82
+ const onDoneMock = vi.fn();
83
+ const { getByRole, getByText } = render(
84
+ <SignatureScreen
85
+ onDone={onDoneMock}
86
+ modalSize="wide"
87
+ connectLocale={mockConnectLocale}
88
+ client={TEST_CLIENT}
89
+ auth={mockAuth}
90
+ />,
91
+ { setConnectedWallet: true },
92
+ );
93
+
94
+ const signInButton = getByRole("button", { name: "Sign In" });
95
+ await userEvent.click(signInButton);
96
+
97
+ // Should show signing in progress
98
+ await waitFor(() => {
99
+ expect(getByText("Signing in progress...")).toBeInTheDocument();
100
+ });
101
+ });
102
+
103
+ it("shows loading state when wallet is undefined", async () => {
104
+ vi.mocked(useActiveWallet).mockReturnValueOnce(undefined);
105
+
106
+ const { queryByTestId } = render(
107
+ <SignatureScreen
108
+ onDone={() => {}}
109
+ modalSize="wide"
110
+ connectLocale={mockConnectLocale}
111
+ client={TEST_CLIENT}
112
+ auth={mockAuth}
113
+ />,
114
+ { setConnectedWallet: true },
115
+ );
116
+
117
+ expect(queryByTestId("sign-in-button")).not.toBeInTheDocument();
118
+ });
119
+
120
+ it("handles error state", async () => {
121
+ mockAuth.doLogin.mockRejectedValueOnce(new Error("Signing failed"));
122
+ const { getByTestId, getByRole, getByText } = render(
123
+ <SignatureScreen
124
+ onDone={() => {}}
125
+ modalSize="wide"
126
+ connectLocale={mockConnectLocale}
127
+ client={TEST_CLIENT}
128
+ auth={mockAuth}
129
+ />,
130
+ { setConnectedWallet: true },
131
+ );
132
+
133
+ const signInButton = await waitFor(() => {
134
+ return getByTestId("sign-in-button");
135
+ });
136
+ await userEvent.click(signInButton);
137
+
138
+ // Should show error state
139
+ await waitFor(
140
+ () => {
141
+ expect(getByText("Signing failed")).toBeInTheDocument();
142
+ expect(getByRole("button", { name: "Try Again" })).toBeInTheDocument();
143
+ },
144
+ {
145
+ timeout: 2000,
146
+ },
147
+ );
148
+ });
149
+
150
+ describe("HeadlessSignIn", () => {
151
+ const mockWallet = createWallet("inApp");
152
+ beforeEach(() => {
153
+ vi.mocked(useActiveWallet).mockReturnValue(mockWallet);
154
+ });
155
+
156
+ it("automatically triggers sign in on mount", async () => {
157
+ render(
158
+ <SignatureScreen
159
+ onDone={() => {}}
160
+ modalSize="wide"
161
+ connectLocale={mockConnectLocale}
162
+ client={TEST_CLIENT}
163
+ auth={mockAuth}
164
+ />,
165
+ { setConnectedWallet: true },
166
+ );
167
+
168
+ await waitFor(() => {
169
+ expect(mockAuth.doLogin).toHaveBeenCalledTimes(1);
170
+ });
171
+ });
172
+
173
+ it("shows signing message during signing state", async () => {
174
+ const { getByText } = render(
175
+ <SignatureScreen
176
+ onDone={() => {}}
177
+ modalSize="wide"
178
+ connectLocale={mockConnectLocale}
179
+ client={TEST_CLIENT}
180
+ auth={mockAuth}
181
+ />,
182
+ { setConnectedWallet: true },
183
+ );
184
+
185
+ await waitFor(() => {
186
+ expect(getByText("Signing")).toBeInTheDocument();
187
+ });
188
+ });
189
+
190
+ it("shows error and retry button when signing fails", async () => {
191
+ mockAuth.doLogin.mockRejectedValueOnce(
192
+ new Error("Headless signing failed"),
193
+ );
194
+
195
+ const { getByText, getByRole } = render(
196
+ <SignatureScreen
197
+ onDone={() => {}}
198
+ modalSize="wide"
199
+ connectLocale={mockConnectLocale}
200
+ client={TEST_CLIENT}
201
+ auth={mockAuth}
202
+ />,
203
+ { setConnectedWallet: true },
204
+ );
205
+
206
+ await waitFor(
207
+ () => {
208
+ expect(getByText("Headless signing failed")).toBeInTheDocument();
209
+ expect(
210
+ getByRole("button", { name: "Try Again" }),
211
+ ).toBeInTheDocument();
212
+ },
213
+ { timeout: 2000 },
214
+ );
215
+ });
216
+
217
+ it("allows retry after failure", async () => {
218
+ mockAuth.doLogin
219
+ .mockRejectedValueOnce(new Error("Failed first time"))
220
+ .mockResolvedValueOnce(undefined);
221
+
222
+ const { getByRole, getByText } = render(
223
+ <SignatureScreen
224
+ onDone={() => {}}
225
+ modalSize="wide"
226
+ connectLocale={mockConnectLocale}
227
+ client={TEST_CLIENT}
228
+ auth={mockAuth}
229
+ />,
230
+ { setConnectedWallet: true },
231
+ );
232
+
233
+ // Wait for initial failure
234
+ await waitFor(
235
+ () => {
236
+ expect(getByText("Failed first time")).toBeInTheDocument();
237
+ },
238
+ { timeout: 2000 },
239
+ );
240
+
241
+ // Click retry
242
+ const retryButton = getByRole("button", { name: "Try Again" });
243
+ await userEvent.click(retryButton);
244
+
245
+ // Should show loading again
246
+ await waitFor(() => {
247
+ expect(getByText("Signing")).toBeInTheDocument();
248
+ });
249
+
250
+ // Should have called login twice
251
+ expect(mockAuth.doLogin).toHaveBeenCalledTimes(2);
252
+ });
253
+
254
+ it("allows disconnecting wallet after failure", async () => {
255
+ const mockDisconnect = vi.fn().mockResolvedValue(undefined);
256
+ mockAuth.doLogin.mockRejectedValueOnce(new Error("Failed"));
257
+ vi.mocked(useActiveWallet).mockReturnValueOnce({
258
+ ...createWallet("io.metamask"),
259
+ disconnect: mockDisconnect,
260
+ });
261
+
262
+ const { getByTestId } = render(
263
+ <SignatureScreen
264
+ onDone={() => {}}
265
+ modalSize="wide"
266
+ connectLocale={mockConnectLocale}
267
+ client={TEST_CLIENT}
268
+ auth={mockAuth}
269
+ />,
270
+ { setConnectedWallet: true },
271
+ );
272
+
273
+ // Wait for failure and click disconnect
274
+ await waitFor(
275
+ () => {
276
+ return getByTestId("disconnect-button");
277
+ },
278
+ { timeout: 2000 },
279
+ ).then((button) => userEvent.click(button));
280
+
281
+ // Should have attempted to disconnect
282
+ await waitFor(() => {
283
+ expect(mockDisconnect).toHaveBeenCalled();
284
+ });
285
+ });
286
+ });
287
+ });
@@ -51,24 +51,26 @@ export const SignatureScreen: React.FC<{
51
51
  const adminWallet = useAdminWallet();
52
52
  const activeAccount = useActiveAccount();
53
53
  const siweAuth = useSiweAuth(wallet, activeAccount, props.auth);
54
- const [status, setStatus] = useState<Status>("idle");
54
+ const [error, setError] = useState<string | undefined>(undefined);
55
+ const [status, setStatus] = useState<Status>(error ? "failed" : "idle");
55
56
  const { disconnect } = useDisconnect();
56
57
  const locale = connectLocale.signatureScreen;
57
58
 
58
59
  const signIn = useCallback(async () => {
59
60
  try {
61
+ setError(undefined);
60
62
  setStatus("signing");
61
63
  await siweAuth.doLogin();
62
64
  onDone?.();
63
65
  } catch (err) {
64
66
  await wait(1000);
67
+ setError((err as Error).message);
65
68
  setStatus("failed");
66
- console.error("failed to log in", err);
67
69
  }
68
70
  }, [onDone, siweAuth]);
69
71
 
70
72
  if (!wallet) {
71
- return <LoadingScreen />;
73
+ return <LoadingScreen data-testid="loading-screen" />;
72
74
  }
73
75
 
74
76
  if (
@@ -78,6 +80,7 @@ export const SignatureScreen: React.FC<{
78
80
  ) {
79
81
  return (
80
82
  <HeadlessSignIn
83
+ error={error}
81
84
  signIn={signIn}
82
85
  status={status}
83
86
  connectLocale={connectLocale}
@@ -126,6 +129,7 @@ export const SignatureScreen: React.FC<{
126
129
  <Button
127
130
  fullWidth
128
131
  variant="accent"
132
+ data-testid="sign-in-button"
129
133
  onClick={signIn}
130
134
  style={{
131
135
  alignItems: "center",
@@ -138,6 +142,7 @@ export const SignatureScreen: React.FC<{
138
142
  <Button
139
143
  fullWidth
140
144
  variant="secondary"
145
+ data-testid="disconnect-button"
141
146
  onClick={() => {
142
147
  disconnect(wallet);
143
148
  }}
@@ -162,7 +167,7 @@ export const SignatureScreen: React.FC<{
162
167
  <Container flex="column" gap="md" animate="fadein" key={status}>
163
168
  <Text size="lg" center color="primaryText">
164
169
  {status === "failed"
165
- ? locale.signingScreen.failedToSignIn
170
+ ? error || locale.signingScreen.failedToSignIn
166
171
  : locale.signingScreen.inProgress}
167
172
  </Text>
168
173
 
@@ -224,12 +229,14 @@ export const SignatureScreen: React.FC<{
224
229
 
225
230
  function HeadlessSignIn({
226
231
  signIn,
232
+ error,
227
233
  status,
228
234
  connectLocale,
229
235
  wallet,
230
236
  }: {
231
237
  signIn: () => void;
232
238
  status: Status;
239
+ error: string | undefined;
233
240
  connectLocale: ConnectLocale;
234
241
  wallet: Wallet;
235
242
  }) {
@@ -262,7 +269,7 @@ function HeadlessSignIn({
262
269
  <Container>
263
270
  <Spacer y="lg" />
264
271
  <Text size="lg" center color="danger">
265
- {locale.signingScreen.failedToSignIn}
272
+ {error || locale.signingScreen.failedToSignIn}
266
273
  </Text>
267
274
 
268
275
  <Spacer y="lg" />
@@ -288,6 +295,7 @@ function HeadlessSignIn({
288
295
  onClick={() => {
289
296
  disconnect(wallet);
290
297
  }}
298
+ data-testid="disconnect-button"
291
299
  style={{
292
300
  alignItems: "center",
293
301
  padding: spacing.md,
@@ -5,7 +5,6 @@ import type { Wallet } from "../../../../wallets/interfaces/wallet.js";
5
5
  import type { SmartWalletOptions } from "../../../../wallets/smart/types.js";
6
6
  import type { AppMetadata } from "../../../../wallets/types.js";
7
7
  import type { Theme } from "../../../core/design-system/index.js";
8
- import type { SiweAuthOptions } from "../../../core/hooks/auth/useSiweAuth.js";
9
8
  import { SetRootElementContext } from "../../../core/providers/RootElementContext.js";
10
9
  import { WalletUIStatesProvider } from "../../providers/wallet-ui-states-provider.js";
11
10
  import { canFitWideModal } from "../../utils/canFitWideModal.js";
@@ -433,14 +432,6 @@ export type UseConnectModalOptions = {
433
432
  * If you want to hide the branding, set this prop to `false`
434
433
  */
435
434
  showThirdwebBranding?: boolean;
436
-
437
- /**
438
- * Enable SIWE (Sign in with Ethererum) by passing an object of type `SiweAuthOptions` to
439
- * enforce the users to sign a message after connecting their wallet to authenticate themselves.
440
- *
441
- * Refer to the [`SiweAuthOptions`](https://portal.thirdweb.com/references/typescript/v5/SiweAuthOptions) for more details
442
- */
443
- auth?: SiweAuthOptions;
444
435
  };
445
436
 
446
437
  // TODO: consilidate Button/Embed/Modal props into one type with extras
@@ -0,0 +1,87 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import {
3
+ fireEvent,
4
+ render,
5
+ screen,
6
+ } from "../../../../../test/src/react-render.js";
7
+ import { TEST_CLIENT } from "../../../../../test/src/test-clients.js";
8
+ import { createWallet } from "../../../../wallets/create-wallet.js";
9
+ import { ConnectWalletSocialOptions } from "./ConnectWalletSocialOptions.js";
10
+ import en from "./locale/en.js";
11
+
12
+ describe("ConnectWalletSocialOptions", () => {
13
+ const mockSelect = vi.fn();
14
+ const mockDone = vi.fn();
15
+
16
+ const defaultProps = {
17
+ select: mockSelect,
18
+ done: mockDone,
19
+ locale: en,
20
+ chain: undefined,
21
+ client: TEST_CLIENT,
22
+ size: "compact" as const,
23
+ isLinking: false,
24
+ disabled: false,
25
+ };
26
+
27
+ it("renders Sign in with Wallet button when enabled and not linking", () => {
28
+ render(
29
+ <ConnectWalletSocialOptions
30
+ {...defaultProps}
31
+ wallet={createWallet("inApp", {
32
+ auth: {
33
+ options: ["wallet"],
34
+ },
35
+ })}
36
+ />,
37
+ );
38
+
39
+ const walletButton = screen.getByRole("button", {
40
+ name: /sign in with wallet/i,
41
+ });
42
+
43
+ expect(walletButton).toBeInTheDocument();
44
+ expect(walletButton).toHaveTextContent("Sign in with Wallet");
45
+ });
46
+
47
+ it("does not render Sign in with Wallet button when isLinking is true", () => {
48
+ render(
49
+ <ConnectWalletSocialOptions
50
+ {...defaultProps}
51
+ isLinking={true}
52
+ wallet={createWallet("inApp", {
53
+ auth: {
54
+ options: ["wallet"],
55
+ },
56
+ })}
57
+ />,
58
+ );
59
+
60
+ const walletButton = screen.queryByRole("button", {
61
+ name: /sign in with wallet/i,
62
+ });
63
+
64
+ expect(walletButton).not.toBeInTheDocument();
65
+ });
66
+
67
+ it("calls handleWalletLogin when Sign in with Wallet button is clicked", () => {
68
+ render(
69
+ <ConnectWalletSocialOptions
70
+ {...defaultProps}
71
+ wallet={createWallet("inApp", {
72
+ auth: {
73
+ options: ["wallet"],
74
+ },
75
+ })}
76
+ />,
77
+ );
78
+
79
+ const walletButton = screen.getByRole("button", {
80
+ name: /sign in with wallet/i,
81
+ });
82
+
83
+ fireEvent.click(walletButton);
84
+
85
+ expect(mockSelect).toHaveBeenCalled();
86
+ });
87
+ });
@@ -474,7 +474,7 @@ export const ConnectWalletSocialOptions = (
474
474
  )}
475
475
 
476
476
  {/* SIWE login */}
477
- {siweEnabled && (
477
+ {siweEnabled && !props.isLinking && (
478
478
  <WalletTypeRowButton
479
479
  client={props.client}
480
480
  icon={OutlineWalletIcon}
@@ -24,7 +24,10 @@ export async function isZkSyncChain(chain: Chain) {
24
24
  chain.id === 978658 ||
25
25
  chain.id === 531050104 ||
26
26
  chain.id === 4457845 ||
27
- chain.id === 2741
27
+ chain.id === 2741 ||
28
+ chain.id === 240 ||
29
+ chain.id === 61166 ||
30
+ chain.id === 555271
28
31
  ) {
29
32
  return true;
30
33
  }
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = "5.73.0";
1
+ export const version = "5.74.0";
@@ -13,7 +13,7 @@ type EcosystemOptions = {
13
13
  };
14
14
 
15
15
  type SmartAccountOptions = {
16
- chainIds: number[];
16
+ defaultChainId: number;
17
17
  sponsorGas: boolean;
18
18
  accountFactoryAddress: string;
19
19
  };
@@ -10,7 +10,7 @@ export function isEcosystemWallet(wallet: string): wallet is EcosystemWalletId;
10
10
  /**
11
11
  * Checks if the given wallet is an ecosystem wallet.
12
12
  *
13
- * @param {string} walletId - The wallet ID to check.
13
+ * @param {Wallet | string} wallet - The wallet or wallet ID to check.
14
14
  * @returns {boolean} True if the wallet is an ecosystem wallet, false otherwise.
15
15
  * @internal
16
16
  */