@seams/wallet 0.5.0 → 0.5.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.
Files changed (53) hide show
  1. package/dist/esm/sdk/export-private-key-viewer.js +55 -8809
  2. package/dist/esm/sdk/halo-border.js +8 -8892
  3. package/dist/esm/sdk/passkey-halo-loading.js +27 -8855
  4. package/dist/esm/sdk/tx-confirm-ui.js +206 -9575
  5. package/dist/esm/sdk/w3a-tx-confirmer.js +206 -8340
  6. package/dist/public/headers.manifest.json +1 -1
  7. package/dist/public/sdk/export-private-key-viewer.js +55 -8809
  8. package/dist/public/sdk/halo-border.js +8 -8892
  9. package/dist/public/sdk/passkey-halo-loading.js +27 -8855
  10. package/dist/public/sdk/tx-confirm-ui.js +206 -9575
  11. package/dist/public/sdk/w3a-tx-confirmer.js +206 -8340
  12. package/dist/public/sdk/workers/device-linking-key.worker.js +3 -8610
  13. package/dist/public/sdk/workers/ecdsa-derivation-client.worker.js +1 -12414
  14. package/dist/public/sdk/workers/ecdsa-online-client.worker.js +1 -624
  15. package/dist/public/sdk/workers/ecdsa-presign-client.worker.js +1 -1277
  16. package/dist/public/sdk/workers/email-otp.worker.js +7 -15666
  17. package/dist/public/sdk/workers/email_otp_runtime.js +3 -39
  18. package/dist/public/sdk/workers/email_otp_runtime_bg.wasm +0 -0
  19. package/dist/public/sdk/workers/evm-crypto.worker.js +5 -1157
  20. package/dist/public/sdk/workers/evm_crypto.wasm +0 -0
  21. package/dist/public/sdk/workers/evm_crypto_bg.wasm +0 -0
  22. package/dist/public/sdk/workers/near-signer.worker.js +2 -1631
  23. package/dist/public/sdk/workers/passkey-confirm.worker.js +1 -606
  24. package/dist/public/sdk/workers/passkey-mpc-export.worker.js +2 -5416
  25. package/dist/public/sdk/workers/passkey-mpc-session.worker.js +1 -1717
  26. package/dist/public/sdk/workers/shamir3pass.worker.js +4 -874
  27. package/dist/public/sdk/workers/shamir3pass_runtime.js +31 -84
  28. package/dist/public/sdk/workers/shamir3pass_runtime_bg.wasm +0 -0
  29. package/dist/public/sdk/workers/tempo-signer.worker.js +5 -987
  30. package/dist/public/sdk/workers/tempo_signer.wasm +0 -0
  31. package/dist/public/sdk/workers/tempo_signer_bg.wasm +0 -0
  32. package/dist/public/wallet-assets.manifest.json +2 -2
  33. package/dist/workers/device-linking-key.worker.js +3 -8610
  34. package/dist/workers/ecdsa-derivation-client.worker.js +1 -12414
  35. package/dist/workers/ecdsa-online-client.worker.js +1 -624
  36. package/dist/workers/ecdsa-presign-client.worker.js +1 -1277
  37. package/dist/workers/email-otp.worker.js +7 -15666
  38. package/dist/workers/email_otp_runtime.js +3 -39
  39. package/dist/workers/email_otp_runtime_bg.wasm +0 -0
  40. package/dist/workers/evm-crypto.worker.js +5 -1157
  41. package/dist/workers/evm_crypto.wasm +0 -0
  42. package/dist/workers/evm_crypto_bg.wasm +0 -0
  43. package/dist/workers/near-signer.worker.js +2 -1631
  44. package/dist/workers/passkey-confirm.worker.js +1 -606
  45. package/dist/workers/passkey-mpc-export.worker.js +2 -5416
  46. package/dist/workers/passkey-mpc-session.worker.js +1 -1717
  47. package/dist/workers/shamir3pass.worker.js +4 -874
  48. package/dist/workers/shamir3pass_runtime.js +31 -84
  49. package/dist/workers/shamir3pass_runtime_bg.wasm +0 -0
  50. package/dist/workers/tempo-signer.worker.js +5 -987
  51. package/dist/workers/tempo_signer.wasm +0 -0
  52. package/dist/workers/tempo_signer_bg.wasm +0 -0
  53. package/package.json +2 -2
