@dynamic-labs-wallet/browser 0.0.66 → 0.0.68

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/index.cjs.js CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  var core = require('@dynamic-labs-wallet/core');
4
4
  var web = require('./internal/web');
5
+ var sdkApiCore = require('@dynamic-labs/sdk-api-core');
5
6
  var logger$1 = require('@dynamic-labs/logger');
6
7
  var messageTransport = require('@dynamic-labs/message-transport');
7
8
 
@@ -130,7 +131,9 @@ const timeoutPromise = ({ timeInMs, activity = 'Ceremony' })=>{
130
131
  }));
131
132
  throw error;
132
133
  }
133
- await new Promise((resolve)=>setTimeout(resolve, retryInterval));
134
+ // Calculate exponential backoff delay
135
+ const exponentialDelay = retryInterval * 2 ** (attempts - 1);
136
+ await new Promise((resolve)=>setTimeout(resolve, exponentialDelay));
134
137
  }
135
138
  }
136
139
  // TypeScript needs this even though it's unreachable
@@ -166,6 +169,30 @@ const formatMessage = (chainName, message)=>{
166
169
  throw new Error('Unsupported chain name');
167
170
  }
168
171
  };
172
+ const getGoogleOAuthAccountId = (verifiedCredentials)=>{
173
+ const googleVerifiedCredential = verifiedCredentials == null ? void 0 : verifiedCredentials.find((credential)=>credential.oauthProvider === sdkApiCore.ProviderEnum.Google);
174
+ return googleVerifiedCredential == null ? void 0 : googleVerifiedCredential.id;
175
+ };
176
+ const createBackupData = ({ encryptedKeyShares, accountAddress, thresholdSignatureScheme, hasPassword = true })=>{
177
+ return {
178
+ keyShares: encryptedKeyShares,
179
+ metadata: {
180
+ version: '1.0',
181
+ createdAt: new Date().toISOString(),
182
+ accountAddress,
183
+ thresholdSignatureScheme,
184
+ hasPassword,
185
+ encryption: {
186
+ algorithm: AES_GCM_ALGORITHM,
187
+ keyDerivation: PBKDF2_ALGORITHM,
188
+ iterations: PBKDF2_ITERATIONS,
189
+ hashAlgorithm: PBKDF2_HASH_ALGORITHM,
190
+ algorithmLength: AES_GCM_LENGTH
191
+ },
192
+ shareCount: encryptedKeyShares.length
193
+ }
194
+ };
195
+ };
169
196
 
170
197
  const PBKDF2_ALGORITHM = 'PBKDF2';
171
198
  const PBKDF2_ITERATIONS = 100000;
