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.
- package/dist/cjs/adapters/eip1193/from-eip1193.js +2 -0
- package/dist/cjs/adapters/eip1193/from-eip1193.js.map +1 -1
- package/dist/cjs/adapters/eip1193/to-eip1193.js +2 -0
- package/dist/cjs/adapters/eip1193/to-eip1193.js.map +1 -1
- package/dist/cjs/exports/wallets/smart.js +2 -1
- package/dist/cjs/exports/wallets/smart.js.map +1 -1
- package/dist/cjs/extensions/erc20/read/isERC20.js +8 -1
- package/dist/cjs/extensions/erc20/read/isERC20.js.map +1 -1
- package/dist/cjs/react/web/ui/ConnectWallet/screens/SignatureScreen.js +12 -10
- package/dist/cjs/react/web/ui/ConnectWallet/screens/SignatureScreen.js.map +1 -1
- package/dist/cjs/react/web/ui/ConnectWallet/useConnectModal.js.map +1 -1
- package/dist/cjs/react/web/wallets/shared/ConnectWalletSocialOptions.js +1 -1
- package/dist/cjs/react/web/wallets/shared/ConnectWalletSocialOptions.js.map +1 -1
- package/dist/cjs/utils/any-evm/zksync/isZkSyncChain.js +4 -1
- package/dist/cjs/utils/any-evm/zksync/isZkSyncChain.js.map +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/wallets/ecosystem/is-ecosystem-wallet.js +1 -1
- package/dist/cjs/wallets/in-app/core/users/getUser.js +6 -1
- package/dist/cjs/wallets/in-app/core/users/getUser.js.map +1 -1
- package/dist/cjs/wallets/in-app/core/wallet/in-app-core.js +8 -4
- package/dist/cjs/wallets/in-app/core/wallet/in-app-core.js.map +1 -1
- package/dist/cjs/wallets/in-app/web/ecosystem.js +1 -1
- package/dist/cjs/wallets/in-app/web/in-app.js +2 -2
- package/dist/cjs/wallets/smart/index.js +19 -12
- package/dist/cjs/wallets/smart/index.js.map +1 -1
- package/dist/cjs/wallets/smart/lib/bundler.js +2 -1
- package/dist/cjs/wallets/smart/lib/bundler.js.map +1 -1
- package/dist/cjs/wallets/smart/lib/constants.js +21 -1
- package/dist/cjs/wallets/smart/lib/constants.js.map +1 -1
- package/dist/cjs/wallets/smart/lib/userop.js +19 -4
- package/dist/cjs/wallets/smart/lib/userop.js.map +1 -1
- package/dist/cjs/wallets/smart/smart-wallet.js +1 -1
- package/dist/cjs/wallets/smart/types.js.map +1 -1
- package/dist/esm/adapters/eip1193/from-eip1193.js +2 -0
- package/dist/esm/adapters/eip1193/from-eip1193.js.map +1 -1
- package/dist/esm/adapters/eip1193/to-eip1193.js +2 -0
- package/dist/esm/adapters/eip1193/to-eip1193.js.map +1 -1
- package/dist/esm/exports/wallets/smart.js +1 -1
- package/dist/esm/exports/wallets/smart.js.map +1 -1
- package/dist/esm/extensions/erc20/read/isERC20.js +8 -1
- package/dist/esm/extensions/erc20/read/isERC20.js.map +1 -1
- package/dist/esm/react/web/ui/ConnectWallet/screens/SignatureScreen.js +12 -10
- package/dist/esm/react/web/ui/ConnectWallet/screens/SignatureScreen.js.map +1 -1
- package/dist/esm/react/web/ui/ConnectWallet/useConnectModal.js.map +1 -1
- package/dist/esm/react/web/wallets/shared/ConnectWalletSocialOptions.js +1 -1
- package/dist/esm/react/web/wallets/shared/ConnectWalletSocialOptions.js.map +1 -1
- package/dist/esm/utils/any-evm/zksync/isZkSyncChain.js +4 -1
- package/dist/esm/utils/any-evm/zksync/isZkSyncChain.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/wallets/ecosystem/is-ecosystem-wallet.js +1 -1
- package/dist/esm/wallets/in-app/core/users/getUser.js +6 -1
- package/dist/esm/wallets/in-app/core/users/getUser.js.map +1 -1
- package/dist/esm/wallets/in-app/core/wallet/in-app-core.js +9 -5
- package/dist/esm/wallets/in-app/core/wallet/in-app-core.js.map +1 -1
- package/dist/esm/wallets/in-app/web/ecosystem.js +1 -1
- package/dist/esm/wallets/in-app/web/in-app.js +2 -2
- package/dist/esm/wallets/smart/index.js +20 -13
- package/dist/esm/wallets/smart/index.js.map +1 -1
- package/dist/esm/wallets/smart/lib/bundler.js +2 -1
- package/dist/esm/wallets/smart/lib/bundler.js.map +1 -1
- package/dist/esm/wallets/smart/lib/constants.js +20 -0
- package/dist/esm/wallets/smart/lib/constants.js.map +1 -1
- package/dist/esm/wallets/smart/lib/userop.js +20 -5
- package/dist/esm/wallets/smart/lib/userop.js.map +1 -1
- package/dist/esm/wallets/smart/smart-wallet.js +1 -1
- package/dist/esm/wallets/smart/types.js.map +1 -1
- package/dist/types/adapters/eip1193/from-eip1193.d.ts +2 -0
- package/dist/types/adapters/eip1193/from-eip1193.d.ts.map +1 -1
- package/dist/types/adapters/eip1193/to-eip1193.d.ts +2 -0
- package/dist/types/adapters/eip1193/to-eip1193.d.ts.map +1 -1
- package/dist/types/exports/wallets/smart.d.ts +1 -1
- package/dist/types/exports/wallets/smart.d.ts.map +1 -1
- package/dist/types/extensions/erc20/read/isERC20.d.ts +8 -1
- package/dist/types/extensions/erc20/read/isERC20.d.ts.map +1 -1
- package/dist/types/react/web/ui/ConnectWallet/screens/SignatureScreen.d.ts.map +1 -1
- package/dist/types/react/web/ui/ConnectWallet/useConnectModal.d.ts +0 -8
- package/dist/types/react/web/ui/ConnectWallet/useConnectModal.d.ts.map +1 -1
- package/dist/types/utils/any-evm/zksync/isZkSyncChain.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/dist/types/wallets/ecosystem/get-ecosystem-wallet-auth-options.d.ts +1 -1
- package/dist/types/wallets/ecosystem/get-ecosystem-wallet-auth-options.d.ts.map +1 -1
- package/dist/types/wallets/in-app/core/users/getUser.d.ts.map +1 -1
- package/dist/types/wallets/in-app/core/wallet/in-app-core.d.ts.map +1 -1
- package/dist/types/wallets/in-app/web/ecosystem.d.ts +1 -1
- package/dist/types/wallets/in-app/web/in-app.d.ts +2 -2
- package/dist/types/wallets/smart/index.d.ts.map +1 -1
- package/dist/types/wallets/smart/lib/bundler.d.ts +6 -0
- package/dist/types/wallets/smart/lib/bundler.d.ts.map +1 -1
- package/dist/types/wallets/smart/lib/constants.d.ts +4 -0
- package/dist/types/wallets/smart/lib/constants.d.ts.map +1 -1
- package/dist/types/wallets/smart/lib/userop.d.ts.map +1 -1
- package/dist/types/wallets/smart/smart-wallet.d.ts +1 -1
- package/dist/types/wallets/smart/types.d.ts +7 -4
- package/dist/types/wallets/smart/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/adapters/eip1193/from-eip1193.ts +2 -0
- package/src/adapters/eip1193/to-eip1193.ts +2 -0
- package/src/exports/wallets/smart.ts +1 -0
- package/src/extensions/erc20/read/isERC20.ts +8 -1
- package/src/react/web/ui/ConnectWallet/screens/SignatureScreen.test.tsx +287 -0
- package/src/react/web/ui/ConnectWallet/screens/SignatureScreen.tsx +13 -5
- package/src/react/web/ui/ConnectWallet/useConnectModal.tsx +0 -9
- package/src/react/web/wallets/shared/ConnectWalletSocialOptions.test.tsx +87 -0
- package/src/react/web/wallets/shared/ConnectWalletSocialOptions.tsx +1 -1
- package/src/utils/any-evm/zksync/isZkSyncChain.ts +4 -1
- package/src/version.ts +1 -1
- package/src/wallets/ecosystem/get-ecosystem-wallet-auth-options.ts +1 -1
- package/src/wallets/ecosystem/is-ecosystem-wallet.ts +1 -1
- package/src/wallets/in-app/core/users/getUser.test.ts +216 -0
- package/src/wallets/in-app/core/users/getUser.ts +6 -1
- package/src/wallets/in-app/core/wallet/in-app-core.test.ts +270 -0
- package/src/wallets/in-app/core/wallet/in-app-core.ts +16 -5
- package/src/wallets/in-app/web/ecosystem.ts +1 -1
- package/src/wallets/in-app/web/in-app.ts +2 -2
- package/src/wallets/smart/index.ts +37 -17
- package/src/wallets/smart/lib/bundler.ts +14 -4
- package/src/wallets/smart/lib/constants.ts +23 -0
- package/src/wallets/smart/lib/userop.ts +31 -8
- package/src/wallets/smart/smart-wallet-tokenpaymaster.test.ts +117 -0
- package/src/wallets/smart/smart-wallet.ts +1 -1
- 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 [
|
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
|
+
});
|
@@ -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.
|
1
|
+
export const version = "5.74.0";
|
@@ -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}
|
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
|
*/
|