signer-test-sdk-core 0.0.1
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/README.md +81 -0
- package/dist/src/components/OnboardingUI/auth.d.ts +158 -0
- package/dist/src/components/OnboardingUI/auth.js +230 -0
- package/dist/src/components/OnboardingUI/auth.js.map +1 -0
- package/dist/src/components/OnboardingUI/index.d.ts +9 -0
- package/dist/src/components/OnboardingUI/index.js +9 -0
- package/dist/src/components/OnboardingUI/index.js.map +1 -0
- package/dist/src/components/OnboardingUI/types.d.ts +159 -0
- package/dist/src/components/OnboardingUI/types.js +5 -0
- package/dist/src/components/OnboardingUI/types.js.map +1 -0
- package/dist/src/core/AbstraxnWallet.d.ts +162 -0
- package/dist/src/core/AbstraxnWallet.js +593 -0
- package/dist/src/core/AbstraxnWallet.js.map +1 -0
- package/dist/src/core/AuthManager.d.ts +112 -0
- package/dist/src/core/AuthManager.js +685 -0
- package/dist/src/core/AuthManager.js.map +1 -0
- package/dist/src/core/Signer.d.ts +35 -0
- package/dist/src/core/Signer.js +156 -0
- package/dist/src/core/Signer.js.map +1 -0
- package/dist/src/index.d.ts +17 -0
- package/dist/src/index.js +19 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/interfaces/IAuth.d.ts +26 -0
- package/dist/src/interfaces/IAuth.js +2 -0
- package/dist/src/interfaces/IAuth.js.map +1 -0
- package/dist/src/interfaces/ISigner.d.ts +14 -0
- package/dist/src/interfaces/ISigner.js +2 -0
- package/dist/src/interfaces/ISigner.js.map +1 -0
- package/dist/src/interfaces/IStorage.d.ts +15 -0
- package/dist/src/interfaces/IStorage.js +2 -0
- package/dist/src/interfaces/IStorage.js.map +1 -0
- package/dist/src/interfaces/IWallet.d.ts +45 -0
- package/dist/src/interfaces/IWallet.js +2 -0
- package/dist/src/interfaces/IWallet.js.map +1 -0
- package/dist/src/services/ApiService.d.ts +131 -0
- package/dist/src/services/ApiService.js +626 -0
- package/dist/src/services/ApiService.js.map +1 -0
- package/dist/src/services/TokenService.d.ts +29 -0
- package/dist/src/services/TokenService.js +40 -0
- package/dist/src/services/TokenService.js.map +1 -0
- package/dist/src/services/TurnkeyService.d.ts +54 -0
- package/dist/src/services/TurnkeyService.js +91 -0
- package/dist/src/services/TurnkeyService.js.map +1 -0
- package/dist/src/storage/IndexedDBStorage.d.ts +39 -0
- package/dist/src/storage/IndexedDBStorage.js +280 -0
- package/dist/src/storage/IndexedDBStorage.js.map +1 -0
- package/dist/src/utils/constants.d.ts +52 -0
- package/dist/src/utils/constants.js +78 -0
- package/dist/src/utils/constants.js.map +1 -0
- package/dist/src/utils/errors.d.ts +23 -0
- package/dist/src/utils/errors.js +48 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/helpers.d.ts +12 -0
- package/dist/src/utils/helpers.js +30 -0
- package/dist/src/utils/helpers.js.map +1 -0
- package/dist/src/utils/passkey.d.ts +33 -0
- package/dist/src/utils/passkey.js +122 -0
- package/dist/src/utils/passkey.js.map +1 -0
- package/dist/src/utils/types.d.ts +182 -0
- package/dist/src/utils/types.js +5 -0
- package/dist/src/utils/types.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,626 @@
|
|
|
1
|
+
import { API_ENDPOINTS, API_BASE_URL, TURNKEY_CONFIG, TURNKEY_ENDPOINTS } from '../utils/constants';
|
|
2
|
+
import { AuthenticationError, NetworkError } from '../utils/errors';
|
|
3
|
+
import { getErrorMessage } from '../utils/helpers';
|
|
4
|
+
export class ApiService {
|
|
5
|
+
constructor(apiKey, tokenService, turnkeyService) {
|
|
6
|
+
this.apiKey = apiKey;
|
|
7
|
+
this.tokenService = tokenService;
|
|
8
|
+
this.turnkeyService = turnkeyService;
|
|
9
|
+
this.isRefreshing = false;
|
|
10
|
+
this.refreshPromise = null;
|
|
11
|
+
// Use fixed backend URL from constants
|
|
12
|
+
this.baseUrl = API_BASE_URL;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Build URL with API key as query parameter
|
|
16
|
+
*/
|
|
17
|
+
buildUrl(endpoint) {
|
|
18
|
+
const url = new URL(endpoint, this.baseUrl);
|
|
19
|
+
url.searchParams.set('apikey', this.apiKey);
|
|
20
|
+
return url.toString();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Initialize OTP
|
|
24
|
+
*/
|
|
25
|
+
async initOtp(email) {
|
|
26
|
+
try {
|
|
27
|
+
const url = this.buildUrl(API_ENDPOINTS.INIT_OTP);
|
|
28
|
+
const response = await fetch(url, {
|
|
29
|
+
method: 'POST',
|
|
30
|
+
headers: {
|
|
31
|
+
'Content-Type': 'application/json',
|
|
32
|
+
},
|
|
33
|
+
body: JSON.stringify({ email }),
|
|
34
|
+
});
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
const error = await response.json().catch(() => ({ message: 'Failed to initialize OTP' }));
|
|
37
|
+
throw new AuthenticationError(error.message || 'Failed to initialize OTP');
|
|
38
|
+
}
|
|
39
|
+
return await response.json();
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (error instanceof AuthenticationError) {
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
throw new NetworkError(`Network error: ${getErrorMessage(error)}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Verify OTP
|
|
50
|
+
*/
|
|
51
|
+
async verifyOtp(otpId, otpCode, targetPublicKey) {
|
|
52
|
+
try {
|
|
53
|
+
const url = this.buildUrl(API_ENDPOINTS.VERIFY_OTP);
|
|
54
|
+
const response = await fetch(url, {
|
|
55
|
+
method: 'POST',
|
|
56
|
+
headers: {
|
|
57
|
+
'Content-Type': 'application/json',
|
|
58
|
+
},
|
|
59
|
+
body: JSON.stringify({
|
|
60
|
+
otpId,
|
|
61
|
+
otpCode,
|
|
62
|
+
targetPublicKey,
|
|
63
|
+
}),
|
|
64
|
+
});
|
|
65
|
+
if (!response.ok) {
|
|
66
|
+
const error = await response.json().catch(() => ({ message: 'Failed to verify OTP' }));
|
|
67
|
+
throw new AuthenticationError(error.message || 'Failed to verify OTP');
|
|
68
|
+
}
|
|
69
|
+
const data = await response.json();
|
|
70
|
+
// Store tokens if provided
|
|
71
|
+
if (data.accessToken && data.refreshToken) {
|
|
72
|
+
await this.tokenService.setTokens({
|
|
73
|
+
accessToken: data.accessToken,
|
|
74
|
+
refreshToken: data.refreshToken,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return data;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (error instanceof AuthenticationError) {
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
throw new NetworkError(`Network error: ${getErrorMessage(error)}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get Google OAuth URL
|
|
88
|
+
*/
|
|
89
|
+
getGoogleAuthUrl(publicKey, originUrl) {
|
|
90
|
+
const url = new URL(API_ENDPOINTS.GOOGLE_AUTH, this.baseUrl);
|
|
91
|
+
url.searchParams.set('apikey', this.apiKey);
|
|
92
|
+
url.searchParams.set('publickey', publicKey);
|
|
93
|
+
url.searchParams.set('origin', originUrl);
|
|
94
|
+
return url.toString();
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get Discord OAuth URL
|
|
98
|
+
*/
|
|
99
|
+
getDiscordAuthUrl(publicKey, originUrl) {
|
|
100
|
+
const url = new URL(API_ENDPOINTS.DISCORD_AUTH, this.baseUrl);
|
|
101
|
+
url.searchParams.set('apikey', this.apiKey);
|
|
102
|
+
url.searchParams.set('publickey', publicKey);
|
|
103
|
+
url.searchParams.set('origin', originUrl);
|
|
104
|
+
return url.toString();
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get X (Twitter) OAuth URL
|
|
108
|
+
*/
|
|
109
|
+
getTwitterAuthUrl(publicKey, originUrl) {
|
|
110
|
+
const url = new URL(API_ENDPOINTS.X_AUTH, this.baseUrl);
|
|
111
|
+
url.searchParams.set('apikey', this.apiKey);
|
|
112
|
+
url.searchParams.set('publickey', publicKey);
|
|
113
|
+
url.searchParams.set('origin', originUrl);
|
|
114
|
+
return url.toString();
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Passkey signup
|
|
118
|
+
* Calls the backend API to register a new user with passkey
|
|
119
|
+
*/
|
|
120
|
+
async passkeySignup(payload) {
|
|
121
|
+
try {
|
|
122
|
+
const url = this.buildUrl(API_ENDPOINTS.PASSKEY_SIGNUP);
|
|
123
|
+
const response = await fetch(url, {
|
|
124
|
+
method: 'POST',
|
|
125
|
+
headers: {
|
|
126
|
+
'Content-Type': 'application/json',
|
|
127
|
+
},
|
|
128
|
+
body: JSON.stringify(payload),
|
|
129
|
+
});
|
|
130
|
+
if (!response.ok) {
|
|
131
|
+
const error = await response.json().catch(() => ({ message: 'Failed to signup with passkey' }));
|
|
132
|
+
throw new AuthenticationError(error.message || 'Failed to signup with passkey');
|
|
133
|
+
}
|
|
134
|
+
const data = await response.json();
|
|
135
|
+
// Store tokens if provided
|
|
136
|
+
if (data.accessToken && data.refreshToken) {
|
|
137
|
+
await this.tokenService.setTokens({
|
|
138
|
+
accessToken: data.accessToken,
|
|
139
|
+
refreshToken: data.refreshToken,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return data;
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (error instanceof AuthenticationError) {
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
throw new NetworkError(`Network error: ${getErrorMessage(error)}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Passkey login
|
|
153
|
+
* Calls the backend API to login with passkey stamp
|
|
154
|
+
*/
|
|
155
|
+
async passkeyLogin(payload) {
|
|
156
|
+
try {
|
|
157
|
+
const url = this.buildUrl(API_ENDPOINTS.PASSKEY_LOGIN);
|
|
158
|
+
const response = await fetch(url, {
|
|
159
|
+
method: 'POST',
|
|
160
|
+
headers: {
|
|
161
|
+
'Content-Type': 'application/json',
|
|
162
|
+
},
|
|
163
|
+
body: JSON.stringify(payload),
|
|
164
|
+
});
|
|
165
|
+
if (!response.ok) {
|
|
166
|
+
const error = await response.json().catch(() => ({ message: 'Failed to login with passkey' }));
|
|
167
|
+
throw new AuthenticationError(error.message || 'Failed to login with passkey');
|
|
168
|
+
}
|
|
169
|
+
const data = await response.json();
|
|
170
|
+
// Store tokens if provided
|
|
171
|
+
if (data.accessToken && data.refreshToken) {
|
|
172
|
+
await this.tokenService.setTokens({
|
|
173
|
+
accessToken: data.accessToken,
|
|
174
|
+
refreshToken: data.refreshToken,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return data;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
if (error instanceof AuthenticationError) {
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
throw new NetworkError(`Network error: ${getErrorMessage(error)}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Handle Google OAuth callback
|
|
188
|
+
* Calls the backend API with code and state to get accessToken and refreshToken
|
|
189
|
+
*/
|
|
190
|
+
async handleGoogleCallback(code, state) {
|
|
191
|
+
try {
|
|
192
|
+
const url = new URL(API_ENDPOINTS.GOOGLE_CALLBACK, this.baseUrl);
|
|
193
|
+
url.searchParams.set('apikey', this.apiKey);
|
|
194
|
+
url.searchParams.set('code', code);
|
|
195
|
+
url.searchParams.set('state', state);
|
|
196
|
+
const response = await fetch(url.toString(), {
|
|
197
|
+
method: 'GET',
|
|
198
|
+
headers: {
|
|
199
|
+
'Content-Type': 'application/json',
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
if (!response.ok) {
|
|
203
|
+
const error = await response.json().catch(() => ({ message: 'Failed to handle Google callback' }));
|
|
204
|
+
throw new AuthenticationError(error.message || 'Failed to handle Google callback');
|
|
205
|
+
}
|
|
206
|
+
const data = await response.json();
|
|
207
|
+
// Store tokens using TokenService
|
|
208
|
+
if (data.accessToken && data.refreshToken) {
|
|
209
|
+
await this.tokenService.setTokens({
|
|
210
|
+
accessToken: data.accessToken,
|
|
211
|
+
refreshToken: data.refreshToken,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
return data;
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
if (error instanceof AuthenticationError) {
|
|
218
|
+
throw error;
|
|
219
|
+
}
|
|
220
|
+
throw new NetworkError(`Network error: ${getErrorMessage(error)}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Handle Discord OAuth callback
|
|
225
|
+
* Calls the backend API with code and state to get accessToken and refreshToken
|
|
226
|
+
*/
|
|
227
|
+
async handleDiscordCallback(code, state) {
|
|
228
|
+
try {
|
|
229
|
+
const url = new URL(API_ENDPOINTS.DISCORD_CALLBACK, this.baseUrl);
|
|
230
|
+
url.searchParams.set('apikey', this.apiKey);
|
|
231
|
+
url.searchParams.set('code', code);
|
|
232
|
+
url.searchParams.set('state', state);
|
|
233
|
+
const response = await fetch(url.toString(), {
|
|
234
|
+
method: 'GET',
|
|
235
|
+
headers: {
|
|
236
|
+
'Content-Type': 'application/json',
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
if (!response.ok) {
|
|
240
|
+
const error = await response.json().catch(() => ({ message: 'Failed to handle Discord callback' }));
|
|
241
|
+
throw new AuthenticationError(error.message || 'Failed to handle Discord callback');
|
|
242
|
+
}
|
|
243
|
+
const data = await response.json();
|
|
244
|
+
if (data.accessToken && data.refreshToken) {
|
|
245
|
+
await this.tokenService.setTokens({
|
|
246
|
+
accessToken: data.accessToken,
|
|
247
|
+
refreshToken: data.refreshToken,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
return data;
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
if (error instanceof AuthenticationError) {
|
|
254
|
+
throw error;
|
|
255
|
+
}
|
|
256
|
+
throw new NetworkError(`Network error: ${getErrorMessage(error)}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Handle X (Twitter) OAuth callback
|
|
261
|
+
* Calls the backend API with code and state to get accessToken and refreshToken
|
|
262
|
+
*/
|
|
263
|
+
async handleTwitterCallback(code, state) {
|
|
264
|
+
try {
|
|
265
|
+
const url = new URL(API_ENDPOINTS.X_CALLBACK, this.baseUrl);
|
|
266
|
+
url.searchParams.set('apikey', this.apiKey);
|
|
267
|
+
url.searchParams.set('code', code);
|
|
268
|
+
url.searchParams.set('state', state);
|
|
269
|
+
const response = await fetch(url.toString(), {
|
|
270
|
+
method: 'GET',
|
|
271
|
+
headers: {
|
|
272
|
+
'Content-Type': 'application/json',
|
|
273
|
+
},
|
|
274
|
+
});
|
|
275
|
+
if (!response.ok) {
|
|
276
|
+
const error = await response.json().catch(() => ({ message: 'Failed to handle X (Twitter) callback' }));
|
|
277
|
+
throw new AuthenticationError(error.message || 'Failed to handle X (Twitter) callback');
|
|
278
|
+
}
|
|
279
|
+
const data = await response.json();
|
|
280
|
+
if (data.accessToken && data.refreshToken) {
|
|
281
|
+
await this.tokenService.setTokens({
|
|
282
|
+
accessToken: data.accessToken,
|
|
283
|
+
refreshToken: data.refreshToken,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
return data;
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
if (error instanceof AuthenticationError) {
|
|
290
|
+
throw error;
|
|
291
|
+
}
|
|
292
|
+
throw new NetworkError(`Network error: ${getErrorMessage(error)}`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Refresh access token
|
|
297
|
+
* Handles both cases where API returns only accessToken or both accessToken and refreshToken
|
|
298
|
+
*/
|
|
299
|
+
async refreshToken() {
|
|
300
|
+
// If already refreshing, return the existing promise to prevent concurrent calls
|
|
301
|
+
if (this.isRefreshing && this.refreshPromise) {
|
|
302
|
+
return this.refreshPromise;
|
|
303
|
+
}
|
|
304
|
+
this.isRefreshing = true;
|
|
305
|
+
this.refreshPromise = (async () => {
|
|
306
|
+
try {
|
|
307
|
+
const refreshToken = await this.tokenService.getRefreshToken();
|
|
308
|
+
if (!refreshToken) {
|
|
309
|
+
throw new AuthenticationError('No refresh token available');
|
|
310
|
+
}
|
|
311
|
+
const url = this.buildUrl(API_ENDPOINTS.REFRESH_TOKEN);
|
|
312
|
+
const response = await fetch(url, {
|
|
313
|
+
method: 'POST',
|
|
314
|
+
headers: {
|
|
315
|
+
'Content-Type': 'application/json',
|
|
316
|
+
},
|
|
317
|
+
body: JSON.stringify({ refreshToken }),
|
|
318
|
+
});
|
|
319
|
+
if (!response.ok) {
|
|
320
|
+
throw new AuthenticationError('Failed to refresh token');
|
|
321
|
+
}
|
|
322
|
+
const data = await response.json();
|
|
323
|
+
// If API returns new refreshToken, use it; otherwise keep the existing one
|
|
324
|
+
const newRefreshToken = data.refreshToken || refreshToken;
|
|
325
|
+
// Save both tokens
|
|
326
|
+
await this.tokenService.setTokens({
|
|
327
|
+
accessToken: data.accessToken,
|
|
328
|
+
refreshToken: newRefreshToken,
|
|
329
|
+
});
|
|
330
|
+
return {
|
|
331
|
+
accessToken: data.accessToken,
|
|
332
|
+
refreshToken: newRefreshToken,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
finally {
|
|
336
|
+
this.isRefreshing = false;
|
|
337
|
+
this.refreshPromise = null;
|
|
338
|
+
}
|
|
339
|
+
})();
|
|
340
|
+
return this.refreshPromise;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Check if response indicates token expiration (401 or 403)
|
|
344
|
+
*/
|
|
345
|
+
isTokenExpired(response) {
|
|
346
|
+
return response.status === 401 || response.status === 403;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Make an authenticated request with automatic token refresh on expiration
|
|
350
|
+
*/
|
|
351
|
+
async makeAuthenticatedRequest(requestFn, retryCount = 0) {
|
|
352
|
+
const accessToken = await this.tokenService.getAccessToken();
|
|
353
|
+
if (!accessToken) {
|
|
354
|
+
throw new AuthenticationError('No access token available');
|
|
355
|
+
}
|
|
356
|
+
let response = await requestFn(accessToken);
|
|
357
|
+
// If token expired, refresh and retry once
|
|
358
|
+
if (this.isTokenExpired(response) && retryCount === 0) {
|
|
359
|
+
try {
|
|
360
|
+
// Refresh the token
|
|
361
|
+
await this.refreshToken();
|
|
362
|
+
// Get the new access token
|
|
363
|
+
const newAccessToken = await this.tokenService.getAccessToken();
|
|
364
|
+
if (!newAccessToken) {
|
|
365
|
+
throw new AuthenticationError('Failed to get new access token after refresh');
|
|
366
|
+
}
|
|
367
|
+
// Retry the request with new token
|
|
368
|
+
response = await requestFn(newAccessToken);
|
|
369
|
+
}
|
|
370
|
+
catch (error) {
|
|
371
|
+
// If refresh fails, throw authentication error
|
|
372
|
+
if (error instanceof AuthenticationError) {
|
|
373
|
+
throw error;
|
|
374
|
+
}
|
|
375
|
+
throw new AuthenticationError('Failed to refresh token and retry request');
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
// If still not ok after retry, throw error
|
|
379
|
+
if (!response.ok) {
|
|
380
|
+
const error = await response.json().catch(() => ({ message: 'Request failed' }));
|
|
381
|
+
throw new Error(error.message || `Request failed with status ${response.status}`);
|
|
382
|
+
}
|
|
383
|
+
return await response.json();
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Sign transaction (legacy - for Turnkey proxy)
|
|
387
|
+
*/
|
|
388
|
+
async signTransaction(body, stamp, url) {
|
|
389
|
+
try {
|
|
390
|
+
return await this.makeAuthenticatedRequest(async (accessToken) => {
|
|
391
|
+
const apiUrl = this.buildUrl(API_ENDPOINTS.SIGN_TRANSACTION);
|
|
392
|
+
return await fetch(apiUrl, {
|
|
393
|
+
method: 'POST',
|
|
394
|
+
headers: {
|
|
395
|
+
'Content-Type': 'application/json',
|
|
396
|
+
Authorization: `Bearer ${accessToken}`,
|
|
397
|
+
},
|
|
398
|
+
body: JSON.stringify({
|
|
399
|
+
body,
|
|
400
|
+
stamp,
|
|
401
|
+
url,
|
|
402
|
+
}),
|
|
403
|
+
});
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
catch (error) {
|
|
407
|
+
if (error instanceof AuthenticationError) {
|
|
408
|
+
throw error;
|
|
409
|
+
}
|
|
410
|
+
throw new NetworkError(`Network error: ${getErrorMessage(error)}`);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Sign transaction via backend API
|
|
415
|
+
* Takes an unsigned transaction and returns a signed transaction
|
|
416
|
+
* Backend expects the same format as PROXY endpoint (url, method, body, stamp)
|
|
417
|
+
*/
|
|
418
|
+
async signTransactionViaBackend(unsignedTransaction, signWith, organizationId) {
|
|
419
|
+
try {
|
|
420
|
+
// Create request body for Turnkey sign transaction call
|
|
421
|
+
const body = JSON.stringify({
|
|
422
|
+
type: 'ACTIVITY_TYPE_SIGN_TRANSACTION_V2',
|
|
423
|
+
timestampMs: new Date().getTime().toString(),
|
|
424
|
+
organizationId,
|
|
425
|
+
parameters: {
|
|
426
|
+
signWith,
|
|
427
|
+
unsignedTransaction,
|
|
428
|
+
type: 'TRANSACTION_TYPE_ETHEREUM',
|
|
429
|
+
},
|
|
430
|
+
});
|
|
431
|
+
// Create stamp for the request
|
|
432
|
+
const stamp = await this.turnkeyService.createStamp(body);
|
|
433
|
+
// Turnkey sign transaction endpoint URL
|
|
434
|
+
const turnkeyUrl = `${TURNKEY_CONFIG.BASE_URL}${TURNKEY_ENDPOINTS.SIGN_TRANSACTION}`;
|
|
435
|
+
const response = await this.makeAuthenticatedRequest(async (accessToken) => {
|
|
436
|
+
const url = this.buildUrl(API_ENDPOINTS.SIGN_TRANSACTION);
|
|
437
|
+
return await fetch(url, {
|
|
438
|
+
method: 'POST',
|
|
439
|
+
headers: {
|
|
440
|
+
'Content-Type': 'application/json',
|
|
441
|
+
'Authorization': `Bearer ${accessToken}`,
|
|
442
|
+
},
|
|
443
|
+
body: JSON.stringify({
|
|
444
|
+
url: turnkeyUrl,
|
|
445
|
+
body,
|
|
446
|
+
stamp,
|
|
447
|
+
}),
|
|
448
|
+
});
|
|
449
|
+
});
|
|
450
|
+
// console.log('response', response)
|
|
451
|
+
// Extract signed transaction from response
|
|
452
|
+
// Try direct signature field first (new format)
|
|
453
|
+
let signedTransaction = response.signature;
|
|
454
|
+
// Fallback to nested structure (old format)
|
|
455
|
+
if (!signedTransaction) {
|
|
456
|
+
signedTransaction = response.result?.activity?.result?.signTransactionResult?.signedTransaction;
|
|
457
|
+
}
|
|
458
|
+
if (!signedTransaction) {
|
|
459
|
+
throw new Error('No signed transaction found in response');
|
|
460
|
+
}
|
|
461
|
+
return { signedTransaction };
|
|
462
|
+
}
|
|
463
|
+
catch (error) {
|
|
464
|
+
if (error instanceof AuthenticationError) {
|
|
465
|
+
throw error;
|
|
466
|
+
}
|
|
467
|
+
throw new NetworkError(`Network error: ${getErrorMessage(error)}`);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Export wallet account
|
|
472
|
+
* Calls backend API to export private key
|
|
473
|
+
*/
|
|
474
|
+
async exportWalletAccount(organizationId, address, targetPublicKey) {
|
|
475
|
+
try {
|
|
476
|
+
// Create request body for Turnkey export wallet call
|
|
477
|
+
const body = JSON.stringify({
|
|
478
|
+
type: 'ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT',
|
|
479
|
+
timestampMs: new Date().getTime().toString(),
|
|
480
|
+
organizationId,
|
|
481
|
+
parameters: {
|
|
482
|
+
address,
|
|
483
|
+
targetPublicKey,
|
|
484
|
+
},
|
|
485
|
+
});
|
|
486
|
+
// Create stamp for the request
|
|
487
|
+
const stamp = await this.turnkeyService.createStamp(body);
|
|
488
|
+
// Turnkey export wallet endpoint URL
|
|
489
|
+
const turnkeyUrl = `${TURNKEY_CONFIG.BASE_URL}${TURNKEY_ENDPOINTS.STAMP_EXPORT_WALLET_ACCOUNT}`;
|
|
490
|
+
const response = await this.makeAuthenticatedRequest(async (accessToken) => {
|
|
491
|
+
const url = this.buildUrl(API_ENDPOINTS.EXPORT_WALLET);
|
|
492
|
+
return await fetch(url, {
|
|
493
|
+
method: 'POST',
|
|
494
|
+
headers: {
|
|
495
|
+
'Content-Type': 'application/json',
|
|
496
|
+
'Authorization': `Bearer ${accessToken}`,
|
|
497
|
+
},
|
|
498
|
+
body: JSON.stringify({
|
|
499
|
+
url: turnkeyUrl,
|
|
500
|
+
body,
|
|
501
|
+
stamp,
|
|
502
|
+
}),
|
|
503
|
+
});
|
|
504
|
+
});
|
|
505
|
+
const exportBundle = response.result?.activity?.result?.exportWalletAccountResult?.exportBundle;
|
|
506
|
+
if (!exportBundle) {
|
|
507
|
+
throw new Error('No export bundle found in response');
|
|
508
|
+
}
|
|
509
|
+
return { exportBundle };
|
|
510
|
+
}
|
|
511
|
+
catch (error) {
|
|
512
|
+
if (error instanceof AuthenticationError) {
|
|
513
|
+
throw error;
|
|
514
|
+
}
|
|
515
|
+
throw new NetworkError(`Network error: ${getErrorMessage(error)}`);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Get whoami information from backend endpoint
|
|
520
|
+
* Calls backend whoami endpoint with access token
|
|
521
|
+
* Backend expects the same format as PROXY endpoint (url, method, body, stamp)
|
|
522
|
+
*/
|
|
523
|
+
async getWhoami(organizationId) {
|
|
524
|
+
try {
|
|
525
|
+
// Create request body for whoami call
|
|
526
|
+
const body = JSON.stringify({
|
|
527
|
+
organizationId,
|
|
528
|
+
});
|
|
529
|
+
// Create stamp for the request
|
|
530
|
+
const stamp = await this.turnkeyService.createStamp(body);
|
|
531
|
+
// Turnkey whoami endpoint URL
|
|
532
|
+
const turnkeyUrl = `${TURNKEY_CONFIG.BASE_URL}${TURNKEY_ENDPOINTS.GET_WHOAMI}`;
|
|
533
|
+
const response = await this.makeAuthenticatedRequest(async (accessToken) => {
|
|
534
|
+
const url = this.buildUrl(API_ENDPOINTS.WHOAMI);
|
|
535
|
+
return await fetch(url, {
|
|
536
|
+
method: 'POST',
|
|
537
|
+
headers: {
|
|
538
|
+
'Content-Type': 'application/json',
|
|
539
|
+
'Authorization': `Bearer ${accessToken}`,
|
|
540
|
+
},
|
|
541
|
+
body: JSON.stringify({
|
|
542
|
+
url: turnkeyUrl,
|
|
543
|
+
body,
|
|
544
|
+
stamp,
|
|
545
|
+
}),
|
|
546
|
+
});
|
|
547
|
+
});
|
|
548
|
+
// Extract result from response wrapper
|
|
549
|
+
if (response.result) {
|
|
550
|
+
return response.result;
|
|
551
|
+
}
|
|
552
|
+
throw new Error('Invalid whoami response: missing result');
|
|
553
|
+
}
|
|
554
|
+
catch (error) {
|
|
555
|
+
if (error instanceof AuthenticationError) {
|
|
556
|
+
throw error;
|
|
557
|
+
}
|
|
558
|
+
throw new NetworkError(`Network error: ${getErrorMessage(error)}`);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Get whoami information from Turnkey via PROXY (deprecated - use getWhoami instead)
|
|
563
|
+
* This is kept for backward compatibility but should use getWhoami
|
|
564
|
+
*/
|
|
565
|
+
async getWhoamiViaProxy(organizationId) {
|
|
566
|
+
// Use the new backend endpoint instead
|
|
567
|
+
return this.getWhoami(organizationId);
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* Call PROXY endpoint to proxy Turnkey requests
|
|
571
|
+
*/
|
|
572
|
+
async callProxy(turnkeyUrl, method, body, stamp) {
|
|
573
|
+
try {
|
|
574
|
+
// Use makeAuthenticatedRequest if we have an access token, otherwise make direct call
|
|
575
|
+
const accessToken = await this.tokenService.getAccessToken();
|
|
576
|
+
if (accessToken) {
|
|
577
|
+
return await this.makeAuthenticatedRequest(async (token) => {
|
|
578
|
+
const proxyUrl = this.buildUrl(API_ENDPOINTS.PROXY);
|
|
579
|
+
const headers = {
|
|
580
|
+
'Content-Type': 'application/json',
|
|
581
|
+
'Authorization': `Bearer ${token}`,
|
|
582
|
+
};
|
|
583
|
+
return await fetch(proxyUrl, {
|
|
584
|
+
method: 'POST',
|
|
585
|
+
headers,
|
|
586
|
+
body: JSON.stringify({
|
|
587
|
+
url: turnkeyUrl,
|
|
588
|
+
method,
|
|
589
|
+
body,
|
|
590
|
+
stamp,
|
|
591
|
+
}),
|
|
592
|
+
});
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
else {
|
|
596
|
+
// If no access token, make direct call without authentication
|
|
597
|
+
const proxyUrl = this.buildUrl(API_ENDPOINTS.PROXY);
|
|
598
|
+
const headers = {
|
|
599
|
+
'Content-Type': 'application/json',
|
|
600
|
+
};
|
|
601
|
+
const response = await fetch(proxyUrl, {
|
|
602
|
+
method: 'POST',
|
|
603
|
+
headers,
|
|
604
|
+
body: JSON.stringify({
|
|
605
|
+
url: turnkeyUrl,
|
|
606
|
+
method,
|
|
607
|
+
body,
|
|
608
|
+
stamp,
|
|
609
|
+
}),
|
|
610
|
+
});
|
|
611
|
+
if (!response.ok) {
|
|
612
|
+
const error = await response.json().catch(() => ({ message: 'Failed to call PROXY' }));
|
|
613
|
+
throw new Error(error.message || 'Failed to call PROXY');
|
|
614
|
+
}
|
|
615
|
+
return await response.json();
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
catch (error) {
|
|
619
|
+
if (error instanceof AuthenticationError) {
|
|
620
|
+
throw error;
|
|
621
|
+
}
|
|
622
|
+
throw new NetworkError(`Network error: ${getErrorMessage(error)}`);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
//# sourceMappingURL=ApiService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiService.js","sourceRoot":"","sources":["../../../src/services/ApiService.ts"],"names":[],"mappings":"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"}
|