@dynamic-labs-wallet/browser 0.0.30 → 0.0.32

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
@@ -64,6 +64,11 @@ const getClientKeyShareExportFileName = ({ thresholdSignatureScheme, accountAddr
64
64
  return `${CLIENT_KEYSHARE_EXPORT_FILENAME_PREFIX}-${thresholdSignatureScheme}-${accountAddress}.json`;
65
65
  };
66
66
 
67
+ const PBKDF2_ALGORITHM = 'PBKDF2';
68
+ const PBKDF2_ITERATIONS = 100000;
69
+ const PBKDF2_HASH_ALGORITHM = 'SHA-256';
70
+ const AES_GCM_ALGORITHM = 'AES-GCM';
71
+ const AES_GCM_LENGTH = 256;
67
72
  const getKey = async ({ password, salt })=>{
68
73
  const passwordBytes = stringToBytes(password);
69
74
  const initialKey = await crypto.subtle.importKey('raw', passwordBytes, {
@@ -72,13 +77,13 @@ const getKey = async ({ password, salt })=>{
72
77
  'deriveKey'
73
78
  ]);
74
79
  return crypto.subtle.deriveKey({
75
- name: 'PBKDF2',
80
+ name: PBKDF2_ALGORITHM,
76
81
  salt,
77
- iterations: 100000,
78
- hash: 'SHA-256'
82
+ iterations: PBKDF2_ITERATIONS,
83
+ hash: PBKDF2_HASH_ALGORITHM
79
84
  }, initialKey, {
80
- name: 'AES-GCM',
81
- length: 256
85
+ name: AES_GCM_ALGORITHM,
86
+ length: AES_GCM_LENGTH
82
87
  }, false, [
83
88
  'encrypt',
84
89
  'decrypt'
@@ -97,7 +102,7 @@ const encryptData = async ({ data, password })=>{
97
102
  const dataBytes = new TextEncoder().encode(data);
98
103
  // Encrypt the data
99
104
  const encryptedData = await crypto.subtle.encrypt({
100
- name: 'AES-GCM',
105
+ name: AES_GCM_ALGORITHM,
101
106
  iv
102
107
  }, key, dataBytes);
103
108
  // Convert to base64 strings, ensure proper padding
@@ -126,24 +131,42 @@ const decryptData = async ({ data, password })=>{
126
131
  salt: saltBytes
127
132
  });
128
133
  const decryptedData = await crypto.subtle.decrypt({
129
- name: 'AES-GCM',
134
+ name: AES_GCM_ALGORITHM,
130
135
  iv: ivBytes
131
136
  }, key, cipherBytes);
132
137
  return new TextDecoder().decode(decryptedData);
133
138
  } catch (error) {
134
139
  console.error('Decryption error details:', error);
135
- throw new Error(`Decryption failed`);
140
+ throw new Error('Decryption failed');
136
141
  }
137
142
  };
138
143
 
139
144
  const GOOGLE_DRIVE_UPLOAD_API = 'https://www.googleapis.com';
140
- const uploadFileToGoogleDrive = async ({ accessToken, fileName, jsonData })=>{
141
- const metadata = {
142
- name: fileName,
143
- mimeType: 'application/json',
145
+ const uploadFileToGoogleDriveAppStorage = async ({ accessToken, fileName, jsonData })=>{
146
+ return uploadFileToGoogleDrive({
147
+ accessToken,
148
+ fileName,
149
+ jsonData,
144
150
  parents: [
145
151
  'appDataFolder'
146
152
  ]
153
+ });
154
+ };
155
+ const uploadFileToGoogleDrivePersonal = async ({ accessToken, fileName, jsonData })=>{
156
+ return uploadFileToGoogleDrive({
157
+ accessToken,
158
+ fileName,
159
+ jsonData,
160
+ parents: [
161
+ 'root'
162
+ ]
163
+ });
164
+ };
165
+ const uploadFileToGoogleDrive = async ({ accessToken, fileName, jsonData, parents })=>{
166
+ const metadata = {
167
+ name: fileName,
168
+ mimeType: 'application/json',
169
+ parents
147
170
  };
148
171
  const form = new FormData();
149
172
  form.append('metadata', new Blob([
@@ -189,6 +212,9 @@ const downloadFileFromGoogleDrive = async ({ accessToken, name })=>{
189
212
  accessToken,
190
213
  name
191
214
  });
215
+ if (!files || files.length === 0) {
216
+ return null;
217
+ }
192
218
  // Get the most recent file
193
219
  const fileMetadata = files[0];
194
220
  // Fetch the file data using the file ID
@@ -202,7 +228,14 @@ const downloadFileFromGoogleDrive = async ({ accessToken, name })=>{
202
228
  if (fileRawData.length === 0) {
203
229
  return null;
204
230
  }
205
- return JSON.parse(fileRawData);
231
+ try {
232
+ // Just parse and return the data without validation
233
+ // The client will handle validation of the structure
234
+ return JSON.parse(fileRawData);
235
+ } catch (error) {
236
+ console.error('Error parsing backup file:', error);
237
+ return null;
238
+ }
206
239
  };
207
240
 
208
241
  const localStorageWriteTest = {
@@ -322,13 +355,11 @@ class DynamicWalletClient {
322
355
  const keygenInitResults = await Promise.all(Array(clientThreshold).fill(null).map(()=>mpcSigner.initKeygen()));
323
356
  return keygenInitResults;
324
357
  }
325
- async derivePublicKey({ chainName, keyShare, imported = false }) {
358
+ async derivePublicKey({ chainName, keyShare, derivationPath }) {
326
359
  const mpcSigner = getMPCSigner({
327
360
  chainName,
328
361
  baseRelayUrl: this.baseMPCRelayApiUrl
329
362
  });
330
- const chainConfig = core.getMPCChainConfig(chainName);
331
- const derivationPath = imported ? undefined : new Uint32Array(chainConfig.derivationPath);
332
363
  let publicKey;
333
364
  if (mpcSigner instanceof web.Ecdsa) {
334
365
  publicKey = await mpcSigner.derivePubkey(keyShare, derivationPath);
@@ -358,10 +389,12 @@ class DynamicWalletClient {
358
389
  }));
359
390
  // only need one client keygen result to derive the public key
360
391
  const [clientKeygenResult] = clientKeygenResults;
392
+ const chainConfig = core.getMPCChainConfig(chainName);
393
+ const derivationPath = new Uint32Array(chainConfig.derivationPath);
361
394
  const rawPublicKey = await this.derivePublicKey({
362
395
  chainName,
363
396
  keyShare: clientKeygenResult,
364
- imported: false
397
+ derivationPath
365
398
  });
366
399
  return {
367
400
  rawPublicKey,
@@ -407,14 +440,12 @@ class DynamicWalletClient {
407
440
  });
408
441
  return data;
409
442
  }
410
- async clientSign({ chainName, message, roomId, keyShare, imported = false }) {
443
+ async clientSign({ chainName, message, roomId, keyShare, derivationPath }) {
411
444
  try {
412
- const chainConfig = core.getMPCChainConfig(chainName);
413
445
  const mpcSigner = getMPCSigner({
414
446
  chainName,
415
447
  baseRelayUrl: this.baseMPCRelayApiUrl
416
448
  });
417
- const derivationPath = imported ? undefined : new Uint32Array(chainConfig.derivationPath);
418
449
  let formattedMessage;
419
450
  //note: Ecdsa can also be used by bitcoin, but only keccak256 is used by ethereum
420
451
  if (mpcSigner instanceof web.Ecdsa) {
@@ -442,23 +473,23 @@ class DynamicWalletClient {
442
473
  }
443
474
  }
444
475
  //todo: need to modify with imported flag
445
- async sign({ accountAddress, message, chainName, imported = false }) {
476
+ async sign({ accountAddress, message, chainName }) {
446
477
  const wallet = await this.getWallet({
447
478
  accountAddress
448
479
  });
449
- this.logger.debug('signing wallet', wallet);
450
480
  // Perform the server sign
451
481
  const data = await this.serverSign({
452
482
  walletId: wallet.walletId,
453
483
  message
454
484
  });
485
+ const derivationPath = wallet.derivationPath && wallet.derivationPath != '' ? new Uint32Array(Object.values(JSON.parse(wallet.derivationPath))) : undefined;
455
486
  // Perform the client sign and return the signature
456
487
  const signature = await this.clientSign({
457
488
  chainName,
458
489
  message,
459
490
  roomId: data.roomId,
460
491
  keyShare: wallet.clientKeyShares[0],
461
- imported
492
+ derivationPath
462
493
  });
463
494
  return signature;
464
495
  }
@@ -586,7 +617,6 @@ class DynamicWalletClient {
586
617
  const wallet = await this.getWallet({
587
618
  accountAddress
588
619
  });
589
- const chainConfig = core.getMPCChainConfig(chainName);
590
620
  const mpcSigner = getMPCSigner({
591
621
  chainName,
592
622
  baseRelayUrl: this.baseMPCRelayApiUrl
@@ -603,7 +633,7 @@ class DynamicWalletClient {
603
633
  if (!keyExportRaw) {
604
634
  throw new Error('Error exporting private key');
605
635
  }
606
- const derivationPath = new Uint32Array(chainConfig.derivationPath);
636
+ const derivationPath = wallet.derivationPath && wallet.derivationPath != '' ? new Uint32Array(Object.values(JSON.parse(wallet.derivationPath))) : undefined;
607
637
  let derivedPrivateKey;
608
638
  if (mpcSigner instanceof web.Ecdsa) {
609
639
  derivedPrivateKey = await mpcSigner.derivePrivateKeyFromXpriv(keyExportRaw, derivationPath);
@@ -616,7 +646,7 @@ class DynamicWalletClient {
616
646
  derivedPrivateKey
617
647
  };
618
648
  }
619
- async offlineExportKey({ chainName, keyShares }) {
649
+ async offlineExportKey({ chainName, keyShares, derivationPath }) {
620
650
  try {
621
651
  if (!keyShares || keyShares.length < 2) {
622
652
  throw new Error(`Must provide at least min threshold of key shares`);
@@ -633,14 +663,14 @@ class DynamicWalletClient {
633
663
  throw new Error('Error exporting private key: Export returned null');
634
664
  }
635
665
  const chainConfig = core.getMPCChainConfig(chainName);
636
- const derivationPath = new Uint32Array(chainConfig.derivationPath);
666
+ const walletDerivationPath = !derivationPath ? undefined : new Uint32Array(chainConfig.derivationPath);
637
667
  let derivedPrivateKey;
638
668
  if (mpcSigner instanceof web.Ecdsa) {
639
- derivedPrivateKey = await mpcSigner.derivePrivateKeyFromXpriv(keyExportRaw, derivationPath);
669
+ derivedPrivateKey = await mpcSigner.derivePrivateKeyFromXpriv(keyExportRaw, walletDerivationPath);
640
670
  } else if (mpcSigner instanceof web.Ed25519) {
641
671
  derivedPrivateKey = keyExportRaw;
642
672
  } else if (mpcSigner instanceof web.BIP340) {
643
- derivedPrivateKey = await mpcSigner.derivePrivateKeyFromXpriv(keyExportRaw, derivationPath);
673
+ derivedPrivateKey = await mpcSigner.derivePrivateKeyFromXpriv(keyExportRaw, walletDerivationPath);
644
674
  }
645
675
  return {
646
676
  derivedPrivateKey
@@ -702,7 +732,8 @@ class DynamicWalletClient {
702
732
  accountAddress,
703
733
  chainName: data.chainName,
704
734
  keyShare,
705
- thresholdSignatureScheme: wallet.thresholdSignatureScheme
735
+ thresholdSignatureScheme: wallet.thresholdSignatureScheme,
736
+ derivationPath: wallet.derivationPath
706
737
  });
707
738
  });
708
739
  return decryptedKeyShares;
@@ -715,17 +746,27 @@ class DynamicWalletClient {
715
746
  }
716
747
  this.walletMap = JSON.parse(wallets);
717
748
  }
718
- async restoreBackupShare({ walletId, accountAddress, chainName, keyShare, thresholdSignatureScheme }) {
749
+ async restoreBackupShare({ walletId, accountAddress, chainName, keyShare, thresholdSignatureScheme, derivationPath }) {
719
750
  var _this_walletMap_accountAddress;
751
+ // Get existing shares if any
752
+ const existingShares = ((_this_walletMap_accountAddress = this.walletMap[accountAddress]) == null ? void 0 : _this_walletMap_accountAddress.clientKeyShares) || [];
753
+ // Check if this share already exists to prevent duplicates
754
+ const isDuplicate = existingShares.some((existingShare)=>{
755
+ var _existingShare_pubkey, _keyShare_pubkey;
756
+ return ((_existingShare_pubkey = existingShare.pubkey) == null ? void 0 : _existingShare_pubkey.toString()) === ((_keyShare_pubkey = keyShare.pubkey) == null ? void 0 : _keyShare_pubkey.toString()) && existingShare.secretShare === keyShare.secretShare;
757
+ });
758
+ // Only add the share if it's not a duplicate
759
+ const updatedShares = isDuplicate ? existingShares : [
760
+ ...existingShares,
761
+ keyShare
762
+ ];
720
763
  this.walletMap[accountAddress] = {
721
764
  walletId,
722
765
  chainName,
723
766
  accountAddress,
724
- clientKeyShares: [
725
- ...((_this_walletMap_accountAddress = this.walletMap[accountAddress]) == null ? void 0 : _this_walletMap_accountAddress.clientKeyShares) || [],
726
- keyShare
727
- ],
728
- thresholdSignatureScheme
767
+ clientKeyShares: updatedShares,
768
+ thresholdSignatureScheme,
769
+ derivationPath
729
770
  };
730
771
  await this.storage.setItem(this.storageKey, JSON.stringify(this.walletMap));
731
772
  }
@@ -749,15 +790,44 @@ class DynamicWalletClient {
749
790
  thresholdSignatureScheme,
750
791
  accountAddress
751
792
  });
752
- const uploadMetadata = await uploadFileToGoogleDrive({
753
- accessToken,
754
- fileName: fileName != null ? fileName : suggestedFileName,
755
- jsonData: encryptedKeyShares
756
- });
793
+ const backupData = {
794
+ keyShares: encryptedKeyShares,
795
+ metadata: {
796
+ version: '1.0',
797
+ createdAt: new Date().toISOString(),
798
+ accountAddress,
799
+ thresholdSignatureScheme,
800
+ hasPassword: true,
801
+ encryption: {
802
+ algorithm: AES_GCM_ALGORITHM,
803
+ keyDerivation: PBKDF2_ALGORITHM,
804
+ iterations: PBKDF2_ITERATIONS,
805
+ hashAlgorithm: PBKDF2_HASH_ALGORITHM,
806
+ algorithmLength: AES_GCM_LENGTH
807
+ },
808
+ shareCount: encryptedKeyShares.length
809
+ }
810
+ };
811
+ // TODO: handle errors
812
+ const [appUpload, personalUpload] = await Promise.all([
813
+ uploadFileToGoogleDriveAppStorage({
814
+ accessToken,
815
+ fileName: fileName != null ? fileName : suggestedFileName,
816
+ jsonData: backupData
817
+ }),
818
+ uploadFileToGoogleDrivePersonal({
819
+ accessToken,
820
+ fileName: fileName != null ? fileName : suggestedFileName,
821
+ jsonData: backupData
822
+ })
823
+ ]);
757
824
  await this.apiClient.markKeySharesAsBackedUpGoogleDrive({
758
825
  walletId: this.walletMap[accountAddress].walletId
759
826
  });
760
- return uploadMetadata;
827
+ return {
828
+ appUpload,
829
+ personalUpload
830
+ };
761
831
  }
762
832
  async restoreBackupFromGoogleDrive({ accountAddress, oauthAccountId, name, password }) {
763
833
  await this.getWallet({
@@ -771,17 +841,19 @@ class DynamicWalletClient {
771
841
  thresholdSignatureScheme,
772
842
  accountAddress
773
843
  });
774
- const file = await downloadFileFromGoogleDrive({
844
+ const backupData = await downloadFileFromGoogleDrive({
775
845
  accessToken,
776
846
  name: name != null ? name : suggestedFileName
777
847
  });
778
- if (!file) {
779
- throw new Error('No file found');
848
+ if (!backupData) {
849
+ throw new Error('No backup file found');
780
850
  }
781
- const fileArray = Array.isArray(file) ? file : [
782
- file
783
- ];
784
- const decryptedKeyShares = await Promise.all(fileArray.map((keyShare)=>this.decryptKeyShare({
851
+ // Validate the backup data structure
852
+ if (!backupData.keyShares || !backupData.metadata) {
853
+ throw new Error('Invalid backup format: missing keyShares or metadata');
854
+ }
855
+ const { keyShares } = backupData;
856
+ const decryptedKeyShares = await Promise.all(keyShares.map((keyShare)=>this.decryptKeyShare({
785
857
  keyShare,
786
858
  password
787
859
  })));
@@ -835,7 +907,7 @@ class DynamicWalletClient {
835
907
  const rawPublicKey = await this.derivePublicKey({
836
908
  chainName,
837
909
  keyShare: clientKeygenResult,
838
- imported: true
910
+ derivationPath: undefined
839
911
  });
840
912
  return {
841
913
  rawPublicKey,
@@ -846,7 +918,14 @@ class DynamicWalletClient {
846
918
  const clientKeyShares = await this.getClientKeyShares({
847
919
  accountAddress
848
920
  });
849
- const text = JSON.stringify(clientKeyShares);
921
+ if (!accountAddress) {
922
+ throw new Error('Must provide an account address');
923
+ }
924
+ const derivationPath = this.walletMap[accountAddress].derivationPath;
925
+ const text = JSON.stringify({
926
+ keyShares: clientKeyShares,
927
+ derivationPath
928
+ });
850
929
  const blob = new Blob([
851
930
  text
852
931
  ], {
@@ -866,7 +945,7 @@ class DynamicWalletClient {
866
945
  }
867
946
  async getWallet({ accountAddress }) {
868
947
  if (accountAddress) {
869
- if (this.walletMap[accountAddress] && this.walletMap[accountAddress].clientKeyShares.length > 0) {
948
+ if (this.walletMap[accountAddress] && this.walletMap[accountAddress].clientKeyShares.length > 0 && this.walletMap[accountAddress].thresholdSignatureScheme) {
870
949
  this.logger.debug('Wallet already exists', this.walletMap[accountAddress]);
871
950
  return this.walletMap[accountAddress];
872
951
  } else {
@@ -882,7 +961,8 @@ class DynamicWalletClient {
882
961
  walletId: wallet.id,
883
962
  chainName: wallet.chainName,
884
963
  accountAddress,
885
- thresholdSignatureScheme: walletProperties.thresholdSignatureScheme
964
+ thresholdSignatureScheme: walletProperties.thresholdSignatureScheme,
965
+ derivationPath: walletProperties.derivationPath
886
966
  });
887
967
  // restore backup
888
968
  const decryptedKeyShares = await this.recoverEncryptedBackupByWallet({
@@ -917,13 +997,15 @@ class DynamicWalletClient {
917
997
  accountAddress: vc.address
918
998
  }));
919
999
  this.walletMap = wallets.reduce((acc, wallet)=>{
920
- var _acc_wallet_accountAddress, _acc_wallet_accountAddress1;
1000
+ var _acc_accountAddress, _acc_accountAddress1, _acc_accountAddress2;
1001
+ const accountAddress = wallet.accountAddress;
921
1002
  acc[wallet.accountAddress] = {
922
1003
  walletId: wallet.walletId,
923
1004
  chainName: wallet.chainName,
924
- accountAddress: wallet.accountAddress,
925
- clientKeyShares: ((_acc_wallet_accountAddress = acc[wallet.accountAddress]) == null ? void 0 : _acc_wallet_accountAddress.clientKeyShares) || [],
926
- thresholdSignatureScheme: ((_acc_wallet_accountAddress1 = acc[wallet.accountAddress]) == null ? void 0 : _acc_wallet_accountAddress1.thresholdSignatureScheme) || undefined
1005
+ accountAddress: accountAddress,
1006
+ clientKeyShares: ((_acc_accountAddress = acc[accountAddress]) == null ? void 0 : _acc_accountAddress.clientKeyShares) || [],
1007
+ thresholdSignatureScheme: ((_acc_accountAddress1 = acc[accountAddress]) == null ? void 0 : _acc_accountAddress1.thresholdSignatureScheme) || undefined,
1008
+ derivationPath: ((_acc_accountAddress2 = acc[accountAddress]) == null ? void 0 : _acc_accountAddress2.derivationPath) || undefined
927
1009
  };
928
1010
  return acc;
929
1011
  }, {});
package/index.esm.js CHANGED
@@ -64,6 +64,11 @@ const getClientKeyShareExportFileName = ({ thresholdSignatureScheme, accountAddr
64
64
  return `${CLIENT_KEYSHARE_EXPORT_FILENAME_PREFIX}-${thresholdSignatureScheme}-${accountAddress}.json`;
65
65
  };
66
66
 
67
+ const PBKDF2_ALGORITHM = 'PBKDF2';
68
+ const PBKDF2_ITERATIONS = 100000;
69
+ const PBKDF2_HASH_ALGORITHM = 'SHA-256';
70
+ const AES_GCM_ALGORITHM = 'AES-GCM';
71
+ const AES_GCM_LENGTH = 256;
67
72
  const getKey = async ({ password, salt })=>{
68
73
  const passwordBytes = stringToBytes(password);
69
74
  const initialKey = await crypto.subtle.importKey('raw', passwordBytes, {
@@ -72,13 +77,13 @@ const getKey = async ({ password, salt })=>{
72
77
  'deriveKey'
73
78
  ]);
74
79
  return crypto.subtle.deriveKey({
75
- name: 'PBKDF2',
80
+ name: PBKDF2_ALGORITHM,
76
81
  salt,
77
- iterations: 100000,
78
- hash: 'SHA-256'
82
+ iterations: PBKDF2_ITERATIONS,
83
+ hash: PBKDF2_HASH_ALGORITHM
79
84
  }, initialKey, {
80
- name: 'AES-GCM',
81
- length: 256
85
+ name: AES_GCM_ALGORITHM,
86
+ length: AES_GCM_LENGTH
82
87
  }, false, [
83
88
  'encrypt',
84
89
  'decrypt'
@@ -97,7 +102,7 @@ const encryptData = async ({ data, password })=>{
97
102
  const dataBytes = new TextEncoder().encode(data);
98
103
  // Encrypt the data
99
104
  const encryptedData = await crypto.subtle.encrypt({
100
- name: 'AES-GCM',
105
+ name: AES_GCM_ALGORITHM,
101
106
  iv
102
107
  }, key, dataBytes);
103
108
  // Convert to base64 strings, ensure proper padding
@@ -126,24 +131,42 @@ const decryptData = async ({ data, password })=>{
126
131
  salt: saltBytes
127
132
  });
128
133
  const decryptedData = await crypto.subtle.decrypt({
129
- name: 'AES-GCM',
134
+ name: AES_GCM_ALGORITHM,
130
135
  iv: ivBytes
131
136
  }, key, cipherBytes);
132
137
  return new TextDecoder().decode(decryptedData);
133
138
  } catch (error) {
134
139
  console.error('Decryption error details:', error);
135
- throw new Error(`Decryption failed`);
140
+ throw new Error('Decryption failed');
136
141
  }
137
142
  };
138
143
 
139
144
  const GOOGLE_DRIVE_UPLOAD_API = 'https://www.googleapis.com';
140
- const uploadFileToGoogleDrive = async ({ accessToken, fileName, jsonData })=>{
141
- const metadata = {
142
- name: fileName,
143
- mimeType: 'application/json',
145
+ const uploadFileToGoogleDriveAppStorage = async ({ accessToken, fileName, jsonData })=>{
146
+ return uploadFileToGoogleDrive({
147
+ accessToken,
148
+ fileName,
149
+ jsonData,
144
150
  parents: [
145
151
  'appDataFolder'
146
152
  ]
153
+ });
154
+ };
155
+ const uploadFileToGoogleDrivePersonal = async ({ accessToken, fileName, jsonData })=>{
156
+ return uploadFileToGoogleDrive({
157
+ accessToken,
158
+ fileName,
159
+ jsonData,
160
+ parents: [
161
+ 'root'
162
+ ]
163
+ });
164
+ };
165
+ const uploadFileToGoogleDrive = async ({ accessToken, fileName, jsonData, parents })=>{
166
+ const metadata = {
167
+ name: fileName,
168
+ mimeType: 'application/json',
169
+ parents
147
170
  };
148
171
  const form = new FormData();
149
172
  form.append('metadata', new Blob([
@@ -189,6 +212,9 @@ const downloadFileFromGoogleDrive = async ({ accessToken, name })=>{
189
212
  accessToken,
190
213
  name
191
214
  });
215
+ if (!files || files.length === 0) {
216
+ return null;
217
+ }
192
218
  // Get the most recent file
193
219
  const fileMetadata = files[0];
194
220
  // Fetch the file data using the file ID
@@ -202,7 +228,14 @@ const downloadFileFromGoogleDrive = async ({ accessToken, name })=>{
202
228
  if (fileRawData.length === 0) {
203
229
  return null;
204
230
  }
205
- return JSON.parse(fileRawData);
231
+ try {
232
+ // Just parse and return the data without validation
233
+ // The client will handle validation of the structure
234
+ return JSON.parse(fileRawData);
235
+ } catch (error) {
236
+ console.error('Error parsing backup file:', error);
237
+ return null;
238
+ }
206
239
  };
207
240
 
208
241
  const localStorageWriteTest = {
@@ -322,13 +355,11 @@ class DynamicWalletClient {
322
355
  const keygenInitResults = await Promise.all(Array(clientThreshold).fill(null).map(()=>mpcSigner.initKeygen()));
323
356
  return keygenInitResults;
324
357
  }
325
- async derivePublicKey({ chainName, keyShare, imported = false }) {
358
+ async derivePublicKey({ chainName, keyShare, derivationPath }) {
326
359
  const mpcSigner = getMPCSigner({
327
360
  chainName,
328
361
  baseRelayUrl: this.baseMPCRelayApiUrl
329
362
  });
330
- const chainConfig = getMPCChainConfig(chainName);
331
- const derivationPath = imported ? undefined : new Uint32Array(chainConfig.derivationPath);
332
363
  let publicKey;
333
364
  if (mpcSigner instanceof Ecdsa) {
334
365
  publicKey = await mpcSigner.derivePubkey(keyShare, derivationPath);
@@ -358,10 +389,12 @@ class DynamicWalletClient {
358
389
  }));
359
390
  // only need one client keygen result to derive the public key
360
391
  const [clientKeygenResult] = clientKeygenResults;
392
+ const chainConfig = getMPCChainConfig(chainName);
393
+ const derivationPath = new Uint32Array(chainConfig.derivationPath);
361
394
  const rawPublicKey = await this.derivePublicKey({
362
395
  chainName,
363
396
  keyShare: clientKeygenResult,
364
- imported: false
397
+ derivationPath
365
398
  });
366
399
  return {
367
400
  rawPublicKey,
@@ -407,14 +440,12 @@ class DynamicWalletClient {
407
440
  });
408
441
  return data;
409
442
  }
410
- async clientSign({ chainName, message, roomId, keyShare, imported = false }) {
443
+ async clientSign({ chainName, message, roomId, keyShare, derivationPath }) {
411
444
  try {
412
- const chainConfig = getMPCChainConfig(chainName);
413
445
  const mpcSigner = getMPCSigner({
414
446
  chainName,
415
447
  baseRelayUrl: this.baseMPCRelayApiUrl
416
448
  });
417
- const derivationPath = imported ? undefined : new Uint32Array(chainConfig.derivationPath);
418
449
  let formattedMessage;
419
450
  //note: Ecdsa can also be used by bitcoin, but only keccak256 is used by ethereum
420
451
  if (mpcSigner instanceof Ecdsa) {
@@ -442,23 +473,23 @@ class DynamicWalletClient {
442
473
  }
443
474
  }
444
475
  //todo: need to modify with imported flag
445
- async sign({ accountAddress, message, chainName, imported = false }) {
476
+ async sign({ accountAddress, message, chainName }) {
446
477
  const wallet = await this.getWallet({
447
478
  accountAddress
448
479
  });
449
- this.logger.debug('signing wallet', wallet);
450
480
  // Perform the server sign
451
481
  const data = await this.serverSign({
452
482
  walletId: wallet.walletId,
453
483
  message
454
484
  });
485
+ const derivationPath = wallet.derivationPath && wallet.derivationPath != '' ? new Uint32Array(Object.values(JSON.parse(wallet.derivationPath))) : undefined;
455
486
  // Perform the client sign and return the signature
456
487
  const signature = await this.clientSign({
457
488
  chainName,
458
489
  message,
459
490
  roomId: data.roomId,
460
491
  keyShare: wallet.clientKeyShares[0],
461
- imported
492
+ derivationPath
462
493
  });
463
494
  return signature;
464
495
  }
@@ -586,7 +617,6 @@ class DynamicWalletClient {
586
617
  const wallet = await this.getWallet({
587
618
  accountAddress
588
619
  });
589
- const chainConfig = getMPCChainConfig(chainName);
590
620
  const mpcSigner = getMPCSigner({
591
621
  chainName,
592
622
  baseRelayUrl: this.baseMPCRelayApiUrl
@@ -603,7 +633,7 @@ class DynamicWalletClient {
603
633
  if (!keyExportRaw) {
604
634
  throw new Error('Error exporting private key');
605
635
  }
606
- const derivationPath = new Uint32Array(chainConfig.derivationPath);
636
+ const derivationPath = wallet.derivationPath && wallet.derivationPath != '' ? new Uint32Array(Object.values(JSON.parse(wallet.derivationPath))) : undefined;
607
637
  let derivedPrivateKey;
608
638
  if (mpcSigner instanceof Ecdsa) {
609
639
  derivedPrivateKey = await mpcSigner.derivePrivateKeyFromXpriv(keyExportRaw, derivationPath);
@@ -616,7 +646,7 @@ class DynamicWalletClient {
616
646
  derivedPrivateKey
617
647
  };
618
648
  }
619
- async offlineExportKey({ chainName, keyShares }) {
649
+ async offlineExportKey({ chainName, keyShares, derivationPath }) {
620
650
  try {
621
651
  if (!keyShares || keyShares.length < 2) {
622
652
  throw new Error(`Must provide at least min threshold of key shares`);
@@ -633,14 +663,14 @@ class DynamicWalletClient {
633
663
  throw new Error('Error exporting private key: Export returned null');
634
664
  }
635
665
  const chainConfig = getMPCChainConfig(chainName);
636
- const derivationPath = new Uint32Array(chainConfig.derivationPath);
666
+ const walletDerivationPath = !derivationPath ? undefined : new Uint32Array(chainConfig.derivationPath);
637
667
  let derivedPrivateKey;
638
668
  if (mpcSigner instanceof Ecdsa) {
639
- derivedPrivateKey = await mpcSigner.derivePrivateKeyFromXpriv(keyExportRaw, derivationPath);
669
+ derivedPrivateKey = await mpcSigner.derivePrivateKeyFromXpriv(keyExportRaw, walletDerivationPath);
640
670
  } else if (mpcSigner instanceof Ed25519) {
641
671
  derivedPrivateKey = keyExportRaw;
642
672
  } else if (mpcSigner instanceof BIP340) {
643
- derivedPrivateKey = await mpcSigner.derivePrivateKeyFromXpriv(keyExportRaw, derivationPath);
673
+ derivedPrivateKey = await mpcSigner.derivePrivateKeyFromXpriv(keyExportRaw, walletDerivationPath);
644
674
  }
645
675
  return {
646
676
  derivedPrivateKey
@@ -702,7 +732,8 @@ class DynamicWalletClient {
702
732
  accountAddress,
703
733
  chainName: data.chainName,
704
734
  keyShare,
705
- thresholdSignatureScheme: wallet.thresholdSignatureScheme
735
+ thresholdSignatureScheme: wallet.thresholdSignatureScheme,
736
+ derivationPath: wallet.derivationPath
706
737
  });
707
738
  });
708
739
  return decryptedKeyShares;
@@ -715,17 +746,27 @@ class DynamicWalletClient {
715
746
  }
716
747
  this.walletMap = JSON.parse(wallets);
717
748
  }
718
- async restoreBackupShare({ walletId, accountAddress, chainName, keyShare, thresholdSignatureScheme }) {
749
+ async restoreBackupShare({ walletId, accountAddress, chainName, keyShare, thresholdSignatureScheme, derivationPath }) {
719
750
  var _this_walletMap_accountAddress;
751
+ // Get existing shares if any
752
+ const existingShares = ((_this_walletMap_accountAddress = this.walletMap[accountAddress]) == null ? void 0 : _this_walletMap_accountAddress.clientKeyShares) || [];
753
+ // Check if this share already exists to prevent duplicates
754
+ const isDuplicate = existingShares.some((existingShare)=>{
755
+ var _existingShare_pubkey, _keyShare_pubkey;
756
+ return ((_existingShare_pubkey = existingShare.pubkey) == null ? void 0 : _existingShare_pubkey.toString()) === ((_keyShare_pubkey = keyShare.pubkey) == null ? void 0 : _keyShare_pubkey.toString()) && existingShare.secretShare === keyShare.secretShare;
757
+ });
758
+ // Only add the share if it's not a duplicate
759
+ const updatedShares = isDuplicate ? existingShares : [
760
+ ...existingShares,
761
+ keyShare
762
+ ];
720
763
  this.walletMap[accountAddress] = {
721
764
  walletId,
722
765
  chainName,
723
766
  accountAddress,
724
- clientKeyShares: [
725
- ...((_this_walletMap_accountAddress = this.walletMap[accountAddress]) == null ? void 0 : _this_walletMap_accountAddress.clientKeyShares) || [],
726
- keyShare
727
- ],
728
- thresholdSignatureScheme
767
+ clientKeyShares: updatedShares,
768
+ thresholdSignatureScheme,
769
+ derivationPath
729
770
  };
730
771
  await this.storage.setItem(this.storageKey, JSON.stringify(this.walletMap));
731
772
  }
@@ -749,15 +790,44 @@ class DynamicWalletClient {
749
790
  thresholdSignatureScheme,
750
791
  accountAddress
751
792
  });
752
- const uploadMetadata = await uploadFileToGoogleDrive({
753
- accessToken,
754
- fileName: fileName != null ? fileName : suggestedFileName,
755
- jsonData: encryptedKeyShares
756
- });
793
+ const backupData = {
794
+ keyShares: encryptedKeyShares,
795
+ metadata: {
796
+ version: '1.0',
797
+ createdAt: new Date().toISOString(),
798
+ accountAddress,
799
+ thresholdSignatureScheme,
800
+ hasPassword: true,
801
+ encryption: {
802
+ algorithm: AES_GCM_ALGORITHM,
803
+ keyDerivation: PBKDF2_ALGORITHM,
804
+ iterations: PBKDF2_ITERATIONS,
805
+ hashAlgorithm: PBKDF2_HASH_ALGORITHM,
806
+ algorithmLength: AES_GCM_LENGTH
807
+ },
808
+ shareCount: encryptedKeyShares.length
809
+ }
810
+ };
811
+ // TODO: handle errors
812
+ const [appUpload, personalUpload] = await Promise.all([
813
+ uploadFileToGoogleDriveAppStorage({
814
+ accessToken,
815
+ fileName: fileName != null ? fileName : suggestedFileName,
816
+ jsonData: backupData
817
+ }),
818
+ uploadFileToGoogleDrivePersonal({
819
+ accessToken,
820
+ fileName: fileName != null ? fileName : suggestedFileName,
821
+ jsonData: backupData
822
+ })
823
+ ]);
757
824
  await this.apiClient.markKeySharesAsBackedUpGoogleDrive({
758
825
  walletId: this.walletMap[accountAddress].walletId
759
826
  });
760
- return uploadMetadata;
827
+ return {
828
+ appUpload,
829
+ personalUpload
830
+ };
761
831
  }
762
832
  async restoreBackupFromGoogleDrive({ accountAddress, oauthAccountId, name, password }) {
763
833
  await this.getWallet({
@@ -771,17 +841,19 @@ class DynamicWalletClient {
771
841
  thresholdSignatureScheme,
772
842
  accountAddress
773
843
  });
774
- const file = await downloadFileFromGoogleDrive({
844
+ const backupData = await downloadFileFromGoogleDrive({
775
845
  accessToken,
776
846
  name: name != null ? name : suggestedFileName
777
847
  });
778
- if (!file) {
779
- throw new Error('No file found');
848
+ if (!backupData) {
849
+ throw new Error('No backup file found');
780
850
  }
781
- const fileArray = Array.isArray(file) ? file : [
782
- file
783
- ];
784
- const decryptedKeyShares = await Promise.all(fileArray.map((keyShare)=>this.decryptKeyShare({
851
+ // Validate the backup data structure
852
+ if (!backupData.keyShares || !backupData.metadata) {
853
+ throw new Error('Invalid backup format: missing keyShares or metadata');
854
+ }
855
+ const { keyShares } = backupData;
856
+ const decryptedKeyShares = await Promise.all(keyShares.map((keyShare)=>this.decryptKeyShare({
785
857
  keyShare,
786
858
  password
787
859
  })));
@@ -835,7 +907,7 @@ class DynamicWalletClient {
835
907
  const rawPublicKey = await this.derivePublicKey({
836
908
  chainName,
837
909
  keyShare: clientKeygenResult,
838
- imported: true
910
+ derivationPath: undefined
839
911
  });
840
912
  return {
841
913
  rawPublicKey,
@@ -846,7 +918,14 @@ class DynamicWalletClient {
846
918
  const clientKeyShares = await this.getClientKeyShares({
847
919
  accountAddress
848
920
  });
849
- const text = JSON.stringify(clientKeyShares);
921
+ if (!accountAddress) {
922
+ throw new Error('Must provide an account address');
923
+ }
924
+ const derivationPath = this.walletMap[accountAddress].derivationPath;
925
+ const text = JSON.stringify({
926
+ keyShares: clientKeyShares,
927
+ derivationPath
928
+ });
850
929
  const blob = new Blob([
851
930
  text
852
931
  ], {
@@ -866,7 +945,7 @@ class DynamicWalletClient {
866
945
  }
867
946
  async getWallet({ accountAddress }) {
868
947
  if (accountAddress) {
869
- if (this.walletMap[accountAddress] && this.walletMap[accountAddress].clientKeyShares.length > 0) {
948
+ if (this.walletMap[accountAddress] && this.walletMap[accountAddress].clientKeyShares.length > 0 && this.walletMap[accountAddress].thresholdSignatureScheme) {
870
949
  this.logger.debug('Wallet already exists', this.walletMap[accountAddress]);
871
950
  return this.walletMap[accountAddress];
872
951
  } else {
@@ -882,7 +961,8 @@ class DynamicWalletClient {
882
961
  walletId: wallet.id,
883
962
  chainName: wallet.chainName,
884
963
  accountAddress,
885
- thresholdSignatureScheme: walletProperties.thresholdSignatureScheme
964
+ thresholdSignatureScheme: walletProperties.thresholdSignatureScheme,
965
+ derivationPath: walletProperties.derivationPath
886
966
  });
887
967
  // restore backup
888
968
  const decryptedKeyShares = await this.recoverEncryptedBackupByWallet({
@@ -917,13 +997,15 @@ class DynamicWalletClient {
917
997
  accountAddress: vc.address
918
998
  }));
919
999
  this.walletMap = wallets.reduce((acc, wallet)=>{
920
- var _acc_wallet_accountAddress, _acc_wallet_accountAddress1;
1000
+ var _acc_accountAddress, _acc_accountAddress1, _acc_accountAddress2;
1001
+ const accountAddress = wallet.accountAddress;
921
1002
  acc[wallet.accountAddress] = {
922
1003
  walletId: wallet.walletId,
923
1004
  chainName: wallet.chainName,
924
- accountAddress: wallet.accountAddress,
925
- clientKeyShares: ((_acc_wallet_accountAddress = acc[wallet.accountAddress]) == null ? void 0 : _acc_wallet_accountAddress.clientKeyShares) || [],
926
- thresholdSignatureScheme: ((_acc_wallet_accountAddress1 = acc[wallet.accountAddress]) == null ? void 0 : _acc_wallet_accountAddress1.thresholdSignatureScheme) || undefined
1005
+ accountAddress: accountAddress,
1006
+ clientKeyShares: ((_acc_accountAddress = acc[accountAddress]) == null ? void 0 : _acc_accountAddress.clientKeyShares) || [],
1007
+ thresholdSignatureScheme: ((_acc_accountAddress1 = acc[accountAddress]) == null ? void 0 : _acc_accountAddress1.thresholdSignatureScheme) || undefined,
1008
+ derivationPath: ((_acc_accountAddress2 = acc[accountAddress]) == null ? void 0 : _acc_accountAddress2.derivationPath) || undefined
927
1009
  };
928
1010
  return acc;
929
1011
  }, {});
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@dynamic-labs-wallet/browser",
3
- "version": "0.0.30",
3
+ "version": "0.0.32",
4
4
  "dependencies": {
5
- "@dynamic-labs-wallet/core": "0.0.30",
5
+ "@dynamic-labs-wallet/core": "0.0.32",
6
6
  "@dynamic-labs/logger": "^4.5.1"
7
7
  },
8
8
  "files": [
@@ -1,3 +1,8 @@
1
+ export declare const PBKDF2_ALGORITHM = "PBKDF2";
2
+ export declare const PBKDF2_ITERATIONS = 100000;
3
+ export declare const PBKDF2_HASH_ALGORITHM = "SHA-256";
4
+ export declare const AES_GCM_ALGORITHM = "AES-GCM";
5
+ export declare const AES_GCM_LENGTH = 256;
1
6
  export declare const encryptData: ({ data, password, }: {
2
7
  data: string;
3
8
  password: string;
@@ -1 +1 @@
1
- {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../src/backup/encryption.ts"],"names":[],"mappings":"AAiCA,eAAO,MAAM,WAAW,wBAGrB;IACD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;;;;EA4BA,CAAC;AAEF,eAAO,MAAM,WAAW,wBAGrB;IACD,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,QAAQ,EAAE,MAAM,CAAC;CAClB,oBA0BA,CAAC"}
1
+ {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../src/backup/encryption.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,gBAAgB,WAAW,CAAC;AACzC,eAAO,MAAM,iBAAiB,SAAS,CAAC;AACxC,eAAO,MAAM,qBAAqB,YAAY,CAAC;AAE/C,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAC3C,eAAO,MAAM,cAAc,MAAM,CAAC;AA4BlC,eAAO,MAAM,WAAW,wBAGrB;IACD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;;;;EA4BA,CAAC;AAEF,eAAO,MAAM,WAAW,wBAGrB;IACD,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,QAAQ,EAAE,MAAM,CAAC;CAClB,oBA0BA,CAAC"}
@@ -1,7 +1,12 @@
1
- export declare const uploadFileToGoogleDrive: ({ accessToken, fileName, jsonData, }: {
1
+ export declare const uploadFileToGoogleDriveAppStorage: ({ accessToken, fileName, jsonData, }: {
2
2
  accessToken: string;
3
3
  fileName: string;
4
- jsonData: string[];
4
+ jsonData: unknown;
5
+ }) => Promise<any>;
6
+ export declare const uploadFileToGoogleDrivePersonal: ({ accessToken, fileName, jsonData, }: {
7
+ accessToken: string;
8
+ fileName: string;
9
+ jsonData: unknown;
5
10
  }) => Promise<any>;
6
11
  export declare const listFilesFromGoogleDrive: ({ accessToken, name, }: {
7
12
  accessToken: string;
@@ -10,5 +15,5 @@ export declare const listFilesFromGoogleDrive: ({ accessToken, name, }: {
10
15
  export declare const downloadFileFromGoogleDrive: ({ accessToken, name, }: {
11
16
  accessToken: string;
12
17
  name: string;
13
- }) => Promise<string[] | string | null>;
18
+ }) => Promise<unknown | null>;
14
19
  //# sourceMappingURL=googleDrive.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"googleDrive.d.ts","sourceRoot":"","sources":["../../../src/backup/providers/googleDrive.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB,yCAIjC;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,iBAkCA,CAAC;AAEF,eAAO,MAAM,wBAAwB,2BAGlC;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,iBAsBA,CAAC;AAEF,eAAO,MAAM,2BAA2B,2BAGrC;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,KAAG,OAAO,CAAC,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAsBnC,CAAC"}
1
+ {"version":3,"file":"googleDrive.d.ts","sourceRoot":"","sources":["../../../src/backup/providers/googleDrive.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iCAAiC,yCAI3C;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB,iBAOA,CAAC;AAEF,eAAO,MAAM,+BAA+B,yCAIzC;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB,iBAOA,CAAC;AAiDF,eAAO,MAAM,wBAAwB,2BAGlC;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,iBAsBA,CAAC;AAEF,eAAO,MAAM,2BAA2B,2BAGrC;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,KAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAiCzB,CAAC"}
package/src/client.d.ts CHANGED
@@ -31,10 +31,10 @@ export declare class DynamicWalletClient {
31
31
  chainName: string;
32
32
  thresholdSignatureScheme: ThresholdSignatureScheme;
33
33
  }): Promise<ClientInitKeygenResult[]>;
34
- derivePublicKey({ chainName, keyShare, imported, }: {
34
+ derivePublicKey({ chainName, keyShare, derivationPath, }: {
35
35
  chainName: string;
36
36
  keyShare: ClientKeyShare;
37
- imported: boolean;
37
+ derivationPath: Uint32Array | undefined;
38
38
  }): Promise<EcdsaPublicKey | Uint8Array | undefined>;
39
39
  clientKeyGen({ chainName, roomId, serverKeygenIds, clientKeygenInitResults, thresholdSignatureScheme, }: {
40
40
  chainName: string;
@@ -57,18 +57,17 @@ export declare class DynamicWalletClient {
57
57
  walletId: string;
58
58
  message: string | Uint8Array;
59
59
  }): Promise<any>;
60
- clientSign({ chainName, message, roomId, keyShare, imported, }: {
60
+ clientSign({ chainName, message, roomId, keyShare, derivationPath, }: {
61
61
  chainName: string;
62
62
  message: string | Uint8Array;
63
63
  roomId: string;
64
64
  keyShare: ClientKeyShare;
65
- imported?: boolean;
65
+ derivationPath: Uint32Array | undefined;
66
66
  }): Promise<Uint8Array | EcdsaSignature>;
67
- sign({ accountAddress, message, chainName, imported, }: {
67
+ sign({ accountAddress, message, chainName, }: {
68
68
  accountAddress?: string;
69
69
  message: string | Uint8Array;
70
70
  chainName: string;
71
- imported?: boolean;
72
71
  }): Promise<Uint8Array | EcdsaSignature>;
73
72
  refreshWalletAccountShares({ accountAddress, chainName, }: {
74
73
  accountAddress: string;
@@ -115,9 +114,10 @@ export declare class DynamicWalletClient {
115
114
  }): Promise<{
116
115
  derivedPrivateKey: string | undefined;
117
116
  }>;
118
- offlineExportKey({ chainName, keyShares, }: {
117
+ offlineExportKey({ chainName, keyShares, derivationPath, }: {
119
118
  chainName: string;
120
119
  keyShares: ClientKeyShare[];
120
+ derivationPath?: string;
121
121
  }): Promise<{
122
122
  derivedPrivateKey: string | undefined;
123
123
  }>;
@@ -138,19 +138,23 @@ export declare class DynamicWalletClient {
138
138
  password?: string;
139
139
  }): Promise<any[]>;
140
140
  restoreWallets(): Promise<void>;
141
- restoreBackupShare({ walletId, accountAddress, chainName, keyShare, thresholdSignatureScheme, }: {
141
+ restoreBackupShare({ walletId, accountAddress, chainName, keyShare, thresholdSignatureScheme, derivationPath, }: {
142
142
  walletId: string;
143
143
  accountAddress: string;
144
144
  chainName: string;
145
145
  keyShare: ClientKeyShare;
146
146
  thresholdSignatureScheme: ThresholdSignatureScheme;
147
+ derivationPath?: string;
147
148
  }): Promise<void>;
148
149
  backupKeySharesToGoogleDrive({ accountAddress, fileName, oauthAccountId, password, }: {
149
150
  accountAddress: string;
150
151
  fileName?: string;
151
152
  oauthAccountId: string;
152
153
  password?: string;
153
- }): Promise<any>;
154
+ }): Promise<{
155
+ appUpload: any;
156
+ personalUpload: any;
157
+ }>;
154
158
  restoreBackupFromGoogleDrive({ accountAddress, oauthAccountId, name, password, }: {
155
159
  accountAddress: string;
156
160
  oauthAccountId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../packages/src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../packages/src/client.ts"],"names":[],"mappings":"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"}
package/src/types.d.ts CHANGED
@@ -9,6 +9,7 @@ export interface WalletProperties {
9
9
  accountAddress: string;
10
10
  clientKeyShares: ClientKeyShare[];
11
11
  thresholdSignatureScheme: ThresholdSignatureScheme;
12
+ derivationPath?: string;
12
13
  }
13
14
  export interface DynamicWalletClientProps {
14
15
  environmentId: string;
@@ -18,4 +19,21 @@ export interface DynamicWalletClientProps {
18
19
  debug?: boolean;
19
20
  baseMPCRelayApiUrl?: string;
20
21
  }
22
+ export type BackupData = {
23
+ keyShares: string[];
24
+ metadata: {
25
+ version: string;
26
+ createdAt: string;
27
+ accountAddress: string;
28
+ thresholdSignatureScheme: ThresholdSignatureScheme;
29
+ hasPassword: boolean;
30
+ encryption?: {
31
+ algorithm: string;
32
+ keyDerivation: string;
33
+ iterations: number;
34
+ hashAlgorithm: string;
35
+ };
36
+ shareCount: number;
37
+ };
38
+ };
21
39
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../packages/src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,GAAG,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,gBAAgB,GAAG;IAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;CAAE,CAAC;AAEzD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,wBAAwB,EAAE,wBAAwB,CAAC;CACpD;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../packages/src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,GAAG,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,gBAAgB,GAAG;IAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;CAAE,CAAC;AAEzD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,wBAAwB,EAAE,wBAAwB,CAAC;IACnD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,WAAW,EAAE,OAAO,CAAC;QACrB,UAAU,CAAC,EAAE;YACX,SAAS,EAAE,MAAM,CAAC;YAClB,aAAa,EAAE,MAAM,CAAC;YACtB,UAAU,EAAE,MAAM,CAAC;YACnB,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;QACF,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH,CAAC"}