@@ -293,9 +320,9 @@ const uploadFileToGoogleDrive = async ({ accessToken, fileName, jsonData, parent
293
320
  const result = await response.json();
294
321
  return result; // Return file metadata, including file ID
295
322
  };
296
- const listFilesFromGoogleDrive = async ({ accessToken, name })=>{
323
+ const listFilesFromGoogleDrive = async ({ accessToken, fileName })=>{
297
324
  // Step 1: List all files inside `appDataFolder` with the specified backup filename
298
- const resp = await fetch(`${GOOGLE_DRIVE_UPLOAD_API}/drive/v3/files?q=${encodeURIComponent(`name='${name}'`)}&spaces=appDataFolder&orderBy=createdTime desc`, {
325
+ const resp = await fetch(`${GOOGLE_DRIVE_UPLOAD_API}/drive/v3/files?q=${encodeURIComponent(`name='${fileName}'`)}&spaces=appDataFolder&orderBy=createdTime desc`, {
299
326
  headers: {
300
327
  Authorization: `Bearer ${accessToken}`
301
328
  }
@@ -308,10 +335,10 @@ const listFilesFromGoogleDrive = async ({ accessToken, name })=>{
308
335
  const files = data.files;
309
336
  return files;
310
337
  };
311
- const downloadFileFromGoogleDrive = async ({ accessToken, name })=>{
338
+ const downloadFileFromGoogleDrive = async ({ accessToken, fileName })=>{
312
339
  const files = await listFilesFromGoogleDrive({
313
340
  accessToken,
314
- name
341
+ fileName
315
342
  });
316
343
  if (!files || files.length === 0) {
317
344
  return null;
@@ -489,6 +516,56 @@ class IframeDisplayChannelAdapter {
489
516
  }
490
517
  }
491
518
 
519
+ /**
520
+ * Updates the wallet map with backup information after successful backup to Google Drive
521
+ * @param data - Response data containing key shares information
522
+ * @param walletMap - The wallet map to update
523
+ * @param accountAddress - The account address associated with the wallet
524
+ * @param backupLocation - The location where the backup is stored
525
+ * @param storage - Storage interface for persisting the updated wallet map
526
+ * @param storageKey - Key used to store the wallet map
527
+ * @returns The array of key share IDs that were backed up
528
+ */ const updateWalletMapWithBackupInfo = async ({ data, walletMap, accountAddress, storage, storageKey })=>{
529
+ const ids = data.keyShares.map((keyShare)=>keyShare.id);
530
+ walletMap[accountAddress].clientKeySharesBackupInfo.backups[core.BackupLocation.GOOGLE_DRIVE] = ids;
531
+ await storage.setItem(storageKey, JSON.stringify(walletMap));
532
+ return ids;
533
+ };
534
+ /**
535
+ * Uploads a backup to Google Drive App
536
+ * @param accessToken - The access token for the Google Drive API
537
+ * @param fileName - The name of the file to upload
538
+ * @param backupData - The data to upload
539
+ * @param accountAddress - The account address associated with the backup
540
+ */ const uploadBackupToGoogleDrive = async ({ accessToken, fileName, backupData, accountAddress })=>{
541
+ try {
542
+ await retryPromise(()=>uploadFileToGoogleDriveAppStorage({
543
+ accessToken,
544
+ fileName,
545
+ jsonData: backupData
546
+ }));
547
+ } catch (error) {
548
+ logger.error('Failed to upload keyshares to Google Drive App Storage', {
549
+ accountAddress,
550
+ error
551
+ });
552
+ throw new Error(`Failed to backup keyshares to Google Drive App Storage: ${error instanceof Error ? error.message : String(error)}`);
553
+ }
554
+ try {
555
+ await retryPromise(()=>uploadFileToGoogleDrivePersonal({
556
+ accessToken,
557
+ fileName,
558
+ jsonData: backupData
559
+ }));
560
+ } catch (error) {
561
+ logger.error('Failed to upload keyshares to Google Drive Personal', {
562
+ accountAddress,
563
+ error
564
+ });
565
+ throw new Error(`Failed to backup keyshares to Google Drive Personal: ${error instanceof Error ? error.message : String(error)}`);
566
+ }
567
+ };
568
+
492
569
  class DynamicWalletClient {
493
570
  async initialize() {
494
571
  if (this.initializePromise) {
@@ -1206,13 +1283,9 @@ class DynamicWalletClient {
1206
1283
  });
1207
1284
  const hasGoogleDriveBackup = this.walletMap[accountAddress].clientKeySharesBackupInfo.backups[core.BackupLocation.GOOGLE_DRIVE].length > 0;
1208
1285
  if (hasGoogleDriveBackup) {
1209
- var _user_verifiedCredentials_find;
1210
- const user = await this.apiClient.getUser();
1211
- const oauthAccountId = user == null ? void 0 : (_user_verifiedCredentials_find = user.verifiedCredentials.find((credential)=>credential.oauthProvider === 'google')) == null ? void 0 : _user_verifiedCredentials_find.id;
1212
1286
  const googleDriveKeyShareIds = await this.backupKeySharesToGoogleDrive({
1213
1287
  accountAddress,
1214
- password,
1215
- oauthAccountId
1288
+ password
1216
1289
  });
1217
1290
  data.keyShares.push({
1218
1291
  backupLocation: core.BackupLocation.GOOGLE_DRIVE,
@@ -1269,6 +1342,23 @@ class DynamicWalletClient {
1269
1342
  return deserializedKeyShare;
1270
1343
  }
1271
1344
  /**
1345
+ * Helper function to get Google OAuth Account ID or throw an error if not found.
1346
+ * @param accountAddress - The account address for logging purposes
1347
+ * @returns The Google OAuth Account ID
1348
+ * @throws Error if no Google OAuth account ID is found
1349
+ */ async getGoogleOauthAccountIdOrThrow(accountAddress) {
1350
+ const user = await this.apiClient.getUser();
1351
+ const oauthAccountId = getGoogleOAuthAccountId(user == null ? void 0 : user.verifiedCredentials);
1352
+ if (!oauthAccountId) {
1353
+ this.logger.error('No Google OAuth account ID found', {
1354
+ user,
1355
+ accountAddress
1356
+ });
1357
+ throw new Error('No Google OAuth account ID found');
1358
+ }
1359
+ return oauthAccountId;
1360
+ }
1361
+ /**
1272
1362
  * Helper function to determine keyshare recovery strategy for dynamic shares.
1273
1363
  * For REFRESH operations, retrieves enough shares to meet the client threshold.
1274
1364
  * For all other operations, retrieves just 1 share.
@@ -1331,7 +1421,7 @@ class DynamicWalletClient {
1331
1421
  }
1332
1422
  this.walletMap = JSON.parse(wallets);
1333
1423
  }
1334
- async backupKeySharesToGoogleDrive({ accountAddress, fileName, oauthAccountId, password }) {
1424
+ async backupKeySharesToGoogleDrive({ accountAddress, password }) {
1335
1425
  await this.getWallet({
1336
1426
  accountAddress,
1337
1427
  walletOperation: core.WalletOperation.REACH_ALL_PARTIES,
@@ -1347,74 +1437,77 @@ class DynamicWalletClient {
1347
1437
  keyShare,
1348
1438
  password
1349
1439
  })));
1440
+ const oauthAccountId = await this.getGoogleOauthAccountIdOrThrow(accountAddress);
1350
1441
  const accessToken = await this.apiClient.getAccessToken({
1351
1442
  oauthAccountId
1352
1443
  });
1353
1444
  const thresholdSignatureScheme = this.walletMap[accountAddress].thresholdSignatureScheme;
1354
- const suggestedFileName = getClientKeyShareExportFileName({
1445
+ const fileName = getClientKeyShareExportFileName({
1355
1446
  thresholdSignatureScheme,
1356
1447
  accountAddress
1357
1448
  });
1358
- const backupData = {
1359
- keyShares: encryptedKeyShares,
1360
- metadata: {
1361
- version: '1.0',
1362
- createdAt: new Date().toISOString(),
1363
- accountAddress,
1364
- thresholdSignatureScheme,
1365
- hasPassword: true,
1366
- encryption: {
1367
- algorithm: AES_GCM_ALGORITHM,
1368
- keyDerivation: PBKDF2_ALGORITHM,
1369
- iterations: PBKDF2_ITERATIONS,
1370
- hashAlgorithm: PBKDF2_HASH_ALGORITHM,
1371
- algorithmLength: AES_GCM_LENGTH
1372
- },
1373
- shareCount: encryptedKeyShares.length
1374
- }
1375
- };
1376
- // TODO: handle errors
1377
- await Promise.all([
1378
- uploadFileToGoogleDriveAppStorage({
1379
- accessToken,
1380
- fileName: fileName != null ? fileName : suggestedFileName,
1381
- jsonData: backupData
1382
- }),
1383
- uploadFileToGoogleDrivePersonal({
1384
- accessToken,
1385
- fileName: fileName != null ? fileName : suggestedFileName,
1386
- jsonData: backupData
1387
- })
1388
- ]);
1449
+ const backupData = createBackupData({
1450
+ encryptedKeyShares,
1451
+ accountAddress,
1452
+ thresholdSignatureScheme
1453
+ });
1454
+ await uploadBackupToGoogleDrive({
1455
+ accessToken,
1456
+ fileName,
1457
+ backupData,
1458
+ accountAddress
1459
+ });
1389
1460
  const data = await this.apiClient.markKeySharesAsBackedUpGoogleDrive({
1390
1461
  walletId: this.walletMap[accountAddress].walletId
1391
1462
  });
1392
- const ids = data.keyShares.map((keyShare)=>keyShare.id);
1393
- this.walletMap[accountAddress].clientKeySharesBackupInfo.backups[core.BackupLocation.GOOGLE_DRIVE] = ids;
1394
- await this.storage.setItem(this.storageKey, JSON.stringify(this.walletMap));
1395
- return ids;
1463
+ await updateWalletMapWithBackupInfo({
1464
+ data,
1465
+ walletMap: this.walletMap,
1466
+ accountAddress,
1467
+ storage: this.storage,
1468
+ storageKey: this.storageKey
1469
+ });
1396
1470
  }
1397
- async restoreBackupFromGoogleDrive({ accountAddress, oauthAccountId, name, displayContainer, password }) {
1471
+ async restoreBackupFromGoogleDrive({ accountAddress, displayContainer, password }) {
1398
1472
  await this.getWallet({
1399
1473
  accountAddress
1400
1474
  });
1475
+ const oauthAccountId = await this.getGoogleOauthAccountIdOrThrow(accountAddress);
1401
1476
  const accessToken = await this.apiClient.getAccessToken({
1402
1477
  oauthAccountId
1403
1478
  });
1404
1479
  const thresholdSignatureScheme = this.walletMap[accountAddress].thresholdSignatureScheme;
1405
- const suggestedFileName = getClientKeyShareExportFileName({
1480
+ const fileName = getClientKeyShareExportFileName({
1406
1481
  thresholdSignatureScheme,
1407
1482
  accountAddress
1408
1483
  });
1409
- const backupData = await downloadFileFromGoogleDrive({
1410
- accessToken,
1411
- name: name != null ? name : suggestedFileName
1412
- });
1484
+ let backupData = null;
1485
+ try {
1486
+ backupData = await retryPromise(()=>downloadFileFromGoogleDrive({
1487
+ accessToken,
1488
+ fileName
1489
+ }));
1490
+ } catch (error) {
1491
+ this.logger.error('Failed to download backup from Google Drive', {
1492
+ accountAddress,
1493
+ fileName,
1494
+ error
1495
+ });
1496
+ throw new Error('Failed to restore backup from Google Drive');
1497
+ }
1413
1498
  if (!backupData) {
1499
+ this.logger.error('No backup file found', {
1500
+ accountAddress,
1501
+ fileName
1502
+ });
1414
1503
  throw new Error('No backup file found');
1415
1504
  }
1416
1505
  // Validate the backup data structure
1417
1506
  if (!backupData.keyShares || !backupData.metadata) {
1507
+ this.logger.error('Invalid backup format: missing keyShares or metadata', {
1508
+ accountAddress,
1509
+ fileName
1510
+ });
1418
1511
  throw new Error('Invalid backup format: missing keyShares or metadata');
1419
1512
  }
1420
1513
  const { keyShares } = backupData;
@@ -1786,11 +1879,13 @@ Object.defineProperty(exports, "MessageHash", {
1786
1879
  exports.DynamicWalletClient = DynamicWalletClient;
1787
1880
  exports.base64ToBytes = base64ToBytes;
1788
1881
  exports.bytesToBase64 = bytesToBase64;
1882
+ exports.createBackupData = createBackupData;
1789
1883
  exports.ensureBase64Padding = ensureBase64Padding;
1790
1884
  exports.formatEvmMessage = formatEvmMessage;
1791
1885
  exports.formatMessage = formatMessage;
1792
1886
  exports.getClientKeyShareBackupInfo = getClientKeyShareBackupInfo;
1793
1887
  exports.getClientKeyShareExportFileName = getClientKeyShareExportFileName;
1888
+ exports.getGoogleOAuthAccountId = getGoogleOAuthAccountId;
1794
1889
  exports.getMPCSignatureScheme = getMPCSignatureScheme;
1795
1890
  exports.getMPCSigner = getMPCSigner;
1796
1891
  exports.isBrowser = isBrowser;
package/index.esm.js CHANGED
@@ -2,6 +2,7 @@ import { SigningAlgorithm, MPC_RELAY_PROD_API_URL, getMPCChainConfig, BackupLoca
2
2
  export * from '@dynamic-labs-wallet/core';
3
3
  import { BIP340, Ed25519, Ecdsa, MessageHash, EcdsaKeygenResult, Ed25519KeygenResult, BIP340KeygenResult } from './internal/web';
4
4
  export { BIP340, BIP340InitKeygenResult, BIP340KeygenResult, Ecdsa, EcdsaInitKeygenResult, EcdsaKeygenResult, EcdsaPublicKey, EcdsaSignature, Ed25519, Ed25519InitKeygenResult, Ed25519KeygenResult, MessageHash } from './internal/web';
5
+ import { ProviderEnum } from '@dynamic-labs/sdk-api-core';
5
6
  import { Logger } from '@dynamic-labs/logger';
6
7
  import { createRequestChannel, parseMessageTransportData, applyDefaultMessageOrigin, createMessageTransport } from '@dynamic-labs/message-transport';
7
8
 
@@ -130,7 +131,9 @@ const timeoutPromise = ({ timeInMs, activity = 'Ceremony' })=>{
130
131
  }));
131
132
  throw error;
132
133
  }
133
- await new Promise((resolve)=>setTimeout(resolve, retryInterval));
134
+ // Calculate exponential backoff delay
135
+ const exponentialDelay = retryInterval * 2 ** (attempts - 1);
136
+ await new Promise((resolve)=>setTimeout(resolve, exponentialDelay));
134
137
  }
135
138
  }
136
139
  // TypeScript needs this even though it's unreachable
@@ -166,6 +169,30 @@ const formatMessage = (chainName, message)=>{
166
169
  throw new Error('Unsupported chain name');
167
170
  }
168
171
  };
172
+ const getGoogleOAuthAccountId = (verifiedCredentials)=>{
173
+ const googleVerifiedCredential = verifiedCredentials == null ? void 0 : verifiedCredentials.find((credential)=>credential.oauthProvider === ProviderEnum.Google);
174
+ return googleVerifiedCredential == null ? void 0 : googleVerifiedCredential.id;
175
+ };
176
+ const createBackupData = ({ encryptedKeyShares, accountAddress, thresholdSignatureScheme, hasPassword = true })=>{
177
+ return {
178
+ keyShares: encryptedKeyShares,
179
+ metadata: {
180
+ version: '1.0',
181
+ createdAt: new Date().toISOString(),
182
+ accountAddress,
183
+ thresholdSignatureScheme,
184
+ hasPassword,
185
+ encryption: {
186
+ algorithm: AES_GCM_ALGORITHM,
187
+ keyDerivation: PBKDF2_ALGORITHM,
188
+ iterations: PBKDF2_ITERATIONS,
189
+ hashAlgorithm: PBKDF2_HASH_ALGORITHM,
190
+ algorithmLength: AES_GCM_LENGTH
191
+ },
192
+ shareCount: encryptedKeyShares.length
193
+ }
194
+ };
195
+ };
169
196
 
170
197
  const PBKDF2_ALGORITHM = 'PBKDF2';
171
198
  const PBKDF2_ITERATIONS = 100000;
@@ -293,9 +320,9 @@ const uploadFileToGoogleDrive = async ({ accessToken, fileName, jsonData, parent
293
320
  const result = await response.json();
294
321
  return result; // Return file metadata, including file ID
295
322
  };
296
- const listFilesFromGoogleDrive = async ({ accessToken, name })=>{
323
+ const listFilesFromGoogleDrive = async ({ accessToken, fileName })=>{
297
324
  // Step 1: List all files inside `appDataFolder` with the specified backup filename
298
- const resp = await fetch(`${GOOGLE_DRIVE_UPLOAD_API}/drive/v3/files?q=${encodeURIComponent(`name='${name}'`)}&spaces=appDataFolder&orderBy=createdTime desc`, {
325
+ const resp = await fetch(`${GOOGLE_DRIVE_UPLOAD_API}/drive/v3/files?q=${encodeURIComponent(`name='${fileName}'`)}&spaces=appDataFolder&orderBy=createdTime desc`, {
299
326
  headers: {
300
327
  Authorization: `Bearer ${accessToken}`
301
328
  }
@@ -308,10 +335,10 @@ const listFilesFromGoogleDrive = async ({ accessToken, name })=>{
308
335
  const files = data.files;
309
336
  return files;
310
337
  };
311
- const downloadFileFromGoogleDrive = async ({ accessToken, name })=>{
338
+ const downloadFileFromGoogleDrive = async ({ accessToken, fileName })=>{
312
339
  const files = await listFilesFromGoogleDrive({
313
340
  accessToken,
314
- name
341
+ fileName
315
342
  });
316
343
  if (!files || files.length === 0) {
317
344
  return null;
@@ -489,6 +516,56 @@ class IframeDisplayChannelAdapter {
489
516
  }
490
517
  }
491
518
 
519
+ /**
520
+ * Updates the wallet map with backup information after successful backup to Google Drive
521
+ * @param data - Response data containing key shares information
522
+ * @param walletMap - The wallet map to update
523
+ * @param accountAddress - The account address associated with the wallet
524
+ * @param backupLocation - The location where the backup is stored
525
+ * @param storage - Storage interface for persisting the updated wallet map
526
+ * @param storageKey - Key used to store the wallet map
527
+ * @returns The array of key share IDs that were backed up
528
+ */ const updateWalletMapWithBackupInfo = async ({ data, walletMap, accountAddress, storage, storageKey })=>{
529
+ const ids = data.keyShares.map((keyShare)=>keyShare.id);
530
+ walletMap[accountAddress].clientKeySharesBackupInfo.backups[BackupLocation.GOOGLE_DRIVE] = ids;
531
+ await storage.setItem(storageKey, JSON.stringify(walletMap));
532
+ return ids;
533
+ };
534
+ /**
535
+ * Uploads a backup to Google Drive App
536
+ * @param accessToken - The access token for the Google Drive API
537
+ * @param fileName - The name of the file to upload
538
+ * @param backupData - The data to upload
539
+ * @param accountAddress - The account address associated with the backup
540
+ */ const uploadBackupToGoogleDrive = async ({ accessToken, fileName, backupData, accountAddress })=>{
541
+ try {
542
+ await retryPromise(()=>uploadFileToGoogleDriveAppStorage({
543
+ accessToken,
544
+ fileName,
545
+ jsonData: backupData
546
+ }));
547
+ } catch (error) {
548
+ logger.error('Failed to upload keyshares to Google Drive App Storage', {
549
+ accountAddress,
550
+ error
551
+ });
552
+ throw new Error(`Failed to backup keyshares to Google Drive App Storage: ${error instanceof Error ? error.message : String(error)}`);
553
+ }
554
+ try {
555
+ await retryPromise(()=>uploadFileToGoogleDrivePersonal({
556
+ accessToken,
557
+ fileName,
558
+ jsonData: backupData
559
+ }));
560
+ } catch (error) {
561
+ logger.error('Failed to upload keyshares to Google Drive Personal', {
562
+ accountAddress,
563
+ error
564
+ });
565
+ throw new Error(`Failed to backup keyshares to Google Drive Personal: ${error instanceof Error ? error.message : String(error)}`);
566
+ }
567
+ };
568
+
492
569
  class DynamicWalletClient {
493
570
  async initialize() {
494
571
  if (this.initializePromise) {
@@ -1206,13 +1283,9 @@ class DynamicWalletClient {
1206
1283
  });
1207
1284
  const hasGoogleDriveBackup = this.walletMap[accountAddress].clientKeySharesBackupInfo.backups[BackupLocation.GOOGLE_DRIVE].length > 0;
1208
1285
  if (hasGoogleDriveBackup) {
1209
- var _user_verifiedCredentials_find;
1210
- const user = await this.apiClient.getUser();
1211
- const oauthAccountId = user == null ? void 0 : (_user_verifiedCredentials_find = user.verifiedCredentials.find((credential)=>credential.oauthProvider === 'google')) == null ? void 0 : _user_verifiedCredentials_find.id;
1212
1286
  const googleDriveKeyShareIds = await this.backupKeySharesToGoogleDrive({
1213
1287
  accountAddress,
1214
- password,
1215
- oauthAccountId
1288
+ password
1216
1289
  });
1217
1290
  data.keyShares.push({
1218
1291
  backupLocation: BackupLocation.GOOGLE_DRIVE,
@@ -1269,6 +1342,23 @@ class DynamicWalletClient {
1269
1342
  return deserializedKeyShare;
1270
1343
  }
1271
1344
  /**
1345
+ * Helper function to get Google OAuth Account ID or throw an error if not found.
1346
+ * @param accountAddress - The account address for logging purposes
1347
+ * @returns The Google OAuth Account ID
1348
+ * @throws Error if no Google OAuth account ID is found
1349
+ */ async getGoogleOauthAccountIdOrThrow(accountAddress) {
1350
+ const user = await this.apiClient.getUser();
1351
+ const oauthAccountId = getGoogleOAuthAccountId(user == null ? void 0 : user.verifiedCredentials);
1352
+ if (!oauthAccountId) {
1353
+ this.logger.error('No Google OAuth account ID found', {
1354
+ user,
1355
+ accountAddress
1356
+ });
1357
+ throw new Error('No Google OAuth account ID found');
1358
+ }
1359
+ return oauthAccountId;
1360
+ }
1361
+ /**
1272
1362
  * Helper function to determine keyshare recovery strategy for dynamic shares.
1273
1363
  * For REFRESH operations, retrieves enough shares to meet the client threshold.
1274
1364
  * For all other operations, retrieves just 1 share.
@@ -1331,7 +1421,7 @@ class DynamicWalletClient {
1331
1421
  }
1332
1422
  this.walletMap = JSON.parse(wallets);
1333
1423
  }
1334
- async backupKeySharesToGoogleDrive({ accountAddress, fileName, oauthAccountId, password }) {
1424
+ async backupKeySharesToGoogleDrive({ accountAddress, password }) {
1335
1425
  await this.getWallet({
1336
1426
  accountAddress,
1337
1427
  walletOperation: WalletOperation.REACH_ALL_PARTIES,
@@ -1347,74 +1437,77 @@ class DynamicWalletClient {
1347
1437
  keyShare,
1348
1438
  password
1349
1439
  })));
1440
+ const oauthAccountId = await this.getGoogleOauthAccountIdOrThrow(accountAddress);
1350
1441
  const accessToken = await this.apiClient.getAccessToken({
1351
1442
  oauthAccountId
1352
1443
  });
1353
1444
  const thresholdSignatureScheme = this.walletMap[accountAddress].thresholdSignatureScheme;
1354
- const suggestedFileName = getClientKeyShareExportFileName({
1445
+ const fileName = getClientKeyShareExportFileName({
1355
1446
  thresholdSignatureScheme,
1356
1447
  accountAddress
1357
1448
  });
1358
- const backupData = {
1359
- keyShares: encryptedKeyShares,
1360
- metadata: {
1361
- version: '1.0',
1362
- createdAt: new Date().toISOString(),
1363
- accountAddress,
1364
- thresholdSignatureScheme,
1365
- hasPassword: true,
1366
- encryption: {
1367
- algorithm: AES_GCM_ALGORITHM,
1368
- keyDerivation: PBKDF2_ALGORITHM,
1369
- iterations: PBKDF2_ITERATIONS,
1370
- hashAlgorithm: PBKDF2_HASH_ALGORITHM,
1371
- algorithmLength: AES_GCM_LENGTH
1372
- },
1373
- shareCount: encryptedKeyShares.length
1374
- }
1375
- };
1376
- // TODO: handle errors
1377
- await Promise.all([
1378
- uploadFileToGoogleDriveAppStorage({
1379
- accessToken,
1380
- fileName: fileName != null ? fileName : suggestedFileName,
1381
- jsonData: backupData
1382
- }),
1383
- uploadFileToGoogleDrivePersonal({
1384
- accessToken,
1385
- fileName: fileName != null ? fileName : suggestedFileName,
1386
- jsonData: backupData
1387
- })
1388
- ]);
1449
+ const backupData = createBackupData({
1450
+ encryptedKeyShares,
1451
+ accountAddress,
1452
+ thresholdSignatureScheme
1453
+ });
1454
+ await uploadBackupToGoogleDrive({
1455
+ accessToken,
1456
+ fileName,
1457
+ backupData,
1458
+ accountAddress
1459
+ });
1389
1460
  const data = await this.apiClient.markKeySharesAsBackedUpGoogleDrive({
1390
1461
  walletId: this.walletMap[accountAddress].walletId
1391
1462
  });
1392
- const ids = data.keyShares.map((keyShare)=>keyShare.id);
1393
- this.walletMap[accountAddress].clientKeySharesBackupInfo.backups[BackupLocation.GOOGLE_DRIVE] = ids;
1394
- await this.storage.setItem(this.storageKey, JSON.stringify(this.walletMap));
1395
- return ids;
1463
+ await updateWalletMapWithBackupInfo({
1464
+ data,
1465
+ walletMap: this.walletMap,
1466
+ accountAddress,
1467
+ storage: this.storage,
1468
+ storageKey: this.storageKey
1469
+ });
1396
1470
  }
1397
- async restoreBackupFromGoogleDrive({ accountAddress, oauthAccountId, name, displayContainer, password }) {
1471
+ async restoreBackupFromGoogleDrive({ accountAddress, displayContainer, password }) {
1398
1472
  await this.getWallet({
1399
1473
  accountAddress
1400
1474
  });
1475
+ const oauthAccountId = await this.getGoogleOauthAccountIdOrThrow(accountAddress);
1401
1476
  const accessToken = await this.apiClient.getAccessToken({
1402
1477
  oauthAccountId
1403
1478
  });
1404
1479
  const thresholdSignatureScheme = this.walletMap[accountAddress].thresholdSignatureScheme;
1405
- const suggestedFileName = getClientKeyShareExportFileName({
1480
+ const fileName = getClientKeyShareExportFileName({
1406
1481
  thresholdSignatureScheme,
1407
1482
  accountAddress
1408
1483
  });
1409
- const backupData = await downloadFileFromGoogleDrive({
1410
- accessToken,
1411
- name: name != null ? name : suggestedFileName
1412
- });
1484
+ let backupData = null;
1485
+ try {
1486
+ backupData = await retryPromise(()=>downloadFileFromGoogleDrive({
1487
+ accessToken,
1488
+ fileName
1489
+ }));
1490
+ } catch (error) {
1491
+ this.logger.error('Failed to download backup from Google Drive', {
1492
+ accountAddress,
1493
+ fileName,
1494
+ error
1495
+ });
1496
+ throw new Error('Failed to restore backup from Google Drive');
1497
+ }
1413
1498
  if (!backupData) {
1499
+ this.logger.error('No backup file found', {
1500
+ accountAddress,
1501
+ fileName
1502
+ });
1414
1503
  throw new Error('No backup file found');
1415
1504
  }
1416
1505
  // Validate the backup data structure
1417
1506
  if (!backupData.keyShares || !backupData.metadata) {
1507
+ this.logger.error('Invalid backup format: missing keyShares or metadata', {
1508
+ accountAddress,
1509
+ fileName
1510
+ });
1418
1511
  throw new Error('Invalid backup format: missing keyShares or metadata');
1419
1512
  }
1420
1513
  const { keyShares } = backupData;
@@ -1735,4 +1828,4 @@ class DynamicWalletClient {
1735
1828
  }
1736
1829
  }
1737
1830
 
1738
- export { DynamicWalletClient, base64ToBytes, bytesToBase64, ensureBase64Padding, formatEvmMessage, formatMessage, getClientKeyShareBackupInfo, getClientKeyShareExportFileName, getMPCSignatureScheme, getMPCSigner, isBrowser, isHexString, mergeUniqueKeyShares, retryPromise, stringToBytes, timeoutPromise };
1831
+ export { DynamicWalletClient, base64ToBytes, bytesToBase64, createBackupData, ensureBase64Padding, formatEvmMessage, formatMessage, getClientKeyShareBackupInfo, getClientKeyShareExportFileName, getGoogleOAuthAccountId, getMPCSignatureScheme, getMPCSigner, isBrowser, isHexString, mergeUniqueKeyShares, retryPromise, stringToBytes, timeoutPromise };
@@ -16,7 +16,7 @@ export declare class Ecdsa {
16
16
  derivePubkeyFromXpub(Xpub: string, derivationPath?: Uint32Array): Promise<EcdsaPublicKey>;
17
17
  exportFullPrivateKey(roomUuid: string, keygenResult: EcdsaKeygenResult | string, toExportID: string): Promise<string | undefined>;
18
18
  derivePrivateKeyFromXpriv(xpriv: string, derivationPath?: Uint32Array): Promise<string>;
19
- offlineExportFullPrivateKey(keygenResults: (EcdsaKeygenResult[] | string[])): Promise<string>;
19
+ offlineExportFullPrivateKey(keygenResults: EcdsaKeygenResult[] | string[]): Promise<string>;
20
20
  importPrivateKeyRecipient(roomUuid: string, threshold: number, keygenInit: EcdsaInitKeygenResult, keygenIds: string[]): Promise<EcdsaKeygenResult>;
21
21
  importPrivateKeyImporter(roomUuid: string, threshold: number, privateKey: string, keygenInit: EcdsaInitKeygenResult, keygenIds: string[]): Promise<EcdsaKeygenResult>;
22
22
  protected getHostUrl(path?: string): string;
@@ -1 +1 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.Ecdsa=void 0;let _1=require("./"),common_1=require("./common");class Ecdsa{constructor(e,t){this.NATIVE=e,this.URL=t}async createRoom(e,t){return(0,common_1.sanitizeNumberOfParties)(e),(await this.NATIVE).createRoom(this.URL,e,t)}async initKeygen(){var e=await(await this.NATIVE).initKeygen();return new _1.EcdsaInitKeygenResult(e.pubkey,e.keypair)}async exportID(e){e="string"==typeof e?e:e.secretShare;return(await this.NATIVE).ecdsaGetExportID(e)}async keygen(e,t,r,a,s){if((0,common_1.sanitizeNumberOfParties)(t,r),s.length!==t-1)throw new Error(`keygenIds length must be exactly: ${t-1}, it is: `+s.length);e=await(await this.NATIVE).ecdsaKeygen(e,this.URL,t,r,a.keygenSecret,s),t=new _1.EcdsaPublicKey(e.pubkey),r=e.secret_share;return new _1.EcdsaKeygenResult(t,r)}async sign(e,t,r,a=new Uint32Array){t="string"==typeof t?t:t.secretShare,e=await(await this.NATIVE).ecdsaSign(e,this.URL,t,r.toHex(),Array.from(a));return _1.EcdsaSignature.fromBuffer(e)}async refresh(e,t){t="string"==typeof t?t:t.secretShare,e=await(await this.NATIVE).ecdsaRefresh(e,this.URL,t),t=new _1.EcdsaPublicKey(e.pubkey),e=e.secret_share;return new _1.EcdsaKeygenResult(t,e)}async reshareNewParty(e,t,r,a,s){e=await(await this.NATIVE).ecdsaReshareNewParty(e,this.URL,t,r,a.keygenSecret,s),t=new _1.EcdsaPublicKey(e.pubkey),r=e.secret_share;return new _1.EcdsaKeygenResult(t,r)}async reshareRemainingParty(e,t,r,a){r="string"==typeof r?r:r.secretShare,e=await(await this.NATIVE).ecdsaReshareRemainingParty(e,this.URL,t,r,a),t=new _1.EcdsaPublicKey(e.pubkey),r=e.secret_share;return new _1.EcdsaKeygenResult(t,r)}async derivePubkey(e,t=new Uint32Array){e="string"==typeof e?e:e.secretShare,e=await(await this.NATIVE).ecdsaDerivePubkey(e,Array.from(t));return new _1.EcdsaPublicKey(e)}async getXpub(e){e="string"==typeof e?e:e.secretShare;return(await this.NATIVE).ecdsaGetXpub(e)}async derivePubkeyFromXpub(e,t=new Uint32Array){e=await(await this.NATIVE).ecdsaDerivePubkeyFromXpub(e,Array.from(t));return new _1.EcdsaPublicKey(e)}async exportFullPrivateKey(e,t,r){t="string"==typeof t?t:t.secretShare;return(await this.NATIVE).ecdsaExportFullPrivateKey(e,this.URL,t,r)}async derivePrivateKeyFromXpriv(e,t=new Uint32Array){return(await this.NATIVE).ecdsaDerivePrivateKeyFromXpriv(e,Array.from(t))}async offlineExportFullPrivateKey(e){e=e.map(e=>{if("string"==typeof e)return e;if(e instanceof _1.EcdsaKeygenResult)return e.secretShare;throw"UnknownType"});return(await this.NATIVE).ecdsaOfflineExportFullPrivateKey(e)}async importPrivateKeyRecipient(e,t,r,a){e=await(await this.NATIVE).ecdsaImportPrivateKeyRecipient(e,this.URL,t,r.keygenSecret,a),t=new _1.EcdsaPublicKey(e.pubkey),r=e.secret_share;return new _1.EcdsaKeygenResult(t,r)}async importPrivateKeyImporter(e,t,r,a,s){e=await(await this.NATIVE).ecdsaImportPrivateKeyImporter(e,this.URL,t,r,a.keygenSecret,s),t=new _1.EcdsaPublicKey(e.pubkey),r=e.secret_share;return new _1.EcdsaKeygenResult(t,r)}getHostUrl(e){return e||this.URL}}exports.Ecdsa=Ecdsa;
1
+ Object.defineProperty(exports,"__esModule",{value:!0}),exports.Ecdsa=void 0;let _1=require("./"),common_1=require("./common");class Ecdsa{constructor(e,t){this.NATIVE=e,this.URL=t}async createRoom(e,t){return(0,common_1.sanitizeNumberOfParties)(e),(await this.NATIVE).createRoom(this.URL,e,t)}async initKeygen(){var e=await(await this.NATIVE).initKeygen();return new _1.EcdsaInitKeygenResult(e.pubkey,e.keypair)}async exportID(e){e="string"==typeof e?e:e.secretShare;return(await this.NATIVE).ecdsaGetExportID(e)}async keygen(e,t,r,a,s){if((0,common_1.sanitizeNumberOfParties)(t,r),s.length!==t-1)throw new Error(`keygenIds length must be exactly: ${t-1}, it is: `+s.length);e=await(await this.NATIVE).ecdsaKeygen(e,this.URL,t,r,a.keygenSecret,s),t=new _1.EcdsaPublicKey(e.pubkey),r=e.secret_share;return new _1.EcdsaKeygenResult(t,r)}async sign(e,t,r,a=new Uint32Array){t="string"==typeof t?t:t.secretShare,e=await(await this.NATIVE).ecdsaSign(e,this.URL,t,r.toHex(),Array.from(a));return _1.EcdsaSignature.fromBuffer(e)}async refresh(e,t){t="string"==typeof t?t:t.secretShare,e=await(await this.NATIVE).ecdsaRefresh(e,this.URL,t),t=new _1.EcdsaPublicKey(e.pubkey),e=e.secret_share;return new _1.EcdsaKeygenResult(t,e)}async reshareNewParty(e,t,r,a,s){e=await(await this.NATIVE).ecdsaReshareNewParty(e,this.URL,t,r,a.keygenSecret,s),t=new _1.EcdsaPublicKey(e.pubkey),r=e.secret_share;return new _1.EcdsaKeygenResult(t,r)}async reshareRemainingParty(e,t,r,a){r="string"==typeof r?r:r.secretShare,e=await(await this.NATIVE).ecdsaReshareRemainingParty(e,this.URL,t,r,a),t=new _1.EcdsaPublicKey(e.pubkey),r=e.secret_share;return new _1.EcdsaKeygenResult(t,r)}async derivePubkey(e,t=new Uint32Array){e="string"==typeof e?e:e.secretShare,e=await(await this.NATIVE).ecdsaDerivePubkey(e,Array.from(t));return new _1.EcdsaPublicKey(e)}async getXpub(e){e="string"==typeof e?e:e.secretShare;return(await this.NATIVE).ecdsaGetXpub(e)}async derivePubkeyFromXpub(e,t=new Uint32Array){e=await(await this.NATIVE).ecdsaDerivePubkeyFromXpub(e,Array.from(t));return new _1.EcdsaPublicKey(e)}async exportFullPrivateKey(e,t,r){t="string"==typeof t?t:t.secretShare,e=await(await this.NATIVE).ecdsaExportFullPrivateKey(e,this.URL,t,r);return e||void 0}async derivePrivateKeyFromXpriv(e,t=new Uint32Array){return(await this.NATIVE).ecdsaDerivePrivateKeyFromXpriv(e,Array.from(t))}async offlineExportFullPrivateKey(e){e=e.map(e=>{if("string"==typeof e)return e;if(e instanceof _1.EcdsaKeygenResult)return e.secretShare;throw"UnknownType"});return(await this.NATIVE).ecdsaOfflineExportFullPrivateKey(e)}async importPrivateKeyRecipient(e,t,r,a){e=await(await this.NATIVE).ecdsaImportPrivateKeyRecipient(e,this.URL,t,r.keygenSecret,a),t=new _1.EcdsaPublicKey(e.pubkey),r=e.secret_share;return new _1.EcdsaKeygenResult(t,r)}async importPrivateKeyImporter(e,t,r,a,s){e=await(await this.NATIVE).ecdsaImportPrivateKeyImporter(e,this.URL,t,r,a.keygenSecret,s),t=new _1.EcdsaPublicKey(e.pubkey),r=e.secret_share;return new _1.EcdsaKeygenResult(t,r)}getHostUrl(e){return e||this.URL}}exports.Ecdsa=Ecdsa;
@@ -1 +1 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.Ed25519=void 0;let _1=require("./"),utils_1=require("@noble/hashes/utils"),common_1=require("./common");class Ed25519{constructor(e,t){this.NATIVE=e,this.URL=t}async initKeygen(){var e=await(await this.NATIVE).initKeygen();return new _1.Ed25519InitKeygenResult(e.pubkey,e.keypair)}async exportID(e){e="string"==typeof e?e:e.secretShare;return(await this.NATIVE).ed25519GetExportID(e)}async createRoom(e,t){return(0,common_1.sanitizeNumberOfParties)(e),(await this.NATIVE).createRoom(this.URL,e,t)}async keygen(e,t,r,i,s){if((0,common_1.sanitizeNumberOfParties)(t,r),s.length!==t-1)throw new Error(`keygenIds length must be exactly: ${t-1}, it is: `+s.length);e=await(await this.NATIVE).ed25519Keygen(e,this.URL,t,r,i.keygenSecret,s);if(e.pubkey&&e.secret_share)return t=(0,utils_1.hexToBytes)(e.pubkey),r=e.secret_share,new _1.Ed25519KeygenResult(t,r);throw new Error("Keygen failed, no public key or secret share was returned.")}async sign(e,t,r,i=new Uint32Array){"string"!=typeof r&&(r=(0,utils_1.bytesToHex)(r));t="string"==typeof t?t:t.secretShare,e=await(await this.NATIVE).ed25519Sign(e,this.URL,t,r,Array.from(i));return(0,utils_1.hexToBytes)(e)}async refresh(e,t){var t="string"==typeof t?t:t.secretShare,e=await(await this.NATIVE).ed25519Refresh(e,this.URL,t);if(e.pubkey&&e.secret_share)return t=(0,utils_1.hexToBytes)(e.pubkey),e=e.secret_share,new _1.Ed25519KeygenResult(t,e);throw new Error("Keygen failed, no public key or secret share was returned.")}async reshareNewParty(e,t,r,i,s){e=await(await this.NATIVE).ed25519ReshareNewParty(e,this.URL,t,r,i.keygenSecret,s),t=(0,utils_1.hexToBytes)(e.pubkey),r=e.secret_share;return new _1.Ed25519KeygenResult(t,r)}async reshareRemainingParty(e,t,r,i){r="string"==typeof r?r:r.secretShare,e=await(await this.NATIVE).ed25519ReshareRemainingParty(e,this.URL,t,r,i),t=(0,utils_1.hexToBytes)(e.pubkey),r=e.secret_share;return new _1.Ed25519KeygenResult(t,r)}async derivePubkey(e,t=new Uint32Array){e="string"==typeof e?e:e.secretShare,e=await(await this.NATIVE).ed25519DerivePubkey(e,Array.from(t));return(0,utils_1.hexToBytes)(e)}async getSpub(e){e="string"==typeof e?e:e.secretShare;return(await this.NATIVE).ed25519GetSpub(e)}async derivePubkeyFromSpub(e,t){e=await(await this.NATIVE).ed25519DerivePubkeyFromSpub(e,Array.from(t));return(0,utils_1.hexToBytes)(e)}async exportFullPrivateKey(e,t,r){t="string"==typeof t?t:t.secretShare;return(await this.NATIVE).ed25519ExportFullPrivateKey(e,this.URL,t,r)}async derivePrivateKeyFromSpriv(e,t=new Uint32Array){return(await this.NATIVE).ed25519DerivePrivateKeyFromSpriv(e,Array.from(t))}async offlineExportFullPrivateKey(e){e=e.map(e=>{if("string"==typeof e)return e;if(e instanceof _1.Ed25519KeygenResult)return e.secretShare;throw"UnknownType"});return(await this.NATIVE).ed25519OfflineExportFullPrivateKey(e)}async importPrivateKeyRecipient(e,t,r,i){e=await(await this.NATIVE).ed25519ImportPrivateKeyRecipient(e,this.URL,t,r.keygenSecret,i),t=(0,utils_1.hexToBytes)(e.pubkey),r=e.secret_share;return new _1.Ed25519KeygenResult(t,r)}async importPrivateKeyImporter(e,t,r,i,s,a=!1){e=await(await this.NATIVE).ed25519ImportPrivateKeyImporter(e,this.URL,t,r,i.keygenSecret,s,a),t=(0,utils_1.hexToBytes)(e.pubkey),r=e.secret_share;return new _1.Ed25519KeygenResult(t,r)}}exports.Ed25519=Ed25519;
1
+ Object.defineProperty(exports,"__esModule",{value:!0}),exports.Ed25519=void 0;let _1=require("./"),utils_1=require("@noble/hashes/utils"),common_1=require("./common");class Ed25519{constructor(e,t){this.NATIVE=e,this.URL=t}async initKeygen(){var e=await(await this.NATIVE).initKeygen();return new _1.Ed25519InitKeygenResult(e.pubkey,e.keypair)}async exportID(e){e="string"==typeof e?e:e.secretShare;return(await this.NATIVE).ed25519GetExportID(e)}async createRoom(e,t){return(0,common_1.sanitizeNumberOfParties)(e),(await this.NATIVE).createRoom(this.URL,e,t)}async keygen(e,t,r,i,s){if((0,common_1.sanitizeNumberOfParties)(t,r),s.length!==t-1)throw new Error(`keygenIds length must be exactly: ${t-1}, it is: `+s.length);e=await(await this.NATIVE).ed25519Keygen(e,this.URL,t,r,i.keygenSecret,s);if(e.pubkey&&e.secret_share)return t=(0,utils_1.hexToBytes)(e.pubkey),r=e.secret_share,new _1.Ed25519KeygenResult(t,r);throw new Error("Keygen failed, no public key or secret share was returned.")}async sign(e,t,r,i=new Uint32Array){"string"!=typeof r&&(r=(0,utils_1.bytesToHex)(r));t="string"==typeof t?t:t.secretShare,e=await(await this.NATIVE).ed25519Sign(e,this.URL,t,r,Array.from(i));return(0,utils_1.hexToBytes)(e)}async refresh(e,t){var t="string"==typeof t?t:t.secretShare,e=await(await this.NATIVE).ed25519Refresh(e,this.URL,t);if(e.pubkey&&e.secret_share)return t=(0,utils_1.hexToBytes)(e.pubkey),e=e.secret_share,new _1.Ed25519KeygenResult(t,e);throw new Error("Keygen failed, no public key or secret share was returned.")}async reshareNewParty(e,t,r,i,s){e=await(await this.NATIVE).ed25519ReshareNewParty(e,this.URL,t,r,i.keygenSecret,s),t=(0,utils_1.hexToBytes)(e.pubkey),r=e.secret_share;return new _1.Ed25519KeygenResult(t,r)}async reshareRemainingParty(e,t,r,i){r="string"==typeof r?r:r.secretShare,e=await(await this.NATIVE).ed25519ReshareRemainingParty(e,this.URL,t,r,i),t=(0,utils_1.hexToBytes)(e.pubkey),r=e.secret_share;return new _1.Ed25519KeygenResult(t,r)}async derivePubkey(e,t=new Uint32Array){e="string"==typeof e?e:e.secretShare,e=await(await this.NATIVE).ed25519DerivePubkey(e,Array.from(t));return(0,utils_1.hexToBytes)(e)}async getSpub(e){e="string"==typeof e?e:e.secretShare;return(await this.NATIVE).ed25519GetSpub(e)}async derivePubkeyFromSpub(e,t){e=await(await this.NATIVE).ed25519DerivePubkeyFromSpub(e,Array.from(t));return(0,utils_1.hexToBytes)(e)}async exportFullPrivateKey(e,t,r){t="string"==typeof t?t:t.secretShare,e=await(await this.NATIVE).ed25519ExportFullPrivateKey(e,this.URL,t,r);return e||void 0}async derivePrivateKeyFromSpriv(e,t=new Uint32Array){return(await this.NATIVE).ed25519DerivePrivateKeyFromSpriv(e,Array.from(t))}async offlineExportFullPrivateKey(e){e=e.map(e=>{if("string"==typeof e)return e;if(e instanceof _1.Ed25519KeygenResult)return e.secretShare;throw"UnknownType"});return(await this.NATIVE).ed25519OfflineExportFullPrivateKey(e)}async importPrivateKeyRecipient(e,t,r,i){e=await(await this.NATIVE).ed25519ImportPrivateKeyRecipient(e,this.URL,t,r.keygenSecret,i),t=(0,utils_1.hexToBytes)(e.pubkey),r=e.secret_share;return new _1.Ed25519KeygenResult(t,r)}async importPrivateKeyImporter(e,t,r,i,s,a=!1){e=await(await this.NATIVE).ed25519ImportPrivateKeyImporter(e,this.URL,t,r,i.keygenSecret,s,a),t=(0,utils_1.hexToBytes)(e.pubkey),r=e.secret_share;return new _1.Ed25519KeygenResult(t,r)}}exports.Ed25519=Ed25519;