@@ -1,1277 +1 @@
1
- // ../../node_modules/base-x/src/esm/index.js
2
- function base(ALPHABET) {
3
- if (ALPHABET.length >= 255) {
4
- throw new TypeError("Alphabet too long");
5
- }
6
- const BASE_MAP = new Uint8Array(256);
7
- for (let j = 0;j < BASE_MAP.length; j++) {
8
- BASE_MAP[j] = 255;
9
- }
10
- for (let i = 0;i < ALPHABET.length; i++) {
11
- const x = ALPHABET.charAt(i);
12
- const xc = x.charCodeAt(0);
13
- if (BASE_MAP[xc] !== 255) {
14
- throw new TypeError(x + " is ambiguous");
15
- }
16
- BASE_MAP[xc] = i;
17
- }
18
- const BASE = ALPHABET.length;
19
- const LEADER = ALPHABET.charAt(0);
20
- const FACTOR = Math.log(BASE) / Math.log(256);
21
- const iFACTOR = Math.log(256) / Math.log(BASE);
22
- function encode(source) {
23
- if (source instanceof Uint8Array) {} else if (ArrayBuffer.isView(source)) {
24
- source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);
25
- } else if (Array.isArray(source)) {
26
- source = Uint8Array.from(source);
27
- }
28
- if (!(source instanceof Uint8Array)) {
29
- throw new TypeError("Expected Uint8Array");
30
- }
31
- if (source.length === 0) {
32
- return "";
33
- }
34
- let zeroes = 0;
35
- let length = 0;
36
- let pbegin = 0;
37
- const pend = source.length;
38
- while (pbegin !== pend && source[pbegin] === 0) {
39
- pbegin++;
40
- zeroes++;
41
- }
42
- const size = (pend - pbegin) * iFACTOR + 1 >>> 0;
43
- const b58 = new Uint8Array(size);
44
- while (pbegin !== pend) {
45
- let carry = source[pbegin];
46
- let i = 0;
47
- for (let it1 = size - 1;(carry !== 0 || i < length) && it1 !== -1; it1--, i++) {
48
- carry += 256 * b58[it1] >>> 0;
49
- b58[it1] = carry % BASE >>> 0;
50
- carry = carry / BASE >>> 0;
51
- }
52
- if (carry !== 0) {
53
- throw new Error("Non-zero carry");
54
- }
55
- length = i;
56
- pbegin++;
57
- }
58
- let it2 = size - length;
59
- while (it2 !== size && b58[it2] === 0) {
60
- it2++;
61
- }
62
- let str = LEADER.repeat(zeroes);
63
- for (;it2 < size; ++it2) {
64
- str += ALPHABET.charAt(b58[it2]);
65
- }
66
- return str;
67
- }
68
- function decodeUnsafe(source) {
69
- if (typeof source !== "string") {
70
- throw new TypeError("Expected String");
71
- }
72
- if (source.length === 0) {
73
- return new Uint8Array;
74
- }
75
- let psz = 0;
76
- let zeroes = 0;
77
- let length = 0;
78
- while (source[psz] === LEADER) {
79
- zeroes++;
80
- psz++;
81
- }
82
- const size = (source.length - psz) * FACTOR + 1 >>> 0;
83
- const b256 = new Uint8Array(size);
84
- while (psz < source.length) {
85
- const charCode = source.charCodeAt(psz);
86
- if (charCode > 255) {
87
- return;
88
- }
89
- let carry = BASE_MAP[charCode];
90
- if (carry === 255) {
91
- return;
92
- }
93
- let i = 0;
94
- for (let it3 = size - 1;(carry !== 0 || i < length) && it3 !== -1; it3--, i++) {
95
- carry += BASE * b256[it3] >>> 0;
96
- b256[it3] = carry % 256 >>> 0;
97
- carry = carry / 256 >>> 0;
98
- }
99
- if (carry !== 0) {
100
- throw new Error("Non-zero carry");
101
- }
102
- length = i;
103
- psz++;
104
- }
105
- let it4 = size - length;
106
- while (it4 !== size && b256[it4] === 0) {
107
- it4++;
108
- }
109
- const vch = new Uint8Array(zeroes + (size - it4));
110
- let j = zeroes;
111
- while (it4 !== size) {
112
- vch[j++] = b256[it4++];
113
- }
114
- return vch;
115
- }
116
- function decode(string) {
117
- const buffer = decodeUnsafe(string);
118
- if (buffer) {
119
- return buffer;
120
- }
121
- throw new Error("Non-base" + BASE + " character");
122
- }
123
- return {
124
- encode,
125
- decodeUnsafe,
126
- decode
127
- };
128
- }
129
- var esm_default = base;
130
-
131
- // ../../node_modules/bs58/src/esm/index.js
132
- var ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
133
- var esm_default2 = esm_default(ALPHABET);
134
-
135
- // ../shared-ts/src/utils/errors.ts
136
- function errorMessage(err) {
137
- try {
138
- if (typeof err === "string")
139
- return err;
140
- if (err && typeof err.message === "string") {
141
- return err.message;
142
- }
143
- return String(err ?? "");
144
- } catch {
145
- return "";
146
- }
147
- }
148
- function b64uField(prefix) {
149
- return `${prefix}B64u`;
150
- }
151
- var SENSITIVE_ERROR_FIELD_NAMES = [
152
- "nearPrivateKey",
153
- "near_private_key",
154
- "privateKey",
155
- "private_key",
156
- b64uField("seed"),
157
- "seed_b64u",
158
- b64uField("canonicalSeed"),
159
- "canonical_seed_b64u",
160
- b64uField("xClientBase"),
161
- "x_client_base_b64u",
162
- b64uField("clientOutputMask"),
163
- "client_output_mask_b64u",
164
- b64uField("clientRecoverableSecret"),
165
- "client_recoverable_secret_b64u",
166
- "prfOutput",
167
- "prf_output",
168
- "prfFirst",
169
- "prf_first",
170
- b64uField("prfFirst"),
171
- "prf_first_b64u",
172
- "prfSecond",
173
- "prf_second",
174
- b64uField("prfSecond"),
175
- "prf_second_b64u",
176
- b64uField("signingShare32"),
177
- "signing_share32_b64u",
178
- b64uField("clientNonceHandle"),
179
- "client_nonce_handle_b64u"
180
- ];
181
- function redactJsonStringField(input, fieldName) {
182
- const escapedFieldName = fieldName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
183
- return input.replace(new RegExp(`("${escapedFieldName}"\\s*:\\s*")([^"]*)(")`, "g"), `$1[REDACTED]$3`);
184
- }
185
- function redactAssignmentField(input, fieldName) {
186
- const escapedFieldName = fieldName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
187
- return input.replace(new RegExp(`\\b(${escapedFieldName}\\s*[=:]\\s*)([^\\s,}\\]]+)`, "g"), "$1[REDACTED]");
188
- }
189
- function redactSensitiveErrorText(input) {
190
- let redacted = String(input || "");
191
- for (const fieldName of SENSITIVE_ERROR_FIELD_NAMES) {
192
- redacted = redactJsonStringField(redacted, fieldName);
193
- redacted = redactAssignmentField(redacted, fieldName);
194
- }
195
- return redacted;
196
- }
197
- function safeErrorMessage(err) {
198
- return redactSensitiveErrorText(errorMessage(err));
199
- }
200
-
201
- // src/core/signingEngine/workerManager/workerDeferred.ts
202
- class WorkerDeferred {
203
- promise;
204
- resolveValue = null;
205
- rejectValue = null;
206
- constructor() {
207
- this.promise = new Promise(this.capture);
208
- }
209
- resolve(value) {
210
- if (!this.resolveValue)
211
- throw new Error("Worker deferred resolver is unavailable");
212
- this.resolveValue(value);
213
- }
214
- reject(error) {
215
- if (!this.rejectValue)
216
- throw new Error("Worker deferred rejecter is unavailable");
217
- this.rejectValue(error);
218
- }
219
- capture = (resolve, reject) => {
220
- this.resolveValue = resolve;
221
- this.rejectValue = reject;
222
- };
223
- }
224
-
225
- // src/core/signingEngine/workerManager/workerTypes.ts
226
- var WorkerControlMessage = {
227
- WORKER_READY: "WORKER_READY"
228
- };
229
- var EcdsaPresignClientRequestType = {
230
- SessionInit: 71000,
231
- SessionStep: 71001,
232
- SessionAbort: 71002,
233
- Admit: 71003,
234
- Destroy: 71004,
235
- Reserve: 71005,
236
- Commit: 71006,
237
- ListAvailable: 71007
238
- };
239
- var EcdsaPresignClientResponseType = {
240
- SessionInitSuccess: 71100,
241
- SessionStepSuccess: 71101,
242
- SessionAbortSuccess: 71102,
243
- AdmitSuccess: 71103,
244
- DestroySuccess: 71104,
245
- ReserveSuccess: 71105,
246
- CommitSuccess: 71106,
247
- ListAvailableSuccess: 71107
248
- };
249
- var EcdsaOnlineClientRequestType = {
250
- ComputeSignatureShare: 72000,
251
- RetirePool: 72001
252
- };
253
- var EcdsaOnlineClientResponseType = {
254
- ComputeSignatureShareSuccess: 72100,
255
- RetirePoolSuccess: 72101
256
- };
257
-
258
- // ../shared-ts/src/utils/domainIds.ts
259
- function parseDomainId(raw, fieldName) {
260
- if (raw == null) {
261
- return {
262
- ok: false,
263
- error: {
264
- code: "missing",
265
- message: `${fieldName} is required`
266
- }
267
- };
268
- }
269
- if (typeof raw !== "string") {
270
- return {
271
- ok: false,
272
- error: {
273
- code: "invalid",
274
- message: `${fieldName} must be a string`
275
- }
276
- };
277
- }
278
- const value = raw.trim();
279
- if (!value) {
280
- return {
281
- ok: false,
282
- error: {
283
- code: "missing",
284
- message: `${fieldName} is required`
285
- }
286
- };
287
- }
288
- return { ok: true, value };
289
- }
290
- function parseRootShareEpoch(raw) {
291
- return parseDomainId(raw, "rootShareEpoch");
292
- }
293
- // ../shared-ts/src/utils/validation.ts
294
- function isObject(x) {
295
- return x !== null && typeof x === "object";
296
- }
297
- // ../shared-ts/src/authorization/capabilityKinds.ts
298
- var CAPABILITY_KINDS = {
299
- vaultAccess: "vault_access",
300
- nearEd25519MpcSigning: "near_ed25519_mpc_signing",
301
- evmEcdsaMpcSigning: "evm_ecdsa_mpc_signing"
302
- };
303
- var VAULT_OPERATION_KINDS = {
304
- proxyUse: "vault.proxy_use",
305
- reveal: "vault.reveal"
306
- };
307
- var NEAR_ED25519_MPC_OPERATION_KINDS = {
308
- signTransaction: "near.sign_transaction",
309
- signDelegateAction: "near.sign_delegate_action",
310
- signNep413Message: "near.sign_nep413_message",
311
- exportKey: "near.export_key"
312
- };
313
- var EVM_ECDSA_MPC_OPERATION_KINDS = {
314
- signTransaction: "evm.sign_transaction",
315
- exportKey: "evm.export_key"
316
- };
317
- var AUTHORIZATION_EVIDENCE_KINDS = {
318
- seamsSession: "seams_session",
319
- passkeyAssertion: "passkey_assertion",
320
- emailOtp: "email_otp"
321
- };
322
- var CAPABILITY_KIND_VALUES = Object.values(CAPABILITY_KINDS);
323
- var VAULT_OPERATION_KIND_VALUES = Object.values(VAULT_OPERATION_KINDS);
324
- var NEAR_ED25519_MPC_OPERATION_KIND_VALUES = Object.values(NEAR_ED25519_MPC_OPERATION_KINDS);
325
- var EVM_ECDSA_MPC_OPERATION_KIND_VALUES = Object.values(EVM_ECDSA_MPC_OPERATION_KINDS);
326
- var AUTHORIZATION_EVIDENCE_KIND_VALUES = Object.values(AUTHORIZATION_EVIDENCE_KINDS);
327
-
328
- // ../shared-ts/src/authorization/delegatedAuthority.ts
329
- var FULL_OWNER_PERMISSIONS = Object.freeze([
330
- "export_keys",
331
- "link_devices",
332
- "revoke_devices",
333
- "sign"
334
- ]);
335
- var SIGNING_ONLY_PERMISSIONS = Object.freeze([
336
- "sign"
337
- ]);
338
- var DELEGATED_WALLET_PERMISSION_VALUES = [
339
- "export_keys",
340
- "link_devices",
341
- "revoke_devices",
342
- "sign"
343
- ];
344
- var DELEGATED_WALLET_PERMISSION_VALUE_SET = new Set(DELEGATED_WALLET_PERMISSION_VALUES);
345
- var canonicalPermissionSetBrand = Symbol("canonicalPermissionSetBrand");
346
-
347
- // ../shared-ts/src/authorization/walletAuthority.ts
348
- var TEXT_ENCODER = new TextEncoder;
349
-
350
- // ../shared-ts/src/utils/registrationIntent.ts
351
- var SERVER_ALLOCATED_WALLET_ADJECTIVES = [
352
- "alpine",
353
- "amber",
354
- "azure",
355
- "brisk",
356
- "bright",
357
- "calm",
358
- "cedar",
359
- "cobalt",
360
- "copper",
361
- "coral",
362
- "crimson",
363
- "crystal",
364
- "dawn",
365
- "deep",
366
- "dusky",
367
- "evergreen",
368
- "fair",
369
- "fern",
370
- "frost",
371
- "gentle",
372
- "glacier",
373
- "glowing",
374
- "golden",
375
- "harbor",
376
- "humble",
377
- "indigo",
378
- "ivory",
379
- "jade",
380
- "keen",
381
- "lunar",
382
- "maple",
383
- "misty",
384
- "mossy",
385
- "noble",
386
- "ocean",
387
- "opal",
388
- "polar",
389
- "quiet",
390
- "rapid",
391
- "redwood",
392
- "river",
393
- "royal",
394
- "sage",
395
- "scarlet",
396
- "serene",
397
- "silver",
398
- "solar",
399
- "steady",
400
- "stone",
401
- "swift",
402
- "tranquil",
403
- "twilight",
404
- "umber",
405
- "verdant",
406
- "vibrant",
407
- "violet",
408
- "vivid",
409
- "warm",
410
- "wild",
411
- "willow",
412
- "winter",
413
- "woodland",
414
- "young",
415
- "zephyr"
416
- ];
417
- var SERVER_ALLOCATED_WALLET_NOUNS = [
418
- "anchor",
419
- "arbor",
420
- "atlas",
421
- "aurora",
422
- "badger",
423
- "beacon",
424
- "bloom",
425
- "brook",
426
- "canyon",
427
- "cascade",
428
- "comet",
429
- "cove",
430
- "crane",
431
- "delta",
432
- "dune",
433
- "eagle",
434
- "ember",
435
- "falcon",
436
- "feather",
437
- "fjord",
438
- "forest",
439
- "galaxy",
440
- "garden",
441
- "giant",
442
- "grove",
443
- "harvest",
444
- "heron",
445
- "horizon",
446
- "island",
447
- "lagoon",
448
- "lantern",
449
- "lark",
450
- "meadow",
451
- "meteor",
452
- "monolith",
453
- "nebula",
454
- "oasis",
455
- "orchid",
456
- "otter",
457
- "peak",
458
- "pebble",
459
- "phoenix",
460
- "pine",
461
- "prism",
462
- "quartz",
463
- "raven",
464
- "reef",
465
- "ridge",
466
- "sable",
467
- "sequoia",
468
- "shore",
469
- "solstice",
470
- "sparrow",
471
- "star",
472
- "summit",
473
- "tempo",
474
- "thunder",
475
- "tundra",
476
- "valley",
477
- "vermillion",
478
- "voyage",
479
- "wave",
480
- "wren",
481
- "zenith"
482
- ];
483
- var SERVER_ALLOCATED_WALLET_ADJECTIVE_SET = new Set(SERVER_ALLOCATED_WALLET_ADJECTIVES);
484
- var SERVER_ALLOCATED_WALLET_NOUN_SET = new Set(SERVER_ALLOCATED_WALLET_NOUNS);
485
-
486
- // ../shared-ts/src/utils/routerAbEd25519Yao.ts
487
- var ED25519_YAO_CONTROL_CIPHERTEXT_MAX_BYTES_V1 = 64 * 1024;
488
- var UTF8 = new TextEncoder;
489
-
490
- // ../shared-ts/src/device-linking/parsers.ts
491
- var QR_FIELDS = [
492
- "version",
493
- "purpose",
494
- "linkSessionId",
495
- "linkPublicKeyB64u",
496
- "devicePublicKeyB64u",
497
- "requestedPermission",
498
- "targetFactor",
499
- "issuedAtMs",
500
- "expiresAtMs"
501
- ];
502
- var QR_EMAIL_FIELDS = [...QR_FIELDS, "targetEmail"];
503
- var COMPACT_QR_FIELDS = ["v", "s", "l", "d", "a", "f", "i", "e"];
504
- var COMPACT_QR_EMAIL_FIELDS = [...COMPACT_QR_FIELDS, "t"];
505
- var ENROLLMENT_FIELDS = [
506
- "kind",
507
- "linkSessionId",
508
- "walletId",
509
- "enrollmentId",
510
- "deviceId",
511
- "linkPublicKeyB64u",
512
- "devicePublicKeyB64u",
513
- "permission",
514
- "targetFactor",
515
- "ownerAuthorization",
516
- "approvedAtMs",
517
- "expiresAtMs"
518
- ];
519
- var ENROLLMENT_FIELDS_WITH_SOURCE_CONTRIBUTION = [
520
- ...ENROLLMENT_FIELDS,
521
- "sourceContribution"
522
- ];
523
- var CREDENTIAL_BASE_FIELDS = [
524
- "kind",
525
- "linkSessionId",
526
- "walletId",
527
- "enrollmentId",
528
- "deviceId",
529
- "walletAuthMethodId",
530
- "targetFactor",
531
- "targetPreparationDigestB64u",
532
- "ordinarySignerMaterialRecipientRequests",
533
- "registeredAtMs"
534
- ];
535
- var PASSKEY_CREDENTIAL_FIELDS = [...CREDENTIAL_BASE_FIELDS, "webauthnRegistration"];
536
- var EMAIL_OTP_CREDENTIAL_FIELDS = [
537
- ...CREDENTIAL_BASE_FIELDS,
538
- "targetEmail",
539
- "emailOtpVerificationGrant"
540
- ];
541
- var EMAIL_OTP_CREDENTIAL_NEW_FIELDS = [
542
- ...EMAIL_OTP_CREDENTIAL_FIELDS,
543
- "emailOtpEnrollment"
544
- ];
545
- var TARGET_PREPARATION_BASE_FIELDS = [
546
- "kind",
547
- "linkSessionId",
548
- "walletId",
549
- "enrollmentId",
550
- "deviceId",
551
- "deliveryRecipientPublicKey65B64u",
552
- "walletAuthMethodId",
553
- "ed25519ExportRoot",
554
- "targetFactor",
555
- "ordinarySignerMaterialRecipientRequirements",
556
- "issuedAtMs",
557
- "expiresAtMs"
558
- ];
559
- var TARGET_PREPARATION_PASSKEY_FIELDS = [
560
- ...TARGET_PREPARATION_BASE_FIELDS,
561
- "passkeyCreationOptions",
562
- "passkeyConfigurationDigestB64u"
563
- ];
564
- var TARGET_PREPARATION_EMAIL_FIELDS = [
565
- ...TARGET_PREPARATION_BASE_FIELDS,
566
- "targetEmail",
567
- "enrollment",
568
- "baseWalletAuthMethodId"
569
- ];
570
- var TARGET_PREPARATION_EMAIL_NEW_FIELDS = [
571
- ...TARGET_PREPARATION_BASE_FIELDS,
572
- "targetEmail",
573
- "enrollment"
574
- ];
575
- var EMAIL_OTP_VERIFICATION_GRANT_BASE_FIELDS = [
576
- "kind",
577
- "grantId",
578
- "grantToken",
579
- "challengeId",
580
- "linkSessionId",
581
- "walletId",
582
- "enrollmentId",
583
- "deviceId",
584
- "targetPreparationDigestB64u",
585
- "targetEmail",
586
- "enrollment",
587
- "emailHashHex",
588
- "registrationAuthorityId",
589
- "providerUserId",
590
- "authorityDigestB64u",
591
- "issuedAtMs",
592
- "expiresAtMs"
593
- ];
594
- var EMAIL_OTP_VERIFICATION_GRANT_FIELDS = [
595
- ...EMAIL_OTP_VERIFICATION_GRANT_BASE_FIELDS,
596
- "baseWalletAuthMethodId"
597
- ];
598
- var P256_FIELD_PRIME = BigInt("0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff");
599
- var P256_CURVE_A = P256_FIELD_PRIME - 3n;
600
- var P256_CURVE_B = BigInt("0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b");
601
-
602
- // src/core/signingEngine/workerManager/ecdsaClientWorkerChannels.ts
603
- var EcdsaClientWorkerControlKind = {
604
- AttachDerivationToPresign: "attach_ecdsa_derivation_to_presign_v1",
605
- AttachLinkedHolderToPresign: "attach_linked_holder_to_ecdsa_presign_v1",
606
- AttachPresignToOnline: "attach_ecdsa_presign_to_online_v1"
607
- };
608
- var ECDSA_CLIENT_CHANNEL_PROBE_DIGEST_B64U = "A".repeat(43);
609
- function parseWorkerChannelControl(value) {
610
- if (!isObject(value))
611
- return null;
612
- return { kind: value.kind, port: value.port };
613
- }
614
- function isAttachEcdsaDerivationToPresignPort(value) {
615
- const parsed = parseWorkerChannelControl(value);
616
- return parsed?.kind === EcdsaClientWorkerControlKind.AttachDerivationToPresign && parsed.port instanceof MessagePort;
617
- }
618
- function isAttachLinkedHolderToPresignPort(value) {
619
- const parsed = parseWorkerChannelControl(value);
620
- return parsed?.kind === EcdsaClientWorkerControlKind.AttachLinkedHolderToPresign && parsed.port instanceof MessagePort;
621
- }
622
- function isAttachPresignToOnlinePort(value) {
623
- const parsed = parseWorkerChannelControl(value);
624
- return parsed?.kind === EcdsaClientWorkerControlKind.AttachPresignToOnline && parsed.port instanceof MessagePort;
625
- }
626
-
627
- // src/core/signingEngine/workerManager/ecdsaPresignPoolIdentity.ts
628
- var FIXED_ECDSA_PRESIGN_PROTOCOL_ID = "seams/router-ab-ecdsa-presign/fixed-2of2/v1";
629
- function requireIdentityString(value, label) {
630
- if (typeof value !== "string" || !value.trim())
631
- throw new Error(`${label} is required`);
632
- return value;
633
- }
634
- function parseEcdsaClientPresignPoolIdentity(value) {
635
- if (typeof value !== "object" || value === null) {
636
- throw new Error("poolIdentity is required");
637
- }
638
- const raw = value;
639
- if (raw.pairRole !== "client")
640
- throw new Error("poolIdentity.pairRole must be client");
641
- if (raw.protocolId !== FIXED_ECDSA_PRESIGN_PROTOCOL_ID) {
642
- throw new Error("poolIdentity.protocolId is unsupported");
643
- }
644
- return {
645
- poolKey: requireIdentityString(raw.poolKey, "poolIdentity.poolKey"),
646
- materialActivationId: requireIdentityString(raw.materialActivationId, "poolIdentity.materialActivationId"),
647
- capability: requireIdentityString(raw.capability, "poolIdentity.capability"),
648
- keyBinding: requireIdentityString(raw.keyBinding, "poolIdentity.keyBinding"),
649
- walletId: requireIdentityString(raw.walletId, "poolIdentity.walletId"),
650
- signingScopeB64u: requireIdentityString(raw.signingScopeB64u, "poolIdentity.signingScopeB64u"),
651
- pairRole: "client",
652
- keyEpoch: requireIdentityString(raw.keyEpoch, "poolIdentity.keyEpoch"),
653
- activationEpoch: requirePoolRootShareEpoch(raw.activationEpoch),
654
- protocolId: FIXED_ECDSA_PRESIGN_PROTOCOL_ID
655
- };
656
- }
657
- function requirePoolRootShareEpoch(value) {
658
- const parsed = parseRootShareEpoch(value);
659
- if (!parsed.ok)
660
- throw new Error("poolIdentity.activationEpoch is invalid");
661
- return parsed.value;
662
- }
663
- function equalEcdsaClientPresignPoolIdentity(left, right) {
664
- return left.poolKey === right.poolKey && left.materialActivationId === right.materialActivationId && left.capability === right.capability && left.keyBinding === right.keyBinding && left.walletId === right.walletId && left.signingScopeB64u === right.signingScopeB64u && left.pairRole === right.pairRole && left.keyEpoch === right.keyEpoch && left.activationEpoch === right.activationEpoch && left.protocolId === right.protocolId;
665
- }
666
-
667
- // src/core/signingEngine/workerManager/workers/ecdsa-presign-client.worker.ts
668
- var opaqueMaterials = new Map;
669
- var pendingOpaqueAuthorities = new Map;
670
- var opaqueSessionPorts = new Map;
671
- var opaqueSessionBindings = new Map;
672
- var derivationPort = null;
673
- var linkedHolderPort = null;
674
- var onlinePort = null;
675
- var messageQueue = Promise.resolve();
676
- function randomHandle(prefix) {
677
- const bytes = new Uint8Array(16);
678
- crypto.getRandomValues(bytes);
679
- let suffix = "";
680
- for (const byte of bytes)
681
- suffix += byte.toString(16).padStart(2, "0");
682
- return `${prefix}-${suffix}`;
683
- }
684
- function toBytes(value, label) {
685
- if (value instanceof ArrayBuffer)
686
- return new Uint8Array(value);
687
- if (value instanceof Uint8Array)
688
- return value;
689
- if (ArrayBuffer.isView(value)) {
690
- return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
691
- }
692
- throw new Error(`${label} must be bytes`);
693
- }
694
- function requireString(value, label) {
695
- const normalized = String(value ?? "").trim();
696
- if (!normalized)
697
- throw new Error(`${label} is required`);
698
- return normalized;
699
- }
700
- function requireFutureTimestamp(value, label) {
701
- const timestamp = Number(value);
702
- if (!Number.isSafeInteger(timestamp) || timestamp <= Date.now()) {
703
- throw new Error(`${label} must be a future timestamp`);
704
- }
705
- return timestamp;
706
- }
707
- function handleOpaqueAuthorityResponse(port, event) {
708
- const response = event.data;
709
- if (response.kind !== "opaque_ecdsa_presign_authority_result_v1")
710
- return;
711
- const pending = pendingOpaqueAuthorities.get(response.requestId);
712
- if (!pending || pending.port !== port)
713
- return;
714
- pendingOpaqueAuthorities.delete(response.requestId);
715
- if (!response.ok) {
716
- pending.deferred.reject(new Error(response.error));
717
- return;
718
- }
719
- pending.deferred.resolve(response.result);
720
- }
721
- function purgeAuthorityPort(port, message) {
722
- rejectPendingOpaqueAuthorities(port, message);
723
- for (const [sessionId, sessionPort] of opaqueSessionPorts) {
724
- if (sessionPort !== port)
725
- continue;
726
- opaqueSessionPorts.delete(sessionId);
727
- opaqueSessionBindings.delete(sessionId);
728
- }
729
- for (const [materialHandle, entry] of opaqueMaterials) {
730
- if (entry.authorityPort === port)
731
- opaqueMaterials.delete(materialHandle);
732
- }
733
- }
734
- function rejectPendingOpaqueAuthorities(port, message) {
735
- for (const [requestId, pending] of pendingOpaqueAuthorities) {
736
- if (pending.port !== port)
737
- continue;
738
- pendingOpaqueAuthorities.delete(requestId);
739
- pending.deferred.reject(new Error(message));
740
- }
741
- }
742
- function requestOpaqueAuthority(port, request, transfer = []) {
743
- const deferred = new WorkerDeferred;
744
- pendingOpaqueAuthorities.set(request.requestId, { port, deferred });
745
- try {
746
- port.postMessage(request, transfer);
747
- } catch (error) {
748
- pendingOpaqueAuthorities.delete(request.requestId);
749
- deferred.reject(error instanceof Error ? error : new Error(String(error)));
750
- }
751
- return deferred.promise;
752
- }
753
- async function initializeSession(payload) {
754
- const sessionId = requireString(payload.sessionId, "sessionId");
755
- if (opaqueSessionPorts.has(sessionId))
756
- await abortSession({ sessionId });
757
- const poolIdentity = parseEcdsaClientPresignPoolIdentity(payload.poolIdentity);
758
- const groupPublicKey33 = toBytes(payload.groupPublicKey33, "groupPublicKey33");
759
- if (groupPublicKey33.length !== 33)
760
- throw new Error("groupPublicKey33 must be 33 bytes");
761
- const materialExpiresAtMs = requireFutureTimestamp(payload.materialExpiresAtMs, "materialExpiresAtMs");
762
- switch (payload.authority.kind) {
763
- case "role_local_derivation_handle": {
764
- if (!derivationPort) {
765
- throw new Error("ECDSA presign client has no derivation material channel");
766
- }
767
- const requestId = randomHandle("ecdsa-role-local-presign");
768
- const groupPublicKeyBuffer = groupPublicKey33.slice().buffer;
769
- const result = await requestOpaqueAuthority(derivationPort, {
770
- kind: "opaque_ecdsa_presign_session_init_v1",
771
- requestId,
772
- sessionId,
773
- authority: {
774
- kind: "role_local_derivation_handle",
775
- materialHandle: requireString(payload.authority.materialHandle, "materialHandle"),
776
- material: payload.authority.material
777
- },
778
- poolIdentity,
779
- groupPublicKey33: groupPublicKeyBuffer,
780
- materialExpiresAtMs
781
- }, [groupPublicKeyBuffer]);
782
- const progress = requireOpaqueProgress(result);
783
- retainCompletedMaterial({
784
- progress,
785
- authorityPort: derivationPort,
786
- poolIdentity,
787
- groupPublicKey33,
788
- expiresAtMs: materialExpiresAtMs
789
- });
790
- if (progress.event !== "presign_done") {
791
- opaqueSessionPorts.set(sessionId, derivationPort);
792
- opaqueSessionBindings.set(sessionId, {
793
- poolIdentity,
794
- groupPublicKey33: groupPublicKey33.slice(),
795
- expiresAtMs: materialExpiresAtMs
796
- });
797
- }
798
- return { authority: { kind: "role_local_derivation_handle" }, progress };
799
- }
800
- case "linked_holder_signing_material": {
801
- if (!linkedHolderPort) {
802
- throw new Error("ECDSA presign client has no linked holder material channel");
803
- }
804
- const requestId = randomHandle("linked-holder-ecdsa-presign");
805
- const groupPublicKeyBuffer = groupPublicKey33.slice().buffer;
806
- const result = await requestOpaqueAuthority(linkedHolderPort, {
807
- kind: "opaque_ecdsa_presign_session_init_v1",
808
- requestId,
809
- sessionId,
810
- authority: {
811
- kind: "linked_holder_signing_material",
812
- holderHandleId: requireString(payload.authority.holderHandleId, "holderHandleId")
813
- },
814
- poolIdentity,
815
- groupPublicKey33: groupPublicKeyBuffer,
816
- materialExpiresAtMs
817
- }, [groupPublicKeyBuffer]);
818
- const progress = requireOpaqueProgress(result);
819
- retainCompletedMaterial({
820
- progress,
821
- authorityPort: linkedHolderPort,
822
- poolIdentity,
823
- groupPublicKey33,
824
- expiresAtMs: materialExpiresAtMs
825
- });
826
- if (progress.event !== "presign_done") {
827
- opaqueSessionPorts.set(sessionId, linkedHolderPort);
828
- opaqueSessionBindings.set(sessionId, {
829
- poolIdentity,
830
- groupPublicKey33: groupPublicKey33.slice(),
831
- expiresAtMs: materialExpiresAtMs
832
- });
833
- }
834
- return { authority: { kind: "linked_holder_signing_material" }, progress };
835
- }
836
- default:
837
- payload.authority;
838
- throw new Error("Unsupported ECDSA presign authority");
839
- }
840
- }
841
- async function stepSession(payload) {
842
- const sessionId = requireString(payload.sessionId, "sessionId");
843
- const opaquePort = opaqueSessionPorts.get(sessionId);
844
- if (opaquePort) {
845
- const activeBinding = opaqueSessionBindings.get(sessionId);
846
- if (!activeBinding || Date.now() >= activeBinding.expiresAtMs) {
847
- await abortSession({ sessionId });
848
- throw new Error("Opaque ECDSA presign session expired");
849
- }
850
- try {
851
- const requestId = randomHandle("opaque-ecdsa-presign-step");
852
- const incomingMessages = payload.incomingMessages.map(copyArrayBuffer);
853
- const result = await requestOpaqueAuthority(opaquePort, {
854
- kind: "opaque_ecdsa_presign_session_step_v1",
855
- requestId,
856
- sessionId,
857
- stage: payload.stage,
858
- incomingMessages
859
- }, incomingMessages);
860
- const progress = requireOpaqueProgress(result);
861
- if (progress.event === "presign_done") {
862
- const binding = opaqueSessionBindings.get(sessionId);
863
- if (!binding)
864
- throw new Error("Opaque ECDSA presign session binding is unknown");
865
- retainCompletedMaterial({
866
- progress,
867
- authorityPort: opaquePort,
868
- poolIdentity: binding.poolIdentity,
869
- groupPublicKey33: binding.groupPublicKey33,
870
- expiresAtMs: binding.expiresAtMs
871
- });
872
- opaqueSessionPorts.delete(sessionId);
873
- opaqueSessionBindings.delete(sessionId);
874
- }
875
- return progress;
876
- } catch (error) {
877
- opaqueSessionPorts.delete(sessionId);
878
- opaqueSessionBindings.delete(sessionId);
879
- throw error;
880
- }
881
- }
882
- throw new Error("Unknown ECDSA Client presign session");
883
- }
884
- async function abortSession(payload) {
885
- const sessionId = requireString(payload.sessionId, "sessionId");
886
- const opaquePort = opaqueSessionPorts.get(sessionId);
887
- if (opaquePort) {
888
- opaqueSessionPorts.delete(sessionId);
889
- opaqueSessionBindings.delete(sessionId);
890
- const result = await requestOpaqueAuthority(opaquePort, {
891
- kind: "opaque_ecdsa_presign_session_abort_v1",
892
- requestId: randomHandle("opaque-ecdsa-presign-abort"),
893
- sessionId
894
- });
895
- if (result.kind !== "aborted" || result.sessionId !== sessionId) {
896
- throw new Error("Opaque ECDSA presign authority returned an invalid abort result");
897
- }
898
- return { kind: "threshold_ecdsa_presign_session_aborted", sessionId };
899
- }
900
- return { kind: "threshold_ecdsa_presign_session_aborted", sessionId };
901
- }
902
- function requireOpaqueProgress(result) {
903
- if (result.kind !== "progress") {
904
- throw new Error("Opaque ECDSA presign authority returned an invalid progress result");
905
- }
906
- return result.progress;
907
- }
908
- function copyArrayBuffer(value) {
909
- return value.slice(0);
910
- }
911
- async function presignatureId(bigR33) {
912
- const digest = new Uint8Array(await crypto.subtle.digest("SHA-256", bigR33));
913
- let binary = "";
914
- for (const byte of digest)
915
- binary += String.fromCharCode(byte);
916
- return `presig-${btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "")}`;
917
- }
918
- function retainCompletedMaterial(args) {
919
- if (args.progress.event !== "presign_done")
920
- return;
921
- const materialHandle = requireString(args.progress.presignatureHandle, "presignatureHandle");
922
- const bigR33 = toBytes(args.progress.presignatureBigR33, "presignatureBigR33");
923
- if (bigR33.length !== 33)
924
- throw new Error("presignatureBigR33 must be 33 bytes");
925
- opaqueMaterials.set(materialHandle, {
926
- authorityPort: args.authorityPort,
927
- poolIdentity: args.poolIdentity,
928
- groupPublicKey33: args.groupPublicKey33.slice(),
929
- bigR33: bigR33.slice().buffer,
930
- createdAtMs: Date.now(),
931
- expiresAtMs: args.expiresAtMs,
932
- state: { kind: "pending_admission" }
933
- });
934
- }
935
- function requireOpaqueMaterial(materialHandle, poolIdentity) {
936
- const entry = opaqueMaterials.get(materialHandle);
937
- if (!entry)
938
- throw new Error("ECDSA Client presign material unavailable: not_found");
939
- if (!equalEcdsaClientPresignPoolIdentity(entry.poolIdentity, poolIdentity)) {
940
- opaqueMaterials.delete(materialHandle);
941
- destroyOpaqueMaterial(materialHandle, entry);
942
- throw new Error("ECDSA Client presign material unavailable: binding_rejected");
943
- }
944
- if (Date.now() >= entry.expiresAtMs) {
945
- opaqueMaterials.delete(materialHandle);
946
- destroyOpaqueMaterial(materialHandle, entry);
947
- throw new Error("ECDSA Client presign material unavailable: material_expired");
948
- }
949
- return entry;
950
- }
951
- async function destroyOpaqueMaterial(materialHandle, entry) {
952
- await requestOpaqueAuthority(entry.authorityPort, {
953
- kind: "opaque_ecdsa_presign_material_destroy_v1",
954
- requestId: randomHandle("opaque-ecdsa-presign-destroy"),
955
- materialHandle
956
- }).catch(() => {
957
- return;
958
- });
959
- }
960
- async function admitPresignature(payload) {
961
- const materialHandle = requireString(payload.materialHandle, "materialHandle");
962
- const expectedPresignatureId = requireString(payload.expectedPresignatureId, "expectedPresignatureId");
963
- const entry = requireOpaqueMaterial(materialHandle, parseEcdsaClientPresignPoolIdentity(payload.poolIdentity));
964
- const actualPresignatureId = await presignatureId(entry.bigR33);
965
- if (actualPresignatureId !== expectedPresignatureId) {
966
- opaqueMaterials.delete(materialHandle);
967
- await destroyOpaqueMaterial(materialHandle, entry);
968
- throw new Error("ECDSA Client presign admission failed: binding_rejected");
969
- }
970
- if (entry.state.kind !== "pending_admission" && entry.state.kind !== "available") {
971
- throw new Error("ECDSA Client presign admission failed: invalid_state");
972
- }
973
- entry.state = { kind: "available" };
974
- return {
975
- kind: "ecdsa_client_presignature_admitted_v1",
976
- materialHandle,
977
- presignatureId: actualPresignatureId
978
- };
979
- }
980
- async function destroyPresignature(payload) {
981
- const materialHandle = requireString(payload.materialHandle, "materialHandle");
982
- const entry = requireOpaqueMaterial(materialHandle, parseEcdsaClientPresignPoolIdentity(payload.poolIdentity));
983
- opaqueMaterials.delete(materialHandle);
984
- await destroyOpaqueMaterial(materialHandle, entry);
985
- return { kind: "ecdsa_client_presignature_destroyed_v1", materialHandle };
986
- }
987
- async function reservePresignature(payload) {
988
- const materialHandle = requireString(payload.materialHandle, "materialHandle");
989
- const entry = requireOpaqueMaterial(materialHandle, parseEcdsaClientPresignPoolIdentity(payload.poolIdentity));
990
- if (entry.state.kind !== "available") {
991
- throw new Error("ECDSA Client presign reservation failed: invalid_state");
992
- }
993
- const leaseExpiresAtMs = requireFutureTimestamp(payload.leaseExpiresAtMs, "leaseExpiresAtMs");
994
- if (leaseExpiresAtMs > entry.expiresAtMs) {
995
- throw new Error("ECDSA Client presign reservation failed: material_expired");
996
- }
997
- entry.state = {
998
- kind: "reserved",
999
- requestBinding: requireString(payload.requestBinding, "requestBinding"),
1000
- reservationId: requireString(payload.reservationId, "reservationId"),
1001
- leaseExpiresAtMs
1002
- };
1003
- return { kind: "ecdsa_client_presignature_lifecycle_advanced_v1", materialHandle };
1004
- }
1005
- async function commitPresignature(payload) {
1006
- const materialHandle = requireString(payload.materialHandle, "materialHandle");
1007
- const entry = requireOpaqueMaterial(materialHandle, parseEcdsaClientPresignPoolIdentity(payload.poolIdentity));
1008
- const requestBinding = requireString(payload.requestBinding, "requestBinding");
1009
- const reservationId = requireString(payload.reservationId, "reservationId");
1010
- if (entry.state.kind !== "reserved" || entry.state.requestBinding !== requestBinding || entry.state.reservationId !== reservationId || Date.now() >= entry.state.leaseExpiresAtMs) {
1011
- throw new Error("ECDSA Client presign commit failed: binding_rejected");
1012
- }
1013
- entry.state = {
1014
- kind: "committed",
1015
- requestBinding,
1016
- reservationId,
1017
- leaseExpiresAtMs: entry.state.leaseExpiresAtMs
1018
- };
1019
- return { kind: "ecdsa_client_presignature_lifecycle_advanced_v1", materialHandle };
1020
- }
1021
- async function listAvailablePresignatures(payload) {
1022
- const poolIdentity = parseEcdsaClientPresignPoolIdentity(payload.poolIdentity);
1023
- const refs = [];
1024
- for (const [materialHandle, entry] of opaqueMaterials) {
1025
- if (entry.state.kind !== "available")
1026
- continue;
1027
- if (!equalEcdsaClientPresignPoolIdentity(entry.poolIdentity, poolIdentity))
1028
- continue;
1029
- if (Date.now() >= entry.expiresAtMs) {
1030
- opaqueMaterials.delete(materialHandle);
1031
- await destroyOpaqueMaterial(materialHandle, entry);
1032
- continue;
1033
- }
1034
- refs.push({
1035
- presignatureId: await presignatureId(entry.bigR33),
1036
- materialHandle,
1037
- bigR33: entry.bigR33.slice(0),
1038
- createdAtMs: entry.createdAtMs,
1039
- expiresAtMs: entry.expiresAtMs
1040
- });
1041
- }
1042
- return refs.sort((left, right) => left.createdAtMs - right.createdAtMs);
1043
- }
1044
- function attachControlChannel(value) {
1045
- if (isAttachEcdsaDerivationToPresignPort(value)) {
1046
- if (derivationPort) {
1047
- purgeAuthorityPort(derivationPort, "ECDSA derivation presign authority channel was replaced");
1048
- }
1049
- derivationPort?.close();
1050
- derivationPort = value.port;
1051
- derivationPort.onmessage = (event) => handleOpaqueAuthorityResponse(value.port, event);
1052
- derivationPort.onmessageerror = () => purgeAuthorityPort(value.port, "ECDSA derivation presign authority channel failed");
1053
- derivationPort.start();
1054
- return true;
1055
- }
1056
- if (isAttachLinkedHolderToPresignPort(value)) {
1057
- if (linkedHolderPort) {
1058
- purgeAuthorityPort(linkedHolderPort, "Linked holder ECDSA presign authority channel was replaced");
1059
- }
1060
- linkedHolderPort?.close();
1061
- linkedHolderPort = value.port;
1062
- linkedHolderPort.onmessage = (event) => handleOpaqueAuthorityResponse(value.port, event);
1063
- linkedHolderPort.onmessageerror = () => {
1064
- purgeAuthorityPort(value.port, "Linked holder ECDSA presign authority channel failed");
1065
- };
1066
- linkedHolderPort.start();
1067
- return true;
1068
- }
1069
- if (isAttachPresignToOnlinePort(value)) {
1070
- onlinePort?.close();
1071
- onlinePort = value.port;
1072
- onlinePort.onmessage = (event) => enqueueOnlineRequest(value.port, event);
1073
- onlinePort.start();
1074
- return true;
1075
- }
1076
- return false;
1077
- }
1078
- async function computeOnlineShare(payload) {
1079
- const materialHandle = requireString(payload.materialHandle, "materialHandle");
1080
- const entry = requireOpaqueMaterial(materialHandle, parseEcdsaClientPresignPoolIdentity(payload.poolIdentity));
1081
- const requestBinding = requireString(payload.requestBinding, "requestBinding");
1082
- const reservationId = requireString(payload.reservationId, "reservationId");
1083
- if (entry.state.kind !== "committed" || entry.state.requestBinding !== requestBinding || entry.state.reservationId !== reservationId || Date.now() >= entry.state.leaseExpiresAtMs) {
1084
- throw new Error("ECDSA Client presign material unavailable: binding_rejected");
1085
- }
1086
- const suppliedGroupPublicKey33 = new Uint8Array(payload.groupPublicKey33);
1087
- if (!equalPublicBytes(entry.groupPublicKey33, suppliedGroupPublicKey33)) {
1088
- opaqueMaterials.delete(materialHandle);
1089
- await destroyOpaqueMaterial(materialHandle, entry);
1090
- throw new Error("ECDSA Client presign material unavailable: binding_rejected");
1091
- }
1092
- const buffers = [
1093
- copyArrayBuffer(payload.groupPublicKey33),
1094
- copyArrayBuffer(payload.expectedPresignBigR33),
1095
- copyArrayBuffer(payload.digest32),
1096
- copyArrayBuffer(payload.clientRerandomizationContribution32),
1097
- copyArrayBuffer(payload.signingWorkerRerandomizationContribution32)
1098
- ];
1099
- try {
1100
- const result = await requestOpaqueAuthority(entry.authorityPort, {
1101
- kind: "opaque_ecdsa_online_compute_v1",
1102
- requestId: randomHandle("opaque-ecdsa-online"),
1103
- materialHandle,
1104
- groupPublicKey33: buffers[0],
1105
- expectedPresignBigR33: buffers[1],
1106
- digest32: buffers[2],
1107
- clientRerandomizationContribution32: buffers[3],
1108
- signingWorkerRerandomizationContribution32: buffers[4]
1109
- }, buffers);
1110
- if (result.kind !== "online_share") {
1111
- throw new Error("Opaque ECDSA authority returned an invalid online result");
1112
- }
1113
- opaqueMaterials.delete(materialHandle);
1114
- return result.signatureShare32;
1115
- } catch (error) {
1116
- opaqueMaterials.delete(materialHandle);
1117
- await destroyOpaqueMaterial(materialHandle, entry);
1118
- throw error;
1119
- }
1120
- }
1121
- function equalPublicBytes(left, right) {
1122
- if (left.length !== right.length)
1123
- return false;
1124
- for (let index = 0;index < left.length; index += 1) {
1125
- if (left[index] !== right[index])
1126
- return false;
1127
- }
1128
- return true;
1129
- }
1130
- async function retireOpaquePool(payload) {
1131
- const poolIdentity = parseEcdsaClientPresignPoolIdentity(payload.poolIdentity);
1132
- let retiredCount = 0;
1133
- for (const [materialHandle, entry] of opaqueMaterials) {
1134
- if (!equalEcdsaClientPresignPoolIdentity(entry.poolIdentity, poolIdentity))
1135
- continue;
1136
- opaqueMaterials.delete(materialHandle);
1137
- await destroyOpaqueMaterial(materialHandle, entry);
1138
- retiredCount += 1;
1139
- }
1140
- return {
1141
- kind: "ecdsa_client_presignature_pool_retired_v1",
1142
- poolIdentity,
1143
- reason: payload.reason,
1144
- retiredCount
1145
- };
1146
- }
1147
- async function handleOnlineRequest(port, request) {
1148
- try {
1149
- switch (request.type) {
1150
- case EcdsaOnlineClientRequestType.ComputeSignatureShare: {
1151
- const signatureShare32 = await computeOnlineShare(request.payload);
1152
- port.postMessage({
1153
- id: request.id,
1154
- ok: true,
1155
- result: {
1156
- type: EcdsaOnlineClientResponseType.ComputeSignatureShareSuccess,
1157
- payload: signatureShare32
1158
- }
1159
- }, [signatureShare32]);
1160
- return;
1161
- }
1162
- case EcdsaOnlineClientRequestType.RetirePool:
1163
- port.postMessage({
1164
- id: request.id,
1165
- ok: true,
1166
- result: {
1167
- type: EcdsaOnlineClientResponseType.RetirePoolSuccess,
1168
- payload: await retireOpaquePool(request.payload)
1169
- }
1170
- });
1171
- return;
1172
- }
1173
- } catch (error) {
1174
- try {
1175
- port.postMessage({ id: request.id, ok: false, error: safeErrorMessage(error) });
1176
- } catch {}
1177
- }
1178
- }
1179
- function enqueueOnlineRequest(port, event) {
1180
- handleOnlineRequest(port, event.data);
1181
- }
1182
- async function handleRpcRequest(request) {
1183
- try {
1184
- switch (request.type) {
1185
- case EcdsaPresignClientRequestType.SessionInit:
1186
- self.postMessage({
1187
- id: request.id,
1188
- ok: true,
1189
- result: {
1190
- type: EcdsaPresignClientResponseType.SessionInitSuccess,
1191
- payload: await initializeSession(request.payload)
1192
- }
1193
- });
1194
- return;
1195
- case EcdsaPresignClientRequestType.SessionStep:
1196
- self.postMessage({
1197
- id: request.id,
1198
- ok: true,
1199
- result: {
1200
- type: EcdsaPresignClientResponseType.SessionStepSuccess,
1201
- payload: await stepSession(request.payload)
1202
- }
1203
- });
1204
- return;
1205
- case EcdsaPresignClientRequestType.SessionAbort:
1206
- self.postMessage({
1207
- id: request.id,
1208
- ok: true,
1209
- result: {
1210
- type: EcdsaPresignClientResponseType.SessionAbortSuccess,
1211
- payload: await abortSession(request.payload)
1212
- }
1213
- });
1214
- return;
1215
- case EcdsaPresignClientRequestType.Admit:
1216
- self.postMessage({
1217
- id: request.id,
1218
- ok: true,
1219
- result: {
1220
- type: EcdsaPresignClientResponseType.AdmitSuccess,
1221
- payload: await admitPresignature(request.payload)
1222
- }
1223
- });
1224
- return;
1225
- case EcdsaPresignClientRequestType.Destroy:
1226
- self.postMessage({
1227
- id: request.id,
1228
- ok: true,
1229
- result: {
1230
- type: EcdsaPresignClientResponseType.DestroySuccess,
1231
- payload: await destroyPresignature(request.payload)
1232
- }
1233
- });
1234
- return;
1235
- case EcdsaPresignClientRequestType.Reserve:
1236
- self.postMessage({
1237
- id: request.id,
1238
- ok: true,
1239
- result: {
1240
- type: EcdsaPresignClientResponseType.ReserveSuccess,
1241
- payload: await reservePresignature(request.payload)
1242
- }
1243
- });
1244
- return;
1245
- case EcdsaPresignClientRequestType.Commit:
1246
- self.postMessage({
1247
- id: request.id,
1248
- ok: true,
1249
- result: {
1250
- type: EcdsaPresignClientResponseType.CommitSuccess,
1251
- payload: await commitPresignature(request.payload)
1252
- }
1253
- });
1254
- return;
1255
- case EcdsaPresignClientRequestType.ListAvailable:
1256
- self.postMessage({
1257
- id: request.id,
1258
- ok: true,
1259
- result: {
1260
- type: EcdsaPresignClientResponseType.ListAvailableSuccess,
1261
- payload: await listAvailablePresignatures(request.payload)
1262
- }
1263
- });
1264
- return;
1265
- }
1266
- } catch (error) {
1267
- self.postMessage({ id: request.id, ok: false, error: safeErrorMessage(error) });
1268
- }
1269
- }
1270
- function processMessage(event) {
1271
- if (attachControlChannel(event.data))
1272
- return;
1273
- const request = event.data;
1274
- messageQueue = messageQueue.then(() => handleRpcRequest(request));
1275
- }
1276
- self.addEventListener("message", processMessage);
1277
- self.postMessage({ type: WorkerControlMessage.WORKER_READY, ready: true });
1
+ function n4($){if($.length>=255)throw new TypeError("Alphabet too long");let J=new Uint8Array(256);for(let Y=0;Y<J.length;Y++)J[Y]=255;for(let Y=0;Y<$.length;Y++){let W=$.charAt(Y),B=W.charCodeAt(0);if(J[B]!==255)throw new TypeError(W+" is ambiguous");J[B]=Y}let C=$.length,X=$.charAt(0),Q=Math.log(C)/Math.log(256),O=Math.log(256)/Math.log(C);function G(Y){if(Y instanceof Uint8Array);else if(ArrayBuffer.isView(Y))Y=new Uint8Array(Y.buffer,Y.byteOffset,Y.byteLength);else if(Array.isArray(Y))Y=Uint8Array.from(Y);if(!(Y instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(Y.length===0)return"";let W=0,B=0,V=0,P=Y.length;while(V!==P&&Y[V]===0)V++,W++;let M=(P-V)*O+1>>>0,H=new Uint8Array(M);while(V!==P){let S=Y[V],_=0;for(let A=M-1;(S!==0||_<B)&&A!==-1;A--,_++)S+=256*H[A]>>>0,H[A]=S%C>>>0,S=S/C>>>0;if(S!==0)throw new Error("Non-zero carry");B=_,V++}let K=M-B;while(K!==M&&H[K]===0)K++;let o=X.repeat(W);for(;K<M;++K)o+=$.charAt(H[K]);return o}function E(Y){if(typeof Y!=="string")throw new TypeError("Expected String");if(Y.length===0)return new Uint8Array;let W=0,B=0,V=0;while(Y[W]===X)B++,W++;let P=(Y.length-W)*Q+1>>>0,M=new Uint8Array(P);while(W<Y.length){let S=Y.charCodeAt(W);if(S>255)return;let _=J[S];if(_===255)return;let A=0;for(let i=P-1;(_!==0||A<V)&&i!==-1;i--,A++)_+=C*M[i]>>>0,M[i]=_%256>>>0,_=_/256>>>0;if(_!==0)throw new Error("Non-zero carry");V=A,W++}let H=P-V;while(H!==P&&M[H]===0)H++;let K=new Uint8Array(B+(P-H)),o=B;while(H!==P)K[o++]=M[H++];return K}function N(Y){let W=E(Y);if(W)return W;throw new Error("Non-base"+C+" character")}return{encode:G,decodeUnsafe:E,decode:N}}var D4=n4;var b4="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",c4=D4(b4);function d4($){try{if(typeof $==="string")return $;if($&&typeof $.message==="string")return $.message;return String($??"")}catch{return""}}function q($){return`${$}B64u`}var o4=["nearPrivateKey","near_private_key","privateKey","private_key",q("seed"),"seed_b64u",q("canonicalSeed"),"canonical_seed_b64u",q("xClientBase"),"x_client_base_b64u",q("clientOutputMask"),"client_output_mask_b64u",q("clientRecoverableSecret"),"client_recoverable_secret_b64u","prfOutput","prf_output","prfFirst","prf_first",q("prfFirst"),"prf_first_b64u","prfSecond","prf_second",q("prfSecond"),"prf_second_b64u",q("signingShare32"),"signing_share32_b64u",q("clientNonceHandle"),"client_nonce_handle_b64u"];function i4($,J){let C=J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return $.replace(new RegExp(`("${C}"\\s*:\\s*")([^"]*)(")`,"g"),"$1[REDACTED]$3")}function t4($,J){let C=J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return $.replace(new RegExp(`\\b(${C}\\s*[=:]\\s*)([^\\s,}\\]]+)`,"g"),"$1[REDACTED]")}function r4($){let J=String($||"");for(let C of o4)J=i4(J,C),J=t4(J,C);return J}function X4($){return r4(d4($))}class Q4{promise;resolveValue=null;rejectValue=null;constructor(){this.promise=new Promise(this.capture)}resolve($){if(!this.resolveValue)throw new Error("Worker deferred resolver is unavailable");this.resolveValue($)}reject($){if(!this.rejectValue)throw new Error("Worker deferred rejecter is unavailable");this.rejectValue($)}capture=($,J)=>{this.resolveValue=$,this.rejectValue=J}}var L4={WORKER_READY:"WORKER_READY"};var R={SessionInit:71000,SessionStep:71001,SessionAbort:71002,Admit:71003,Destroy:71004,Reserve:71005,Commit:71006,ListAvailable:71007},I={SessionInitSuccess:71100,SessionStepSuccess:71101,SessionAbortSuccess:71102,AdmitSuccess:71103,DestroySuccess:71104,ReserveSuccess:71105,CommitSuccess:71106,ListAvailableSuccess:71107},Y4={ComputeSignatureShare:72000,RetirePool:72001},Z4={ComputeSignatureShareSuccess:72100,RetirePoolSuccess:72101};function a4($,J){if($==null)return{ok:!1,error:{code:"missing",message:`${J} is required`}};if(typeof $!=="string")return{ok:!1,error:{code:"invalid",message:`${J} must be a string`}};let C=$.trim();if(!C)return{ok:!1,error:{code:"missing",message:`${J} is required`}};return{ok:!0,value:C}}function t($){return a4($,"rootShareEpoch")}function O4($){return $!==null&&typeof $==="object"}var Y$={vaultAccess:"vault_access",nearEd25519MpcSigning:"near_ed25519_mpc_signing",evmEcdsaMpcSigning:"evm_ecdsa_mpc_signing"},Z$={proxyUse:"vault.proxy_use",reveal:"vault.reveal"},G$={signTransaction:"near.sign_transaction",signDelegateAction:"near.sign_delegate_action",signNep413Message:"near.sign_nep413_message",exportKey:"near.export_key"},P4={signTransaction:"evm.sign_transaction",exportKey:"evm.export_key"};var U$={seamsSession:"seams_session",passkeyAssertion:"passkey_assertion",emailOtp:"email_otp"};var UJ=Object.values(Y$),EJ=Object.values(Z$),WJ=Object.values(G$),FJ=Object.values(P4),NJ=Object.values(U$);var VJ=Object.freeze(["export_keys","link_devices","revoke_devices","sign"]),HJ=Object.freeze(["sign"]),E$=["export_keys","link_devices","revoke_devices","sign"],_J=new Set(E$),DJ=Symbol("canonicalPermissionSetBrand");var F$=["alpine","amber","azure","brisk","bright","calm","cedar","cobalt","copper","coral","crimson","crystal","dawn","deep","dusky","evergreen","fair","fern","frost","gentle","glacier","glowing","golden","harbor","humble","indigo","ivory","jade","keen","lunar","maple","misty","mossy","noble","ocean","opal","polar","quiet","rapid","redwood","river","royal","sage","scarlet","serene","silver","solar","steady","stone","swift","tranquil","twilight","umber","verdant","vibrant","violet","vivid","warm","wild","willow","winter","woodland","young","zephyr"],N$=["anchor","arbor","atlas","aurora","badger","beacon","bloom","brook","canyon","cascade","comet","cove","crane","delta","dune","eagle","ember","falcon","feather","fjord","forest","galaxy","garden","giant","grove","harvest","heron","horizon","island","lagoon","lantern","lark","meadow","meteor","monolith","nebula","oasis","orchid","otter","peak","pebble","phoenix","pine","prism","quartz","raven","reef","ridge","sable","sequoia","shore","solstice","sparrow","star","summit","tempo","thunder","tundra","valley","vermillion","voyage","wave","wren","zenith"];var XC=new Set(F$),QC=new Set(N$);var R$=["version","purpose","linkSessionId","linkPublicKeyB64u","devicePublicKeyB64u","requestedPermission","targetFactor","issuedAtMs","expiresAtMs"],V8=[...R$,"targetEmail"],I$=["v","s","l","d","a","f","i","e"],H8=[...I$,"t"];var k$=["kind","linkSessionId","walletId","enrollmentId","deviceId","linkPublicKeyB64u","devicePublicKeyB64u","permission","targetFactor","ownerAuthorization","approvedAtMs","expiresAtMs"],_8=[...k$,"sourceContribution"];var k4=["kind","linkSessionId","walletId","enrollmentId","deviceId","walletAuthMethodId","targetFactor","targetPreparationDigestB64u","ordinarySignerMaterialRecipientRequests","registeredAtMs"],D8=[...k4,"webauthnRegistration"],A$=[...k4,"targetEmail","emailOtpVerificationGrant"],L8=[...A$,"emailOtpEnrollment"],F4=["kind","linkSessionId","walletId","enrollmentId","deviceId","deliveryRecipientPublicKey65B64u","walletAuthMethodId","ed25519ExportRoot","targetFactor","ordinarySignerMaterialRecipientRequirements","issuedAtMs","expiresAtMs"];var j8=[...F4,"passkeyCreationOptions","passkeyConfigurationDigestB64u"],O8=[...F4,"targetEmail","enrollment","baseWalletAuthMethodId"],B8=[...F4,"targetEmail","enrollment"],x$=["kind","grantId","grantToken","challengeId","linkSessionId","walletId","enrollmentId","deviceId","targetPreparationDigestB64u","targetEmail","enrollment","emailHashHex","registrationAuthorityId","providerUserId","authorityDigestB64u","issuedAtMs","expiresAtMs"],P8=[...x$,"baseWalletAuthMethodId"];var y$=BigInt("0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff"),M8=y$-3n,z8=BigInt("0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b");var N4={AttachDerivationToPresign:"attach_ecdsa_derivation_to_presign_v1",AttachLinkedHolderToPresign:"attach_linked_holder_to_ecdsa_presign_v1",AttachPresignToOnline:"attach_ecdsa_presign_to_online_v1"};var _Q="A".repeat(43);function T4($){if(!O4($))return null;return{kind:$.kind,port:$.port}}function y4($){let J=T4($);return J?.kind===N4.AttachDerivationToPresign&&J.port instanceof MessagePort}function m4($){let J=T4($);return J?.kind===N4.AttachLinkedHolderToPresign&&J.port instanceof MessagePort}function h4($){let J=T4($);return J?.kind===N4.AttachPresignToOnline&&J.port instanceof MessagePort}var w4="seams/router-ab-ecdsa-presign/fixed-2of2/v1";function h($,J){if(typeof $!=="string"||!$.trim())throw new Error(`${J} is required`);return $}function k($){if(typeof $!=="object"||$===null)throw new Error("poolIdentity is required");let J=$;if(J.pairRole!=="client")throw new Error("poolIdentity.pairRole must be client");if(J.protocolId!==w4)throw new Error("poolIdentity.protocolId is unsupported");return{poolKey:h(J.poolKey,"poolIdentity.poolKey"),materialActivationId:h(J.materialActivationId,"poolIdentity.materialActivationId"),capability:h(J.capability,"poolIdentity.capability"),keyBinding:h(J.keyBinding,"poolIdentity.keyBinding"),walletId:h(J.walletId,"poolIdentity.walletId"),signingScopeB64u:h(J.signingScopeB64u,"poolIdentity.signingScopeB64u"),pairRole:"client",keyEpoch:h(J.keyEpoch,"poolIdentity.keyEpoch"),activationEpoch:p$(J.activationEpoch),protocolId:w4}}function p$($){let J=t($);if(!J.ok)throw new Error("poolIdentity.activationEpoch is invalid");return J.value}function $4($,J){return $.poolKey===J.poolKey&&$.materialActivationId===J.materialActivationId&&$.capability===J.capability&&$.keyBinding===J.keyBinding&&$.walletId===J.walletId&&$.signingScopeB64u===J.signingScopeB64u&&$.pairRole===J.pairRole&&$.keyEpoch===J.keyEpoch&&$.activationEpoch===J.activationEpoch&&$.protocolId===J.protocolId}var F=new Map,p=new Map,z=new Map,x=new Map,L=null,j=null,J4=null,f4=Promise.resolve();function v($){let J=new Uint8Array(16);crypto.getRandomValues(J);let C="";for(let X of J)C+=X.toString(16).padStart(2,"0");return`${$}-${C}`}function p4($,J){if($ instanceof ArrayBuffer)return new Uint8Array($);if($ instanceof Uint8Array)return $;if(ArrayBuffer.isView($))return new Uint8Array($.buffer,$.byteOffset,$.byteLength);throw new Error(`${J} must be bytes`)}function Z($,J){let C=String($??"").trim();if(!C)throw new Error(`${J} is required`);return C}function v4($,J){let C=Number($);if(!Number.isSafeInteger(C)||C<=Date.now())throw new Error(`${J} must be a future timestamp`);return C}function g4($,J){let C=J.data;if(C.kind!=="opaque_ecdsa_presign_authority_result_v1")return;let X=p.get(C.requestId);if(!X||X.port!==$)return;if(p.delete(C.requestId),!C.ok){X.deferred.reject(new Error(C.error));return}X.deferred.resolve(C.result)}function C4($,J){v$($,J);for(let[C,X]of z){if(X!==$)continue;z.delete(C),x.delete(C)}for(let[C,X]of F)if(X.authorityPort===$)F.delete(C)}function v$($,J){for(let[C,X]of p){if(X.port!==$)continue;p.delete(C),X.deferred.reject(new Error(J))}}function s($,J,C=[]){let X=new Q4;p.set(J.requestId,{port:$,deferred:X});try{$.postMessage(J,C)}catch(Q){p.delete(J.requestId),X.reject(Q instanceof Error?Q:new Error(String(Q)))}return X.promise}async function s$($){let J=Z($.sessionId,"sessionId");if(z.has(J))await _4({sessionId:J});let C=k($.poolIdentity),X=p4($.groupPublicKey33,"groupPublicKey33");if(X.length!==33)throw new Error("groupPublicKey33 must be 33 bytes");let Q=v4($.materialExpiresAtMs,"materialExpiresAtMs");switch($.authority.kind){case"role_local_derivation_handle":{if(!L)throw new Error("ECDSA presign client has no derivation material channel");let O=v("ecdsa-role-local-presign"),G=X.slice().buffer,E=await s(L,{kind:"opaque_ecdsa_presign_session_init_v1",requestId:O,sessionId:J,authority:{kind:"role_local_derivation_handle",materialHandle:Z($.authority.materialHandle,"materialHandle"),material:$.authority.material},poolIdentity:C,groupPublicKey33:G,materialExpiresAtMs:Q},[G]),N=V4(E);if(H4({progress:N,authorityPort:L,poolIdentity:C,groupPublicKey33:X,expiresAtMs:Q}),N.event!=="presign_done")z.set(J,L),x.set(J,{poolIdentity:C,groupPublicKey33:X.slice(),expiresAtMs:Q});return{authority:{kind:"role_local_derivation_handle"},progress:N}}case"linked_holder_signing_material":{if(!j)throw new Error("ECDSA presign client has no linked holder material channel");let O=v("linked-holder-ecdsa-presign"),G=X.slice().buffer,E=await s(j,{kind:"opaque_ecdsa_presign_session_init_v1",requestId:O,sessionId:J,authority:{kind:"linked_holder_signing_material",holderHandleId:Z($.authority.holderHandleId,"holderHandleId")},poolIdentity:C,groupPublicKey33:G,materialExpiresAtMs:Q},[G]),N=V4(E);if(H4({progress:N,authorityPort:j,poolIdentity:C,groupPublicKey33:X,expiresAtMs:Q}),N.event!=="presign_done")z.set(J,j),x.set(J,{poolIdentity:C,groupPublicKey33:X.slice(),expiresAtMs:Q});return{authority:{kind:"linked_holder_signing_material"},progress:N}}default:throw $.authority,new Error("Unsupported ECDSA presign authority")}}async function n$($){let J=Z($.sessionId,"sessionId"),C=z.get(J);if(C){let X=x.get(J);if(!X||Date.now()>=X.expiresAtMs)throw await _4({sessionId:J}),new Error("Opaque ECDSA presign session expired");try{let Q=v("opaque-ecdsa-presign-step"),O=$.incomingMessages.map(g),G=await s(C,{kind:"opaque_ecdsa_presign_session_step_v1",requestId:Q,sessionId:J,stage:$.stage,incomingMessages:O},O),E=V4(G);if(E.event==="presign_done"){let N=x.get(J);if(!N)throw new Error("Opaque ECDSA presign session binding is unknown");H4({progress:E,authorityPort:C,poolIdentity:N.poolIdentity,groupPublicKey33:N.groupPublicKey33,expiresAtMs:N.expiresAtMs}),z.delete(J),x.delete(J)}return E}catch(Q){throw z.delete(J),x.delete(J),Q}}throw new Error("Unknown ECDSA Client presign session")}async function _4($){let J=Z($.sessionId,"sessionId"),C=z.get(J);if(C){z.delete(J),x.delete(J);let X=await s(C,{kind:"opaque_ecdsa_presign_session_abort_v1",requestId:v("opaque-ecdsa-presign-abort"),sessionId:J});if(X.kind!=="aborted"||X.sessionId!==J)throw new Error("Opaque ECDSA presign authority returned an invalid abort result");return{kind:"threshold_ecdsa_presign_session_aborted",sessionId:J}}return{kind:"threshold_ecdsa_presign_session_aborted",sessionId:J}}function V4($){if($.kind!=="progress")throw new Error("Opaque ECDSA presign authority returned an invalid progress result");return $.progress}function g($){return $.slice(0)}async function s4($){let J=new Uint8Array(await crypto.subtle.digest("SHA-256",$)),C="";for(let X of J)C+=String.fromCharCode(X);return`presig-${btoa(C).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}`}function H4($){if($.progress.event!=="presign_done")return;let J=Z($.progress.presignatureHandle,"presignatureHandle"),C=p4($.progress.presignatureBigR33,"presignatureBigR33");if(C.length!==33)throw new Error("presignatureBigR33 must be 33 bytes");F.set(J,{authorityPort:$.authorityPort,poolIdentity:$.poolIdentity,groupPublicKey33:$.groupPublicKey33.slice(),bigR33:C.slice().buffer,createdAtMs:Date.now(),expiresAtMs:$.expiresAtMs,state:{kind:"pending_admission"}})}function d($,J){let C=F.get($);if(!C)throw new Error("ECDSA Client presign material unavailable: not_found");if(!$4(C.poolIdentity,J))throw F.delete($),y($,C),new Error("ECDSA Client presign material unavailable: binding_rejected");if(Date.now()>=C.expiresAtMs)throw F.delete($),y($,C),new Error("ECDSA Client presign material unavailable: material_expired");return C}async function y($,J){await s(J.authorityPort,{kind:"opaque_ecdsa_presign_material_destroy_v1",requestId:v("opaque-ecdsa-presign-destroy"),materialHandle:$}).catch(()=>{return})}async function b$($){let J=Z($.materialHandle,"materialHandle"),C=Z($.expectedPresignatureId,"expectedPresignatureId"),X=d(J,k($.poolIdentity)),Q=await s4(X.bigR33);if(Q!==C)throw F.delete(J),await y(J,X),new Error("ECDSA Client presign admission failed: binding_rejected");if(X.state.kind!=="pending_admission"&&X.state.kind!=="available")throw new Error("ECDSA Client presign admission failed: invalid_state");return X.state={kind:"available"},{kind:"ecdsa_client_presignature_admitted_v1",materialHandle:J,presignatureId:Q}}async function c$($){let J=Z($.materialHandle,"materialHandle"),C=d(J,k($.poolIdentity));return F.delete(J),await y(J,C),{kind:"ecdsa_client_presignature_destroyed_v1",materialHandle:J}}async function u$($){let J=Z($.materialHandle,"materialHandle"),C=d(J,k($.poolIdentity));if(C.state.kind!=="available")throw new Error("ECDSA Client presign reservation failed: invalid_state");let X=v4($.leaseExpiresAtMs,"leaseExpiresAtMs");if(X>C.expiresAtMs)throw new Error("ECDSA Client presign reservation failed: material_expired");return C.state={kind:"reserved",requestBinding:Z($.requestBinding,"requestBinding"),reservationId:Z($.reservationId,"reservationId"),leaseExpiresAtMs:X},{kind:"ecdsa_client_presignature_lifecycle_advanced_v1",materialHandle:J}}async function d$($){let J=Z($.materialHandle,"materialHandle"),C=d(J,k($.poolIdentity)),X=Z($.requestBinding,"requestBinding"),Q=Z($.reservationId,"reservationId");if(C.state.kind!=="reserved"||C.state.requestBinding!==X||C.state.reservationId!==Q||Date.now()>=C.state.leaseExpiresAtMs)throw new Error("ECDSA Client presign commit failed: binding_rejected");return C.state={kind:"committed",requestBinding:X,reservationId:Q,leaseExpiresAtMs:C.state.leaseExpiresAtMs},{kind:"ecdsa_client_presignature_lifecycle_advanced_v1",materialHandle:J}}async function o$($){let J=k($.poolIdentity),C=[];for(let[X,Q]of F){if(Q.state.kind!=="available")continue;if(!$4(Q.poolIdentity,J))continue;if(Date.now()>=Q.expiresAtMs){F.delete(X),await y(X,Q);continue}C.push({presignatureId:await s4(Q.bigR33),materialHandle:X,bigR33:Q.bigR33.slice(0),createdAtMs:Q.createdAtMs,expiresAtMs:Q.expiresAtMs})}return C.sort((X,Q)=>X.createdAtMs-Q.createdAtMs)}function i$($){if(y4($)){if(L)C4(L,"ECDSA derivation presign authority channel was replaced");return L?.close(),L=$.port,L.onmessage=(J)=>g4($.port,J),L.onmessageerror=()=>C4($.port,"ECDSA derivation presign authority channel failed"),L.start(),!0}if(m4($)){if(j)C4(j,"Linked holder ECDSA presign authority channel was replaced");return j?.close(),j=$.port,j.onmessage=(J)=>g4($.port,J),j.onmessageerror=()=>{C4($.port,"Linked holder ECDSA presign authority channel failed")},j.start(),!0}if(h4($))return J4?.close(),J4=$.port,J4.onmessage=(J)=>e$($.port,J),J4.start(),!0;return!1}async function t$($){let J=Z($.materialHandle,"materialHandle"),C=d(J,k($.poolIdentity)),X=Z($.requestBinding,"requestBinding"),Q=Z($.reservationId,"reservationId");if(C.state.kind!=="committed"||C.state.requestBinding!==X||C.state.reservationId!==Q||Date.now()>=C.state.leaseExpiresAtMs)throw new Error("ECDSA Client presign material unavailable: binding_rejected");let O=new Uint8Array($.groupPublicKey33);if(!r$(C.groupPublicKey33,O))throw F.delete(J),await y(J,C),new Error("ECDSA Client presign material unavailable: binding_rejected");let G=[g($.groupPublicKey33),g($.expectedPresignBigR33),g($.digest32),g($.clientRerandomizationContribution32),g($.signingWorkerRerandomizationContribution32)];try{let E=await s(C.authorityPort,{kind:"opaque_ecdsa_online_compute_v1",requestId:v("opaque-ecdsa-online"),materialHandle:J,groupPublicKey33:G[0],expectedPresignBigR33:G[1],digest32:G[2],clientRerandomizationContribution32:G[3],signingWorkerRerandomizationContribution32:G[4]},G);if(E.kind!=="online_share")throw new Error("Opaque ECDSA authority returned an invalid online result");return F.delete(J),E.signatureShare32}catch(E){throw F.delete(J),await y(J,C),E}}function r$($,J){if($.length!==J.length)return!1;for(let C=0;C<$.length;C+=1)if($[C]!==J[C])return!1;return!0}async function a$($){let J=k($.poolIdentity),C=0;for(let[X,Q]of F){if(!$4(Q.poolIdentity,J))continue;F.delete(X),await y(X,Q),C+=1}return{kind:"ecdsa_client_presignature_pool_retired_v1",poolIdentity:J,reason:$.reason,retiredCount:C}}async function l$($,J){try{switch(J.type){case Y4.ComputeSignatureShare:{let C=await t$(J.payload);$.postMessage({id:J.id,ok:!0,result:{type:Z4.ComputeSignatureShareSuccess,payload:C}},[C]);return}case Y4.RetirePool:$.postMessage({id:J.id,ok:!0,result:{type:Z4.RetirePoolSuccess,payload:await a$(J.payload)}});return}}catch(C){try{$.postMessage({id:J.id,ok:!1,error:X4(C)})}catch{}}}function e$($,J){l$($,J.data)}async function $0($){try{switch($.type){case R.SessionInit:self.postMessage({id:$.id,ok:!0,result:{type:I.SessionInitSuccess,payload:await s$($.payload)}});return;case R.SessionStep:self.postMessage({id:$.id,ok:!0,result:{type:I.SessionStepSuccess,payload:await n$($.payload)}});return;case R.SessionAbort:self.postMessage({id:$.id,ok:!0,result:{type:I.SessionAbortSuccess,payload:await _4($.payload)}});return;case R.Admit:self.postMessage({id:$.id,ok:!0,result:{type:I.AdmitSuccess,payload:await b$($.payload)}});return;case R.Destroy:self.postMessage({id:$.id,ok:!0,result:{type:I.DestroySuccess,payload:await c$($.payload)}});return;case R.Reserve:self.postMessage({id:$.id,ok:!0,result:{type:I.ReserveSuccess,payload:await u$($.payload)}});return;case R.Commit:self.postMessage({id:$.id,ok:!0,result:{type:I.CommitSuccess,payload:await d$($.payload)}});return;case R.ListAvailable:self.postMessage({id:$.id,ok:!0,result:{type:I.ListAvailableSuccess,payload:await o$($.payload)}});return}}catch(J){self.postMessage({id:$.id,ok:!1,error:X4(J)})}}function J0($){if(i$($.data))return;let J=$.data;f4=f4.then(()=>$0(J))}self.addEventListener("message",J0);self.postMessage({type:L4.WORKER_READY,ready:!0});