@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 +1 -0
- package/index.esm.js +537 -0
- package/package.json +28 -0
- package/src/backup/encryption.d.ts +17 -0
- package/src/backup/encryption.d.ts.map +1 -0
- package/src/backup/providers/googleDrive.d.ts +14 -0
- package/src/backup/providers/googleDrive.d.ts.map +1 -0
- package/src/client.d.ts +118 -0
- package/src/client.d.ts.map +1 -0
- package/src/constants.d.ts +2 -0
- package/src/constants.d.ts.map +1 -0
- package/src/index.d.ts +4 -0
- package/src/index.d.ts.map +1 -0
- package/src/mpc/index.d.ts +4 -0
- package/src/mpc/index.d.ts.map +1 -0
- package/src/mpc/mpc.d.ts +11 -0
- package/src/mpc/mpc.d.ts.map +1 -0
- package/src/mpc/types.d.ts +5 -0
- package/src/mpc/types.d.ts.map +1 -0
- package/src/utils.d.ts +5 -0
- package/src/utils.d.ts.map +1 -0
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"}
|
package/src/client.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/src/mpc/mpc.d.ts
ADDED
|
@@ -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"}
|