@dynamic-labs-wallet/browser 0.0.10 → 0.0.12

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
@@ -182,34 +182,24 @@ const downloadFileFromGoogleDrive = async ({ accessToken, name })=>{
182
182
  const BACKUP_FILENAME = 'dynamicWalletSecretBackup.json';
183
183
 
184
184
  class DynamicWalletClient {
185
- async serverInitializeKeyGen({ chainName, clientPrimaryKeygenId, clientSecondaryKeygenId, thresholdSignatureScheme }) {
185
+ async serverInitializeKeyGen({ chainName, clientKeygenIds, thresholdSignatureScheme }) {
186
186
  // Initilize keygen, create room, and create the wallet account on the server
187
187
  const data = await this.apiClient.createWalletAccount({
188
188
  chainName,
189
- clientKeygenIds: [
190
- clientPrimaryKeygenId,
191
- clientSecondaryKeygenId
192
- ],
189
+ clientKeygenIds,
193
190
  thresholdSignatureScheme
194
191
  });
195
192
  return data;
196
193
  }
197
- async clientInitializeKeyGen({ chainName }) {
194
+ async clientInitializeKeyGen({ chainName, thresholdSignatureScheme }) {
198
195
  // Get the mpc signer
199
196
  const mpcSigner = getMPCSigner({
200
197
  chainName,
201
198
  baseRelayUrl: this.baseMPCRelayApiUrl
202
199
  });
203
- // Initialize the keygen for the primary client and the secondary client shares
204
- const keygenInitResults = await Promise.all([
205
- mpcSigner.initKeygen(),
206
- mpcSigner.initKeygen()
207
- ]);
208
- const [clientPrimaryKeygenInitResult, clientSecondaryKeygenInitResult] = keygenInitResults;
209
- return {
210
- clientPrimaryKeygenInitResult,
211
- clientSecondaryKeygenInitResult
212
- };
200
+ const clientThreshold = core.getClientThreshold(thresholdSignatureScheme);
201
+ const keygenInitResults = await Promise.all(Array(clientThreshold).fill(null).map(()=>mpcSigner.initKeygen()));
202
+ return keygenInitResults;
213
203
  }
214
204
  async derivePublicKey({ chainName, keyShare }) {
215
205
  const mpcSigner = getMPCSigner({
@@ -225,72 +215,58 @@ class DynamicWalletClient {
225
215
  }
226
216
  return publicKey;
227
217
  }
228
- async clientKeyGen({ chainName, roomId, serverKeygenIds, clientPrimaryKeygenInitResult, clientSecondaryKeygenInitResult, thresholdSignatureScheme }) {
218
+ async clientKeyGen({ chainName, roomId, serverKeygenIds, clientKeygenInitResults, thresholdSignatureScheme }) {
229
219
  // Get the chain config and the mpc signer
230
- const chainConfig = core.getMPCChainConfig(chainName);
231
220
  const mpcSigner = getMPCSigner({
232
221
  chainName,
233
222
  baseRelayUrl: this.baseMPCRelayApiUrl
234
223
  });
235
- // All parties receive the keygenIds from all OTHER parties
236
- const clientPrimaryKeygenId = clientPrimaryKeygenInitResult.keygenId;
237
- const clientSecondaryKeygenId = clientSecondaryKeygenInitResult.keygenId;
238
- const clientPrimaryKeygenIds = [
239
- ...serverKeygenIds,
240
- clientSecondaryKeygenId
241
- ];
242
- const clientSecondaryKeygenIds = [
243
- ...serverKeygenIds,
244
- clientPrimaryKeygenId
245
- ];
246
224
  // Get the MPC config for the threshold signature scheme
247
225
  const mpcConfig = core.MPC_CONFIG[thresholdSignatureScheme];
248
- // All parties join the keygen room
249
- const keygenResults = await Promise.all([
250
- mpcSigner.keygen(roomId, mpcConfig.numberOfParties, mpcConfig.threshold, clientPrimaryKeygenInitResult, clientPrimaryKeygenIds),
251
- mpcSigner.keygen(roomId, mpcConfig.numberOfParties, mpcConfig.threshold, clientSecondaryKeygenInitResult, clientSecondaryKeygenIds)
252
- ]);
253
- const [clientPrimaryKeygenResult, clientSecondaryKeygenResult] = keygenResults;
254
- // Pick the derivation path of the public key you want to sign for
255
- const derivationPath = new Uint32Array(chainConfig.derivationPath);
256
- // Get the public key for the derivation path
257
- let rawPublicKey;
258
- if (mpcSigner instanceof libMpcWeb.Ecdsa) {
259
- rawPublicKey = await mpcSigner.derivePubkey(clientPrimaryKeygenResult, derivationPath);
260
- } else if (mpcSigner instanceof libMpcWeb.Ed25519) {
261
- rawPublicKey = await mpcSigner.derivePubkey(clientPrimaryKeygenResult, derivationPath);
262
- } else if (mpcSigner instanceof libMpcWeb.BIP340) {
263
- rawPublicKey = await mpcSigner.deriveTweakPubkey(clientPrimaryKeygenResult, derivationPath);
264
- }
226
+ // For each client keygen init result, create an array of other parties' keygenIds
227
+ const clientKeygenResults = await Promise.all(clientKeygenInitResults.map((currentInit)=>{
228
+ // Get all other client keygenIds (excluding current one)
229
+ const otherClientKeygenIds = clientKeygenInitResults.filter((init)=>init.keygenId !== currentInit.keygenId).map((init)=>init.keygenId);
230
+ // Combine server keygenIds with other client keygenIds
231
+ const allOtherKeygenIds = [
232
+ ...serverKeygenIds,
233
+ ...otherClientKeygenIds
234
+ ];
235
+ return mpcSigner.keygen(roomId, mpcConfig.numberOfParties, mpcConfig.threshold, currentInit, allOtherKeygenIds);
236
+ }));
237
+ // only need one client keygen result to derive the public key
238
+ const [clientKeygenResult] = clientKeygenResults;
239
+ const rawPublicKey = await this.derivePublicKey({
240
+ chainName,
241
+ keyShare: clientKeygenResult
242
+ });
265
243
  return {
266
244
  rawPublicKey,
267
- primaryKeygenResult: clientPrimaryKeygenResult,
268
- secondaryKeygenResult: clientSecondaryKeygenResult
245
+ clientKeygenResults
269
246
  };
270
247
  }
271
248
  async keyGen({ chainName, thresholdSignatureScheme }) {
272
249
  try {
273
- const { clientPrimaryKeygenInitResult, clientSecondaryKeygenInitResult } = await this.clientInitializeKeyGen({
274
- chainName
250
+ const clientKeygenInitResults = await this.clientInitializeKeyGen({
251
+ chainName,
252
+ thresholdSignatureScheme
275
253
  });
276
- const data = await this.serverInitializeKeyGen({
254
+ const clientKeygenIds = clientKeygenInitResults.map((result)=>result.keygenId);
255
+ const { roomId, serverKeygenIds } = await this.serverInitializeKeyGen({
277
256
  chainName,
278
- clientPrimaryKeygenId: clientPrimaryKeygenInitResult.keygenId,
279
- clientSecondaryKeygenId: clientSecondaryKeygenInitResult.keygenId,
257
+ clientKeygenIds,
280
258
  thresholdSignatureScheme
281
259
  });
282
- const { rawPublicKey, primaryKeygenResult, secondaryKeygenResult } = await this.clientKeyGen({
260
+ const { rawPublicKey, clientKeygenResults: clientKeyShares } = await this.clientKeyGen({
283
261
  chainName,
284
- roomId: data.roomId,
285
- serverKeygenIds: data.serverKeygenIds,
286
- clientPrimaryKeygenInitResult,
287
- clientSecondaryKeygenInitResult,
262
+ roomId,
263
+ serverKeygenIds,
264
+ clientKeygenInitResults,
288
265
  thresholdSignatureScheme
289
266
  });
290
267
  return {
291
268
  rawPublicKey,
292
- primaryKeygenResult,
293
- secondaryKeygenResult
269
+ clientKeyShares
294
270
  };
295
271
  } catch (error) {
296
272
  console.error('Error creating wallet account', error);
@@ -299,6 +275,9 @@ class DynamicWalletClient {
299
275
  }
300
276
  async serverSign({ walletId, message }) {
301
277
  // Create the room and sign the message
278
+ if (typeof message !== 'string') {
279
+ message = '0x' + Buffer.from(message).toString('hex');
280
+ }
302
281
  const data = await this.apiClient.signMessage({
303
282
  walletId,
304
283
  message
@@ -314,11 +293,12 @@ class DynamicWalletClient {
314
293
  });
315
294
  const derivationPath = new Uint32Array(chainConfig.derivationPath);
316
295
  let formattedMessage;
296
+ //note: Ecdsa can also be used by bitcoin, but only keccak256 is used by ethereum
317
297
  if (mpcSigner instanceof libMpcWeb.Ecdsa) {
318
- formattedMessage = libMpcWeb.MessageHash.sha256(message);
319
- } else if (mpcSigner instanceof libMpcWeb.Ed25519) {
298
+ formattedMessage = libMpcWeb.MessageHash.keccak256(message);
299
+ } else if (mpcSigner instanceof libMpcWeb.Ed25519 && typeof message === 'string') {
320
300
  formattedMessage = new TextEncoder().encode(message);
321
- } else if (mpcSigner instanceof libMpcWeb.BIP340) {
301
+ } else if (mpcSigner instanceof libMpcWeb.BIP340 && typeof message === 'string') {
322
302
  formattedMessage = new TextEncoder().encode(message);
323
303
  } else {
324
304
  throw new Error('Unsupported signer type');
@@ -594,59 +574,43 @@ class DynamicWalletClient {
594
574
  return decryptedKeyShare;
595
575
  }
596
576
  async importRawPrivateKey({ chainName, privateKey, thresholdSignatureScheme }) {
597
- const chainConfig = core.getMPCChainConfig(chainName);
598
577
  const mpcSigner = getMPCSigner({
599
578
  chainName,
600
579
  baseRelayUrl: this.baseMPCRelayApiUrl
601
580
  });
602
- // 1. 2 parties on the client side create keygenInit
603
- const { clientPrimaryKeygenInitResult, clientSecondaryKeygenInitResult } = await this.clientInitializeKeyGen({
604
- chainName
605
- });
606
- const clientSecondaryKeygenId = clientSecondaryKeygenInitResult.keygenId;
607
- const clientPrimaryKeygenId = clientPrimaryKeygenInitResult.keygenId;
608
- // 2. server to create a room for importing the private key
609
- // server will do 3 things:
610
- // --- 1. init keygen for the server as a party
611
- // --- 2. open a room and return the roomId for the ceremony
612
- // --- 3. join the room as a party for the 2/3 ceremony
581
+ const clientKeygenInitResults = await this.clientInitializeKeyGen({
582
+ chainName,
583
+ thresholdSignatureScheme
584
+ });
585
+ const clientKeygenIds = clientKeygenInitResults.map((result)=>result.keygenId);
613
586
  const { roomId, serverKeygenIds } = await this.apiClient.importPrivateKey({
614
587
  chainName,
615
- clientKeygenIds: [
616
- clientPrimaryKeygenId,
617
- clientSecondaryKeygenId
618
- ],
588
+ clientKeygenIds,
619
589
  thresholdSignatureScheme
620
590
  });
621
591
  const { threshold } = core.getTSSConfig(thresholdSignatureScheme);
622
- // prep
623
- const importerKeygenIds = [
624
- ...serverKeygenIds,
625
- clientSecondaryKeygenId
626
- ];
627
- const recipientKeygenIds = [
628
- ...serverKeygenIds,
629
- clientPrimaryKeygenId
630
- ];
631
- // 3. Join the keygen room for the ceremony
632
- const [clientPrimaryKeygenResult, clientSecondaryKeygenResult] = await Promise.all([
633
- mpcSigner.importPrivateKeyImporter(roomId, threshold, privateKey, clientPrimaryKeygenInitResult, importerKeygenIds),
634
- mpcSigner.importPrivateKeyRecipient(roomId, threshold, clientSecondaryKeygenInitResult, recipientKeygenIds)
635
- ]);
636
- const derivationPath = new Uint32Array(chainConfig.derivationPath);
637
- // Get the public key for the derivation path
638
- let rawPublicKey;
639
- if (mpcSigner instanceof libMpcWeb.Ecdsa) {
640
- rawPublicKey = await mpcSigner.derivePubkey(clientPrimaryKeygenResult, derivationPath);
641
- } else if (mpcSigner instanceof libMpcWeb.Ed25519) {
642
- rawPublicKey = await mpcSigner.derivePubkey(clientPrimaryKeygenResult, derivationPath);
643
- } else if (mpcSigner instanceof libMpcWeb.BIP340) {
644
- rawPublicKey = await mpcSigner.deriveTweakPubkey(clientPrimaryKeygenResult, derivationPath);
645
- }
592
+ const clientKeygenResults = await Promise.all(clientKeygenInitResults.map((currentInit, index)=>{
593
+ const otherClientKeygenIds = clientKeygenInitResults.filter((init)=>init.keygenId !== currentInit.keygenId).map((init)=>init.keygenId);
594
+ if (index === 0) {
595
+ return mpcSigner.importPrivateKeyImporter(roomId, threshold, privateKey, currentInit, [
596
+ ...serverKeygenIds,
597
+ ...otherClientKeygenIds
598
+ ]);
599
+ } else {
600
+ return mpcSigner.importPrivateKeyRecipient(roomId, threshold, currentInit, [
601
+ ...serverKeygenIds,
602
+ ...otherClientKeygenIds
603
+ ]);
604
+ }
605
+ }));
606
+ const [clientKeygenResult] = clientKeygenResults;
607
+ const rawPublicKey = await this.derivePublicKey({
608
+ chainName,
609
+ keyShare: clientKeygenResult
610
+ });
646
611
  return {
647
612
  rawPublicKey,
648
- primaryKeygenResult: clientPrimaryKeygenResult,
649
- secondaryKeygenResult: clientSecondaryKeygenResult
613
+ clientKeyShares: clientKeygenResults
650
614
  };
651
615
  }
652
616
  async exportClientKeyshares({ accountAddress }) {
package/index.esm.js CHANGED
@@ -1,4 +1,4 @@
1
- import { SigningAlgorithm, MPC_RELAY_PROD_API_URL, getMPCChainConfig, MPC_CONFIG, getTSSConfig, DynamicApiClient } from '@dynamic-labs-wallet/core';
1
+ import { SigningAlgorithm, MPC_RELAY_PROD_API_URL, getMPCChainConfig, getClientThreshold, MPC_CONFIG, getTSSConfig, DynamicApiClient } from '@dynamic-labs-wallet/core';
2
2
  export * from '@dynamic-labs-wallet/core';
3
3
  import { BIP340, Ed25519, Ecdsa, MessageHash, EcdsaKeygenResult, Ed25519KeygenResult, BIP340KeygenResult } from '@dynamic-labs-wallet/lib-mpc-web';
4
4
  export { BIP340, BIP340InitKeygenResult, BIP340KeygenResult, Ecdsa, EcdsaInitKeygenResult, EcdsaKeygenResult, EcdsaPublicKey, EcdsaSignature, Ed25519, Ed25519InitKeygenResult, Ed25519KeygenResult, MessageHash } from '@dynamic-labs-wallet/lib-mpc-web';
@@ -182,34 +182,24 @@ const downloadFileFromGoogleDrive = async ({ accessToken, name })=>{
182
182
  const BACKUP_FILENAME = 'dynamicWalletSecretBackup.json';
183
183
 
184
184
  class DynamicWalletClient {
185
- async serverInitializeKeyGen({ chainName, clientPrimaryKeygenId, clientSecondaryKeygenId, thresholdSignatureScheme }) {
185
+ async serverInitializeKeyGen({ chainName, clientKeygenIds, thresholdSignatureScheme }) {
186
186
  // Initilize keygen, create room, and create the wallet account on the server
187
187
  const data = await this.apiClient.createWalletAccount({
188
188
  chainName,
189
- clientKeygenIds: [
190
- clientPrimaryKeygenId,
191
- clientSecondaryKeygenId
192
- ],
189
+ clientKeygenIds,
193
190
  thresholdSignatureScheme
194
191
  });
195
192
  return data;
196
193
  }
197
- async clientInitializeKeyGen({ chainName }) {
194
+ async clientInitializeKeyGen({ chainName, thresholdSignatureScheme }) {
198
195
  // Get the mpc signer
199
196
  const mpcSigner = getMPCSigner({
200
197
  chainName,
201
198
  baseRelayUrl: this.baseMPCRelayApiUrl
202
199
  });
203
- // Initialize the keygen for the primary client and the secondary client shares
204
- const keygenInitResults = await Promise.all([
205
- mpcSigner.initKeygen(),
206
- mpcSigner.initKeygen()
207
- ]);
208
- const [clientPrimaryKeygenInitResult, clientSecondaryKeygenInitResult] = keygenInitResults;
209
- return {
210
- clientPrimaryKeygenInitResult,
211
- clientSecondaryKeygenInitResult
212
- };
200
+ const clientThreshold = getClientThreshold(thresholdSignatureScheme);
201
+ const keygenInitResults = await Promise.all(Array(clientThreshold).fill(null).map(()=>mpcSigner.initKeygen()));
202
+ return keygenInitResults;
213
203
  }
214
204
  async derivePublicKey({ chainName, keyShare }) {
215
205
  const mpcSigner = getMPCSigner({
@@ -225,72 +215,58 @@ class DynamicWalletClient {
225
215
  }
226
216
  return publicKey;
227
217
  }
228
- async clientKeyGen({ chainName, roomId, serverKeygenIds, clientPrimaryKeygenInitResult, clientSecondaryKeygenInitResult, thresholdSignatureScheme }) {
218
+ async clientKeyGen({ chainName, roomId, serverKeygenIds, clientKeygenInitResults, thresholdSignatureScheme }) {
229
219
  // Get the chain config and the mpc signer
230
- const chainConfig = getMPCChainConfig(chainName);
231
220
  const mpcSigner = getMPCSigner({
232
221
  chainName,
233
222
  baseRelayUrl: this.baseMPCRelayApiUrl
234
223
  });
235
- // All parties receive the keygenIds from all OTHER parties
236
- const clientPrimaryKeygenId = clientPrimaryKeygenInitResult.keygenId;
237
- const clientSecondaryKeygenId = clientSecondaryKeygenInitResult.keygenId;
238
- const clientPrimaryKeygenIds = [
239
- ...serverKeygenIds,
240
- clientSecondaryKeygenId
241
- ];
242
- const clientSecondaryKeygenIds = [
243
- ...serverKeygenIds,
244
- clientPrimaryKeygenId
245
- ];
246
224
  // Get the MPC config for the threshold signature scheme
247
225
  const mpcConfig = MPC_CONFIG[thresholdSignatureScheme];
248
- // All parties join the keygen room
249
- const keygenResults = await Promise.all([
250
- mpcSigner.keygen(roomId, mpcConfig.numberOfParties, mpcConfig.threshold, clientPrimaryKeygenInitResult, clientPrimaryKeygenIds),
251
- mpcSigner.keygen(roomId, mpcConfig.numberOfParties, mpcConfig.threshold, clientSecondaryKeygenInitResult, clientSecondaryKeygenIds)
252
- ]);
253
- const [clientPrimaryKeygenResult, clientSecondaryKeygenResult] = keygenResults;
254
- // Pick the derivation path of the public key you want to sign for
255
- const derivationPath = new Uint32Array(chainConfig.derivationPath);
256
- // Get the public key for the derivation path
257
- let rawPublicKey;
258
- if (mpcSigner instanceof Ecdsa) {
259
- rawPublicKey = await mpcSigner.derivePubkey(clientPrimaryKeygenResult, derivationPath);
260
- } else if (mpcSigner instanceof Ed25519) {
261
- rawPublicKey = await mpcSigner.derivePubkey(clientPrimaryKeygenResult, derivationPath);
262
- } else if (mpcSigner instanceof BIP340) {
263
- rawPublicKey = await mpcSigner.deriveTweakPubkey(clientPrimaryKeygenResult, derivationPath);
264
- }
226
+ // For each client keygen init result, create an array of other parties' keygenIds
227
+ const clientKeygenResults = await Promise.all(clientKeygenInitResults.map((currentInit)=>{
228
+ // Get all other client keygenIds (excluding current one)
229
+ const otherClientKeygenIds = clientKeygenInitResults.filter((init)=>init.keygenId !== currentInit.keygenId).map((init)=>init.keygenId);
230
+ // Combine server keygenIds with other client keygenIds
231
+ const allOtherKeygenIds = [
232
+ ...serverKeygenIds,
233
+ ...otherClientKeygenIds
234
+ ];
235
+ return mpcSigner.keygen(roomId, mpcConfig.numberOfParties, mpcConfig.threshold, currentInit, allOtherKeygenIds);
236
+ }));
237
+ // only need one client keygen result to derive the public key
238
+ const [clientKeygenResult] = clientKeygenResults;
239
+ const rawPublicKey = await this.derivePublicKey({
240
+ chainName,
241
+ keyShare: clientKeygenResult
242
+ });
265
243
  return {
266
244
  rawPublicKey,
267
- primaryKeygenResult: clientPrimaryKeygenResult,
268
- secondaryKeygenResult: clientSecondaryKeygenResult
245
+ clientKeygenResults
269
246
  };
270
247
  }
271
248
  async keyGen({ chainName, thresholdSignatureScheme }) {
272
249
  try {
273
- const { clientPrimaryKeygenInitResult, clientSecondaryKeygenInitResult } = await this.clientInitializeKeyGen({
274
- chainName
250
+ const clientKeygenInitResults = await this.clientInitializeKeyGen({
251
+ chainName,
252
+ thresholdSignatureScheme
275
253
  });
276
- const data = await this.serverInitializeKeyGen({
254
+ const clientKeygenIds = clientKeygenInitResults.map((result)=>result.keygenId);
255
+ const { roomId, serverKeygenIds } = await this.serverInitializeKeyGen({
277
256
  chainName,
278
- clientPrimaryKeygenId: clientPrimaryKeygenInitResult.keygenId,
279
- clientSecondaryKeygenId: clientSecondaryKeygenInitResult.keygenId,
257
+ clientKeygenIds,
280
258
  thresholdSignatureScheme
281
259
  });
282
- const { rawPublicKey, primaryKeygenResult, secondaryKeygenResult } = await this.clientKeyGen({
260
+ const { rawPublicKey, clientKeygenResults: clientKeyShares } = await this.clientKeyGen({
283
261
  chainName,
284
- roomId: data.roomId,
285
- serverKeygenIds: data.serverKeygenIds,
286
- clientPrimaryKeygenInitResult,
287
- clientSecondaryKeygenInitResult,
262
+ roomId,
263
+ serverKeygenIds,
264
+ clientKeygenInitResults,
288
265
  thresholdSignatureScheme
289
266
  });
290
267
  return {
291
268
  rawPublicKey,
292
- primaryKeygenResult,
293
- secondaryKeygenResult
269
+ clientKeyShares
294
270
  };
295
271
  } catch (error) {
296
272
  console.error('Error creating wallet account', error);
@@ -299,6 +275,9 @@ class DynamicWalletClient {
299
275
  }
300
276
  async serverSign({ walletId, message }) {
301
277
  // Create the room and sign the message
278
+ if (typeof message !== 'string') {
279
+ message = '0x' + Buffer.from(message).toString('hex');
280
+ }
302
281
  const data = await this.apiClient.signMessage({
303
282
  walletId,
304
283
  message
@@ -314,11 +293,12 @@ class DynamicWalletClient {
314
293
  });
315
294
  const derivationPath = new Uint32Array(chainConfig.derivationPath);
316
295
  let formattedMessage;
296
+ //note: Ecdsa can also be used by bitcoin, but only keccak256 is used by ethereum
317
297
  if (mpcSigner instanceof Ecdsa) {
318
- formattedMessage = MessageHash.sha256(message);
319
- } else if (mpcSigner instanceof Ed25519) {
298
+ formattedMessage = MessageHash.keccak256(message);
299
+ } else if (mpcSigner instanceof Ed25519 && typeof message === 'string') {
320
300
  formattedMessage = new TextEncoder().encode(message);
321
- } else if (mpcSigner instanceof BIP340) {
301
+ } else if (mpcSigner instanceof BIP340 && typeof message === 'string') {
322
302
  formattedMessage = new TextEncoder().encode(message);
323
303
  } else {
324
304
  throw new Error('Unsupported signer type');
@@ -594,59 +574,43 @@ class DynamicWalletClient {
594
574
  return decryptedKeyShare;
595
575
  }
596
576
  async importRawPrivateKey({ chainName, privateKey, thresholdSignatureScheme }) {
597
- const chainConfig = getMPCChainConfig(chainName);
598
577
  const mpcSigner = getMPCSigner({
599
578
  chainName,
600
579
  baseRelayUrl: this.baseMPCRelayApiUrl
601
580
  });
602
- // 1. 2 parties on the client side create keygenInit
603
- const { clientPrimaryKeygenInitResult, clientSecondaryKeygenInitResult } = await this.clientInitializeKeyGen({
604
- chainName
605
- });
606
- const clientSecondaryKeygenId = clientSecondaryKeygenInitResult.keygenId;
607
- const clientPrimaryKeygenId = clientPrimaryKeygenInitResult.keygenId;
608
- // 2. server to create a room for importing the private key
609
- // server will do 3 things:
610
- // --- 1. init keygen for the server as a party
611
- // --- 2. open a room and return the roomId for the ceremony
612
- // --- 3. join the room as a party for the 2/3 ceremony
581
+ const clientKeygenInitResults = await this.clientInitializeKeyGen({
582
+ chainName,
583
+ thresholdSignatureScheme
584
+ });
585
+ const clientKeygenIds = clientKeygenInitResults.map((result)=>result.keygenId);
613
586
  const { roomId, serverKeygenIds } = await this.apiClient.importPrivateKey({
614
587
  chainName,
615
- clientKeygenIds: [
616
- clientPrimaryKeygenId,
617
- clientSecondaryKeygenId
618
- ],
588
+ clientKeygenIds,
619
589
  thresholdSignatureScheme
620
590
  });
621
591
  const { threshold } = getTSSConfig(thresholdSignatureScheme);
622
- // prep
623
- const importerKeygenIds = [
624
- ...serverKeygenIds,
625
- clientSecondaryKeygenId
626
- ];
627
- const recipientKeygenIds = [
628
- ...serverKeygenIds,
629
- clientPrimaryKeygenId
630
- ];
631
- // 3. Join the keygen room for the ceremony
632
- const [clientPrimaryKeygenResult, clientSecondaryKeygenResult] = await Promise.all([
633
- mpcSigner.importPrivateKeyImporter(roomId, threshold, privateKey, clientPrimaryKeygenInitResult, importerKeygenIds),
634
- mpcSigner.importPrivateKeyRecipient(roomId, threshold, clientSecondaryKeygenInitResult, recipientKeygenIds)
635
- ]);
636
- const derivationPath = new Uint32Array(chainConfig.derivationPath);
637
- // Get the public key for the derivation path
638
- let rawPublicKey;
639
- if (mpcSigner instanceof Ecdsa) {
640
- rawPublicKey = await mpcSigner.derivePubkey(clientPrimaryKeygenResult, derivationPath);
641
- } else if (mpcSigner instanceof Ed25519) {
642
- rawPublicKey = await mpcSigner.derivePubkey(clientPrimaryKeygenResult, derivationPath);
643
- } else if (mpcSigner instanceof BIP340) {
644
- rawPublicKey = await mpcSigner.deriveTweakPubkey(clientPrimaryKeygenResult, derivationPath);
645
- }
592
+ const clientKeygenResults = await Promise.all(clientKeygenInitResults.map((currentInit, index)=>{
593
+ const otherClientKeygenIds = clientKeygenInitResults.filter((init)=>init.keygenId !== currentInit.keygenId).map((init)=>init.keygenId);
594
+ if (index === 0) {
595
+ return mpcSigner.importPrivateKeyImporter(roomId, threshold, privateKey, currentInit, [
596
+ ...serverKeygenIds,
597
+ ...otherClientKeygenIds
598
+ ]);
599
+ } else {
600
+ return mpcSigner.importPrivateKeyRecipient(roomId, threshold, currentInit, [
601
+ ...serverKeygenIds,
602
+ ...otherClientKeygenIds
603
+ ]);
604
+ }
605
+ }));
606
+ const [clientKeygenResult] = clientKeygenResults;
607
+ const rawPublicKey = await this.derivePublicKey({
608
+ chainName,
609
+ keyShare: clientKeygenResult
610
+ });
646
611
  return {
647
612
  rawPublicKey,
648
- primaryKeygenResult: clientPrimaryKeygenResult,
649
- secondaryKeygenResult: clientSecondaryKeygenResult
613
+ clientKeyShares: clientKeygenResults
650
614
  };
651
615
  }
652
616
  async exportClientKeyshares({ accountAddress }) {
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@dynamic-labs-wallet/browser",
3
- "version": "0.0.10",
3
+ "version": "0.0.12",
4
4
  "dependencies": {
5
- "@dynamic-labs-wallet/core": "0.0.10",
6
- "@dynamic-labs-wallet/lib-mpc-web": "0.0.10"
5
+ "@dynamic-labs-wallet/core": "0.0.12",
6
+ "@dynamic-labs-wallet/lib-mpc-web": "0.0.12"
7
7
  },
8
8
  "publishConfig": {
9
9
  "access": "restricted"
package/src/client.d.ts CHANGED
@@ -19,55 +19,49 @@ export declare class DynamicWalletClient {
19
19
  baseApiUrl?: string;
20
20
  baseMPCRelayApiUrl?: string;
21
21
  });
22
- serverInitializeKeyGen({ chainName, clientPrimaryKeygenId, clientSecondaryKeygenId, thresholdSignatureScheme, }: {
22
+ serverInitializeKeyGen({ chainName, clientKeygenIds, thresholdSignatureScheme, }: {
23
23
  chainName: string;
24
- clientPrimaryKeygenId: string;
25
- clientSecondaryKeygenId: string;
24
+ clientKeygenIds: string[];
26
25
  thresholdSignatureScheme: ThresholdSignatureScheme;
27
26
  }): Promise<any>;
28
- clientInitializeKeyGen({ chainName }: {
27
+ clientInitializeKeyGen({ chainName, thresholdSignatureScheme, }: {
29
28
  chainName: string;
30
- }): Promise<{
31
- clientPrimaryKeygenInitResult: import("@dynamic-labs-wallet/lib-mpc-internal").BIP340InitKeygenResult;
32
- clientSecondaryKeygenInitResult: import("@dynamic-labs-wallet/lib-mpc-internal").BIP340InitKeygenResult;
33
- }>;
29
+ thresholdSignatureScheme: ThresholdSignatureScheme;
30
+ }): Promise<ClientInitKeygenResult[]>;
34
31
  derivePublicKey({ chainName, keyShare, }: {
35
32
  chainName: string;
36
33
  keyShare: ClientKeyShare;
37
34
  }): Promise<EcdsaPublicKey | Uint8Array | undefined>;
38
- clientKeyGen({ chainName, roomId, serverKeygenIds, clientPrimaryKeygenInitResult, clientSecondaryKeygenInitResult, thresholdSignatureScheme, }: {
35
+ clientKeyGen({ chainName, roomId, serverKeygenIds, clientKeygenInitResults, thresholdSignatureScheme, }: {
39
36
  chainName: string;
40
37
  roomId: string;
41
38
  serverKeygenIds: string[];
42
- clientPrimaryKeygenInitResult: ClientInitKeygenResult;
43
- clientSecondaryKeygenInitResult: ClientInitKeygenResult;
39
+ clientKeygenInitResults: ClientInitKeygenResult[];
44
40
  thresholdSignatureScheme: ThresholdSignatureScheme;
45
41
  }): Promise<{
46
42
  rawPublicKey: EcdsaPublicKey | Uint8Array | undefined;
47
- primaryKeygenResult: EcdsaKeygenResult | BIP340KeygenResult;
48
- secondaryKeygenResult: EcdsaKeygenResult | BIP340KeygenResult;
43
+ clientKeygenResults: ClientKeyShare[];
49
44
  }>;
50
45
  keyGen({ chainName, thresholdSignatureScheme, }: {
51
46
  chainName: string;
52
47
  thresholdSignatureScheme: ThresholdSignatureScheme;
53
48
  }): Promise<{
54
49
  rawPublicKey: EcdsaPublicKey | Uint8Array | undefined;
55
- primaryKeygenResult: EcdsaKeygenResult | BIP340KeygenResult;
56
- secondaryKeygenResult: EcdsaKeygenResult | BIP340KeygenResult;
50
+ clientKeyShares: ClientKeyShare[];
57
51
  }>;
58
52
  serverSign({ walletId, message, }: {
59
53
  walletId: string;
60
- message: string;
54
+ message: string | Uint8Array;
61
55
  }): Promise<any>;
62
56
  clientSign({ chainName, message, roomId, keyShare, }: {
63
57
  chainName: string;
64
- message: string;
58
+ message: string | Uint8Array;
65
59
  roomId: string;
66
60
  keyShare: ClientKeyShare;
67
61
  }): Promise<Uint8Array | EcdsaSignature>;
68
62
  sign({ accountAddress, message, chainName, }: {
69
63
  accountAddress?: string;
70
- message: string;
64
+ message: string | Uint8Array;
71
65
  chainName: string;
72
66
  }): Promise<Uint8Array | EcdsaSignature>;
73
67
  refreshWalletAccountShares({ accountAddress, }: {
@@ -138,8 +132,7 @@ export declare class DynamicWalletClient {
138
132
  thresholdSignatureScheme: ThresholdSignatureScheme;
139
133
  }): Promise<{
140
134
  rawPublicKey: EcdsaPublicKey | Uint8Array | undefined;
141
- primaryKeygenResult: ClientKeyShare;
142
- secondaryKeygenResult: ClientKeyShare;
135
+ clientKeyShares: ClientKeyShare[];
143
136
  }>;
144
137
  exportClientKeyshares({ accountAddress }: {
145
138
  accountAddress?: 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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"}