@dynamic-labs-wallet/browser 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/index.esm.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./src/index";
package/index.esm.js ADDED
@@ -0,0 +1,537 @@
1
+ import { SigningAlgorithm, RELAY_API_URL, getMPCChainConfig, MPC_CONFIG, ThresholdSignatureScheme, DynamicApiClient } from '@dynamic-labs-wallet/core';
2
+ export * from '@dynamic-labs-wallet/core';
3
+ import { BIP340, Ed25519, Ecdsa, MessageHash } from '@dynamic-labs-wallet/lib-mpc-web';
4
+ export { BIP340, BIP340InitKeygenResult, BIP340KeygenResult, Ecdsa, EcdsaInitKeygenResult, EcdsaKeygenResult, EcdsaPublicKey, EcdsaSignature, Ed25519, Ed25519InitKeygenResult, Ed25519KeygenResult, MessageHash } from '@dynamic-labs-wallet/lib-mpc-web';
5
+
6
+ const getMPCSignatureScheme = ({ signingAlgorithm, baseRelayUrl = RELAY_API_URL })=>{
7
+ switch(signingAlgorithm){
8
+ case SigningAlgorithm.ECDSA:
9
+ return new Ecdsa(baseRelayUrl);
10
+ case SigningAlgorithm.ED25519:
11
+ return new Ed25519(baseRelayUrl);
12
+ case SigningAlgorithm.BIP340:
13
+ return new BIP340(baseRelayUrl);
14
+ default:
15
+ throw new Error(`Unsupported signing algorithm: ${signingAlgorithm}`);
16
+ }
17
+ };
18
+ const getMPCSigner = ({ chainName, baseRelayUrl })=>{
19
+ const chainConfig = getMPCChainConfig(chainName);
20
+ const signatureScheme = getMPCSignatureScheme({
21
+ signingAlgorithm: chainConfig.signingAlgorithm,
22
+ baseRelayUrl
23
+ });
24
+ return signatureScheme;
25
+ };
26
+
27
+ const bytesToBase64 = (arr)=>{
28
+ return btoa(Array.from(arr, (b)=>String.fromCharCode(b)).join(''));
29
+ };
30
+ const stringToBytes = (str)=>{
31
+ return new TextEncoder().encode(str);
32
+ };
33
+ const base64ToBytes = (base64)=>{
34
+ return new Uint8Array(Buffer.from(base64, 'base64'));
35
+ };
36
+ // Helper function to ensure proper base64 padding
37
+ const ensureBase64Padding = (str)=>{
38
+ return str.padEnd(Math.ceil(str.length / 4) * 4, '=');
39
+ };
40
+
41
+ const getKey = async ({ password, salt })=>{
42
+ const passwordBytes = stringToBytes(password);
43
+ const initialKey = await crypto.subtle.importKey('raw', passwordBytes, {
44
+ name: 'PBKDF2'
45
+ }, false, [
46
+ 'deriveKey'
47
+ ]);
48
+ return crypto.subtle.deriveKey({
49
+ name: 'PBKDF2',
50
+ salt,
51
+ iterations: 100000,
52
+ hash: 'SHA-256'
53
+ }, initialKey, {
54
+ name: 'AES-GCM',
55
+ length: 256
56
+ }, false, [
57
+ 'encrypt',
58
+ 'decrypt'
59
+ ]);
60
+ };
61
+ const encryptData = async ({ data, password })=>{
62
+ try {
63
+ // Generate a random salt and IV
64
+ const salt = crypto.getRandomValues(new Uint8Array(16));
65
+ const iv = crypto.getRandomValues(new Uint8Array(12)); // AES-GCM requires 12 bytes
66
+ const key = await getKey({
67
+ password,
68
+ salt
69
+ });
70
+ // Convert the input string to bytes
71
+ const dataBytes = new TextEncoder().encode(data);
72
+ // Encrypt the data
73
+ const encryptedData = await crypto.subtle.encrypt({
74
+ name: 'AES-GCM',
75
+ iv
76
+ }, key, dataBytes);
77
+ // Convert to base64 strings, ensure proper padding
78
+ return {
79
+ salt: bytesToBase64(salt),
80
+ iv: bytesToBase64(iv),
81
+ cipher: bytesToBase64(new Uint8Array(encryptedData))
82
+ };
83
+ } catch (error) {
84
+ console.error('Error encrypting data:', error);
85
+ throw new Error('Error encrypting data');
86
+ }
87
+ };
88
+ const decryptData = async ({ data, password })=>{
89
+ try {
90
+ const { salt, iv, cipher } = data;
91
+ // Ensure proper base64 padding for all values
92
+ const paddedSalt = ensureBase64Padding(salt);
93
+ const paddedIv = ensureBase64Padding(iv);
94
+ const paddedCipher = ensureBase64Padding(cipher);
95
+ const saltBytes = base64ToBytes(paddedSalt);
96
+ const ivBytes = base64ToBytes(paddedIv);
97
+ const cipherBytes = base64ToBytes(paddedCipher);
98
+ const key = await getKey({
99
+ password,
100
+ salt: saltBytes
101
+ });
102
+ const decryptedData = await crypto.subtle.decrypt({
103
+ name: 'AES-GCM',
104
+ iv: ivBytes
105
+ }, key, cipherBytes);
106
+ return new TextDecoder().decode(decryptedData);
107
+ } catch (error) {
108
+ console.error('Decryption error details:', error);
109
+ throw new Error(`Decryption failed`);
110
+ }
111
+ };
112
+
113
+ const GOOGLE_DRIVE_UPLOAD_API = 'https://www.googleapis.com';
114
+ const uploadFileToGoogleDrive = async ({ accessToken, fileName, jsonData })=>{
115
+ const metadata = {
116
+ name: fileName,
117
+ mimeType: 'application/json',
118
+ parents: [
119
+ 'appDataFolder'
120
+ ]
121
+ };
122
+ const form = new FormData();
123
+ form.append('metadata', new Blob([
124
+ JSON.stringify(metadata)
125
+ ], {
126
+ type: 'application/json'
127
+ }));
128
+ form.append('file', new Blob([
129
+ JSON.stringify(jsonData)
130
+ ], {
131
+ type: 'application/json'
132
+ }));
133
+ const response = await fetch(`${GOOGLE_DRIVE_UPLOAD_API}/upload/drive/v3/files?uploadType=multipart`, {
134
+ method: 'POST',
135
+ headers: {
136
+ Authorization: `Bearer ${accessToken}`
137
+ },
138
+ body: form
139
+ });
140
+ if (!response.ok) {
141
+ throw new Error('Error uploading file');
142
+ }
143
+ const result = await response.json();
144
+ return result; // Return file metadata, including file ID
145
+ };
146
+ const listFilesFromGoogleDrive = async ({ accessToken, name })=>{
147
+ // Step 1: List all files inside `appDataFolder` with the specified backup filename
148
+ const resp = await fetch(`${GOOGLE_DRIVE_UPLOAD_API}/drive/v3/files?q=${encodeURIComponent(`name='${name}'`)}&spaces=appDataFolder&orderBy=createdTime desc`, {
149
+ headers: {
150
+ Authorization: `Bearer ${accessToken}`
151
+ }
152
+ });
153
+ const data = await resp.json();
154
+ // If no files found, return null
155
+ if (!data.files || data.files.length === 0) {
156
+ return null;
157
+ }
158
+ const files = data.files;
159
+ return files;
160
+ };
161
+ const downloadFileFromGoogleDrive = async ({ accessToken, name })=>{
162
+ const files = await listFilesFromGoogleDrive({
163
+ accessToken,
164
+ name
165
+ });
166
+ // Get the most recent file
167
+ const fileMetadata = files[0];
168
+ // Fetch the file data using the file ID
169
+ const fileRes = await fetch(`${GOOGLE_DRIVE_UPLOAD_API}/drive/v3/files/${fileMetadata.id}?alt=media`, {
170
+ headers: {
171
+ Authorization: `Bearer ${accessToken}`
172
+ }
173
+ });
174
+ // Read the file's raw data
175
+ const fileRawData = await fileRes.text();
176
+ if (fileRawData.length === 0) {
177
+ return null;
178
+ }
179
+ return fileRawData;
180
+ };
181
+
182
+ const BACKUP_FILENAME = 'dynamicWalletSecretBackup.json';
183
+
184
+ class DynamicWalletClient {
185
+ async serverInitializeKeyGen({ chainName, clientPrimaryKeygenId, clientSecondaryKeygenId }) {
186
+ // Initilize keygen, create room, and create the wallet account on the server
187
+ const data = await this.apiClient.createWalletAccount({
188
+ chainName,
189
+ clientPrimaryKeygenId,
190
+ clientSecondaryKeygenId
191
+ });
192
+ return data;
193
+ }
194
+ async clientInitializeKeyGen({ chainName }) {
195
+ // Get the mpc signer
196
+ const mpcSigner = getMPCSigner({
197
+ chainName,
198
+ baseRelayUrl: RELAY_API_URL
199
+ });
200
+ // Initialize the keygen for the primary client and the secondary client shares
201
+ const keygenInitResults = await Promise.all([
202
+ mpcSigner.initKeygen(),
203
+ mpcSigner.initKeygen()
204
+ ]);
205
+ const [clientPrimaryKeygenInitResult, clientSecondaryKeygenInitResult] = keygenInitResults;
206
+ return {
207
+ clientPrimaryKeygenInitResult,
208
+ clientSecondaryKeygenInitResult
209
+ };
210
+ }
211
+ async derivePublicKey({ chainName, keyShare }) {
212
+ const mpcSigner = getMPCSigner({
213
+ chainName,
214
+ baseRelayUrl: RELAY_API_URL
215
+ });
216
+ const chainConfig = getMPCChainConfig(chainName);
217
+ let publicKey;
218
+ if (mpcSigner instanceof Ecdsa) {
219
+ publicKey = await mpcSigner.derivePubkey(keyShare != null ? keyShare : this.clientKeyshare, new Uint32Array(chainConfig.derivationPath));
220
+ } else if (mpcSigner instanceof Ed25519) {
221
+ publicKey = await mpcSigner.derivePubkey(keyShare != null ? keyShare : this.clientKeyshare, new Uint32Array(chainConfig.derivationPath));
222
+ }
223
+ return publicKey;
224
+ }
225
+ async clientKeyGen({ chainName, roomId, serverKeygenId, clientPrimaryKeygenInitResult, clientSecondaryKeygenInitResult }) {
226
+ // Get the chain config and the mpc signer
227
+ const chainConfig = getMPCChainConfig(chainName);
228
+ const mpcSigner = getMPCSigner({
229
+ chainName,
230
+ baseRelayUrl: RELAY_API_URL
231
+ });
232
+ // All parties receive the keygenIds from all OTHER parties
233
+ const clientPrimaryKeygenId = clientPrimaryKeygenInitResult.keygenId;
234
+ const clientSecondaryKeygenId = clientSecondaryKeygenInitResult.keygenId;
235
+ const clientPrimaryKeygenIds = [
236
+ serverKeygenId,
237
+ clientSecondaryKeygenId
238
+ ];
239
+ const clientSecondaryKeygenIds = [
240
+ serverKeygenId,
241
+ clientPrimaryKeygenId
242
+ ];
243
+ // Get the MPC config for the threshold signature scheme
244
+ const mpcConfig = MPC_CONFIG[ThresholdSignatureScheme.TWO_OF_THREE];
245
+ // All parties join the keygen room
246
+ const keygenResults = await Promise.all([
247
+ mpcSigner.keygen(roomId, mpcConfig.numberOfParties, mpcConfig.threshold, clientPrimaryKeygenInitResult, clientPrimaryKeygenIds),
248
+ mpcSigner.keygen(roomId, mpcConfig.numberOfParties, mpcConfig.threshold, clientSecondaryKeygenInitResult, clientSecondaryKeygenIds)
249
+ ]);
250
+ const [clientPrimaryKeygenResult, clientSecondaryKeygenResult] = keygenResults;
251
+ this.clientKeyshare = clientPrimaryKeygenResult;
252
+ // Pick the derivation path of the public key you want to sign for
253
+ const derivationPath = new Uint32Array(chainConfig.derivationPath);
254
+ // Get the public key for the derivation path
255
+ let rawPublicKey;
256
+ if (mpcSigner instanceof Ecdsa) {
257
+ rawPublicKey = await mpcSigner.derivePubkey(clientPrimaryKeygenResult, derivationPath);
258
+ } else if (mpcSigner instanceof Ed25519) {
259
+ rawPublicKey = await mpcSigner.derivePubkey(clientPrimaryKeygenResult, derivationPath);
260
+ } else if (mpcSigner instanceof BIP340) {
261
+ rawPublicKey = await mpcSigner.deriveTweakPubkey(clientPrimaryKeygenResult, derivationPath);
262
+ }
263
+ return {
264
+ rawPublicKey,
265
+ primaryKeygenResult: clientPrimaryKeygenResult,
266
+ secondaryKeygenResult: clientSecondaryKeygenResult
267
+ };
268
+ }
269
+ async keyGen({ chainName }) {
270
+ try {
271
+ const { clientPrimaryKeygenInitResult, clientSecondaryKeygenInitResult } = await this.clientInitializeKeyGen({
272
+ chainName
273
+ });
274
+ const data = await this.serverInitializeKeyGen({
275
+ chainName,
276
+ clientPrimaryKeygenId: clientPrimaryKeygenInitResult.keygenId,
277
+ clientSecondaryKeygenId: clientSecondaryKeygenInitResult.keygenId
278
+ });
279
+ const { rawPublicKey, primaryKeygenResult, secondaryKeygenResult } = await this.clientKeyGen({
280
+ chainName,
281
+ roomId: data.roomId,
282
+ serverKeygenId: data.serverKeygenId,
283
+ clientPrimaryKeygenInitResult,
284
+ clientSecondaryKeygenInitResult
285
+ });
286
+ return {
287
+ rawPublicKey,
288
+ primaryKeygenResult,
289
+ secondaryKeygenResult
290
+ };
291
+ } catch (error) {
292
+ console.error('Error creating wallet account', error);
293
+ throw new Error('Error creating wallet account');
294
+ }
295
+ }
296
+ async serverSign({ messageToSign }) {
297
+ // Create the room and sign the message
298
+ const data = await this.apiClient.signMessage({
299
+ messageToSign
300
+ });
301
+ return data;
302
+ }
303
+ async clientSign({ chainName, messageToSign, roomId }) {
304
+ // Get the chain config and the mpc signer
305
+ const chainConfig = getMPCChainConfig(chainName);
306
+ const mpcSigner = getMPCSigner({
307
+ chainName,
308
+ baseRelayUrl: RELAY_API_URL
309
+ });
310
+ const derivationPath = new Uint32Array(chainConfig.derivationPath);
311
+ const formattedMessage = mpcSigner instanceof Ecdsa ? MessageHash.sha256(messageToSign) : new TextEncoder().encode(messageToSign);
312
+ const signature = await mpcSigner.sign(roomId, this.clientKeyshare, formattedMessage, derivationPath);
313
+ return signature;
314
+ }
315
+ async sign({ chainName, messageToSign }) {
316
+ // Perform the server sign
317
+ const data = await this.serverSign({
318
+ messageToSign
319
+ });
320
+ // Perform the client sign and return the signature
321
+ const signature = await this.clientSign({
322
+ chainName,
323
+ messageToSign,
324
+ roomId: data.roomId
325
+ });
326
+ return signature;
327
+ }
328
+ async refreshWalletAccountShares({ chainName, clientPrimaryKeyshare, clientSecondaryKeyshare }) {
329
+ const mpcSigner = getMPCSigner({
330
+ chainName,
331
+ baseRelayUrl: RELAY_API_URL
332
+ });
333
+ // Create the room and refresh the shares
334
+ const data = await this.apiClient.refreshWalletAccountShares();
335
+ const roomId = data.roomId;
336
+ const keygenResults = await Promise.all([
337
+ mpcSigner.refresh(roomId, clientPrimaryKeyshare),
338
+ mpcSigner.refresh(roomId, clientSecondaryKeyshare)
339
+ ]);
340
+ this.clientKeyshare = keygenResults[0];
341
+ return keygenResults;
342
+ }
343
+ async serverReshareRemainingParty({ clientPrimaryKeygenId, clientSecondaryKeygenId }) {
344
+ const data = await this.apiClient.reshareRemainingParty({
345
+ clientPrimaryKeygenId,
346
+ clientSecondaryKeygenId
347
+ });
348
+ return data;
349
+ }
350
+ async getKeygenId({ chainName, clientKeyshare }) {
351
+ const mpcSigner = getMPCSigner({
352
+ chainName,
353
+ baseRelayUrl: RELAY_API_URL
354
+ });
355
+ const exportId = await mpcSigner.exportID(clientKeyshare);
356
+ return exportId;
357
+ }
358
+ async reshareRemainingParty({ chainName, clientKeyshare }) {
359
+ const mpcSigner = getMPCSigner({
360
+ chainName,
361
+ baseRelayUrl: RELAY_API_URL
362
+ });
363
+ // Initialize the new party
364
+ const newPartyInitKeygen = await mpcSigner.initKeygen();
365
+ const newPartyInitKeygenId = newPartyInitKeygen.keygenId;
366
+ const clientKeygenId = await this.getKeygenId({
367
+ chainName,
368
+ clientKeyshare
369
+ });
370
+ // Create the room and reshare the server share
371
+ const data = await this.serverReshareRemainingParty({
372
+ clientPrimaryKeygenId: newPartyInitKeygenId,
373
+ clientSecondaryKeygenId: clientKeygenId
374
+ });
375
+ const roomId = data.roomId;
376
+ // Get the MPC config for the threshold signature scheme
377
+ const mpcConfig = MPC_CONFIG[ThresholdSignatureScheme.TWO_OF_THREE];
378
+ const newClientPrimaryKeygenIds = [
379
+ data.serverKeygenId,
380
+ clientKeygenId
381
+ ];
382
+ const clientSecondaryKeygenIds = [
383
+ data.serverKeygenId,
384
+ newPartyInitKeygenId
385
+ ];
386
+ console.log('newClientPrimaryKeygenIds', newClientPrimaryKeygenIds);
387
+ console.log('clientSecondaryKeygenIds', clientSecondaryKeygenIds);
388
+ const keygenResults = await Promise.all([
389
+ mpcSigner.reshareNewParty(roomId, mpcConfig.threshold, mpcConfig.threshold, newPartyInitKeygen, newClientPrimaryKeygenIds),
390
+ mpcSigner.reshareRemainingParty(roomId, mpcConfig.threshold, clientKeyshare, clientSecondaryKeygenIds)
391
+ ]);
392
+ this.clientKeyshare = keygenResults[0];
393
+ return keygenResults;
394
+ }
395
+ async exportPrivateKey({ chainName, clientKeyshare }) {
396
+ const chainConfig = getMPCChainConfig(chainName);
397
+ const mpcSigner = getMPCSigner({
398
+ chainName,
399
+ baseRelayUrl: RELAY_API_URL
400
+ });
401
+ const exportId = await this.getKeygenId({
402
+ chainName,
403
+ clientKeyshare
404
+ });
405
+ const data = await this.apiClient.exportKey({
406
+ exportId
407
+ });
408
+ const keyExportRaw = await mpcSigner.exportFullPrivateKey(data.roomId, clientKeyshare, exportId);
409
+ if (!keyExportRaw) {
410
+ throw new Error('Error exporting private key');
411
+ }
412
+ const derivationPath = new Uint32Array(chainConfig.derivationPath);
413
+ let derivedPrivateKey;
414
+ if (mpcSigner instanceof Ecdsa) {
415
+ derivedPrivateKey = await mpcSigner.derivePrivateKeyFromXpriv(keyExportRaw, derivationPath);
416
+ } else if (mpcSigner instanceof Ed25519) {
417
+ derivedPrivateKey = keyExportRaw;
418
+ } else if (mpcSigner instanceof BIP340) {
419
+ derivedPrivateKey = await mpcSigner.derivePrivateKeyFromXpriv(keyExportRaw, derivationPath);
420
+ }
421
+ return {
422
+ derivedPrivateKey
423
+ };
424
+ }
425
+ async offlineExportPrivateKey({ chainName, keyShares }) {
426
+ const chainConfig = getMPCChainConfig(chainName);
427
+ const mpcSigner = getMPCSigner({
428
+ chainName,
429
+ baseRelayUrl: RELAY_API_URL
430
+ });
431
+ const keyExportRaw = await mpcSigner.offlineExportFullPrivateKey(keyShares);
432
+ if (!keyExportRaw) {
433
+ throw new Error('Error exporting private key');
434
+ }
435
+ const derivationPath = new Uint32Array(chainConfig.derivationPath);
436
+ let derivedPrivateKey;
437
+ if (mpcSigner instanceof Ecdsa) {
438
+ derivedPrivateKey = await mpcSigner.derivePrivateKeyFromXpriv(keyExportRaw, derivationPath);
439
+ } else if (mpcSigner instanceof Ed25519) {
440
+ derivedPrivateKey = keyExportRaw;
441
+ } else if (mpcSigner instanceof BIP340) {
442
+ derivedPrivateKey = await mpcSigner.derivePrivateKeyFromXpriv(keyExportRaw, derivationPath);
443
+ }
444
+ return {
445
+ derivedPrivateKey
446
+ };
447
+ }
448
+ async encryptKeyShare({ keyShare, password }) {
449
+ const serializedKeyShare = JSON.stringify(keyShare);
450
+ const encryptedKeyShare = await encryptData({
451
+ data: serializedKeyShare,
452
+ password: password != null ? password : this.environmentId
453
+ });
454
+ // stringify the encrypted key share, convert to base64, and store it
455
+ const serializedEncryptedKeyShare = Buffer.from(JSON.stringify(encryptedKeyShare)).toString('base64');
456
+ return serializedEncryptedKeyShare;
457
+ }
458
+ async storeEncryptedBackup({ keyShare, password }) {
459
+ const encryptedKeyShare = await this.encryptKeyShare({
460
+ keyShare,
461
+ password
462
+ });
463
+ const data = await this.apiClient.storeEncryptedBackup({
464
+ keyShare: encryptedKeyShare
465
+ });
466
+ return data;
467
+ }
468
+ async decryptKeyShare({ keyShare, password }) {
469
+ const decodedKeyShare = JSON.parse(Buffer.from(keyShare, 'base64').toString());
470
+ const decryptedKeyShare = await decryptData({
471
+ data: decodedKeyShare,
472
+ password: password != null ? password : this.environmentId
473
+ });
474
+ const deserializedKeyShare = JSON.parse(decryptedKeyShare);
475
+ return deserializedKeyShare;
476
+ }
477
+ async recoverEncryptedBackup({ password } = {}) {
478
+ const data = await this.apiClient.recoverEncryptedBackup();
479
+ const decryptedKeyShare = await this.decryptKeyShare({
480
+ keyShare: data.keyShare,
481
+ password: password != null ? password : this.environmentId
482
+ });
483
+ this.restoreBackupShare({
484
+ keyShare: decryptedKeyShare
485
+ });
486
+ return decryptedKeyShare;
487
+ }
488
+ restoreBackupShare({ keyShare }) {
489
+ this.clientKeyshare = keyShare;
490
+ }
491
+ async getClientShare() {
492
+ return this.clientKeyshare;
493
+ }
494
+ async backupFileToGoogleDrive({ oauthAccountId, fileName = BACKUP_FILENAME, jsonData, password }) {
495
+ const encryptedKeyShare = await this.encryptKeyShare({
496
+ keyShare: jsonData,
497
+ password
498
+ });
499
+ const accessToken = await this.apiClient.getAccessToken({
500
+ oauthAccountId
501
+ });
502
+ const uploadMetadata = await uploadFileToGoogleDrive({
503
+ accessToken,
504
+ fileName,
505
+ jsonData: encryptedKeyShare
506
+ });
507
+ return uploadMetadata;
508
+ }
509
+ async getBackupFileFromGoogleDrive({ oauthAccountId, name = BACKUP_FILENAME, password }) {
510
+ const accessToken = await this.apiClient.getAccessToken({
511
+ oauthAccountId
512
+ });
513
+ const file = await downloadFileFromGoogleDrive({
514
+ accessToken,
515
+ name
516
+ });
517
+ if (!file) {
518
+ return null;
519
+ }
520
+ const decryptedKeyShare = await this.decryptKeyShare({
521
+ keyShare: file,
522
+ password: password != null ? password : this.environmentId
523
+ });
524
+ return decryptedKeyShare;
525
+ }
526
+ constructor({ environmentId, authToken, baseApiUrl, clientKeyshare }){
527
+ this.environmentId = environmentId;
528
+ this.clientKeyshare = clientKeyshare;
529
+ this.apiClient = new DynamicApiClient({
530
+ environmentId,
531
+ authToken,
532
+ baseApiUrl
533
+ });
534
+ }
535
+ }
536
+
537
+ export { DynamicWalletClient, getMPCSignatureScheme, getMPCSigner };
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@dynamic-labs-wallet/browser",
3
+ "version": "0.0.1",
4
+ "dependencies": {
5
+ "@dynamic-labs-wallet/core": "0.0.1",
6
+ "@dynamic-labs-wallet/lib-mpc-web": "0.0.1"
7
+ },
8
+ "publishConfig": {
9
+ "access": "restricted"
10
+ },
11
+ "nx": {
12
+ "sourceRoot": "packages/browser/src",
13
+ "projectType": "library",
14
+ "name": "browser"
15
+ },
16
+ "main": "./index.esm.js",
17
+ "module": "./index.esm.js",
18
+ "types": "./index.esm.d.ts",
19
+ "exports": {
20
+ "./package.json": "./package.json",
21
+ ".": {
22
+ "types": "./index.esm.d.ts",
23
+ "import": "./index.esm.js",
24
+ "default": "./index.esm.js"
25
+ }
26
+ },
27
+ "type": "module"
28
+ }
@@ -0,0 +1,17 @@
1
+ export declare const encryptData: ({ data, password, }: {
2
+ data: string;
3
+ password: string;
4
+ }) => Promise<{
5
+ salt: string;
6
+ iv: string;
7
+ cipher: string;
8
+ }>;
9
+ export declare const decryptData: ({ data, password, }: {
10
+ data: {
11
+ salt: string;
12
+ iv: string;
13
+ cipher: string;
14
+ };
15
+ password: string;
16
+ }) => Promise<string>;
17
+ //# sourceMappingURL=encryption.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,14 @@
1
+ export declare const uploadFileToGoogleDrive: ({ accessToken, fileName, jsonData, }: {
2
+ accessToken: string;
3
+ fileName: string;
4
+ jsonData: string;
5
+ }) => Promise<any>;
6
+ export declare const listFilesFromGoogleDrive: ({ accessToken, name, }: {
7
+ accessToken: string;
8
+ name: string;
9
+ }) => Promise<any>;
10
+ export declare const downloadFileFromGoogleDrive: ({ accessToken, name, }: {
11
+ accessToken: string;
12
+ name: string;
13
+ }) => Promise<string | null>;
14
+ //# sourceMappingURL=googleDrive.d.ts.map
@@ -0,0 +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,CAAC;CAClB,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,GAAG,IAAI,CAsBxB,CAAC"}
@@ -0,0 +1,118 @@
1
+ import { EcdsaPublicKey, EcdsaKeygenResult, Ed25519KeygenResult, BIP340KeygenResult, EcdsaSignature } from '@dynamic-labs-wallet/lib-mpc-web';
2
+ import { ClientInitKeygenResult, ClientKeyshare } from './mpc/types';
3
+ export declare class DynamicWalletClient {
4
+ environmentId: string;
5
+ private apiClient;
6
+ private clientKeyshare?;
7
+ constructor({ environmentId, authToken, baseApiUrl, clientKeyshare, }: {
8
+ environmentId: string;
9
+ authToken: string;
10
+ baseApiUrl?: string;
11
+ clientKeyshare?: ClientKeyshare;
12
+ });
13
+ serverInitializeKeyGen({ chainName, clientPrimaryKeygenId, clientSecondaryKeygenId, }: {
14
+ chainName: string;
15
+ clientPrimaryKeygenId: string;
16
+ clientSecondaryKeygenId: string;
17
+ }): Promise<any>;
18
+ clientInitializeKeyGen({ chainName }: {
19
+ chainName: string;
20
+ }): Promise<{
21
+ clientPrimaryKeygenInitResult: import("@dynamic-labs-wallet/lib-mpc-web").BIP340InitKeygenResult;
22
+ clientSecondaryKeygenInitResult: import("@dynamic-labs-wallet/lib-mpc-web").BIP340InitKeygenResult;
23
+ }>;
24
+ derivePublicKey({ chainName, keyShare, }: {
25
+ chainName: string;
26
+ keyShare?: ClientKeyshare;
27
+ }): Promise<Uint8Array | EcdsaPublicKey | undefined>;
28
+ clientKeyGen({ chainName, roomId, serverKeygenId, clientPrimaryKeygenInitResult, clientSecondaryKeygenInitResult, }: {
29
+ chainName: string;
30
+ roomId: string;
31
+ serverKeygenId: string;
32
+ clientPrimaryKeygenInitResult: ClientInitKeygenResult;
33
+ clientSecondaryKeygenInitResult: ClientInitKeygenResult;
34
+ }): Promise<{
35
+ rawPublicKey: Uint8Array | EcdsaPublicKey | undefined;
36
+ primaryKeygenResult: EcdsaKeygenResult | BIP340KeygenResult;
37
+ secondaryKeygenResult: EcdsaKeygenResult | BIP340KeygenResult;
38
+ }>;
39
+ keyGen({ chainName }: {
40
+ chainName: string;
41
+ }): Promise<{
42
+ rawPublicKey: Uint8Array | EcdsaPublicKey | undefined;
43
+ primaryKeygenResult: EcdsaKeygenResult | BIP340KeygenResult;
44
+ secondaryKeygenResult: EcdsaKeygenResult | BIP340KeygenResult;
45
+ }>;
46
+ serverSign({ messageToSign }: {
47
+ messageToSign: string;
48
+ }): Promise<any>;
49
+ clientSign({ chainName, messageToSign, roomId, }: {
50
+ chainName: string;
51
+ messageToSign: string;
52
+ roomId: string;
53
+ }): Promise<Uint8Array | EcdsaSignature>;
54
+ sign({ chainName, messageToSign, }: {
55
+ chainName: string;
56
+ messageToSign: string;
57
+ }): Promise<Uint8Array | EcdsaSignature>;
58
+ refreshWalletAccountShares({ chainName, clientPrimaryKeyshare, clientSecondaryKeyshare, }: {
59
+ chainName: string;
60
+ clientPrimaryKeyshare: EcdsaKeygenResult | Ed25519KeygenResult | BIP340KeygenResult;
61
+ clientSecondaryKeyshare: EcdsaKeygenResult | Ed25519KeygenResult | BIP340KeygenResult;
62
+ }): Promise<[EcdsaKeygenResult | BIP340KeygenResult, EcdsaKeygenResult | BIP340KeygenResult]>;
63
+ serverReshareRemainingParty({ clientPrimaryKeygenId, clientSecondaryKeygenId, }: {
64
+ clientPrimaryKeygenId: string;
65
+ clientSecondaryKeygenId: string;
66
+ }): Promise<any>;
67
+ getKeygenId({ chainName, clientKeyshare, }: {
68
+ chainName: string;
69
+ clientKeyshare: EcdsaKeygenResult | Ed25519KeygenResult | BIP340KeygenResult;
70
+ }): Promise<string>;
71
+ reshareRemainingParty({ chainName, clientKeyshare, }: {
72
+ chainName: string;
73
+ clientKeyshare: EcdsaKeygenResult | Ed25519KeygenResult | BIP340KeygenResult;
74
+ }): Promise<[EcdsaKeygenResult | BIP340KeygenResult, EcdsaKeygenResult | BIP340KeygenResult]>;
75
+ exportPrivateKey({ chainName, clientKeyshare, }: {
76
+ chainName: string;
77
+ clientKeyshare: EcdsaKeygenResult | Ed25519KeygenResult | BIP340KeygenResult;
78
+ }): Promise<{
79
+ derivedPrivateKey: string | undefined;
80
+ }>;
81
+ offlineExportPrivateKey({ chainName, keyShares, }: {
82
+ chainName: string;
83
+ keyShares: (EcdsaKeygenResult | Ed25519KeygenResult | BIP340KeygenResult)[];
84
+ }): Promise<{
85
+ derivedPrivateKey: string | undefined;
86
+ }>;
87
+ encryptKeyShare({ keyShare, password, }: {
88
+ keyShare: ClientKeyshare;
89
+ password?: string;
90
+ }): Promise<string>;
91
+ storeEncryptedBackup({ keyShare, password, }: {
92
+ keyShare: ClientKeyshare;
93
+ password?: string;
94
+ }): Promise<any>;
95
+ decryptKeyShare({ keyShare, password, }: {
96
+ keyShare: string;
97
+ password?: string;
98
+ }): Promise<any>;
99
+ recoverEncryptedBackup({ password }?: {
100
+ password?: string;
101
+ }): Promise<any>;
102
+ restoreBackupShare({ keyShare }: {
103
+ keyShare: ClientKeyshare;
104
+ }): void;
105
+ getClientShare(): Promise<ClientKeyshare | undefined>;
106
+ backupFileToGoogleDrive({ oauthAccountId, fileName, jsonData, password, }: {
107
+ oauthAccountId: string;
108
+ fileName?: string;
109
+ jsonData: EcdsaKeygenResult;
110
+ password?: string;
111
+ }): Promise<any>;
112
+ getBackupFileFromGoogleDrive({ oauthAccountId, name, password, }: {
113
+ oauthAccountId: string;
114
+ name?: string;
115
+ password?: string;
116
+ }): Promise<ClientKeyshare | null>;
117
+ }
118
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const BACKUP_FILENAME = "dynamicWalletSecretBackup.json";
2
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,mCAAmC,CAAC"}
package/src/index.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export * from '@dynamic-labs-wallet/core';
2
+ export * from './mpc/index';
3
+ export * from './client';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAE1C,cAAc,aAAa,CAAC;AAE5B,cAAc,UAAU,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Ecdsa, Ed25519, BIP340, BIP340KeygenResult, EcdsaPublicKey, Ed25519KeygenResult, EcdsaKeygenResult, MessageHash, EcdsaInitKeygenResult, Ed25519InitKeygenResult, BIP340InitKeygenResult, EcdsaSignature } from '@dynamic-labs-wallet/lib-mpc-web';
2
+ export { Ecdsa, Ed25519, BIP340, EcdsaPublicKey, EcdsaKeygenResult, Ed25519KeygenResult, BIP340KeygenResult, MessageHash, EcdsaInitKeygenResult, Ed25519InitKeygenResult, BIP340InitKeygenResult, EcdsaSignature, };
3
+ export * from './mpc';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mpc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,OAAO,EACP,MAAM,EACN,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,cAAc,EACf,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,KAAK,EACL,OAAO,EACP,MAAM,EACN,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,cAAc,GACf,CAAC;AAEF,cAAc,OAAO,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { SigningAlgorithm } from '@dynamic-labs-wallet/core';
2
+ import { Ecdsa, Ed25519, BIP340 } from '@dynamic-labs-wallet/lib-mpc-web';
3
+ export declare const getMPCSignatureScheme: ({ signingAlgorithm, baseRelayUrl, }: {
4
+ signingAlgorithm: SigningAlgorithm;
5
+ baseRelayUrl?: string;
6
+ }) => Ecdsa | Ed25519 | BIP340;
7
+ export declare const getMPCSigner: ({ chainName, baseRelayUrl, }: {
8
+ chainName: string;
9
+ baseRelayUrl?: string;
10
+ }) => Ecdsa | Ed25519 | BIP340;
11
+ //# sourceMappingURL=mpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mpc.d.ts","sourceRoot":"","sources":["../../../src/mpc/mpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,EAEjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAE1E,eAAO,MAAM,qBAAqB,wCAG/B;IACD,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,6BAWA,CAAC;AAEF,eAAO,MAAM,YAAY,iCAGtB;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,6BAOA,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { BIP340InitKeygenResult, BIP340KeygenResult, Ed25519InitKeygenResult, EcdsaInitKeygenResult, EcdsaKeygenResult, Ed25519KeygenResult } from '@dynamic-labs-wallet/lib-mpc-web';
2
+ export type ClientInitKeygenResult = EcdsaInitKeygenResult | Ed25519InitKeygenResult | BIP340InitKeygenResult;
3
+ export type ClientKeyshare = EcdsaKeygenResult | Ed25519KeygenResult | BIP340KeygenResult;
4
+ export type { Ecdsa, Ed25519, BIP340, EcdsaPublicKey, EcdsaKeygenResult, Ed25519KeygenResult, BIP340KeygenResult, MessageHash, EcdsaSignature, } from '@dynamic-labs-wallet/lib-mpc-web';
5
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/mpc/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,MAAM,sBAAsB,GAC9B,qBAAqB,GACrB,uBAAuB,GACvB,sBAAsB,CAAC;AAE3B,MAAM,MAAM,cAAc,GACtB,iBAAiB,GACjB,mBAAmB,GACnB,kBAAkB,CAAC;AAGrB,YAAY,EACV,KAAK,EACL,OAAO,EACP,MAAM,EACN,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,cAAc,GACf,MAAM,kCAAkC,CAAC"}
package/src/utils.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export declare const bytesToBase64: (arr: Uint8Array) => string;
2
+ export declare const stringToBytes: (str: string) => Uint8Array;
3
+ export declare const base64ToBytes: (base64: string) => Uint8Array;
4
+ export declare const ensureBase64Padding: (str: string) => string;
5
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,QAAS,UAAU,WAE5C,CAAC;AAEF,eAAO,MAAM,aAAa,QAAS,MAAM,eAExC,CAAC;AAEF,eAAO,MAAM,aAAa,WAAY,MAAM,eAE3C,CAAC;AAGF,eAAO,MAAM,mBAAmB,QAAS,MAAM,KAAG,MAEjD,CAAC"}