thirdweb 5.82.0 → 5.83.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/extensions/marketplace/utils.js +1 -1
- package/dist/cjs/extensions/marketplace/utils.js.map +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/wallets/in-app/core/authentication/backend.js +31 -0
- package/dist/cjs/wallets/in-app/core/authentication/backend.js.map +1 -0
- package/dist/cjs/wallets/in-app/core/wallet/in-app-core.js +5 -1
- package/dist/cjs/wallets/in-app/core/wallet/in-app-core.js.map +1 -1
- package/dist/cjs/wallets/in-app/native/auth/index.js +11 -0
- package/dist/cjs/wallets/in-app/native/auth/index.js.map +1 -1
- package/dist/cjs/wallets/in-app/native/native-connector.js +13 -0
- package/dist/cjs/wallets/in-app/native/native-connector.js.map +1 -1
- package/dist/cjs/wallets/in-app/web/in-app.js +14 -0
- package/dist/cjs/wallets/in-app/web/in-app.js.map +1 -1
- package/dist/cjs/wallets/in-app/web/lib/auth/index.js +11 -0
- package/dist/cjs/wallets/in-app/web/lib/auth/index.js.map +1 -1
- package/dist/cjs/wallets/in-app/web/lib/web-connector.js +9 -0
- package/dist/cjs/wallets/in-app/web/lib/web-connector.js.map +1 -1
- package/dist/cjs/wallets/types.js +1 -0
- package/dist/cjs/wallets/types.js.map +1 -1
- package/dist/esm/extensions/marketplace/utils.js +1 -1
- package/dist/esm/extensions/marketplace/utils.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/wallets/in-app/core/authentication/backend.js +28 -0
- package/dist/esm/wallets/in-app/core/authentication/backend.js.map +1 -0
- package/dist/esm/wallets/in-app/core/wallet/in-app-core.js +5 -1
- package/dist/esm/wallets/in-app/core/wallet/in-app-core.js.map +1 -1
- package/dist/esm/wallets/in-app/native/auth/index.js +11 -0
- package/dist/esm/wallets/in-app/native/auth/index.js.map +1 -1
- package/dist/esm/wallets/in-app/native/native-connector.js +13 -0
- package/dist/esm/wallets/in-app/native/native-connector.js.map +1 -1
- package/dist/esm/wallets/in-app/web/in-app.js +14 -0
- package/dist/esm/wallets/in-app/web/in-app.js.map +1 -1
- package/dist/esm/wallets/in-app/web/lib/auth/index.js +11 -0
- package/dist/esm/wallets/in-app/web/lib/auth/index.js.map +1 -1
- package/dist/esm/wallets/in-app/web/lib/web-connector.js +9 -0
- package/dist/esm/wallets/in-app/web/lib/web-connector.js.map +1 -1
- package/dist/esm/wallets/types.js +1 -0
- package/dist/esm/wallets/types.js.map +1 -1
- package/dist/types/react/core/utils/storage.d.ts +1 -1
- package/dist/types/react/core/utils/storage.d.ts.map +1 -1
- package/dist/types/react/web/utils/storage.d.ts +1 -1
- package/dist/types/react/web/utils/storage.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/dist/types/wallets/in-app/core/authentication/backend.d.ts +13 -0
- package/dist/types/wallets/in-app/core/authentication/backend.d.ts.map +1 -0
- package/dist/types/wallets/in-app/core/authentication/types.d.ts +4 -2
- package/dist/types/wallets/in-app/core/authentication/types.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/native/auth/index.d.ts +11 -0
- package/dist/types/wallets/in-app/native/auth/index.d.ts.map +1 -1
- package/dist/types/wallets/in-app/native/native-connector.d.ts.map +1 -1
- package/dist/types/wallets/in-app/web/in-app.d.ts +14 -0
- package/dist/types/wallets/in-app/web/in-app.d.ts.map +1 -1
- package/dist/types/wallets/in-app/web/lib/auth/index.d.ts +11 -0
- package/dist/types/wallets/in-app/web/lib/auth/index.d.ts.map +1 -1
- package/dist/types/wallets/in-app/web/lib/web-connector.d.ts.map +1 -1
- package/dist/types/wallets/types.d.ts +1 -1
- package/dist/types/wallets/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/extensions/marketplace/getAllInBatches.test.ts +54 -0
- package/src/extensions/marketplace/utils.ts +1 -1
- package/src/version.ts +1 -1
- package/src/wallets/in-app/core/authentication/backend.test.ts +69 -0
- package/src/wallets/in-app/core/authentication/backend.ts +36 -0
- package/src/wallets/in-app/core/authentication/types.ts +5 -1
- package/src/wallets/in-app/core/wallet/in-app-core.ts +5 -1
- package/src/wallets/in-app/native/auth/index.ts +11 -0
- package/src/wallets/in-app/native/native-connector.ts +13 -0
- package/src/wallets/in-app/web/in-app.ts +14 -0
- package/src/wallets/in-app/web/lib/auth/index.ts +11 -0
- package/src/wallets/in-app/web/lib/web-connector.test.ts +163 -0
- package/src/wallets/in-app/web/lib/web-connector.ts +9 -0
- package/src/wallets/types.ts +1 -0
@@ -4,6 +4,7 @@ import { nativeLocalStorage } from "../../../utils/storage/nativeStorage.js";
|
|
4
4
|
import type { Account } from "../../interfaces/wallet.js";
|
5
5
|
import { getUserStatus } from "../core/actions/get-enclave-user-status.js";
|
6
6
|
import { authEndpoint } from "../core/authentication/authEndpoint.js";
|
7
|
+
import { backendAuthenticate } from "../core/authentication/backend.js";
|
7
8
|
import { ClientScopedStorage } from "../core/authentication/client-scoped-storage.js";
|
8
9
|
import { guestAuthenticate } from "../core/authentication/guest.js";
|
9
10
|
import { customJwt } from "../core/authentication/jwt.js";
|
@@ -171,6 +172,13 @@ export class InAppNativeConnector implements InAppConnector {
|
|
171
172
|
storage: nativeLocalStorage,
|
172
173
|
});
|
173
174
|
}
|
175
|
+
case "backend": {
|
176
|
+
return backendAuthenticate({
|
177
|
+
client: this.client,
|
178
|
+
walletSecret: params.walletSecret,
|
179
|
+
ecosystem: params.ecosystem,
|
180
|
+
});
|
181
|
+
}
|
174
182
|
case "wallet": {
|
175
183
|
return siweAuthenticate({
|
176
184
|
client: this.client,
|
@@ -179,6 +187,11 @@ export class InAppNativeConnector implements InAppConnector {
|
|
179
187
|
ecosystem: params.ecosystem,
|
180
188
|
});
|
181
189
|
}
|
190
|
+
case "github":
|
191
|
+
case "twitch":
|
192
|
+
case "steam":
|
193
|
+
case "farcaster":
|
194
|
+
case "telegram":
|
182
195
|
case "google":
|
183
196
|
case "facebook":
|
184
197
|
case "discord":
|
@@ -139,6 +139,20 @@ import { createInAppWallet } from "../core/wallet/in-app-core.js";
|
|
139
139
|
* });
|
140
140
|
* ```
|
141
141
|
*
|
142
|
+
* ### Connect to a backend account
|
143
|
+
*
|
144
|
+
* ```ts
|
145
|
+
* import { inAppWallet } from "thirdweb/wallets";
|
146
|
+
*
|
147
|
+
* const wallet = inAppWallet();
|
148
|
+
*
|
149
|
+
* const account = await wallet.connect({
|
150
|
+
* client,
|
151
|
+
* strategy: "backend",
|
152
|
+
* walletSecret: "...", // Provided by your app
|
153
|
+
* });
|
154
|
+
* ```
|
155
|
+
*
|
142
156
|
* ### Connect with custom JWT (any OIDC provider)
|
143
157
|
*
|
144
158
|
* You can use any OIDC provider to authenticate your users. Make sure to configure it in your dashboard under in-app wallet settings.
|
@@ -140,6 +140,17 @@ export async function preAuthenticate(args: PreAuthArgsType) {
|
|
140
140
|
* verificationCode: "123456",
|
141
141
|
* });
|
142
142
|
* ```
|
143
|
+
*
|
144
|
+
* Authenticate to a backend account (only do this on your backend):
|
145
|
+
* ```ts
|
146
|
+
* import { authenticate } from "thirdweb/wallets/in-app";
|
147
|
+
*
|
148
|
+
* const result = await authenticate({
|
149
|
+
* client,
|
150
|
+
* strategy: "backend",
|
151
|
+
* walletSecret: "...", // Provided by your app
|
152
|
+
* });
|
153
|
+
* ```
|
143
154
|
* @wallet
|
144
155
|
*/
|
145
156
|
export async function authenticate(args: AuthArgsType) {
|
@@ -0,0 +1,163 @@
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
2
|
+
import { TEST_CLIENT } from "~test/test-clients.js";
|
3
|
+
import { TEST_ACCOUNT_A } from "~test/test-wallets.js";
|
4
|
+
import { createWalletAdapter } from "../../../../adapters/wallet-adapter.js";
|
5
|
+
import { ethereum } from "../../../../chains/chain-definitions/ethereum.js";
|
6
|
+
import { backendAuthenticate } from "../../core/authentication/backend.js";
|
7
|
+
import { guestAuthenticate } from "../../core/authentication/guest.js";
|
8
|
+
import { siweAuthenticate } from "../../core/authentication/siwe.js";
|
9
|
+
import { loginWithOauth } from "./auth/oauth.js";
|
10
|
+
import { verifyOtp } from "./auth/otp.js";
|
11
|
+
import { InAppWebConnector } from "./web-connector.js";
|
12
|
+
|
13
|
+
vi.mock("./auth/oauth");
|
14
|
+
vi.mock("./auth/iframe-auth.ts", () => {
|
15
|
+
const Auth = vi.fn();
|
16
|
+
Auth.prototype.loginWithAuthToken = vi.fn(() => {
|
17
|
+
return Promise.resolve({
|
18
|
+
user: {
|
19
|
+
authDetails: {
|
20
|
+
recoveryShareManagement: "ENCLAVE",
|
21
|
+
userWalletId: "123",
|
22
|
+
},
|
23
|
+
status: "Logged In, Wallet Initialized",
|
24
|
+
walletAddress: "0x123",
|
25
|
+
},
|
26
|
+
});
|
27
|
+
});
|
28
|
+
return { Auth };
|
29
|
+
});
|
30
|
+
vi.mock("../../core/authentication/siwe");
|
31
|
+
vi.mock("../../core/authentication/guest");
|
32
|
+
vi.mock("../../core/authentication/backend");
|
33
|
+
vi.mock("./auth/otp");
|
34
|
+
vi.mock("../../core/authentication/authEndpoint");
|
35
|
+
vi.mock("../../core/authentication/jwt");
|
36
|
+
vi.mock("../../web/utils/iFrameCommunication/InAppWalletIframeCommunicator");
|
37
|
+
|
38
|
+
describe("InAppWebConnector.connect", () => {
|
39
|
+
const mockAuthToken = {
|
40
|
+
storedToken: {
|
41
|
+
authDetails: {
|
42
|
+
userWalletId: "123",
|
43
|
+
recoveryShareManagement: "ENCLAVE" as const,
|
44
|
+
},
|
45
|
+
authProvider: "EmailOtp" as const,
|
46
|
+
cookieString: "mock-cookie",
|
47
|
+
developerClientId: TEST_CLIENT.clientId,
|
48
|
+
isNewUser: false,
|
49
|
+
jwtToken: "mock-jwt-token",
|
50
|
+
shouldStoreCookieString: true,
|
51
|
+
},
|
52
|
+
};
|
53
|
+
|
54
|
+
const connector = new InAppWebConnector({
|
55
|
+
client: TEST_CLIENT,
|
56
|
+
});
|
57
|
+
const mockWallet = createWalletAdapter({
|
58
|
+
adaptedAccount: TEST_ACCOUNT_A,
|
59
|
+
client: TEST_CLIENT,
|
60
|
+
chain: ethereum,
|
61
|
+
onDisconnect: () => {},
|
62
|
+
switchChain: () => {},
|
63
|
+
});
|
64
|
+
const mockAccount = mockWallet.getAccount();
|
65
|
+
if (!mockAccount) {
|
66
|
+
throw new Error("mockAccount is undefined");
|
67
|
+
}
|
68
|
+
|
69
|
+
it("should handle email authentication", async () => {
|
70
|
+
vi.mocked(verifyOtp).mockResolvedValueOnce(mockAuthToken);
|
71
|
+
|
72
|
+
const result = await connector.connect({
|
73
|
+
strategy: "email",
|
74
|
+
email: "test@example.com",
|
75
|
+
verificationCode: "123456",
|
76
|
+
});
|
77
|
+
|
78
|
+
expect(verifyOtp).toHaveBeenCalledWith({
|
79
|
+
strategy: "email",
|
80
|
+
email: "test@example.com",
|
81
|
+
verificationCode: "123456",
|
82
|
+
client: TEST_CLIENT,
|
83
|
+
ecosystem: undefined,
|
84
|
+
});
|
85
|
+
|
86
|
+
expect(result).toBeDefined();
|
87
|
+
});
|
88
|
+
|
89
|
+
it("should handle wallet authentication", async () => {
|
90
|
+
vi.mocked(siweAuthenticate).mockResolvedValueOnce(mockAuthToken);
|
91
|
+
|
92
|
+
const mockWallet = createWalletAdapter({
|
93
|
+
adaptedAccount: TEST_ACCOUNT_A,
|
94
|
+
client: TEST_CLIENT,
|
95
|
+
chain: ethereum,
|
96
|
+
onDisconnect: () => {},
|
97
|
+
switchChain: () => {},
|
98
|
+
});
|
99
|
+
|
100
|
+
await connector.connect({
|
101
|
+
strategy: "wallet",
|
102
|
+
chain: ethereum,
|
103
|
+
wallet: mockWallet,
|
104
|
+
});
|
105
|
+
|
106
|
+
expect(siweAuthenticate).toHaveBeenCalledWith({
|
107
|
+
wallet: mockWallet,
|
108
|
+
chain: ethereum,
|
109
|
+
client: TEST_CLIENT,
|
110
|
+
ecosystem: undefined,
|
111
|
+
});
|
112
|
+
});
|
113
|
+
|
114
|
+
it("should handle guest authentication", async () => {
|
115
|
+
vi.mocked(guestAuthenticate).mockResolvedValueOnce(mockAuthToken);
|
116
|
+
|
117
|
+
await connector.connect({
|
118
|
+
strategy: "guest",
|
119
|
+
});
|
120
|
+
|
121
|
+
expect(guestAuthenticate).toHaveBeenCalled();
|
122
|
+
});
|
123
|
+
|
124
|
+
it("should handle backend authentication", async () => {
|
125
|
+
vi.mocked(backendAuthenticate).mockResolvedValueOnce(mockAuthToken);
|
126
|
+
|
127
|
+
await connector.connect({
|
128
|
+
strategy: "backend",
|
129
|
+
walletSecret: "secret123",
|
130
|
+
});
|
131
|
+
|
132
|
+
expect(backendAuthenticate).toHaveBeenCalledWith({
|
133
|
+
walletSecret: "secret123",
|
134
|
+
client: TEST_CLIENT,
|
135
|
+
ecosystem: undefined,
|
136
|
+
});
|
137
|
+
});
|
138
|
+
|
139
|
+
it("should handle oauth authentication", async () => {
|
140
|
+
vi.mocked(loginWithOauth).mockResolvedValueOnce(mockAuthToken);
|
141
|
+
|
142
|
+
await connector.connect({
|
143
|
+
strategy: "google",
|
144
|
+
});
|
145
|
+
|
146
|
+
expect(loginWithOauth).toHaveBeenCalledWith({
|
147
|
+
authOption: "google",
|
148
|
+
client: TEST_CLIENT,
|
149
|
+
ecosystem: undefined,
|
150
|
+
closeOpenedWindow: undefined,
|
151
|
+
openedWindow: undefined,
|
152
|
+
});
|
153
|
+
});
|
154
|
+
|
155
|
+
it("should throw error for invalid strategy", async () => {
|
156
|
+
await expect(
|
157
|
+
connector.connect({
|
158
|
+
// @ts-expect-error invalid strategy
|
159
|
+
strategy: "invalid",
|
160
|
+
}),
|
161
|
+
).rejects.toThrow("Invalid param: invalid");
|
162
|
+
});
|
163
|
+
});
|
@@ -5,6 +5,7 @@ import type { SocialAuthOption } from "../../../../wallets/types.js";
|
|
5
5
|
import type { Account } from "../../../interfaces/wallet.js";
|
6
6
|
import { getUserStatus } from "../../core/actions/get-enclave-user-status.js";
|
7
7
|
import { authEndpoint } from "../../core/authentication/authEndpoint.js";
|
8
|
+
import { backendAuthenticate } from "../../core/authentication/backend.js";
|
8
9
|
import { ClientScopedStorage } from "../../core/authentication/client-scoped-storage.js";
|
9
10
|
import { guestAuthenticate } from "../../core/authentication/guest.js";
|
10
11
|
import { customJwt } from "../../core/authentication/jwt.js";
|
@@ -351,6 +352,13 @@ export class InAppWebConnector implements InAppConnector {
|
|
351
352
|
storage: webLocalStorage,
|
352
353
|
});
|
353
354
|
}
|
355
|
+
case "backend": {
|
356
|
+
return backendAuthenticate({
|
357
|
+
client: this.client,
|
358
|
+
walletSecret: args.walletSecret,
|
359
|
+
ecosystem: this.ecosystem,
|
360
|
+
});
|
361
|
+
}
|
354
362
|
case "wallet": {
|
355
363
|
return siweAuthenticate({
|
356
364
|
ecosystem: this.ecosystem,
|
@@ -387,6 +395,7 @@ export class InAppWebConnector implements InAppConnector {
|
|
387
395
|
const authToken = await this.passkeyAuth(args);
|
388
396
|
return this.loginWithAuthToken(authToken);
|
389
397
|
}
|
398
|
+
case "backend":
|
390
399
|
case "phone":
|
391
400
|
case "email":
|
392
401
|
case "wallet":
|