@bcts/frost-hubert 1.0.0-beta.0 → 1.0.0-beta.2

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 (149) hide show
  1. package/README.md +1 -1
  2. package/dist/bin/frost.cjs +17 -19
  3. package/dist/bin/frost.cjs.map +1 -1
  4. package/dist/bin/frost.mjs +16 -17
  5. package/dist/bin/frost.mjs.map +1 -1
  6. package/dist/{busy-EZU7EKr6.cjs → busy-B_h0bNAJ.cjs} +1 -1
  7. package/dist/{busy-DkM2jAIZ.mjs.map → busy-B_h0bNAJ.cjs.map} +1 -1
  8. package/dist/{busy-DkM2jAIZ.mjs → busy-BlU8_pS2.mjs} +1 -1
  9. package/dist/{busy-EZU7EKr6.cjs.map → busy-BlU8_pS2.mjs.map} +1 -1
  10. package/dist/cmd/index.cjs +6 -7
  11. package/dist/cmd/index.d.cts +1 -1
  12. package/dist/cmd/index.d.mts +1 -1
  13. package/dist/cmd/index.mjs +5 -6
  14. package/dist/{cmd-Bw9_i2_f.cjs → cmd-Cd5Bmjy8.cjs} +26 -27
  15. package/dist/{cmd-Bw9_i2_f.cjs.map → cmd-Cd5Bmjy8.cjs.map} +1 -1
  16. package/dist/{cmd-CS1uJtuD.mjs → cmd-ChW3eHA8.mjs} +20 -21
  17. package/dist/{cmd-CS1uJtuD.mjs.map → cmd-ChW3eHA8.mjs.map} +1 -1
  18. package/dist/{common-DUWvtc08.mjs → common--IfAHVkl.mjs} +2 -2
  19. package/dist/{common-DUWvtc08.mjs.map → common--IfAHVkl.mjs.map} +1 -1
  20. package/dist/{common-lKP5EzHy.cjs → common-3msAx7hO.cjs} +4 -4
  21. package/dist/{common-lKP5EzHy.cjs.map → common-3msAx7hO.cjs.map} +1 -1
  22. package/dist/{common-CvH6dFvQ.mjs → common-4spC1kNw.mjs} +3 -3
  23. package/dist/{common-CvH6dFvQ.mjs.map → common-4spC1kNw.mjs.map} +1 -1
  24. package/dist/{common-lThIvJmZ.cjs → common-CeTqMwj0.cjs} +2 -3
  25. package/dist/{common-lThIvJmZ.cjs.map → common-CeTqMwj0.cjs.map} +1 -1
  26. package/dist/dkg/index.cjs +1 -2
  27. package/dist/dkg/index.cjs.map +1 -1
  28. package/dist/dkg/index.d.cts +1 -1
  29. package/dist/dkg/index.d.mts +1 -1
  30. package/dist/dkg/index.mjs +1 -1
  31. package/dist/dkg/index.mjs.map +1 -1
  32. package/dist/{finalize-CNTDj6aS.mjs → finalize-BAwtGCQW.mjs} +6 -6
  33. package/dist/{finalize-CNTDj6aS.mjs.map → finalize-BAwtGCQW.mjs.map} +1 -1
  34. package/dist/{finalize-BRgJK-Xv.cjs → finalize-BUUNWqKC.cjs} +9 -9
  35. package/dist/{finalize-BRgJK-Xv.cjs.map → finalize-BUUNWqKC.cjs.map} +1 -1
  36. package/dist/{finalize-IA01t_Qq.mjs → finalize-Bm5RZIox.mjs} +5 -5
  37. package/dist/{finalize-IA01t_Qq.mjs.map → finalize-Bm5RZIox.mjs.map} +1 -1
  38. package/dist/{finalize-EC3ikHQq.mjs → finalize-CELJsR4C.mjs} +6 -6
  39. package/dist/{finalize-EC3ikHQq.mjs.map → finalize-CELJsR4C.mjs.map} +1 -1
  40. package/dist/{finalize-UPyI1yb1.cjs → finalize-D091kTVy.cjs} +10 -10
  41. package/dist/{finalize-UPyI1yb1.cjs.map → finalize-D091kTVy.cjs.map} +1 -1
  42. package/dist/{finalize-BfLgzn8f.cjs → finalize-SzzTi9BL.cjs} +8 -8
  43. package/dist/{finalize-BfLgzn8f.cjs.map → finalize-SzzTi9BL.cjs.map} +1 -1
  44. package/dist/frost/index.cjs +2 -2
  45. package/dist/frost/index.cjs.map +1 -1
  46. package/dist/frost/index.d.cts.map +1 -1
  47. package/dist/frost/index.d.mts.map +1 -1
  48. package/dist/frost/index.mjs +1 -1
  49. package/dist/frost/index.mjs.map +1 -1
  50. package/dist/{index-F1iNEAJR.d.cts → index-BErX9AZF.d.cts} +3 -3
  51. package/dist/index-BErX9AZF.d.cts.map +1 -0
  52. package/dist/{index-B3c-80VS.d.cts → index-BaUVw4b1.d.mts} +2 -2
  53. package/dist/index-BaUVw4b1.d.mts.map +1 -0
  54. package/dist/{index-C8QeHNwa.d.cts → index-CD50Qtgw.d.cts} +1 -1
  55. package/dist/index-CD50Qtgw.d.cts.map +1 -0
  56. package/dist/{index-DVbWyOs7.d.mts → index-CD50Qtgw.d.mts} +1 -1
  57. package/dist/index-CD50Qtgw.d.mts.map +1 -0
  58. package/dist/{index-BgbSGpxn.d.mts → index-Drklne-Y.d.mts} +3 -3
  59. package/dist/index-Drklne-Y.d.mts.map +1 -0
  60. package/dist/{index-D3QTWkEm.d.mts → index-gkmZzEuD.d.cts} +2 -2
  61. package/dist/index-gkmZzEuD.d.cts.map +1 -0
  62. package/dist/index.cjs +7 -8
  63. package/dist/index.cjs.map +1 -1
  64. package/dist/index.d.cts +3 -3
  65. package/dist/index.d.cts.map +1 -1
  66. package/dist/index.d.mts +3 -3
  67. package/dist/index.d.mts.map +1 -1
  68. package/dist/index.mjs +6 -7
  69. package/dist/index.mjs.map +1 -1
  70. package/dist/{invite-DUTcfTgX.cjs → invite-5sYctfsS.cjs} +7 -7
  71. package/dist/{invite-DUTcfTgX.cjs.map → invite-5sYctfsS.cjs.map} +1 -1
  72. package/dist/{invite-RU-OXTNS.mjs → invite-DNlTkwzM.mjs} +5 -5
  73. package/dist/{invite-RU-OXTNS.mjs.map → invite-DNlTkwzM.mjs.map} +1 -1
  74. package/dist/{invite-5277FQVT.cjs → invite-T3L4N2m0.cjs} +8 -8
  75. package/dist/{invite-5277FQVT.cjs.map → invite-T3L4N2m0.cjs.map} +1 -1
  76. package/dist/{invite-IU4n0dq2.mjs → invite-vRv9LMEE.mjs} +4 -4
  77. package/dist/{invite-IU4n0dq2.mjs.map → invite-vRv9LMEE.mjs.map} +1 -1
  78. package/dist/{parallel-D6zc6VW4.mjs → parallel-PZiwHZT8.mjs} +1 -1
  79. package/dist/{parallel-D1R6ZGlY.cjs.map → parallel-PZiwHZT8.mjs.map} +1 -1
  80. package/dist/{parallel-D1R6ZGlY.cjs → parallel-szwYx-bi.cjs} +1 -1
  81. package/dist/{parallel-D6zc6VW4.mjs.map → parallel-szwYx-bi.cjs.map} +1 -1
  82. package/dist/{proposed-participant-Dm1Eq6mX.cjs → proposed-participant-BvHNnpcZ.cjs} +1 -2
  83. package/dist/{proposed-participant-Dm1Eq6mX.cjs.map → proposed-participant-BvHNnpcZ.cjs.map} +1 -1
  84. package/dist/{proposed-participant-cWM7iUrO.mjs → proposed-participant-Detb823_.mjs} +1 -1
  85. package/dist/{proposed-participant-cWM7iUrO.mjs.map → proposed-participant-Detb823_.mjs.map} +1 -1
  86. package/dist/{receive-DA_KQEgk.mjs → receive-Bzn87ahI.mjs} +6 -6
  87. package/dist/{receive-DA_KQEgk.mjs.map → receive-Bzn87ahI.mjs.map} +1 -1
  88. package/dist/{receive-D2Nn68L7.mjs → receive-C2Dwb_FQ.mjs} +5 -5
  89. package/dist/{receive-D2Nn68L7.mjs.map → receive-C2Dwb_FQ.mjs.map} +1 -1
  90. package/dist/{receive-kZMsXhbK.cjs → receive-Coqg6eFx.cjs} +9 -9
  91. package/dist/{receive-kZMsXhbK.cjs.map → receive-Coqg6eFx.cjs.map} +1 -1
  92. package/dist/{receive-CAI-x4II.cjs → receive-DZARudBa.cjs} +9 -9
  93. package/dist/{receive-CAI-x4II.cjs.map → receive-DZARudBa.cjs.map} +1 -1
  94. package/dist/registry/index.cjs +3 -3
  95. package/dist/registry/index.cjs.map +1 -1
  96. package/dist/registry/index.d.cts +1 -1
  97. package/dist/registry/index.d.mts +1 -1
  98. package/dist/registry/index.mjs.map +1 -1
  99. package/dist/{registry-9puTaRrD.cjs → registry-D-rFKk9R.cjs} +82 -5
  100. package/dist/registry-D-rFKk9R.cjs.map +1 -0
  101. package/dist/{registry-BpCwtrRt.mjs → registry-ycylEdoc.mjs} +74 -3
  102. package/dist/registry-ycylEdoc.mjs.map +1 -0
  103. package/dist/{round1-7v9LlE11.mjs → round1-BRgDPU4Y.mjs} +5 -5
  104. package/dist/{round1-7v9LlE11.mjs.map → round1-BRgDPU4Y.mjs.map} +1 -1
  105. package/dist/{round1-CWSXZx5R.cjs → round1-BwNBKLYm.cjs} +12 -12
  106. package/dist/{round1-CWSXZx5R.cjs.map → round1-BwNBKLYm.cjs.map} +1 -1
  107. package/dist/{round1-BHBjru1m.cjs → round1-C1IlXH-9.cjs} +8 -8
  108. package/dist/{round1-BHBjru1m.cjs.map → round1-C1IlXH-9.cjs.map} +1 -1
  109. package/dist/{round1-DQ0fnc1H.cjs → round1-CEbz7cnL.cjs} +10 -10
  110. package/dist/{round1-DQ0fnc1H.cjs.map → round1-CEbz7cnL.cjs.map} +1 -1
  111. package/dist/{round1-CcQCGlIT.mjs → round1-DL4N2QJ5.mjs} +6 -6
  112. package/dist/{round1-CcQCGlIT.mjs.map → round1-DL4N2QJ5.mjs.map} +1 -1
  113. package/dist/{round1-Cgm7j1kI.mjs → round1-DSaOFCar.mjs} +5 -5
  114. package/dist/{round1-Cgm7j1kI.mjs.map → round1-DSaOFCar.mjs.map} +1 -1
  115. package/dist/{round1-CMLKN2RR.mjs → round1-_fHip4H1.mjs} +7 -7
  116. package/dist/{round1-CMLKN2RR.mjs.map → round1-_fHip4H1.mjs.map} +1 -1
  117. package/dist/{round1-4Hyx8w0x.cjs → round1-ek-G6qVi.cjs} +8 -8
  118. package/dist/{round1-4Hyx8w0x.cjs.map → round1-ek-G6qVi.cjs.map} +1 -1
  119. package/dist/{round2-CdUT-AhH.cjs → round2-BD_0N7Ab.cjs} +8 -8
  120. package/dist/{round2-CdUT-AhH.cjs.map → round2-BD_0N7Ab.cjs.map} +1 -1
  121. package/dist/{round2-BkNRCXgS.mjs → round2-BLOgZeAo.mjs} +5 -5
  122. package/dist/{round2-BkNRCXgS.mjs.map → round2-BLOgZeAo.mjs.map} +1 -1
  123. package/dist/{round2-o2Q-GMbX.cjs → round2-C684Nir0.cjs} +10 -10
  124. package/dist/{round2-o2Q-GMbX.cjs.map → round2-C684Nir0.cjs.map} +1 -1
  125. package/dist/{round2-DOA3rnV-.mjs → round2-CU-yTXHT.mjs} +6 -6
  126. package/dist/{round2-DOA3rnV-.mjs.map → round2-CU-yTXHT.mjs.map} +1 -1
  127. package/dist/{round2-Bl2uK93U.mjs → round2-Cq2SD6F8.mjs} +5 -5
  128. package/dist/{round2-Bl2uK93U.mjs.map → round2-Cq2SD6F8.mjs.map} +1 -1
  129. package/dist/{round2-BWz9SQIi.cjs → round2-D8l1PUm5.cjs} +8 -8
  130. package/dist/{round2-BWz9SQIi.cjs.map → round2-D8l1PUm5.cjs.map} +1 -1
  131. package/dist/{round2-LylCa84n.cjs → round2-DhdFarwY.cjs} +10 -10
  132. package/dist/{round2-LylCa84n.cjs.map → round2-DhdFarwY.cjs.map} +1 -1
  133. package/dist/{round2-Dg24w-TU.mjs → round2-DmQvJDVj.mjs} +7 -7
  134. package/dist/{round2-Dg24w-TU.mjs.map → round2-DmQvJDVj.mjs.map} +1 -1
  135. package/package.json +16 -16
  136. package/dist/index-B3c-80VS.d.cts.map +0 -1
  137. package/dist/index-BgbSGpxn.d.mts.map +0 -1
  138. package/dist/index-C8QeHNwa.d.cts.map +0 -1
  139. package/dist/index-D3QTWkEm.d.mts.map +0 -1
  140. package/dist/index-DVbWyOs7.d.mts.map +0 -1
  141. package/dist/index-F1iNEAJR.d.cts.map +0 -1
  142. package/dist/registry-9puTaRrD.cjs.map +0 -1
  143. package/dist/registry-BpCwtrRt.mjs.map +0 -1
  144. package/dist/storage-B-Gu68-O.cjs +0 -79
  145. package/dist/storage-B-Gu68-O.cjs.map +0 -1
  146. package/dist/storage-Bkkliz0K.mjs +0 -74
  147. package/dist/storage-Bkkliz0K.mjs.map +0 -1
  148. /package/dist/{chunk-CZWwpsFl.cjs → rolldown-runtime-DakpK96I.cjs} +0 -0
  149. /package/dist/{chunk-CjcI7cDX.mjs → rolldown-runtime-z9aeyW2b.mjs} +0 -0
@@ -1,8 +1,8 @@
1
- import { n as __require, t as __exportAll } from "./chunk-CjcI7cDX.mjs";
1
+ import { n as __require, t as __exportAll } from "./rolldown-runtime-z9aeyW2b.mjs";
2
2
  import { PendingRequests, Registry, resolveRegistryPath } from "./registry/index.mjs";
3
- import { c as parseAridUr, n as isVerbose, t as groupStateDir } from "./common-CvH6dFvQ.mjs";
4
- import { n as putWithIndicator, t as getWithIndicator } from "./busy-DkM2jAIZ.mjs";
5
- import { f as parallelFetch, m as parallelSend, p as parallelFetchConfigWithTimeout } from "./parallel-D6zc6VW4.mjs";
3
+ import { c as parseAridUr, n as isVerbose, t as groupStateDir } from "./common-4spC1kNw.mjs";
4
+ import { n as putWithIndicator, t as getWithIndicator } from "./busy-BlU8_pS2.mjs";
5
+ import { f as parallelFetch, m as parallelSend, p as parallelFetchConfigWithTimeout } from "./parallel-PZiwHZT8.mjs";
6
6
  import { ARID, XID } from "@bcts/components";
7
7
  import { Envelope } from "@bcts/envelope";
8
8
  import { SealedRequest, SealedResponse } from "@bcts/gstp";
@@ -447,4 +447,4 @@ async function round2(client, options, cwd) {
447
447
  //#endregion
448
448
  export { round2 as a, validateAndExtractRound2Response as c, persistRound2Packages as i, collectRound2Parallel as n, round2_exports as o, dispatchFinalizeRequestsParallel as r, updatePendingForFinalizeFromCollection as s, buildFinalizeRequestForParticipant as t };
449
449
 
450
- //# sourceMappingURL=round2-Bl2uK93U.mjs.map
450
+ //# sourceMappingURL=round2-Cq2SD6F8.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"round2-Bl2uK93U.mjs","names":[],"sources":["../src/cmd/dkg/coordinator/round2.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * DKG coordinator round 2 command.\n *\n * Port of cmd/dkg/coordinator/round2.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport { ARID, type PrivateKeys, XID } from \"@bcts/components\";\nimport { Envelope } from \"@bcts/envelope\";\nimport { SealedRequest, SealedResponse } from \"@bcts/gstp\";\nimport type { XIDDocument } from \"@bcts/xid\";\n\nimport {\n type GroupRecord,\n PendingRequests,\n Registry,\n resolveRegistryPath,\n} from \"../../../registry/index.js\";\nimport { groupStateDir, isVerbose } from \"../../common.js\";\nimport {\n type CollectionResult,\n parallelFetch,\n parallelSend,\n type ParallelFetchConfig,\n parallelFetchConfigWithTimeout,\n} from \"../../parallel.js\";\nimport { type StorageClient } from \"../../storage.js\";\nimport { getWithIndicator, putWithIndicator } from \"../../busy.js\";\nimport { parseAridUr } from \"../common.js\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/**\n * Options for the DKG round2 command.\n */\nexport interface DkgRound2Options {\n registryPath?: string;\n groupId: string;\n parallel?: boolean;\n timeoutSeconds?: number;\n verbose?: boolean;\n preview?: boolean;\n}\n\n/**\n * Result of the DKG round2 command.\n */\nexport interface DkgRound2Result {\n accepted: number;\n rejected: number;\n errors: number;\n timeouts: number;\n displayPath?: string;\n}\n\n/**\n * Data extracted from a successful Round 2 response.\n *\n * Port of `struct Round2ResponseData` from round2.rs lines 601-604.\n */\nexport interface Round2ResponseData {\n packages: [XID, unknown][];\n nextResponseArid: ARID;\n}\n\n/**\n * Round 2 collection result (for sequential path).\n *\n * Port of `struct Round2Collection` from round2.rs lines 206-213.\n */\ninterface Round2Collection {\n packages: Map<string, [XID, unknown][]>; // Map<XID.urString(), [recipient XID, package][]>\n nextResponseArids: [XID, ARID][];\n displayPath: string;\n}\n\n/**\n * Entry for a collected Round 2 response.\n *\n * Port of `struct CollectedRound2Entry` from round2.rs lines 359-362.\n */\ninterface CollectedRound2Entry {\n packages: [XID, unknown][];\n nextResponseArid: ARID;\n}\n\n// -----------------------------------------------------------------------------\n// Validation\n// -----------------------------------------------------------------------------\n\n/**\n * Validate that the owner is the coordinator of the group.\n *\n * Port of coordinator check from round2.rs lines 86-94.\n */\nfunction validateCoordinator(groupRecord: GroupRecord, ownerXid: XID): void {\n if (groupRecord.coordinator().xid().urString() !== ownerXid.urString()) {\n throw new Error(\n `Only the coordinator can collect Round 2 responses and send finalize packages. ` +\n `Coordinator: ${groupRecord.coordinator().xid().urString()}, Owner: ${ownerXid.urString()}`,\n );\n }\n}\n\n// -----------------------------------------------------------------------------\n// Response validation and extraction\n// -----------------------------------------------------------------------------\n\n/**\n * Validate envelope and extract Round 2 data (for parallel fetch).\n *\n * Port of `validate_and_extract_round2_response()` from round2.rs lines 646-708.\n */\nexport function validateAndExtractRound2Response(\n envelope: Envelope,\n coordinatorKeys: PrivateKeys,\n expectedGroupId: ARID,\n expectedSender: XID,\n): Round2ResponseData | { rejected: string } {\n const now = new Date();\n\n let sealed: SealedResponse;\n try {\n sealed = SealedResponse.tryFromEncryptedEnvelope(envelope, undefined, now, coordinatorKeys);\n } catch (err) {\n return {\n rejected: `Failed to decrypt/parse response: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Check for error response\n if (!sealed.isOk()) {\n try {\n const error = sealed.error();\n const reasonEnv = error.optionalObjectForPredicate(\"reason\");\n const reason = reasonEnv?.extractString() ?? \"unknown reason\";\n return { rejected: `Participant reported error: ${reason}` };\n } catch {\n return { rejected: \"Participant reported error: unknown reason\" };\n }\n }\n\n // Get and validate result\n let result: Envelope;\n try {\n result = sealed.result();\n } catch {\n return { rejected: \"Response has no result envelope\" };\n }\n\n // Validate response type\n try {\n result.checkSubjectUnit();\n result.checkType(\"dkgRound2Response\");\n } catch (err) {\n return {\n rejected: `Invalid response type: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Validate group ID\n try {\n const groupEnv = result.objectForPredicate(\"group\");\n const groupId = groupEnv.extractSubject<ARID>((cbor) => ARID.fromTaggedCbor(cbor));\n if (groupId.urString() !== expectedGroupId.urString()) {\n return {\n rejected: `Response group ID ${groupId.urString()} does not match expected ${expectedGroupId.urString()}`,\n };\n }\n } catch (err) {\n return {\n rejected: `Failed to extract group: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Validate participant/sender\n try {\n const participantEnv = result.objectForPredicate(\"participant\");\n const senderXid = participantEnv.extractSubject<XID>((cbor) => XID.fromTaggedCbor(cbor));\n if (senderXid.urString() !== expectedSender.urString()) {\n return {\n rejected: `Response participant ${senderXid.urString()} does not match expected ${expectedSender.urString()}`,\n };\n }\n } catch (err) {\n return {\n rejected: `Failed to extract participant: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Extract next response ARID\n let nextResponseArid: ARID;\n try {\n const responseAridEnv = result.objectForPredicate(\"response_arid\");\n nextResponseArid = responseAridEnv.extractSubject<ARID>((cbor) => ARID.fromTaggedCbor(cbor));\n } catch (err) {\n return {\n rejected: `Failed to extract response_arid: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Extract round2 packages\n const packages: [XID, unknown][] = [];\n try {\n const pkgEnvelopes = result.objectsForPredicate(\"round2Package\");\n for (const pkgEnv of pkgEnvelopes) {\n const recipientEnv = pkgEnv.objectForPredicate(\"recipient\");\n const recipient = recipientEnv.extractSubject<XID>((cbor) => XID.fromTaggedCbor(cbor));\n const pkgJsonStr = pkgEnv.extractString();\n const pkg: unknown = JSON.parse(pkgJsonStr);\n packages.push([recipient, pkg]);\n }\n } catch (err) {\n return {\n rejected: `Failed to extract round2 packages: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n return { packages, nextResponseArid };\n}\n\n// -----------------------------------------------------------------------------\n// Sequential collection\n// -----------------------------------------------------------------------------\n\n/**\n * Fetch a Round 2 response sequentially.\n *\n * Port of `fetch_round2_response()` from round2.rs lines 364-442.\n */\nasync function fetchRound2Response(\n client: StorageClient,\n arid: ARID,\n timeout: number | undefined,\n coordinatorKeys: PrivateKeys,\n expectedGroup: ARID,\n expectedSender: XID,\n): Promise<CollectedRound2Entry> {\n const envelope = await getWithIndicator(\n client,\n arid,\n expectedSender.urString(),\n timeout,\n isVerbose(),\n );\n\n if (envelope === null || envelope === undefined) {\n throw new Error(\"Response not found in Hubert storage\");\n }\n\n const result = validateAndExtractRound2Response(\n envelope,\n coordinatorKeys,\n expectedGroup,\n expectedSender,\n );\n\n if (\"rejected\" in result) {\n throw new Error(result.rejected);\n }\n\n return {\n packages: result.packages,\n nextResponseArid: result.nextResponseArid,\n };\n}\n\n/**\n * Collect Round 2 responses sequentially.\n *\n * Port of `collect_round2()` from round2.rs lines 216-357.\n */\nasync function collectRound2(\n client: StorageClient,\n registryPath: string,\n registry: Registry,\n coordinatorKeys: PrivateKeys,\n groupId: ARID,\n pendingRequests: PendingRequests,\n timeout: number | undefined,\n): Promise<Round2Collection> {\n if (isVerbose()) {\n console.error(`Collecting Round 2 responses from ${pendingRequests.len()} participants...`);\n }\n\n const allPackages = new Map<string, [XID, unknown][]>();\n const nextResponseArids: [XID, ARID][] = [];\n const errors: [XID, string][] = [];\n\n for (const [participantXid, collectFromArid] of pendingRequests.iterCollect()) {\n const participantRecord = registry.participant(participantXid);\n const participantName = participantRecord?.petName() ?? participantXid.urString();\n\n if (isVerbose()) {\n console.error(`${participantName}...`);\n }\n\n try {\n const collected = await fetchRound2Response(\n client,\n collectFromArid,\n timeout,\n coordinatorKeys,\n groupId,\n participantXid,\n );\n allPackages.set(participantXid.urString(), collected.packages);\n nextResponseArids.push([participantXid, collected.nextResponseArid]);\n } catch (err) {\n if (isVerbose()) {\n console.error(`error: ${err instanceof Error ? err.message : String(err)}`);\n }\n errors.push([participantXid, err instanceof Error ? err.message : String(err)]);\n }\n }\n\n if (errors.length > 0) {\n if (isVerbose()) {\n console.error();\n console.error(`Failed to collect from ${errors.length} participants:`);\n }\n for (const [xid, error] of errors) {\n console.error(` ${xid.urString()}: ${error}`);\n }\n throw new Error(\n `Round 2 collection incomplete: ${errors.length} of ${pendingRequests.len()} responses failed`,\n );\n }\n\n // Persist collected round2 packages\n const displayPath = persistRound2PackagesFromMap(\n registryPath,\n groupId,\n allPackages,\n nextResponseArids,\n );\n\n // Update pending requests\n const newPending = new PendingRequests();\n for (const [xid, sendToArid] of nextResponseArids) {\n newPending.addSendOnly(xid, sendToArid);\n }\n const groupRecord = registry.group(groupId);\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n groupRecord.setPendingRequests(newPending);\n registry.save(registryPath);\n\n return {\n packages: allPackages,\n nextResponseArids,\n displayPath,\n };\n}\n\n/**\n * Persist Round 2 packages from a Map (sequential collection).\n */\nfunction persistRound2PackagesFromMap(\n registryPath: string,\n groupId: ARID,\n allPackages: Map<string, [XID, unknown][]>,\n nextResponseArids: [XID, ARID][],\n): string {\n const stateDir = groupStateDir(registryPath, groupId.hex());\n fs.mkdirSync(stateDir, { recursive: true });\n\n const collectedPath = path.join(stateDir, \"collected_round2.json\");\n const root: Record<string, unknown> = {};\n\n for (const [senderUrString, packages] of allPackages) {\n const senderMap: Record<string, unknown> = {};\n\n // Find response_arid for this sender\n const responseArid = nextResponseArids.find(([xid]) => xid.urString() === senderUrString)?.[1];\n\n if (responseArid !== undefined) {\n senderMap[\"response_arid\"] = responseArid.urString();\n }\n\n const packagesJson: Record<string, unknown> = {};\n for (const [recipient, pkg] of packages) {\n packagesJson[recipient.urString()] = pkg;\n }\n senderMap[\"packages\"] = packagesJson;\n\n root[senderUrString] = senderMap;\n }\n\n fs.writeFileSync(collectedPath, JSON.stringify(root, null, 2));\n\n // Return relative path if possible\n const cwd = process.cwd();\n if (collectedPath.startsWith(cwd)) {\n return collectedPath.slice(cwd.length + 1);\n }\n return collectedPath;\n}\n\n// -----------------------------------------------------------------------------\n// Parallel collection\n// -----------------------------------------------------------------------------\n\n/**\n * Collect Round 2 responses in parallel with progress display.\n *\n * Port of `collect_round2_parallel()` from round2.rs lines 607-643.\n */\nexport async function collectRound2Parallel(\n client: StorageClient,\n registry: Registry,\n pendingRequests: PendingRequests,\n coordinatorKeys: PrivateKeys,\n expectedGroupId: ARID,\n timeout: number | undefined,\n): Promise<CollectionResult<Round2ResponseData>> {\n const requests: [XID, ARID, string][] = [];\n\n for (const [xid, arid] of pendingRequests.iterCollect()) {\n const record = registry.participant(xid);\n const name = record?.petName() ?? xid.urString();\n requests.push([xid, arid, name]);\n }\n\n const config: ParallelFetchConfig = parallelFetchConfigWithTimeout(timeout);\n\n return parallelFetch(\n client,\n requests,\n (envelope: Envelope, xid: XID) =>\n validateAndExtractRound2Response(envelope, coordinatorKeys, expectedGroupId, xid),\n config,\n );\n}\n\n// -----------------------------------------------------------------------------\n// Persist Round 2 packages (parallel)\n// -----------------------------------------------------------------------------\n\n/**\n * Persist Round 2 packages from parallel collection results.\n *\n * Port of `persist_round2_packages()` from round2.rs lines 712-758.\n */\nexport function persistRound2Packages(\n registryPath: string,\n groupId: ARID,\n successes: [XID, Round2ResponseData][],\n): string {\n const stateDir = groupStateDir(registryPath, groupId.hex());\n fs.mkdirSync(stateDir, { recursive: true });\n\n const collectedPath = path.join(stateDir, \"collected_round2.json\");\n const root: Record<string, unknown> = {};\n\n for (const [sender, data] of successes) {\n const senderMap: Record<string, unknown> = {};\n senderMap[\"response_arid\"] = data.nextResponseArid.urString();\n\n const packagesJson: Record<string, unknown> = {};\n for (const [recipient, pkg] of data.packages) {\n packagesJson[recipient.urString()] = pkg;\n }\n senderMap[\"packages\"] = packagesJson;\n\n root[sender.urString()] = senderMap;\n }\n\n fs.writeFileSync(collectedPath, JSON.stringify(root, null, 2));\n\n // Return relative path if possible\n const cwd = process.cwd();\n if (collectedPath.startsWith(cwd)) {\n return collectedPath.slice(cwd.length + 1);\n }\n return collectedPath;\n}\n\n// -----------------------------------------------------------------------------\n// Update pending requests (parallel)\n// -----------------------------------------------------------------------------\n\n/**\n * Update pending requests from parallel collection results.\n *\n * Port of `update_pending_for_finalize_from_collection()` from round2.rs lines 761-777.\n */\nexport function updatePendingForFinalizeFromCollection(\n registry: Registry,\n registryPath: string,\n groupId: ARID,\n successes: [XID, Round2ResponseData][],\n): void {\n const newPending = new PendingRequests();\n for (const [xid, data] of successes) {\n newPending.addSendOnly(xid, data.nextResponseArid);\n }\n\n const groupRecord = registry.group(groupId);\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n groupRecord.setPendingRequests(newPending);\n registry.save(registryPath);\n}\n\n// -----------------------------------------------------------------------------\n// Finalize request building\n// -----------------------------------------------------------------------------\n\n/**\n * Gather packages FOR a specific recipient (from all other senders).\n *\n * Port of `gather_packages_for_recipient()` from round2.rs lines 552-571.\n */\nfunction gatherPackagesForRecipient(\n recipient: XID,\n allPackages: Map<string, [XID, unknown][]>,\n): [XID, unknown][] {\n const result: [XID, unknown][] = [];\n\n for (const [senderUrString, packages] of allPackages) {\n for (const [rcpt, pkg] of packages) {\n if (rcpt.urString() === recipient.urString()) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-require-imports, no-undef\n const { XID: XIDClass } = require(\"@bcts/components\");\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n const sender = XIDClass.fromURString(senderUrString) as XID;\n result.push([sender, pkg]);\n }\n }\n }\n\n if (result.length === 0) {\n throw new Error(`No round2 packages found for recipient ${recipient.urString()}`);\n }\n\n return result;\n}\n\n/**\n * Build a finalize request for a participant.\n *\n * Port of `build_finalize_request_for_participant()` from round2.rs lines 575-594.\n */\nexport function buildFinalizeRequestForParticipant(\n sender: XIDDocument,\n groupId: ARID,\n responseArid: ARID,\n packages: [XID, unknown][],\n): SealedRequest {\n let request = SealedRequest.new(\"dkgFinalize\", ARID.new(), sender)\n .withParameter(\"group\", groupId)\n .withParameter(\"responseArid\", responseArid);\n\n for (const [pkgSender, pkg] of packages) {\n const encoded = JSON.stringify(pkg);\n const pkgEnvelope = Envelope.new(encoded).addAssertion(\"sender\", pkgSender);\n request = request.withParameter(\"round2Package\", pkgEnvelope);\n }\n\n return request;\n}\n\n// -----------------------------------------------------------------------------\n// Send finalize requests (sequential)\n// -----------------------------------------------------------------------------\n\n/**\n * Send finalize requests sequentially.\n *\n * Port of `send_finalize_requests()` from round2.rs lines 444-550.\n */\nasync function sendFinalizeRequests(\n client: StorageClient,\n registryPath: string,\n registry: Registry,\n coordinator: XIDDocument,\n groupId: ARID,\n collection: Round2Collection,\n preview: boolean,\n): Promise<[string, string] | undefined> {\n const signerPrivateKeys = coordinator.inceptionPrivateKeys();\n if (signerPrivateKeys === undefined) {\n throw new Error(\"Coordinator XID document has no signing keys\");\n }\n\n const validUntil = new Date(Date.now() + 60 * 60 * 1000); // 1 hour\n\n // Build participant info: [XID, XIDDocument, sendToArid, collectFromArid]\n const participantInfo: [XID, XIDDocument, ARID, ARID][] = [];\n\n for (const [xid, sendToArid] of collection.nextResponseArids) {\n const record = registry.participant(xid);\n if (record === undefined) {\n throw new Error(`Participant ${xid.urString()} not found in registry`);\n }\n const collectFromArid = ARID.new();\n participantInfo.push([xid, record.xidDocument(), sendToArid, collectFromArid]);\n }\n\n if (isVerbose()) {\n console.error(`Sending finalize packages to ${participantInfo.length} participants...`);\n } else {\n console.error(); // Blank line to separate get phase from put phase\n }\n\n let previewOutput: [string, string] | undefined;\n\n for (const [xid, recipientDoc, sendToArid, collectFromArid] of participantInfo) {\n const record = registry.participant(xid);\n const participantName = record?.petName() ?? xid.urString();\n\n if (isVerbose()) {\n console.error(`${participantName}...`);\n }\n\n // Gather packages FOR this recipient\n const packagesForRecipient = gatherPackagesForRecipient(xid, collection.packages);\n\n const request = buildFinalizeRequestForParticipant(\n coordinator,\n groupId,\n collectFromArid,\n packagesForRecipient,\n );\n\n if (preview && previewOutput === undefined) {\n const unsealedEnvelope = request.toEnvelope(validUntil, signerPrivateKeys, undefined);\n previewOutput = [participantName, unsealedEnvelope.urString()];\n }\n\n const sealedEnvelope = request.toEnvelopeForRecipients(validUntil, signerPrivateKeys, [\n recipientDoc,\n ]);\n\n await putWithIndicator(client, sendToArid, sealedEnvelope, participantName, isVerbose());\n }\n\n // Build pending requests for finalize response collection\n const newPendingRequests = new PendingRequests();\n for (const [xid, , , collectFromArid] of participantInfo) {\n newPendingRequests.addCollectOnly(xid, collectFromArid);\n }\n const groupRecord = registry.group(groupId);\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n groupRecord.setPendingRequests(newPendingRequests);\n registry.save(registryPath);\n\n return previewOutput;\n}\n\n// -----------------------------------------------------------------------------\n// Dispatch finalize requests (parallel)\n// -----------------------------------------------------------------------------\n\n/**\n * Dispatch finalize requests in parallel.\n *\n * Port of `dispatch_finalize_requests_parallel()` from round2.rs lines 780-900.\n */\nexport async function dispatchFinalizeRequestsParallel(\n client: StorageClient,\n registry: Registry,\n registryPath: string,\n coordinator: XIDDocument,\n groupId: ARID,\n successes: [XID, Round2ResponseData][],\n preview: boolean,\n): Promise<[string, string] | undefined> {\n const signerPrivateKeys = coordinator.inceptionPrivateKeys();\n if (signerPrivateKeys === undefined) {\n throw new Error(\"Coordinator XID document has no signing keys\");\n }\n\n const validUntil = new Date(Date.now() + 60 * 60 * 1000); // 1 hour\n\n // Build all_packages map for gatherPackagesForRecipient\n const allPackages = new Map<string, [XID, unknown][]>();\n for (const [xid, data] of successes) {\n allPackages.set(xid.urString(), data.packages);\n }\n\n // Build messages\n const messages: [XID, ARID, Envelope, string][] = [];\n const collectArids: [XID, ARID][] = [];\n let previewOutput: [string, string] | undefined;\n\n for (const [xid, data] of successes) {\n const record = registry.participant(xid);\n if (record === undefined) {\n throw new Error(`Participant ${xid.urString()} not found in registry`);\n }\n const recipientDoc = record.xidDocument();\n const participantName = record.petName() ?? xid.urString();\n\n const collectFromArid = ARID.new();\n collectArids.push([xid, collectFromArid]);\n\n const packagesForRecipient = gatherPackagesForRecipient(xid, allPackages);\n\n const request = buildFinalizeRequestForParticipant(\n coordinator,\n groupId,\n collectFromArid,\n packagesForRecipient,\n );\n\n if (preview && previewOutput === undefined) {\n const unsealedEnvelope = request.toEnvelope(validUntil, signerPrivateKeys, undefined);\n previewOutput = [participantName, unsealedEnvelope.urString()];\n }\n\n const sealedEnvelope = request.toEnvelopeForRecipients(validUntil, signerPrivateKeys, [\n recipientDoc,\n ]);\n\n messages.push([xid, data.nextResponseArid, sealedEnvelope, participantName]);\n }\n\n // Blank line to separate get phase from put phase\n console.error();\n\n // Send all messages in parallel\n const sendResults = await parallelSend(client, messages, isVerbose());\n\n // Check for send failures\n const failures = sendResults.filter(([, err]) => err !== null);\n\n if (failures.length > 0) {\n for (const [xid, error] of failures) {\n if (error !== null) {\n console.error(`Failed to send to ${xid.urString()}: ${error.message}`);\n }\n }\n throw new Error(`Failed to send finalize requests to ${failures.length} participants`);\n }\n\n // Update pending requests for finalize response collection\n const newPendingRequests = new PendingRequests();\n for (const [xid, collectFromArid] of collectArids) {\n newPendingRequests.addCollectOnly(xid, collectFromArid);\n }\n const groupRecord = registry.group(groupId);\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n groupRecord.setPendingRequests(newPendingRequests);\n registry.save(registryPath);\n\n return previewOutput;\n}\n\n// -----------------------------------------------------------------------------\n// Summary printing\n// -----------------------------------------------------------------------------\n\n/**\n * Print summary for parallel collection.\n *\n * Port of `print_summary_parallel()` from round2.rs lines 903-964.\n */\nfunction printSummaryParallel(\n collection: CollectionResult<Round2ResponseData>,\n displayPath: string,\n preview: [string, string] | undefined,\n): void {\n // Report any failures\n if (collection.rejections.length > 0) {\n console.error();\n console.error(\"Rejections:\");\n for (const [xid, reason] of collection.rejections) {\n console.error(` ${xid.urString()}: ${reason}`);\n }\n }\n if (collection.errors.length > 0) {\n console.error();\n console.error(\"Errors:\");\n for (const [xid, error] of collection.errors) {\n console.error(` ${xid.urString()}: ${error}`);\n }\n }\n if (collection.timeouts.length > 0) {\n console.error();\n console.error(\"Timeouts:\");\n for (const xid of collection.timeouts) {\n console.error(` ${xid.urString()}`);\n }\n }\n\n if (!collection.allSucceeded()) {\n console.error();\n console.error(\n `Round 2 collection incomplete: ${collection.successes.length} succeeded, ` +\n `${collection.rejections.length} rejected, ${collection.errors.length} errors, ` +\n `${collection.timeouts.length} timeouts`,\n );\n return;\n }\n\n if (preview !== undefined) {\n const [participantName, ur] = preview;\n if (isVerbose()) {\n console.error(`# Finalize preview for ${participantName}`);\n console.error();\n }\n console.error(\n `Collected ${collection.successes.length} Round 2 responses to ${displayPath} and sent ${collection.successes.length} finalize requests.`,\n );\n console.log(ur);\n } else if (isVerbose()) {\n console.error();\n console.error(\n `Collected ${collection.successes.length} Round 2 responses to ${displayPath} and sent ${collection.successes.length} finalize requests.`,\n );\n }\n}\n\n// -----------------------------------------------------------------------------\n// Main entry point\n// -----------------------------------------------------------------------------\n\n/**\n * Execute the DKG coordinator round 2 command.\n *\n * Collects Round 2 responses and sends finalize packages.\n *\n * Port of `CommandArgs::exec()` from cmd/dkg/coordinator/round2.rs lines 59-203.\n */\nexport async function round2(\n client: StorageClient,\n options: DkgRound2Options,\n cwd: string,\n): Promise<DkgRound2Result> {\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n\n const owner = registry.owner();\n if (owner === undefined) {\n throw new Error(\"Registry owner is required\");\n }\n const ownerDoc = owner.xidDocument();\n\n const groupId = parseAridUr(options.groupId);\n const groupRecord = registry.group(groupId);\n\n if (groupRecord === undefined) {\n throw new Error(`Group ${options.groupId} not found in registry`);\n }\n\n // Verify we are the coordinator\n validateCoordinator(groupRecord, owner.xid());\n\n const pendingRequests = groupRecord.pendingRequests();\n if (pendingRequests.isEmpty()) {\n throw new Error(\n \"No pending requests for this group. Did you run 'frost dkg coordinator round1'?\",\n );\n }\n\n const coordinatorKeys = ownerDoc.inceptionPrivateKeys();\n if (coordinatorKeys === undefined) {\n throw new Error(\"Coordinator XID document has no private keys\");\n }\n\n if (options.parallel === true) {\n // Parallel path with progress display\n const collection = await collectRound2Parallel(\n client,\n registry,\n pendingRequests,\n coordinatorKeys,\n groupId,\n options.timeoutSeconds,\n );\n\n // Persist collected data\n const displayPath = persistRound2Packages(registryPath, groupId, collection.successes);\n\n updatePendingForFinalizeFromCollection(registry, registryPath, groupId, collection.successes);\n\n const preview = await dispatchFinalizeRequestsParallel(\n client,\n registry,\n registryPath,\n ownerDoc,\n groupId,\n collection.successes,\n options.preview ?? false,\n );\n\n printSummaryParallel(collection, displayPath, preview);\n\n return {\n accepted: collection.successes.length,\n rejected: collection.rejections.length,\n errors: collection.errors.length,\n timeouts: collection.timeouts.length,\n displayPath,\n };\n } else {\n // Sequential path (original behavior)\n // Phase 1: Collect Round 2 responses\n const collection = await collectRound2(\n client,\n registryPath,\n registry,\n coordinatorKeys,\n groupId,\n pendingRequests,\n options.timeoutSeconds,\n );\n\n // Phase 2: Send finalize packages\n const preview = await sendFinalizeRequests(\n client,\n registryPath,\n registry,\n ownerDoc,\n groupId,\n collection,\n options.preview ?? false,\n );\n\n if (preview !== undefined) {\n const [participantName, ur] = preview;\n if (isVerbose()) {\n console.error(`# Finalize preview for ${participantName}`);\n console.error();\n }\n console.error(\n `Collected ${collection.packages.size} Round 2 responses to ${collection.displayPath} and sent ${collection.nextResponseArids.length} finalize requests.`,\n );\n console.log(ur);\n } else if (isVerbose()) {\n console.error();\n console.error(\n `Collected ${collection.packages.size} Round 2 responses to ${collection.displayPath} and sent ${collection.nextResponseArids.length} finalize requests.`,\n );\n }\n\n return {\n accepted: collection.packages.size,\n rejected: 0,\n errors: 0,\n timeouts: 0,\n displayPath: collection.displayPath,\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyGA,SAAS,oBAAoB,aAA0B,UAAqB;AAC1E,KAAI,YAAY,aAAa,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,UAAU,CACpE,OAAM,IAAI,MACR,+FACkB,YAAY,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,SAAS,UAAU,GAC5F;;;;;;;AAaL,SAAgB,iCACd,UACA,iBACA,iBACA,gBAC2C;CAC3C,MAAM,sBAAM,IAAI,MAAM;CAEtB,IAAI;AACJ,KAAI;AACF,WAAS,eAAe,yBAAyB,UAAU,KAAA,GAAW,KAAK,gBAAgB;UACpF,KAAK;AACZ,SAAO,EACL,UAAU,qCAAqC,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,IAChG;;AAIH,KAAI,CAAC,OAAO,MAAM,CAChB,KAAI;AAIF,SAAO,EAAE,UAAU,+BAHL,OAAO,OACE,CAAC,2BAA2B,SAC3B,EAAE,eAAe,IAAI,oBACe;SACtD;AACN,SAAO,EAAE,UAAU,8CAA8C;;CAKrE,IAAI;AACJ,KAAI;AACF,WAAS,OAAO,QAAQ;SAClB;AACN,SAAO,EAAE,UAAU,mCAAmC;;AAIxD,KAAI;AACF,SAAO,kBAAkB;AACzB,SAAO,UAAU,oBAAoB;UAC9B,KAAK;AACZ,SAAO,EACL,UAAU,0BAA0B,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,IACrF;;AAIH,KAAI;EAEF,MAAM,UADW,OAAO,mBAAmB,QACnB,CAAC,gBAAsB,SAAS,KAAK,eAAe,KAAK,CAAC;AAClF,MAAI,QAAQ,UAAU,KAAK,gBAAgB,UAAU,CACnD,QAAO,EACL,UAAU,qBAAqB,QAAQ,UAAU,CAAC,2BAA2B,gBAAgB,UAAU,IACxG;UAEI,KAAK;AACZ,SAAO,EACL,UAAU,4BAA4B,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,IACvF;;AAIH,KAAI;EAEF,MAAM,YADiB,OAAO,mBAAmB,cACjB,CAAC,gBAAqB,SAAS,IAAI,eAAe,KAAK,CAAC;AACxF,MAAI,UAAU,UAAU,KAAK,eAAe,UAAU,CACpD,QAAO,EACL,UAAU,wBAAwB,UAAU,UAAU,CAAC,2BAA2B,eAAe,UAAU,IAC5G;UAEI,KAAK;AACZ,SAAO,EACL,UAAU,kCAAkC,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,IAC7F;;CAIH,IAAI;AACJ,KAAI;AAEF,qBADwB,OAAO,mBAAmB,gBAChB,CAAC,gBAAsB,SAAS,KAAK,eAAe,KAAK,CAAC;UACrF,KAAK;AACZ,SAAO,EACL,UAAU,oCAAoC,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,IAC/F;;CAIH,MAAM,WAA6B,EAAE;AACrC,KAAI;EACF,MAAM,eAAe,OAAO,oBAAoB,gBAAgB;AAChE,OAAK,MAAM,UAAU,cAAc;GAEjC,MAAM,YADe,OAAO,mBAAmB,YACjB,CAAC,gBAAqB,SAAS,IAAI,eAAe,KAAK,CAAC;GACtF,MAAM,aAAa,OAAO,eAAe;GACzC,MAAM,MAAe,KAAK,MAAM,WAAW;AAC3C,YAAS,KAAK,CAAC,WAAW,IAAI,CAAC;;UAE1B,KAAK;AACZ,SAAO,EACL,UAAU,sCAAsC,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,IACjG;;AAGH,QAAO;EAAE;EAAU;EAAkB;;;;;;;AAYvC,eAAe,oBACb,QACA,MACA,SACA,iBACA,eACA,gBAC+B;CAC/B,MAAM,WAAW,MAAM,iBACrB,QACA,MACA,eAAe,UAAU,EACzB,SACA,WAAW,CACZ;AAED,KAAI,aAAa,QAAQ,aAAa,KAAA,EACpC,OAAM,IAAI,MAAM,uCAAuC;CAGzD,MAAM,SAAS,iCACb,UACA,iBACA,eACA,eACD;AAED,KAAI,cAAc,OAChB,OAAM,IAAI,MAAM,OAAO,SAAS;AAGlC,QAAO;EACL,UAAU,OAAO;EACjB,kBAAkB,OAAO;EAC1B;;;;;;;AAQH,eAAe,cACb,QACA,cACA,UACA,iBACA,SACA,iBACA,SAC2B;AAC3B,KAAI,WAAW,CACb,SAAQ,MAAM,qCAAqC,gBAAgB,KAAK,CAAC,kBAAkB;CAG7F,MAAM,8BAAc,IAAI,KAA+B;CACvD,MAAM,oBAAmC,EAAE;CAC3C,MAAM,SAA0B,EAAE;AAElC,MAAK,MAAM,CAAC,gBAAgB,oBAAoB,gBAAgB,aAAa,EAAE;EAE7E,MAAM,kBADoB,SAAS,YAAY,eACN,EAAE,SAAS,IAAI,eAAe,UAAU;AAEjF,MAAI,WAAW,CACb,SAAQ,MAAM,GAAG,gBAAgB,KAAK;AAGxC,MAAI;GACF,MAAM,YAAY,MAAM,oBACtB,QACA,iBACA,SACA,iBACA,SACA,eACD;AACD,eAAY,IAAI,eAAe,UAAU,EAAE,UAAU,SAAS;AAC9D,qBAAkB,KAAK,CAAC,gBAAgB,UAAU,iBAAiB,CAAC;WAC7D,KAAK;AACZ,OAAI,WAAW,CACb,SAAQ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;AAE7E,UAAO,KAAK,CAAC,gBAAgB,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,CAAC,CAAC;;;AAInF,KAAI,OAAO,SAAS,GAAG;AACrB,MAAI,WAAW,EAAE;AACf,WAAQ,OAAO;AACf,WAAQ,MAAM,0BAA0B,OAAO,OAAO,gBAAgB;;AAExE,OAAK,MAAM,CAAC,KAAK,UAAU,OACzB,SAAQ,MAAM,KAAK,IAAI,UAAU,CAAC,IAAI,QAAQ;AAEhD,QAAM,IAAI,MACR,kCAAkC,OAAO,OAAO,MAAM,gBAAgB,KAAK,CAAC,mBAC7E;;CAIH,MAAM,cAAc,6BAClB,cACA,SACA,aACA,kBACD;CAGD,MAAM,aAAa,IAAI,iBAAiB;AACxC,MAAK,MAAM,CAAC,KAAK,eAAe,kBAC9B,YAAW,YAAY,KAAK,WAAW;CAEzC,MAAM,cAAc,SAAS,MAAM,QAAQ;AAC3C,KAAI,gBAAgB,KAAA,EAClB,OAAM,IAAI,MAAM,8BAA8B;AAEhD,aAAY,mBAAmB,WAAW;AAC1C,UAAS,KAAK,aAAa;AAE3B,QAAO;EACL,UAAU;EACV;EACA;EACD;;;;;AAMH,SAAS,6BACP,cACA,SACA,aACA,mBACQ;CACR,MAAM,WAAW,cAAc,cAAc,QAAQ,KAAK,CAAC;AAC3D,IAAG,UAAU,UAAU,EAAE,WAAW,MAAM,CAAC;CAE3C,MAAM,gBAAgB,KAAK,KAAK,UAAU,wBAAwB;CAClE,MAAM,OAAgC,EAAE;AAExC,MAAK,MAAM,CAAC,gBAAgB,aAAa,aAAa;EACpD,MAAM,YAAqC,EAAE;EAG7C,MAAM,eAAe,kBAAkB,MAAM,CAAC,SAAS,IAAI,UAAU,KAAK,eAAe,GAAG;AAE5F,MAAI,iBAAiB,KAAA,EACnB,WAAU,mBAAmB,aAAa,UAAU;EAGtD,MAAM,eAAwC,EAAE;AAChD,OAAK,MAAM,CAAC,WAAW,QAAQ,SAC7B,cAAa,UAAU,UAAU,IAAI;AAEvC,YAAU,cAAc;AAExB,OAAK,kBAAkB;;AAGzB,IAAG,cAAc,eAAe,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC;CAG9D,MAAM,MAAM,QAAQ,KAAK;AACzB,KAAI,cAAc,WAAW,IAAI,CAC/B,QAAO,cAAc,MAAM,IAAI,SAAS,EAAE;AAE5C,QAAO;;;;;;;AAYT,eAAsB,sBACpB,QACA,UACA,iBACA,iBACA,iBACA,SAC+C;CAC/C,MAAM,WAAkC,EAAE;AAE1C,MAAK,MAAM,CAAC,KAAK,SAAS,gBAAgB,aAAa,EAAE;EAEvD,MAAM,OADS,SAAS,YAAY,IACjB,EAAE,SAAS,IAAI,IAAI,UAAU;AAChD,WAAS,KAAK;GAAC;GAAK;GAAM;GAAK,CAAC;;AAKlC,QAAO,cACL,QACA,WACC,UAAoB,QACnB,iCAAiC,UAAU,iBAAiB,iBAAiB,IAAI,EANjD,+BAA+B,QAO3D,CACP;;;;;;;AAYH,SAAgB,sBACd,cACA,SACA,WACQ;CACR,MAAM,WAAW,cAAc,cAAc,QAAQ,KAAK,CAAC;AAC3D,IAAG,UAAU,UAAU,EAAE,WAAW,MAAM,CAAC;CAE3C,MAAM,gBAAgB,KAAK,KAAK,UAAU,wBAAwB;CAClE,MAAM,OAAgC,EAAE;AAExC,MAAK,MAAM,CAAC,QAAQ,SAAS,WAAW;EACtC,MAAM,YAAqC,EAAE;AAC7C,YAAU,mBAAmB,KAAK,iBAAiB,UAAU;EAE7D,MAAM,eAAwC,EAAE;AAChD,OAAK,MAAM,CAAC,WAAW,QAAQ,KAAK,SAClC,cAAa,UAAU,UAAU,IAAI;AAEvC,YAAU,cAAc;AAExB,OAAK,OAAO,UAAU,IAAI;;AAG5B,IAAG,cAAc,eAAe,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC;CAG9D,MAAM,MAAM,QAAQ,KAAK;AACzB,KAAI,cAAc,WAAW,IAAI,CAC/B,QAAO,cAAc,MAAM,IAAI,SAAS,EAAE;AAE5C,QAAO;;;;;;;AAYT,SAAgB,uCACd,UACA,cACA,SACA,WACM;CACN,MAAM,aAAa,IAAI,iBAAiB;AACxC,MAAK,MAAM,CAAC,KAAK,SAAS,UACxB,YAAW,YAAY,KAAK,KAAK,iBAAiB;CAGpD,MAAM,cAAc,SAAS,MAAM,QAAQ;AAC3C,KAAI,gBAAgB,KAAA,EAClB,OAAM,IAAI,MAAM,8BAA8B;AAEhD,aAAY,mBAAmB,WAAW;AAC1C,UAAS,KAAK,aAAa;;;;;;;AAY7B,SAAS,2BACP,WACA,aACkB;CAClB,MAAM,SAA2B,EAAE;AAEnC,MAAK,MAAM,CAAC,gBAAgB,aAAa,YACvC,MAAK,MAAM,CAAC,MAAM,QAAQ,SACxB,KAAI,KAAK,UAAU,KAAK,UAAU,UAAU,EAAE;EAE5C,MAAM,EAAE,KAAK,aAAA,UAAqB,mBAAmB;EAErD,MAAM,SAAS,SAAS,aAAa,eAAe;AACpD,SAAO,KAAK,CAAC,QAAQ,IAAI,CAAC;;AAKhC,KAAI,OAAO,WAAW,EACpB,OAAM,IAAI,MAAM,0CAA0C,UAAU,UAAU,GAAG;AAGnF,QAAO;;;;;;;AAQT,SAAgB,mCACd,QACA,SACA,cACA,UACe;CACf,IAAI,UAAU,cAAc,IAAI,eAAe,KAAK,KAAK,EAAE,OAAO,CAC/D,cAAc,SAAS,QAAQ,CAC/B,cAAc,gBAAgB,aAAa;AAE9C,MAAK,MAAM,CAAC,WAAW,QAAQ,UAAU;EACvC,MAAM,UAAU,KAAK,UAAU,IAAI;EACnC,MAAM,cAAc,SAAS,IAAI,QAAQ,CAAC,aAAa,UAAU,UAAU;AAC3E,YAAU,QAAQ,cAAc,iBAAiB,YAAY;;AAG/D,QAAO;;;;;;;AAYT,eAAe,qBACb,QACA,cACA,UACA,aACA,SACA,YACA,SACuC;CACvC,MAAM,oBAAoB,YAAY,sBAAsB;AAC5D,KAAI,sBAAsB,KAAA,EACxB,OAAM,IAAI,MAAM,+CAA+C;CAGjE,MAAM,aAAa,IAAI,KAAK,KAAK,KAAK,GAAG,OAAU,IAAK;CAGxD,MAAM,kBAAoD,EAAE;AAE5D,MAAK,MAAM,CAAC,KAAK,eAAe,WAAW,mBAAmB;EAC5D,MAAM,SAAS,SAAS,YAAY,IAAI;AACxC,MAAI,WAAW,KAAA,EACb,OAAM,IAAI,MAAM,eAAe,IAAI,UAAU,CAAC,wBAAwB;EAExE,MAAM,kBAAkB,KAAK,KAAK;AAClC,kBAAgB,KAAK;GAAC;GAAK,OAAO,aAAa;GAAE;GAAY;GAAgB,CAAC;;AAGhF,KAAI,WAAW,CACb,SAAQ,MAAM,gCAAgC,gBAAgB,OAAO,kBAAkB;KAEvF,SAAQ,OAAO;CAGjB,IAAI;AAEJ,MAAK,MAAM,CAAC,KAAK,cAAc,YAAY,oBAAoB,iBAAiB;EAE9E,MAAM,kBADS,SAAS,YAAY,IACN,EAAE,SAAS,IAAI,IAAI,UAAU;AAE3D,MAAI,WAAW,CACb,SAAQ,MAAM,GAAG,gBAAgB,KAAK;EAMxC,MAAM,UAAU,mCACd,aACA,SACA,iBAL2B,2BAA2B,KAAK,WAAW,SAMlD,CACrB;AAED,MAAI,WAAW,kBAAkB,KAAA,EAE/B,iBAAgB,CAAC,iBADQ,QAAQ,WAAW,YAAY,mBAAmB,KAAA,EACzB,CAAC,UAAU,CAAC;AAOhE,QAAM,iBAAiB,QAAQ,YAJR,QAAQ,wBAAwB,YAAY,mBAAmB,CACpF,aACD,CAEwD,EAAE,iBAAiB,WAAW,CAAC;;CAI1F,MAAM,qBAAqB,IAAI,iBAAiB;AAChD,MAAK,MAAM,CAAC,SAAS,oBAAoB,gBACvC,oBAAmB,eAAe,KAAK,gBAAgB;CAEzD,MAAM,cAAc,SAAS,MAAM,QAAQ;AAC3C,KAAI,gBAAgB,KAAA,EAClB,OAAM,IAAI,MAAM,8BAA8B;AAEhD,aAAY,mBAAmB,mBAAmB;AAClD,UAAS,KAAK,aAAa;AAE3B,QAAO;;;;;;;AAYT,eAAsB,iCACpB,QACA,UACA,cACA,aACA,SACA,WACA,SACuC;CACvC,MAAM,oBAAoB,YAAY,sBAAsB;AAC5D,KAAI,sBAAsB,KAAA,EACxB,OAAM,IAAI,MAAM,+CAA+C;CAGjE,MAAM,aAAa,IAAI,KAAK,KAAK,KAAK,GAAG,OAAU,IAAK;CAGxD,MAAM,8BAAc,IAAI,KAA+B;AACvD,MAAK,MAAM,CAAC,KAAK,SAAS,UACxB,aAAY,IAAI,IAAI,UAAU,EAAE,KAAK,SAAS;CAIhD,MAAM,WAA4C,EAAE;CACpD,MAAM,eAA8B,EAAE;CACtC,IAAI;AAEJ,MAAK,MAAM,CAAC,KAAK,SAAS,WAAW;EACnC,MAAM,SAAS,SAAS,YAAY,IAAI;AACxC,MAAI,WAAW,KAAA,EACb,OAAM,IAAI,MAAM,eAAe,IAAI,UAAU,CAAC,wBAAwB;EAExE,MAAM,eAAe,OAAO,aAAa;EACzC,MAAM,kBAAkB,OAAO,SAAS,IAAI,IAAI,UAAU;EAE1D,MAAM,kBAAkB,KAAK,KAAK;AAClC,eAAa,KAAK,CAAC,KAAK,gBAAgB,CAAC;EAIzC,MAAM,UAAU,mCACd,aACA,SACA,iBAL2B,2BAA2B,KAAK,YAMvC,CACrB;AAED,MAAI,WAAW,kBAAkB,KAAA,EAE/B,iBAAgB,CAAC,iBADQ,QAAQ,WAAW,YAAY,mBAAmB,KAAA,EACzB,CAAC,UAAU,CAAC;EAGhE,MAAM,iBAAiB,QAAQ,wBAAwB,YAAY,mBAAmB,CACpF,aACD,CAAC;AAEF,WAAS,KAAK;GAAC;GAAK,KAAK;GAAkB;GAAgB;GAAgB,CAAC;;AAI9E,SAAQ,OAAO;CAMf,MAAM,YAAW,MAHS,aAAa,QAAQ,UAAU,WAAW,CAAC,EAGxC,QAAQ,GAAG,SAAS,QAAQ,KAAK;AAE9D,KAAI,SAAS,SAAS,GAAG;AACvB,OAAK,MAAM,CAAC,KAAK,UAAU,SACzB,KAAI,UAAU,KACZ,SAAQ,MAAM,qBAAqB,IAAI,UAAU,CAAC,IAAI,MAAM,UAAU;AAG1E,QAAM,IAAI,MAAM,uCAAuC,SAAS,OAAO,eAAe;;CAIxF,MAAM,qBAAqB,IAAI,iBAAiB;AAChD,MAAK,MAAM,CAAC,KAAK,oBAAoB,aACnC,oBAAmB,eAAe,KAAK,gBAAgB;CAEzD,MAAM,cAAc,SAAS,MAAM,QAAQ;AAC3C,KAAI,gBAAgB,KAAA,EAClB,OAAM,IAAI,MAAM,8BAA8B;AAEhD,aAAY,mBAAmB,mBAAmB;AAClD,UAAS,KAAK,aAAa;AAE3B,QAAO;;;;;;;AAYT,SAAS,qBACP,YACA,aACA,SACM;AAEN,KAAI,WAAW,WAAW,SAAS,GAAG;AACpC,UAAQ,OAAO;AACf,UAAQ,MAAM,cAAc;AAC5B,OAAK,MAAM,CAAC,KAAK,WAAW,WAAW,WACrC,SAAQ,MAAM,KAAK,IAAI,UAAU,CAAC,IAAI,SAAS;;AAGnD,KAAI,WAAW,OAAO,SAAS,GAAG;AAChC,UAAQ,OAAO;AACf,UAAQ,MAAM,UAAU;AACxB,OAAK,MAAM,CAAC,KAAK,UAAU,WAAW,OACpC,SAAQ,MAAM,KAAK,IAAI,UAAU,CAAC,IAAI,QAAQ;;AAGlD,KAAI,WAAW,SAAS,SAAS,GAAG;AAClC,UAAQ,OAAO;AACf,UAAQ,MAAM,YAAY;AAC1B,OAAK,MAAM,OAAO,WAAW,SAC3B,SAAQ,MAAM,KAAK,IAAI,UAAU,GAAG;;AAIxC,KAAI,CAAC,WAAW,cAAc,EAAE;AAC9B,UAAQ,OAAO;AACf,UAAQ,MACN,kCAAkC,WAAW,UAAU,OAAO,cACzD,WAAW,WAAW,OAAO,aAAa,WAAW,OAAO,OAAO,WACnE,WAAW,SAAS,OAAO,WACjC;AACD;;AAGF,KAAI,YAAY,KAAA,GAAW;EACzB,MAAM,CAAC,iBAAiB,MAAM;AAC9B,MAAI,WAAW,EAAE;AACf,WAAQ,MAAM,0BAA0B,kBAAkB;AAC1D,WAAQ,OAAO;;AAEjB,UAAQ,MACN,aAAa,WAAW,UAAU,OAAO,wBAAwB,YAAY,YAAY,WAAW,UAAU,OAAO,qBACtH;AACD,UAAQ,IAAI,GAAG;YACN,WAAW,EAAE;AACtB,UAAQ,OAAO;AACf,UAAQ,MACN,aAAa,WAAW,UAAU,OAAO,wBAAwB,YAAY,YAAY,WAAW,UAAU,OAAO,qBACtH;;;;;;;;;;AAeL,eAAsB,OACpB,QACA,SACA,KAC0B;CAC1B,MAAM,eAAe,oBAAoB,QAAQ,cAAc,IAAI;CACnE,MAAM,WAAW,SAAS,KAAK,aAAa;CAE5C,MAAM,QAAQ,SAAS,OAAO;AAC9B,KAAI,UAAU,KAAA,EACZ,OAAM,IAAI,MAAM,6BAA6B;CAE/C,MAAM,WAAW,MAAM,aAAa;CAEpC,MAAM,UAAU,YAAY,QAAQ,QAAQ;CAC5C,MAAM,cAAc,SAAS,MAAM,QAAQ;AAE3C,KAAI,gBAAgB,KAAA,EAClB,OAAM,IAAI,MAAM,SAAS,QAAQ,QAAQ,wBAAwB;AAInE,qBAAoB,aAAa,MAAM,KAAK,CAAC;CAE7C,MAAM,kBAAkB,YAAY,iBAAiB;AACrD,KAAI,gBAAgB,SAAS,CAC3B,OAAM,IAAI,MACR,kFACD;CAGH,MAAM,kBAAkB,SAAS,sBAAsB;AACvD,KAAI,oBAAoB,KAAA,EACtB,OAAM,IAAI,MAAM,+CAA+C;AAGjE,KAAI,QAAQ,aAAa,MAAM;EAE7B,MAAM,aAAa,MAAM,sBACvB,QACA,UACA,iBACA,iBACA,SACA,QAAQ,eACT;EAGD,MAAM,cAAc,sBAAsB,cAAc,SAAS,WAAW,UAAU;AAEtF,yCAAuC,UAAU,cAAc,SAAS,WAAW,UAAU;AAY7F,uBAAqB,YAAY,aAAa,MAVxB,iCACpB,QACA,UACA,cACA,UACA,SACA,WAAW,WACX,QAAQ,WAAW,MACpB,CAEqD;AAEtD,SAAO;GACL,UAAU,WAAW,UAAU;GAC/B,UAAU,WAAW,WAAW;GAChC,QAAQ,WAAW,OAAO;GAC1B,UAAU,WAAW,SAAS;GAC9B;GACD;QACI;EAGL,MAAM,aAAa,MAAM,cACvB,QACA,cACA,UACA,iBACA,SACA,iBACA,QAAQ,eACT;EAGD,MAAM,UAAU,MAAM,qBACpB,QACA,cACA,UACA,UACA,SACA,YACA,QAAQ,WAAW,MACpB;AAED,MAAI,YAAY,KAAA,GAAW;GACzB,MAAM,CAAC,iBAAiB,MAAM;AAC9B,OAAI,WAAW,EAAE;AACf,YAAQ,MAAM,0BAA0B,kBAAkB;AAC1D,YAAQ,OAAO;;AAEjB,WAAQ,MACN,aAAa,WAAW,SAAS,KAAK,wBAAwB,WAAW,YAAY,YAAY,WAAW,kBAAkB,OAAO,qBACtI;AACD,WAAQ,IAAI,GAAG;aACN,WAAW,EAAE;AACtB,WAAQ,OAAO;AACf,WAAQ,MACN,aAAa,WAAW,SAAS,KAAK,wBAAwB,WAAW,YAAY,YAAY,WAAW,kBAAkB,OAAO,qBACtI;;AAGH,SAAO;GACL,UAAU,WAAW,SAAS;GAC9B,UAAU;GACV,QAAQ;GACR,UAAU;GACV,aAAa,WAAW;GACzB"}
1
+ {"version":3,"file":"round2-Cq2SD6F8.mjs","names":[],"sources":["../src/cmd/dkg/coordinator/round2.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * DKG coordinator round 2 command.\n *\n * Port of cmd/dkg/coordinator/round2.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport { ARID, type PrivateKeys, XID } from \"@bcts/components\";\nimport { Envelope } from \"@bcts/envelope\";\nimport { SealedRequest, SealedResponse } from \"@bcts/gstp\";\nimport type { XIDDocument } from \"@bcts/xid\";\n\nimport {\n type GroupRecord,\n PendingRequests,\n Registry,\n resolveRegistryPath,\n} from \"../../../registry/index.js\";\nimport { groupStateDir, isVerbose } from \"../../common.js\";\nimport {\n type CollectionResult,\n parallelFetch,\n parallelSend,\n type ParallelFetchConfig,\n parallelFetchConfigWithTimeout,\n} from \"../../parallel.js\";\nimport { type StorageClient } from \"../../storage.js\";\nimport { getWithIndicator, putWithIndicator } from \"../../busy.js\";\nimport { parseAridUr } from \"../common.js\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/**\n * Options for the DKG round2 command.\n */\nexport interface DkgRound2Options {\n registryPath?: string;\n groupId: string;\n parallel?: boolean;\n timeoutSeconds?: number;\n verbose?: boolean;\n preview?: boolean;\n}\n\n/**\n * Result of the DKG round2 command.\n */\nexport interface DkgRound2Result {\n accepted: number;\n rejected: number;\n errors: number;\n timeouts: number;\n displayPath?: string;\n}\n\n/**\n * Data extracted from a successful Round 2 response.\n *\n * Port of `struct Round2ResponseData` from round2.rs lines 601-604.\n */\nexport interface Round2ResponseData {\n packages: [XID, unknown][];\n nextResponseArid: ARID;\n}\n\n/**\n * Round 2 collection result (for sequential path).\n *\n * Port of `struct Round2Collection` from round2.rs lines 206-213.\n */\ninterface Round2Collection {\n packages: Map<string, [XID, unknown][]>; // Map<XID.urString(), [recipient XID, package][]>\n nextResponseArids: [XID, ARID][];\n displayPath: string;\n}\n\n/**\n * Entry for a collected Round 2 response.\n *\n * Port of `struct CollectedRound2Entry` from round2.rs lines 359-362.\n */\ninterface CollectedRound2Entry {\n packages: [XID, unknown][];\n nextResponseArid: ARID;\n}\n\n// -----------------------------------------------------------------------------\n// Validation\n// -----------------------------------------------------------------------------\n\n/**\n * Validate that the owner is the coordinator of the group.\n *\n * Port of coordinator check from round2.rs lines 86-94.\n */\nfunction validateCoordinator(groupRecord: GroupRecord, ownerXid: XID): void {\n if (groupRecord.coordinator().xid().urString() !== ownerXid.urString()) {\n throw new Error(\n `Only the coordinator can collect Round 2 responses and send finalize packages. ` +\n `Coordinator: ${groupRecord.coordinator().xid().urString()}, Owner: ${ownerXid.urString()}`,\n );\n }\n}\n\n// -----------------------------------------------------------------------------\n// Response validation and extraction\n// -----------------------------------------------------------------------------\n\n/**\n * Validate envelope and extract Round 2 data (for parallel fetch).\n *\n * Port of `validate_and_extract_round2_response()` from round2.rs lines 646-708.\n */\nexport function validateAndExtractRound2Response(\n envelope: Envelope,\n coordinatorKeys: PrivateKeys,\n expectedGroupId: ARID,\n expectedSender: XID,\n): Round2ResponseData | { rejected: string } {\n const now = new Date();\n\n let sealed: SealedResponse;\n try {\n sealed = SealedResponse.tryFromEncryptedEnvelope(envelope, undefined, now, coordinatorKeys);\n } catch (err) {\n return {\n rejected: `Failed to decrypt/parse response: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Check for error response\n if (!sealed.isOk()) {\n try {\n const error = sealed.error();\n const reasonEnv = error.optionalObjectForPredicate(\"reason\");\n const reason = reasonEnv?.extractString() ?? \"unknown reason\";\n return { rejected: `Participant reported error: ${reason}` };\n } catch {\n return { rejected: \"Participant reported error: unknown reason\" };\n }\n }\n\n // Get and validate result\n let result: Envelope;\n try {\n result = sealed.result();\n } catch {\n return { rejected: \"Response has no result envelope\" };\n }\n\n // Validate response type\n try {\n result.checkSubjectUnit();\n result.checkType(\"dkgRound2Response\");\n } catch (err) {\n return {\n rejected: `Invalid response type: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Validate group ID\n try {\n const groupEnv = result.objectForPredicate(\"group\");\n const groupId = groupEnv.extractSubject<ARID>((cbor) => ARID.fromTaggedCbor(cbor));\n if (groupId.urString() !== expectedGroupId.urString()) {\n return {\n rejected: `Response group ID ${groupId.urString()} does not match expected ${expectedGroupId.urString()}`,\n };\n }\n } catch (err) {\n return {\n rejected: `Failed to extract group: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Validate participant/sender\n try {\n const participantEnv = result.objectForPredicate(\"participant\");\n const senderXid = participantEnv.extractSubject<XID>((cbor) => XID.fromTaggedCbor(cbor));\n if (senderXid.urString() !== expectedSender.urString()) {\n return {\n rejected: `Response participant ${senderXid.urString()} does not match expected ${expectedSender.urString()}`,\n };\n }\n } catch (err) {\n return {\n rejected: `Failed to extract participant: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Extract next response ARID\n let nextResponseArid: ARID;\n try {\n const responseAridEnv = result.objectForPredicate(\"response_arid\");\n nextResponseArid = responseAridEnv.extractSubject<ARID>((cbor) => ARID.fromTaggedCbor(cbor));\n } catch (err) {\n return {\n rejected: `Failed to extract response_arid: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n // Extract round2 packages\n const packages: [XID, unknown][] = [];\n try {\n const pkgEnvelopes = result.objectsForPredicate(\"round2Package\");\n for (const pkgEnv of pkgEnvelopes) {\n const recipientEnv = pkgEnv.objectForPredicate(\"recipient\");\n const recipient = recipientEnv.extractSubject<XID>((cbor) => XID.fromTaggedCbor(cbor));\n const pkgJsonStr = pkgEnv.extractString();\n const pkg: unknown = JSON.parse(pkgJsonStr);\n packages.push([recipient, pkg]);\n }\n } catch (err) {\n return {\n rejected: `Failed to extract round2 packages: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n return { packages, nextResponseArid };\n}\n\n// -----------------------------------------------------------------------------\n// Sequential collection\n// -----------------------------------------------------------------------------\n\n/**\n * Fetch a Round 2 response sequentially.\n *\n * Port of `fetch_round2_response()` from round2.rs lines 364-442.\n */\nasync function fetchRound2Response(\n client: StorageClient,\n arid: ARID,\n timeout: number | undefined,\n coordinatorKeys: PrivateKeys,\n expectedGroup: ARID,\n expectedSender: XID,\n): Promise<CollectedRound2Entry> {\n const envelope = await getWithIndicator(\n client,\n arid,\n expectedSender.urString(),\n timeout,\n isVerbose(),\n );\n\n if (envelope === null || envelope === undefined) {\n throw new Error(\"Response not found in Hubert storage\");\n }\n\n const result = validateAndExtractRound2Response(\n envelope,\n coordinatorKeys,\n expectedGroup,\n expectedSender,\n );\n\n if (\"rejected\" in result) {\n throw new Error(result.rejected);\n }\n\n return {\n packages: result.packages,\n nextResponseArid: result.nextResponseArid,\n };\n}\n\n/**\n * Collect Round 2 responses sequentially.\n *\n * Port of `collect_round2()` from round2.rs lines 216-357.\n */\nasync function collectRound2(\n client: StorageClient,\n registryPath: string,\n registry: Registry,\n coordinatorKeys: PrivateKeys,\n groupId: ARID,\n pendingRequests: PendingRequests,\n timeout: number | undefined,\n): Promise<Round2Collection> {\n if (isVerbose()) {\n console.error(`Collecting Round 2 responses from ${pendingRequests.len()} participants...`);\n }\n\n const allPackages = new Map<string, [XID, unknown][]>();\n const nextResponseArids: [XID, ARID][] = [];\n const errors: [XID, string][] = [];\n\n for (const [participantXid, collectFromArid] of pendingRequests.iterCollect()) {\n const participantRecord = registry.participant(participantXid);\n const participantName = participantRecord?.petName() ?? participantXid.urString();\n\n if (isVerbose()) {\n console.error(`${participantName}...`);\n }\n\n try {\n const collected = await fetchRound2Response(\n client,\n collectFromArid,\n timeout,\n coordinatorKeys,\n groupId,\n participantXid,\n );\n allPackages.set(participantXid.urString(), collected.packages);\n nextResponseArids.push([participantXid, collected.nextResponseArid]);\n } catch (err) {\n if (isVerbose()) {\n console.error(`error: ${err instanceof Error ? err.message : String(err)}`);\n }\n errors.push([participantXid, err instanceof Error ? err.message : String(err)]);\n }\n }\n\n if (errors.length > 0) {\n if (isVerbose()) {\n console.error();\n console.error(`Failed to collect from ${errors.length} participants:`);\n }\n for (const [xid, error] of errors) {\n console.error(` ${xid.urString()}: ${error}`);\n }\n throw new Error(\n `Round 2 collection incomplete: ${errors.length} of ${pendingRequests.len()} responses failed`,\n );\n }\n\n // Persist collected round2 packages\n const displayPath = persistRound2PackagesFromMap(\n registryPath,\n groupId,\n allPackages,\n nextResponseArids,\n );\n\n // Update pending requests\n const newPending = new PendingRequests();\n for (const [xid, sendToArid] of nextResponseArids) {\n newPending.addSendOnly(xid, sendToArid);\n }\n const groupRecord = registry.group(groupId);\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n groupRecord.setPendingRequests(newPending);\n registry.save(registryPath);\n\n return {\n packages: allPackages,\n nextResponseArids,\n displayPath,\n };\n}\n\n/**\n * Persist Round 2 packages from a Map (sequential collection).\n */\nfunction persistRound2PackagesFromMap(\n registryPath: string,\n groupId: ARID,\n allPackages: Map<string, [XID, unknown][]>,\n nextResponseArids: [XID, ARID][],\n): string {\n const stateDir = groupStateDir(registryPath, groupId.hex());\n fs.mkdirSync(stateDir, { recursive: true });\n\n const collectedPath = path.join(stateDir, \"collected_round2.json\");\n const root: Record<string, unknown> = {};\n\n for (const [senderUrString, packages] of allPackages) {\n const senderMap: Record<string, unknown> = {};\n\n // Find response_arid for this sender\n const responseArid = nextResponseArids.find(([xid]) => xid.urString() === senderUrString)?.[1];\n\n if (responseArid !== undefined) {\n senderMap[\"response_arid\"] = responseArid.urString();\n }\n\n const packagesJson: Record<string, unknown> = {};\n for (const [recipient, pkg] of packages) {\n packagesJson[recipient.urString()] = pkg;\n }\n senderMap[\"packages\"] = packagesJson;\n\n root[senderUrString] = senderMap;\n }\n\n fs.writeFileSync(collectedPath, JSON.stringify(root, null, 2));\n\n // Return relative path if possible\n const cwd = process.cwd();\n if (collectedPath.startsWith(cwd)) {\n return collectedPath.slice(cwd.length + 1);\n }\n return collectedPath;\n}\n\n// -----------------------------------------------------------------------------\n// Parallel collection\n// -----------------------------------------------------------------------------\n\n/**\n * Collect Round 2 responses in parallel with progress display.\n *\n * Port of `collect_round2_parallel()` from round2.rs lines 607-643.\n */\nexport async function collectRound2Parallel(\n client: StorageClient,\n registry: Registry,\n pendingRequests: PendingRequests,\n coordinatorKeys: PrivateKeys,\n expectedGroupId: ARID,\n timeout: number | undefined,\n): Promise<CollectionResult<Round2ResponseData>> {\n const requests: [XID, ARID, string][] = [];\n\n for (const [xid, arid] of pendingRequests.iterCollect()) {\n const record = registry.participant(xid);\n const name = record?.petName() ?? xid.urString();\n requests.push([xid, arid, name]);\n }\n\n const config: ParallelFetchConfig = parallelFetchConfigWithTimeout(timeout);\n\n return parallelFetch(\n client,\n requests,\n (envelope: Envelope, xid: XID) =>\n validateAndExtractRound2Response(envelope, coordinatorKeys, expectedGroupId, xid),\n config,\n );\n}\n\n// -----------------------------------------------------------------------------\n// Persist Round 2 packages (parallel)\n// -----------------------------------------------------------------------------\n\n/**\n * Persist Round 2 packages from parallel collection results.\n *\n * Port of `persist_round2_packages()` from round2.rs lines 712-758.\n */\nexport function persistRound2Packages(\n registryPath: string,\n groupId: ARID,\n successes: [XID, Round2ResponseData][],\n): string {\n const stateDir = groupStateDir(registryPath, groupId.hex());\n fs.mkdirSync(stateDir, { recursive: true });\n\n const collectedPath = path.join(stateDir, \"collected_round2.json\");\n const root: Record<string, unknown> = {};\n\n for (const [sender, data] of successes) {\n const senderMap: Record<string, unknown> = {};\n senderMap[\"response_arid\"] = data.nextResponseArid.urString();\n\n const packagesJson: Record<string, unknown> = {};\n for (const [recipient, pkg] of data.packages) {\n packagesJson[recipient.urString()] = pkg;\n }\n senderMap[\"packages\"] = packagesJson;\n\n root[sender.urString()] = senderMap;\n }\n\n fs.writeFileSync(collectedPath, JSON.stringify(root, null, 2));\n\n // Return relative path if possible\n const cwd = process.cwd();\n if (collectedPath.startsWith(cwd)) {\n return collectedPath.slice(cwd.length + 1);\n }\n return collectedPath;\n}\n\n// -----------------------------------------------------------------------------\n// Update pending requests (parallel)\n// -----------------------------------------------------------------------------\n\n/**\n * Update pending requests from parallel collection results.\n *\n * Port of `update_pending_for_finalize_from_collection()` from round2.rs lines 761-777.\n */\nexport function updatePendingForFinalizeFromCollection(\n registry: Registry,\n registryPath: string,\n groupId: ARID,\n successes: [XID, Round2ResponseData][],\n): void {\n const newPending = new PendingRequests();\n for (const [xid, data] of successes) {\n newPending.addSendOnly(xid, data.nextResponseArid);\n }\n\n const groupRecord = registry.group(groupId);\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n groupRecord.setPendingRequests(newPending);\n registry.save(registryPath);\n}\n\n// -----------------------------------------------------------------------------\n// Finalize request building\n// -----------------------------------------------------------------------------\n\n/**\n * Gather packages FOR a specific recipient (from all other senders).\n *\n * Port of `gather_packages_for_recipient()` from round2.rs lines 552-571.\n */\nfunction gatherPackagesForRecipient(\n recipient: XID,\n allPackages: Map<string, [XID, unknown][]>,\n): [XID, unknown][] {\n const result: [XID, unknown][] = [];\n\n for (const [senderUrString, packages] of allPackages) {\n for (const [rcpt, pkg] of packages) {\n if (rcpt.urString() === recipient.urString()) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-require-imports, no-undef\n const { XID: XIDClass } = require(\"@bcts/components\");\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n const sender = XIDClass.fromURString(senderUrString) as XID;\n result.push([sender, pkg]);\n }\n }\n }\n\n if (result.length === 0) {\n throw new Error(`No round2 packages found for recipient ${recipient.urString()}`);\n }\n\n return result;\n}\n\n/**\n * Build a finalize request for a participant.\n *\n * Port of `build_finalize_request_for_participant()` from round2.rs lines 575-594.\n */\nexport function buildFinalizeRequestForParticipant(\n sender: XIDDocument,\n groupId: ARID,\n responseArid: ARID,\n packages: [XID, unknown][],\n): SealedRequest {\n let request = SealedRequest.new(\"dkgFinalize\", ARID.new(), sender)\n .withParameter(\"group\", groupId)\n .withParameter(\"responseArid\", responseArid);\n\n for (const [pkgSender, pkg] of packages) {\n const encoded = JSON.stringify(pkg);\n const pkgEnvelope = Envelope.new(encoded).addAssertion(\"sender\", pkgSender);\n request = request.withParameter(\"round2Package\", pkgEnvelope);\n }\n\n return request;\n}\n\n// -----------------------------------------------------------------------------\n// Send finalize requests (sequential)\n// -----------------------------------------------------------------------------\n\n/**\n * Send finalize requests sequentially.\n *\n * Port of `send_finalize_requests()` from round2.rs lines 444-550.\n */\nasync function sendFinalizeRequests(\n client: StorageClient,\n registryPath: string,\n registry: Registry,\n coordinator: XIDDocument,\n groupId: ARID,\n collection: Round2Collection,\n preview: boolean,\n): Promise<[string, string] | undefined> {\n const signerPrivateKeys = coordinator.inceptionPrivateKeys();\n if (signerPrivateKeys === undefined) {\n throw new Error(\"Coordinator XID document has no signing keys\");\n }\n\n const validUntil = new Date(Date.now() + 60 * 60 * 1000); // 1 hour\n\n // Build participant info: [XID, XIDDocument, sendToArid, collectFromArid]\n const participantInfo: [XID, XIDDocument, ARID, ARID][] = [];\n\n for (const [xid, sendToArid] of collection.nextResponseArids) {\n const record = registry.participant(xid);\n if (record === undefined) {\n throw new Error(`Participant ${xid.urString()} not found in registry`);\n }\n const collectFromArid = ARID.new();\n participantInfo.push([xid, record.xidDocument(), sendToArid, collectFromArid]);\n }\n\n if (isVerbose()) {\n console.error(`Sending finalize packages to ${participantInfo.length} participants...`);\n } else {\n console.error(); // Blank line to separate get phase from put phase\n }\n\n let previewOutput: [string, string] | undefined;\n\n for (const [xid, recipientDoc, sendToArid, collectFromArid] of participantInfo) {\n const record = registry.participant(xid);\n const participantName = record?.petName() ?? xid.urString();\n\n if (isVerbose()) {\n console.error(`${participantName}...`);\n }\n\n // Gather packages FOR this recipient\n const packagesForRecipient = gatherPackagesForRecipient(xid, collection.packages);\n\n const request = buildFinalizeRequestForParticipant(\n coordinator,\n groupId,\n collectFromArid,\n packagesForRecipient,\n );\n\n if (preview && previewOutput === undefined) {\n const unsealedEnvelope = request.toEnvelope(validUntil, signerPrivateKeys, undefined);\n previewOutput = [participantName, unsealedEnvelope.urString()];\n }\n\n const sealedEnvelope = request.toEnvelopeForRecipients(validUntil, signerPrivateKeys, [\n recipientDoc,\n ]);\n\n await putWithIndicator(client, sendToArid, sealedEnvelope, participantName, isVerbose());\n }\n\n // Build pending requests for finalize response collection\n const newPendingRequests = new PendingRequests();\n for (const [xid, , , collectFromArid] of participantInfo) {\n newPendingRequests.addCollectOnly(xid, collectFromArid);\n }\n const groupRecord = registry.group(groupId);\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n groupRecord.setPendingRequests(newPendingRequests);\n registry.save(registryPath);\n\n return previewOutput;\n}\n\n// -----------------------------------------------------------------------------\n// Dispatch finalize requests (parallel)\n// -----------------------------------------------------------------------------\n\n/**\n * Dispatch finalize requests in parallel.\n *\n * Port of `dispatch_finalize_requests_parallel()` from round2.rs lines 780-900.\n */\nexport async function dispatchFinalizeRequestsParallel(\n client: StorageClient,\n registry: Registry,\n registryPath: string,\n coordinator: XIDDocument,\n groupId: ARID,\n successes: [XID, Round2ResponseData][],\n preview: boolean,\n): Promise<[string, string] | undefined> {\n const signerPrivateKeys = coordinator.inceptionPrivateKeys();\n if (signerPrivateKeys === undefined) {\n throw new Error(\"Coordinator XID document has no signing keys\");\n }\n\n const validUntil = new Date(Date.now() + 60 * 60 * 1000); // 1 hour\n\n // Build all_packages map for gatherPackagesForRecipient\n const allPackages = new Map<string, [XID, unknown][]>();\n for (const [xid, data] of successes) {\n allPackages.set(xid.urString(), data.packages);\n }\n\n // Build messages\n const messages: [XID, ARID, Envelope, string][] = [];\n const collectArids: [XID, ARID][] = [];\n let previewOutput: [string, string] | undefined;\n\n for (const [xid, data] of successes) {\n const record = registry.participant(xid);\n if (record === undefined) {\n throw new Error(`Participant ${xid.urString()} not found in registry`);\n }\n const recipientDoc = record.xidDocument();\n const participantName = record.petName() ?? xid.urString();\n\n const collectFromArid = ARID.new();\n collectArids.push([xid, collectFromArid]);\n\n const packagesForRecipient = gatherPackagesForRecipient(xid, allPackages);\n\n const request = buildFinalizeRequestForParticipant(\n coordinator,\n groupId,\n collectFromArid,\n packagesForRecipient,\n );\n\n if (preview && previewOutput === undefined) {\n const unsealedEnvelope = request.toEnvelope(validUntil, signerPrivateKeys, undefined);\n previewOutput = [participantName, unsealedEnvelope.urString()];\n }\n\n const sealedEnvelope = request.toEnvelopeForRecipients(validUntil, signerPrivateKeys, [\n recipientDoc,\n ]);\n\n messages.push([xid, data.nextResponseArid, sealedEnvelope, participantName]);\n }\n\n // Blank line to separate get phase from put phase\n console.error();\n\n // Send all messages in parallel\n const sendResults = await parallelSend(client, messages, isVerbose());\n\n // Check for send failures\n const failures = sendResults.filter(([, err]) => err !== null);\n\n if (failures.length > 0) {\n for (const [xid, error] of failures) {\n if (error !== null) {\n console.error(`Failed to send to ${xid.urString()}: ${error.message}`);\n }\n }\n throw new Error(`Failed to send finalize requests to ${failures.length} participants`);\n }\n\n // Update pending requests for finalize response collection\n const newPendingRequests = new PendingRequests();\n for (const [xid, collectFromArid] of collectArids) {\n newPendingRequests.addCollectOnly(xid, collectFromArid);\n }\n const groupRecord = registry.group(groupId);\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n groupRecord.setPendingRequests(newPendingRequests);\n registry.save(registryPath);\n\n return previewOutput;\n}\n\n// -----------------------------------------------------------------------------\n// Summary printing\n// -----------------------------------------------------------------------------\n\n/**\n * Print summary for parallel collection.\n *\n * Port of `print_summary_parallel()` from round2.rs lines 903-964.\n */\nfunction printSummaryParallel(\n collection: CollectionResult<Round2ResponseData>,\n displayPath: string,\n preview: [string, string] | undefined,\n): void {\n // Report any failures\n if (collection.rejections.length > 0) {\n console.error();\n console.error(\"Rejections:\");\n for (const [xid, reason] of collection.rejections) {\n console.error(` ${xid.urString()}: ${reason}`);\n }\n }\n if (collection.errors.length > 0) {\n console.error();\n console.error(\"Errors:\");\n for (const [xid, error] of collection.errors) {\n console.error(` ${xid.urString()}: ${error}`);\n }\n }\n if (collection.timeouts.length > 0) {\n console.error();\n console.error(\"Timeouts:\");\n for (const xid of collection.timeouts) {\n console.error(` ${xid.urString()}`);\n }\n }\n\n if (!collection.allSucceeded()) {\n console.error();\n console.error(\n `Round 2 collection incomplete: ${collection.successes.length} succeeded, ` +\n `${collection.rejections.length} rejected, ${collection.errors.length} errors, ` +\n `${collection.timeouts.length} timeouts`,\n );\n return;\n }\n\n if (preview !== undefined) {\n const [participantName, ur] = preview;\n if (isVerbose()) {\n console.error(`# Finalize preview for ${participantName}`);\n console.error();\n }\n console.error(\n `Collected ${collection.successes.length} Round 2 responses to ${displayPath} and sent ${collection.successes.length} finalize requests.`,\n );\n console.log(ur);\n } else if (isVerbose()) {\n console.error();\n console.error(\n `Collected ${collection.successes.length} Round 2 responses to ${displayPath} and sent ${collection.successes.length} finalize requests.`,\n );\n }\n}\n\n// -----------------------------------------------------------------------------\n// Main entry point\n// -----------------------------------------------------------------------------\n\n/**\n * Execute the DKG coordinator round 2 command.\n *\n * Collects Round 2 responses and sends finalize packages.\n *\n * Port of `CommandArgs::exec()` from cmd/dkg/coordinator/round2.rs lines 59-203.\n */\nexport async function round2(\n client: StorageClient,\n options: DkgRound2Options,\n cwd: string,\n): Promise<DkgRound2Result> {\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n\n const owner = registry.owner();\n if (owner === undefined) {\n throw new Error(\"Registry owner is required\");\n }\n const ownerDoc = owner.xidDocument();\n\n const groupId = parseAridUr(options.groupId);\n const groupRecord = registry.group(groupId);\n\n if (groupRecord === undefined) {\n throw new Error(`Group ${options.groupId} not found in registry`);\n }\n\n // Verify we are the coordinator\n validateCoordinator(groupRecord, owner.xid());\n\n const pendingRequests = groupRecord.pendingRequests();\n if (pendingRequests.isEmpty()) {\n throw new Error(\n \"No pending requests for this group. Did you run 'frost dkg coordinator round1'?\",\n );\n }\n\n const coordinatorKeys = ownerDoc.inceptionPrivateKeys();\n if (coordinatorKeys === undefined) {\n throw new Error(\"Coordinator XID document has no private keys\");\n }\n\n if (options.parallel === true) {\n // Parallel path with progress display\n const collection = await collectRound2Parallel(\n client,\n registry,\n pendingRequests,\n coordinatorKeys,\n groupId,\n options.timeoutSeconds,\n );\n\n // Persist collected data\n const displayPath = persistRound2Packages(registryPath, groupId, collection.successes);\n\n updatePendingForFinalizeFromCollection(registry, registryPath, groupId, collection.successes);\n\n const preview = await dispatchFinalizeRequestsParallel(\n client,\n registry,\n registryPath,\n ownerDoc,\n groupId,\n collection.successes,\n options.preview ?? false,\n );\n\n printSummaryParallel(collection, displayPath, preview);\n\n return {\n accepted: collection.successes.length,\n rejected: collection.rejections.length,\n errors: collection.errors.length,\n timeouts: collection.timeouts.length,\n displayPath,\n };\n } else {\n // Sequential path (original behavior)\n // Phase 1: Collect Round 2 responses\n const collection = await collectRound2(\n client,\n registryPath,\n registry,\n coordinatorKeys,\n groupId,\n pendingRequests,\n options.timeoutSeconds,\n );\n\n // Phase 2: Send finalize packages\n const preview = await sendFinalizeRequests(\n client,\n registryPath,\n registry,\n ownerDoc,\n groupId,\n collection,\n options.preview ?? false,\n );\n\n if (preview !== undefined) {\n const [participantName, ur] = preview;\n if (isVerbose()) {\n console.error(`# Finalize preview for ${participantName}`);\n console.error();\n }\n console.error(\n `Collected ${collection.packages.size} Round 2 responses to ${collection.displayPath} and sent ${collection.nextResponseArids.length} finalize requests.`,\n );\n console.log(ur);\n } else if (isVerbose()) {\n console.error();\n console.error(\n `Collected ${collection.packages.size} Round 2 responses to ${collection.displayPath} and sent ${collection.nextResponseArids.length} finalize requests.`,\n );\n }\n\n return {\n accepted: collection.packages.size,\n rejected: 0,\n errors: 0,\n timeouts: 0,\n displayPath: collection.displayPath,\n };\n }\n}\n"],"mappings":"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"}
@@ -1,16 +1,16 @@
1
- const require_chunk = require("./chunk-CZWwpsFl.cjs");
1
+ const require_rolldown_runtime = require("./rolldown-runtime-DakpK96I.cjs");
2
2
  const require_registry_index = require("./registry/index.cjs");
3
- const require_common = require("./common-lKP5EzHy.cjs");
4
- const require_busy = require("./busy-EZU7EKr6.cjs");
3
+ const require_common = require("./common-3msAx7hO.cjs");
4
+ const require_busy = require("./busy-B_h0bNAJ.cjs");
5
5
  const require_frost_index = require("./frost/index.cjs");
6
- const require_common$1 = require("./common-lThIvJmZ.cjs");
6
+ const require_common$1 = require("./common-CeTqMwj0.cjs");
7
7
  let _bcts_components = require("@bcts/components");
8
8
  let _bcts_dcbor = require("@bcts/dcbor");
9
9
  let _bcts_envelope = require("@bcts/envelope");
10
10
  let node_fs = require("node:fs");
11
- node_fs = require_chunk.__toESM(node_fs, 1);
11
+ node_fs = require_rolldown_runtime.__toESM(node_fs, 1);
12
12
  let node_path = require("node:path");
13
- node_path = require_chunk.__toESM(node_path, 1);
13
+ node_path = require_rolldown_runtime.__toESM(node_path, 1);
14
14
  let _frosts_ed25519 = require("@frosts/ed25519");
15
15
  let _frosts_core = require("@frosts/core");
16
16
  //#region src/cmd/sign/participant/round2.ts
@@ -25,7 +25,7 @@ let _frosts_core = require("@frosts/core");
25
25
  *
26
26
  * @module
27
27
  */
28
- var round2_exports = /* @__PURE__ */ require_chunk.__exportAll({ round2: () => round2 });
28
+ var round2_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({ round2: () => round2 });
29
29
  /**
30
30
  * Load receive state from sign_receive.json.
31
31
  *
@@ -302,4 +302,4 @@ Object.defineProperty(exports, "round2_exports", {
302
302
  }
303
303
  });
304
304
 
305
- //# sourceMappingURL=round2-BWz9SQIi.cjs.map
305
+ //# sourceMappingURL=round2-D8l1PUm5.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"round2-BWz9SQIi.cjs","names":["path","fs","ARIDClass","parseAridUr","XIDClass","signingStateDir","Nonce","Ed25519Sha512","serde","SigningNonces","deserializeSigningCommitments","EnvelopeFunction","JSONComponent","identifierFromU16","serializeSignatureShare","Envelope","serializeSigningCommitments","resolveRegistryPath","Registry","deserializeKeyPackage","getWithIndicator","CborDate","signingRound2","createSigningPackage","putWithIndicator"],"sources":["../src/cmd/sign/participant/round2.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Sign participant round 2 command.\n *\n * Port of cmd/sign/participant/round2.rs from frost-hubert-rust.\n *\n * @module\n */\n\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport {\n type ARID,\n type XID,\n XID as XIDClass,\n ARID as ARIDClass,\n JSON as JSONComponent,\n type Digest,\n} from \"@bcts/components\";\nimport { CborDate } from \"@bcts/dcbor\";\nimport { Envelope, Function as EnvelopeFunction } from \"@bcts/envelope\";\nimport { type XIDDocument } from \"@bcts/xid\";\n\nimport { Registry, resolveRegistryPath } from \"../../../registry/index.js\";\nimport { getWithIndicator, putWithIndicator } from \"../../busy.js\";\nimport { type StorageClient } from \"../../storage.js\";\nimport { parseAridUr } from \"../../dkg/common.js\";\nimport { signingStateDir } from \"../common.js\";\nimport {\n signingRound2,\n createSigningPackage,\n deserializeKeyPackage,\n deserializeSigningCommitments,\n serializeSignatureShare,\n serializeSigningCommitments,\n identifierFromU16,\n type SerializedKeyPackage,\n type SerializedSigningCommitments,\n type FrostIdentifier,\n type FrostKeyPackage,\n type Ed25519SigningCommitments,\n type Ed25519SignatureShare,\n} from \"../../../frost/index.js\";\n\n// Import nonces from @frosts/core\nimport { Nonce, SigningNonces } from \"@frosts/core\";\nimport { Ed25519Sha512, serde } from \"@frosts/ed25519\";\n\n/**\n * Options for the sign round2 command.\n */\nexport interface SignRound2Options {\n registryPath?: string;\n sessionId: string;\n groupId?: string;\n timeoutSeconds?: number;\n preview?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Result of the sign round2 command.\n */\nexport interface SignRound2Result {\n listeningArid: string;\n}\n\n/**\n * ReceiveState loaded from sign_receive.json.\n *\n * Port of `struct ReceiveState` from cmd/sign/participant/round2.rs.\n */\ninterface ReceiveState {\n groupId: ARID;\n participants: XID[];\n minSigners: number;\n targetUr: string;\n}\n\n/**\n * CommitState loaded from commit.json.\n *\n * Port of `struct CommitState` from cmd/sign/participant/round2.rs.\n */\ninterface CommitState {\n nextShareArid: ARID;\n targetUr: string;\n signingNonces: SigningNonces<typeof Ed25519Sha512>;\n signingCommitments: Ed25519SigningCommitments;\n}\n\n/**\n * Sealed request interface for GSTP.\n */\ninterface SealedRequestInstance {\n function: () => unknown;\n id: () => ARID;\n sender: () => { xid: () => XID };\n extractObjectForParameter: <T>(name: string) => T;\n objectsForParameter: (name: string) => Envelope[];\n}\n\n/**\n * Load receive state from sign_receive.json.\n *\n * Port of `load_receive_state()` from cmd/sign/participant/round2.rs.\n */\nfunction loadReceiveState(registryPath: string, sessionId: ARID, groupHint?: ARID): ReceiveState {\n const base = path.dirname(registryPath);\n const groupStateDir = path.join(base, \"group-state\");\n\n // Find candidate paths\n let groupDirs: [ARID, string][];\n\n if (groupHint) {\n groupDirs = [[groupHint, path.join(groupStateDir, groupHint.hex())]];\n } else {\n groupDirs = [];\n if (fs.existsSync(groupStateDir)) {\n for (const entry of fs.readdirSync(groupStateDir, { withFileTypes: true })) {\n if (entry.isDirectory() && entry.name.length === 64 && /^[0-9a-f]+$/i.test(entry.name)) {\n const groupId = ARIDClass.fromHex(entry.name);\n groupDirs.push([groupId, path.join(groupStateDir, entry.name)]);\n }\n }\n }\n }\n\n const candidates: [ARID, string][] = [];\n for (const [groupId, groupDir] of groupDirs) {\n const candidate = path.join(groupDir, \"signing\", sessionId.hex(), \"sign_receive.json\");\n if (fs.existsSync(candidate)) {\n candidates.push([groupId, candidate]);\n }\n }\n\n if (candidates.length === 0) {\n throw new Error(\n \"No sign_receive.json found for this session; run `frost sign participant receive` first\",\n );\n }\n if (candidates.length > 1) {\n throw new Error(\"Multiple groups contain this session; use --group to disambiguate\");\n }\n\n const [groupId, statePath] = candidates[0];\n const raw = JSON.parse(fs.readFileSync(statePath, \"utf-8\")) as Record<string, unknown>;\n\n const getStr = (key: string): string => {\n const value = raw[key];\n if (typeof value !== \"string\") {\n throw new Error(`Missing or invalid ${key} in sign_receive.json`);\n }\n return value;\n };\n\n // Validate session matches\n const sessionInState = parseAridUr(getStr(\"session\"));\n if (sessionInState.urString() !== sessionId.urString()) {\n throw new Error(\n `Session ${sessionInState.urString()} in sign_receive.json does not match requested session ${sessionId.urString()}`,\n );\n }\n\n // Validate group matches\n const groupInState = parseAridUr(getStr(\"group\"));\n if (groupInState.urString() !== groupId.urString()) {\n throw new Error(\n `Group ${groupInState.urString()} in sign_receive.json does not match directory group ${groupId.urString()}`,\n );\n }\n\n // Parse participants\n const participantsVal = raw[\"participants\"] as string[] | undefined;\n if (!participantsVal || !Array.isArray(participantsVal)) {\n throw new Error(\"Missing participants in sign_receive.json\");\n }\n\n const participants: XID[] = [];\n for (const entry of participantsVal) {\n if (typeof entry !== \"string\") {\n throw new Error(\"Invalid participant entry in sign_receive.json\");\n }\n participants.push(XIDClass.fromURString(entry));\n }\n\n // Parse min_signers\n const minSigners = raw[\"min_signers\"];\n if (typeof minSigners !== \"number\") {\n throw new Error(\"Missing min_signers in sign_receive.json\");\n }\n\n const targetUr = getStr(\"target\");\n\n return {\n groupId,\n participants,\n minSigners,\n targetUr,\n };\n}\n\n/**\n * Load commit state from commit.json (includes nonces).\n *\n * Port of `load_commit_state()` from cmd/sign/participant/round2.rs.\n */\nfunction loadCommitState(registryPath: string, groupId: ARID, sessionId: ARID): CommitState {\n const dir = signingStateDir(registryPath, groupId.hex(), sessionId.hex());\n const statePath = path.join(dir, \"commit.json\");\n\n if (!fs.existsSync(statePath)) {\n throw new Error(\n `Commit state not found at ${statePath}. Run \\`frost sign participant commit\\` first.`,\n );\n }\n\n const raw = JSON.parse(fs.readFileSync(statePath, \"utf-8\")) as Record<string, unknown>;\n\n const getStr = (key: string): string => {\n const value = raw[key];\n if (typeof value !== \"string\") {\n throw new Error(`Missing or invalid ${key} in commit.json`);\n }\n return value;\n };\n\n // Validate session matches\n const sessionInState = parseAridUr(getStr(\"session\"));\n if (sessionInState.urString() !== sessionId.urString()) {\n throw new Error(\n `Session ${sessionInState.urString()} in commit.json does not match requested session ${sessionId.urString()}`,\n );\n }\n\n const nextShareArid = parseAridUr(getStr(\"next_share_arid\"));\n const targetUr = getStr(\"target\");\n\n // Deserialize signing nonces\n const noncesRaw = raw[\"signing_nonces\"] as Record<string, string> | undefined;\n if (!noncesRaw) {\n throw new Error(\"Missing signing_nonces in commit.json\");\n }\n\n const hidingNonce = Nonce.deserialize(Ed25519Sha512, serde.hexToBytes(noncesRaw[\"hiding\"]));\n const bindingNonce = Nonce.deserialize(Ed25519Sha512, serde.hexToBytes(noncesRaw[\"binding\"]));\n const signingNonces = SigningNonces.fromNonces(Ed25519Sha512, hidingNonce, bindingNonce);\n\n // Deserialize signing commitments\n const commitmentsRaw = raw[\"signing_commitments\"] as SerializedSigningCommitments | undefined;\n if (!commitmentsRaw) {\n throw new Error(\"Missing signing_commitments in commit.json\");\n }\n const signingCommitments = deserializeSigningCommitments(commitmentsRaw);\n\n return {\n nextShareArid,\n targetUr,\n signingNonces,\n signingCommitments,\n };\n}\n\n/**\n * Validate the incoming GSTP request.\n *\n * Port of request validation logic from cmd/sign/participant/round2.rs.\n */\nfunction validateShareRequest(\n sealedRequest: SealedRequestInstance,\n sessionId: ARID,\n expectedCoordinator: XID,\n): void {\n // Check function\n const expectedFunction = EnvelopeFunction.fromString(\"signRound2\");\n const actualFunction = sealedRequest.function();\n // @ts-expect-error - function() returns unknown, but it should have .equals()\n if (actualFunction.equals(expectedFunction) !== true) {\n throw new Error(`Unexpected request function: ${String(sealedRequest.function())}`);\n }\n\n // Check session ID\n if (sealedRequest.id().urString() !== sessionId.urString()) {\n throw new Error(\n `Session ID mismatch (request ${sealedRequest.id().urString()}, expected ${sessionId.urString()})`,\n );\n }\n\n // Check sender (coordinator)\n if (sealedRequest.sender().xid().urString() !== expectedCoordinator.urString()) {\n throw new Error(\n `Unexpected request sender: ${sealedRequest.sender().xid().urString()} (expected coordinator ${expectedCoordinator.urString()})`,\n );\n }\n}\n\n/**\n * Extract all commitments from the signRound2 request.\n *\n * Port of `parse_commitments()` from cmd/sign/participant/round2.rs.\n */\nfunction extractCommitments(\n sealedRequest: SealedRequestInstance,\n receiveState: ReceiveState,\n): Map<string, Ed25519SigningCommitments> {\n const commitments = new Map<string, Ed25519SigningCommitments>();\n\n const commitmentObjects = sealedRequest.objectsForParameter(\"commitment\");\n\n for (const entry of commitmentObjects) {\n // Extract XID subject\n const xid = XIDClass.fromTaggedCbor(entry.subject().tryLeaf());\n\n // Extract commitments from the \"commitments\" predicate\n const commitmentsObjects = entry.objectsForPredicate(\"commitments\");\n if (commitmentsObjects.length === 0) {\n throw new Error(`Missing commitments for participant ${xid.urString()}`);\n }\n\n const commitmentsJson = JSONComponent.fromTaggedCbor(commitmentsObjects[0].subject().tryLeaf());\n const serializedCommitments = JSON.parse(\n commitmentsJson.asStr(),\n ) as SerializedSigningCommitments;\n const signingCommitments = deserializeSigningCommitments(serializedCommitments);\n\n const xidUr = xid.urString();\n if (commitments.has(xidUr)) {\n throw new Error(`Duplicate commitments for participant ${xidUr}`);\n }\n commitments.set(xidUr, signingCommitments);\n }\n\n if (commitments.size === 0) {\n throw new Error(\"signRound2 request contains no commitments\");\n }\n\n // Validate expected participant set\n const expectedSet = new Set(receiveState.participants.map((p) => p.urString()));\n const actualSet = new Set(commitments.keys());\n\n const missing: string[] = [];\n const extra: string[] = [];\n\n for (const xid of expectedSet) {\n if (!actualSet.has(xid)) {\n missing.push(xid);\n }\n }\n for (const xid of actualSet) {\n if (!expectedSet.has(xid)) {\n extra.push(xid);\n }\n }\n\n if (missing.length > 0 || extra.length > 0) {\n throw new Error(\n `signRound2 commitments do not match session participants (missing: ${missing.join(\", \")}; extra: ${extra.join(\", \")})`,\n );\n }\n\n return commitments;\n}\n\n/**\n * Build a map from XID to FROST identifier (sorted participant order).\n *\n * Port of `xid_identifier_map()` from cmd/sign/participant/round2.rs.\n */\nfunction xidIdentifierMap(participants: XID[]): Map<string, FrostIdentifier> {\n const map = new Map<string, FrostIdentifier>();\n for (let i = 0; i < participants.length; i++) {\n const identifier = identifierFromU16(i + 1);\n map.set(participants[i].urString(), identifier);\n }\n return map;\n}\n\n/**\n * Build signing commitments with identifiers.\n *\n * Port of `commitments_with_identifiers()` from cmd/sign/participant/round2.rs.\n */\nfunction commitmentsWithIdentifiers(\n commitments: Map<string, Ed25519SigningCommitments>,\n xidToIdentifier: Map<string, FrostIdentifier>,\n): Map<FrostIdentifier, Ed25519SigningCommitments> {\n const mapped = new Map<FrostIdentifier, Ed25519SigningCommitments>();\n for (const [xidUr, commits] of commitments) {\n const identifier = xidToIdentifier.get(xidUr);\n if (!identifier) {\n throw new Error(`Unknown participant ${xidUr}`);\n }\n mapped.set(identifier, commits);\n }\n return mapped;\n}\n\n/**\n * Build the signRound2Response body envelope.\n *\n * Port of response body construction from cmd/sign/participant/round2.rs.\n */\nfunction buildResponseBody(\n sessionId: ARID,\n signatureShare: Ed25519SignatureShare,\n finalizeArid: ARID,\n): Envelope {\n const shareHex = serializeSignatureShare(signatureShare);\n const shareJson = JSONComponent.fromString(JSON.stringify({ share: shareHex }));\n\n return Envelope.unit()\n .addType(\"signRound2Response\")\n .addAssertion(\"session\", sessionId)\n .addAssertion(\"signature_share\", shareJson)\n .addAssertion(\"response_arid\", finalizeArid);\n}\n\n/**\n * Persist share state to share.json.\n *\n * Port of `persist_share_state()` from cmd/sign/participant/round2.rs.\n */\nfunction persistShareState(\n registryPath: string,\n groupId: ARID,\n sessionId: ARID,\n responseArid: ARID,\n finalizeArid: ARID,\n signatureShare: Ed25519SignatureShare,\n commitments: Map<string, Ed25519SigningCommitments>,\n): void {\n const dir = signingStateDir(registryPath, groupId.hex(), sessionId.hex());\n fs.mkdirSync(dir, { recursive: true });\n\n // Build commitments JSON object\n const commitmentsJson: Record<string, SerializedSigningCommitments> = {};\n for (const [xidUr, commits] of commitments) {\n commitmentsJson[xidUr] = serializeSigningCommitments(commits);\n }\n\n // Build root JSON object\n const root = {\n session: sessionId.urString(),\n response_arid: responseArid.urString(),\n finalize_arid: finalizeArid.urString(),\n signature_share: { share: serializeSignatureShare(signatureShare) },\n commitments: commitmentsJson,\n };\n\n fs.writeFileSync(path.join(dir, \"share.json\"), JSON.stringify(root, null, 2));\n}\n\n/**\n * Execute the sign participant round 2 command.\n *\n * Receives round 2 request and sends signature share.\n *\n * Port of `CommandArgs::exec()` from cmd/sign/participant/round2.rs.\n */\nexport async function round2(\n client: StorageClient,\n options: SignRound2Options,\n cwd: string,\n): Promise<SignRound2Result> {\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n\n const owner = registry.owner();\n if (!owner) {\n throw new Error(\"Registry owner is required\");\n }\n const ownerXidDocument = owner.xidDocument();\n\n const sessionId = parseAridUr(options.sessionId);\n const groupHint = options.groupId ? parseAridUr(options.groupId) : undefined;\n\n // Load receive state (finds group automatically if not specified)\n const receiveState = loadReceiveState(registryPath, sessionId, groupHint);\n const groupId = receiveState.groupId;\n\n const groupRecord = registry.group(groupId);\n if (!groupRecord) {\n throw new Error(\"Group not found in registry\");\n }\n\n // Validate min_signers matches\n if (groupRecord.minSigners() !== receiveState.minSigners) {\n throw new Error(\n `Session min_signers ${receiveState.minSigners} does not match registry ${groupRecord.minSigners()}`,\n );\n }\n\n // Validate participants match\n const registryParticipants = new Set(groupRecord.participants().map((p) => p.xid().urString()));\n const sessionParticipants = new Set(receiveState.participants.map((p) => p.urString()));\n\n if (\n registryParticipants.size !== sessionParticipants.size ||\n ![...registryParticipants].every((p) => sessionParticipants.has(p))\n ) {\n throw new Error(\"Session participants do not match registry group participants\");\n }\n\n // Validate owner participates in this session\n if (!sessionParticipants.has(owner.xid().urString())) {\n throw new Error(\"This participant is not part of the signing session\");\n }\n\n // Get listening ARID from registry\n const listeningAtArid = groupRecord.listeningAtArid();\n if (!listeningAtArid) {\n throw new Error(\n \"No listening ARID for signRound2. Did you run `frost sign participant commit`?\",\n );\n }\n\n // Load commit state and validate\n const commitState = loadCommitState(registryPath, groupId, sessionId);\n\n if (commitState.nextShareArid.urString() !== listeningAtArid.urString()) {\n throw new Error(\n `Listening ARID in registry (${listeningAtArid.urString()}) does not match persisted commit state (${commitState.nextShareArid.urString()})`,\n );\n }\n\n if (commitState.targetUr !== receiveState.targetUr) {\n throw new Error(\"Target envelope in commit state does not match persisted signInvite request\");\n }\n\n // Load key package\n const keyPackagePath = groupRecord.contributions().keyPackage;\n if (!keyPackagePath) {\n throw new Error(\"Key package path not found; did you finish DKG?\");\n }\n\n interface KeyPackageFile {\n group?: string;\n key_package: SerializedKeyPackage;\n }\n\n const keyPackageFile = JSON.parse(fs.readFileSync(keyPackagePath, \"utf-8\")) as KeyPackageFile;\n const keyPackage: FrostKeyPackage = deserializeKeyPackage(keyPackageFile.key_package);\n\n // Create finalize ARID\n const finalizeArid = ARIDClass.new();\n\n // Compute target digest from persisted target envelope\n const targetEnvelope = Envelope.fromURString(receiveState.targetUr);\n const targetDigest: Digest = targetEnvelope.subject().digest();\n\n if (options.verbose === true) {\n console.error(\"Fetching signRound2 request from Hubert...\");\n }\n\n // Fetch request from storage\n const requestEnvelope = await getWithIndicator(\n client,\n listeningAtArid,\n \"signRound2 request\",\n options.timeoutSeconds,\n options.verbose ?? false,\n );\n\n if (!requestEnvelope) {\n throw new Error(\"signRound2 request not found in Hubert storage\");\n }\n\n // Parse sealed request\n const signerPrivateKeys = ownerXidDocument.inceptionPrivateKeys();\n if (!signerPrivateKeys) {\n throw new Error(\"Owner XID document has no private keys\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports, no-undef\n const { SealedRequest: SealedRequestClass } = require(\"@bcts/gstp\") as {\n SealedRequest: {\n tryFromEnvelope: (\n envelope: Envelope,\n expectedSender: XID | undefined,\n now: CborDate,\n recipientPrivateKeys: unknown,\n ) => SealedRequestInstance;\n };\n };\n\n const now = CborDate.now();\n const sealedRequest = SealedRequestClass.tryFromEnvelope(\n requestEnvelope,\n undefined,\n now,\n signerPrivateKeys,\n );\n\n // Validate request\n const expectedCoordinator = groupRecord.coordinator().xid();\n validateShareRequest(sealedRequest, sessionId, expectedCoordinator);\n\n // Extract response ARID from request\n const responseArid: ARID = sealedRequest.extractObjectForParameter(\"response_arid\");\n\n // Extract and validate commitments\n const commitmentsByXid = extractCommitments(sealedRequest, receiveState);\n\n // Verify our commitments match\n const myCommitments = commitmentsByXid.get(owner.xid().urString());\n if (!myCommitments) {\n throw new Error(\"signRound2 request missing commitments for this participant\");\n }\n\n // Compare commitments using serialized form\n const myCommitmentsSerialized = serializeSigningCommitments(myCommitments);\n const storedCommitmentsSerialized = serializeSigningCommitments(commitState.signingCommitments);\n\n if (\n myCommitmentsSerialized.hiding !== storedCommitmentsSerialized.hiding ||\n myCommitmentsSerialized.binding !== storedCommitmentsSerialized.binding\n ) {\n throw new Error(\"signRound2 request commitments do not match locally stored commitments\");\n }\n\n // Build XID to identifier map (sorted participant order)\n const xidToIdentifier = xidIdentifierMap(receiveState.participants);\n\n // Verify our identifier matches key package\n const myIdentifier = xidToIdentifier.get(owner.xid().urString());\n if (!myIdentifier) {\n throw new Error(\"Identifier for participant not found\");\n }\n\n // Verify key package min_signers matches\n if (keyPackage.minSigners !== receiveState.minSigners) {\n throw new Error(\n `Key package min_signers ${keyPackage.minSigners} does not match session ${receiveState.minSigners}`,\n );\n }\n\n // Verify enough commitments\n if (commitmentsByXid.size < receiveState.minSigners) {\n throw new Error(\n `signRound2 request contained ${commitmentsByXid.size} commitments but requires at least ${receiveState.minSigners} signers`,\n );\n }\n\n // Build signing commitments with identifiers\n const signingCommitments = commitmentsWithIdentifiers(commitmentsByXid, xidToIdentifier);\n\n // Create signing package\n const signingPackage = createSigningPackage(signingCommitments, targetDigest.data());\n\n // Generate signature share using FROST round 2\n const signatureShare = signingRound2(signingPackage, commitState.signingNonces, keyPackage);\n\n // Build response body\n const responseBody = buildResponseBody(sessionId, signatureShare, finalizeArid);\n\n // Build sealed response\n // eslint-disable-next-line @typescript-eslint/no-require-imports, no-undef\n const { SealedResponse: SealedResponseClass } = require(\"@bcts/gstp\") as {\n SealedResponse: {\n newSuccess: (\n requestId: ARID,\n sender: XIDDocument,\n ) => {\n withResult: (result: Envelope) => {\n withPeerContinuation: (continuation: unknown) => {\n toEnvelope: (\n expiry: CborDate | undefined,\n signerPrivateKeys: unknown,\n recipient: XIDDocument | undefined,\n ) => Envelope;\n };\n toEnvelope: (\n expiry: CborDate | undefined,\n signerPrivateKeys: unknown,\n recipient: XIDDocument | undefined,\n ) => Envelope;\n };\n };\n };\n };\n\n const sealedResponse = SealedResponseClass.newSuccess(\n sealedRequest.id(),\n ownerXidDocument,\n ).withResult(responseBody);\n\n // Preview mode - print unsealed response\n if (options.preview === true) {\n const unsealed = sealedResponse.toEnvelope(undefined, signerPrivateKeys, undefined);\n console.log(unsealed.urString());\n return {\n listeningArid: finalizeArid.urString(),\n };\n }\n\n // Get coordinator XID document for encryption\n let coordinatorDoc: XIDDocument;\n if (expectedCoordinator.urString() === owner.xid().urString()) {\n coordinatorDoc = ownerXidDocument;\n } else {\n const coordinatorRecord = registry.participant(expectedCoordinator);\n if (!coordinatorRecord) {\n throw new Error(`Coordinator ${expectedCoordinator.urString()} not found in registry`);\n }\n coordinatorDoc = coordinatorRecord.xidDocument();\n }\n\n // Create response envelope with expiry\n const expiry = CborDate.withDurationFromNow(60 * 60); // 1 hour\n const responseEnvelope = sealedResponse.toEnvelope(expiry, signerPrivateKeys, coordinatorDoc);\n\n // Send response\n await putWithIndicator(\n client,\n responseArid,\n responseEnvelope,\n \"Signature Share\",\n options.verbose ?? false,\n );\n\n // Persist share state\n persistShareState(\n registryPath,\n groupId,\n sessionId,\n responseArid,\n finalizeArid,\n signatureShare,\n commitmentsByXid,\n );\n\n // Update registry with finalize listening ARID\n const groupRecordMutable = registry.group(groupId);\n if (groupRecordMutable) {\n groupRecordMutable.setListeningAtArid(finalizeArid);\n registry.save(registryPath);\n }\n\n if (options.verbose === true) {\n console.error(`Posted signature share to ${responseArid.urString()}`);\n }\n\n return {\n listeningArid: finalizeArid.urString(),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"round2-D8l1PUm5.cjs","names":["path","fs","ARIDClass","parseAridUr","XIDClass","signingStateDir","Nonce","Ed25519Sha512","serde","SigningNonces","deserializeSigningCommitments","EnvelopeFunction","JSONComponent","identifierFromU16","serializeSignatureShare","Envelope","serializeSigningCommitments","resolveRegistryPath","Registry","deserializeKeyPackage","getWithIndicator","CborDate","signingRound2","createSigningPackage","putWithIndicator"],"sources":["../src/cmd/sign/participant/round2.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Sign participant round 2 command.\n *\n * Port of cmd/sign/participant/round2.rs from frost-hubert-rust.\n *\n * @module\n */\n\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport {\n type ARID,\n type XID,\n XID as XIDClass,\n ARID as ARIDClass,\n JSON as JSONComponent,\n type Digest,\n} from \"@bcts/components\";\nimport { CborDate } from \"@bcts/dcbor\";\nimport { Envelope, Function as EnvelopeFunction } from \"@bcts/envelope\";\nimport { type XIDDocument } from \"@bcts/xid\";\n\nimport { Registry, resolveRegistryPath } from \"../../../registry/index.js\";\nimport { getWithIndicator, putWithIndicator } from \"../../busy.js\";\nimport { type StorageClient } from \"../../storage.js\";\nimport { parseAridUr } from \"../../dkg/common.js\";\nimport { signingStateDir } from \"../common.js\";\nimport {\n signingRound2,\n createSigningPackage,\n deserializeKeyPackage,\n deserializeSigningCommitments,\n serializeSignatureShare,\n serializeSigningCommitments,\n identifierFromU16,\n type SerializedKeyPackage,\n type SerializedSigningCommitments,\n type FrostIdentifier,\n type FrostKeyPackage,\n type Ed25519SigningCommitments,\n type Ed25519SignatureShare,\n} from \"../../../frost/index.js\";\n\n// Import nonces from @frosts/core\nimport { Nonce, SigningNonces } from \"@frosts/core\";\nimport { Ed25519Sha512, serde } from \"@frosts/ed25519\";\n\n/**\n * Options for the sign round2 command.\n */\nexport interface SignRound2Options {\n registryPath?: string;\n sessionId: string;\n groupId?: string;\n timeoutSeconds?: number;\n preview?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Result of the sign round2 command.\n */\nexport interface SignRound2Result {\n listeningArid: string;\n}\n\n/**\n * ReceiveState loaded from sign_receive.json.\n *\n * Port of `struct ReceiveState` from cmd/sign/participant/round2.rs.\n */\ninterface ReceiveState {\n groupId: ARID;\n participants: XID[];\n minSigners: number;\n targetUr: string;\n}\n\n/**\n * CommitState loaded from commit.json.\n *\n * Port of `struct CommitState` from cmd/sign/participant/round2.rs.\n */\ninterface CommitState {\n nextShareArid: ARID;\n targetUr: string;\n signingNonces: SigningNonces<typeof Ed25519Sha512>;\n signingCommitments: Ed25519SigningCommitments;\n}\n\n/**\n * Sealed request interface for GSTP.\n */\ninterface SealedRequestInstance {\n function: () => unknown;\n id: () => ARID;\n sender: () => { xid: () => XID };\n extractObjectForParameter: <T>(name: string) => T;\n objectsForParameter: (name: string) => Envelope[];\n}\n\n/**\n * Load receive state from sign_receive.json.\n *\n * Port of `load_receive_state()` from cmd/sign/participant/round2.rs.\n */\nfunction loadReceiveState(registryPath: string, sessionId: ARID, groupHint?: ARID): ReceiveState {\n const base = path.dirname(registryPath);\n const groupStateDir = path.join(base, \"group-state\");\n\n // Find candidate paths\n let groupDirs: [ARID, string][];\n\n if (groupHint) {\n groupDirs = [[groupHint, path.join(groupStateDir, groupHint.hex())]];\n } else {\n groupDirs = [];\n if (fs.existsSync(groupStateDir)) {\n for (const entry of fs.readdirSync(groupStateDir, { withFileTypes: true })) {\n if (entry.isDirectory() && entry.name.length === 64 && /^[0-9a-f]+$/i.test(entry.name)) {\n const groupId = ARIDClass.fromHex(entry.name);\n groupDirs.push([groupId, path.join(groupStateDir, entry.name)]);\n }\n }\n }\n }\n\n const candidates: [ARID, string][] = [];\n for (const [groupId, groupDir] of groupDirs) {\n const candidate = path.join(groupDir, \"signing\", sessionId.hex(), \"sign_receive.json\");\n if (fs.existsSync(candidate)) {\n candidates.push([groupId, candidate]);\n }\n }\n\n if (candidates.length === 0) {\n throw new Error(\n \"No sign_receive.json found for this session; run `frost sign participant receive` first\",\n );\n }\n if (candidates.length > 1) {\n throw new Error(\"Multiple groups contain this session; use --group to disambiguate\");\n }\n\n const [groupId, statePath] = candidates[0];\n const raw = JSON.parse(fs.readFileSync(statePath, \"utf-8\")) as Record<string, unknown>;\n\n const getStr = (key: string): string => {\n const value = raw[key];\n if (typeof value !== \"string\") {\n throw new Error(`Missing or invalid ${key} in sign_receive.json`);\n }\n return value;\n };\n\n // Validate session matches\n const sessionInState = parseAridUr(getStr(\"session\"));\n if (sessionInState.urString() !== sessionId.urString()) {\n throw new Error(\n `Session ${sessionInState.urString()} in sign_receive.json does not match requested session ${sessionId.urString()}`,\n );\n }\n\n // Validate group matches\n const groupInState = parseAridUr(getStr(\"group\"));\n if (groupInState.urString() !== groupId.urString()) {\n throw new Error(\n `Group ${groupInState.urString()} in sign_receive.json does not match directory group ${groupId.urString()}`,\n );\n }\n\n // Parse participants\n const participantsVal = raw[\"participants\"] as string[] | undefined;\n if (!participantsVal || !Array.isArray(participantsVal)) {\n throw new Error(\"Missing participants in sign_receive.json\");\n }\n\n const participants: XID[] = [];\n for (const entry of participantsVal) {\n if (typeof entry !== \"string\") {\n throw new Error(\"Invalid participant entry in sign_receive.json\");\n }\n participants.push(XIDClass.fromURString(entry));\n }\n\n // Parse min_signers\n const minSigners = raw[\"min_signers\"];\n if (typeof minSigners !== \"number\") {\n throw new Error(\"Missing min_signers in sign_receive.json\");\n }\n\n const targetUr = getStr(\"target\");\n\n return {\n groupId,\n participants,\n minSigners,\n targetUr,\n };\n}\n\n/**\n * Load commit state from commit.json (includes nonces).\n *\n * Port of `load_commit_state()` from cmd/sign/participant/round2.rs.\n */\nfunction loadCommitState(registryPath: string, groupId: ARID, sessionId: ARID): CommitState {\n const dir = signingStateDir(registryPath, groupId.hex(), sessionId.hex());\n const statePath = path.join(dir, \"commit.json\");\n\n if (!fs.existsSync(statePath)) {\n throw new Error(\n `Commit state not found at ${statePath}. Run \\`frost sign participant commit\\` first.`,\n );\n }\n\n const raw = JSON.parse(fs.readFileSync(statePath, \"utf-8\")) as Record<string, unknown>;\n\n const getStr = (key: string): string => {\n const value = raw[key];\n if (typeof value !== \"string\") {\n throw new Error(`Missing or invalid ${key} in commit.json`);\n }\n return value;\n };\n\n // Validate session matches\n const sessionInState = parseAridUr(getStr(\"session\"));\n if (sessionInState.urString() !== sessionId.urString()) {\n throw new Error(\n `Session ${sessionInState.urString()} in commit.json does not match requested session ${sessionId.urString()}`,\n );\n }\n\n const nextShareArid = parseAridUr(getStr(\"next_share_arid\"));\n const targetUr = getStr(\"target\");\n\n // Deserialize signing nonces\n const noncesRaw = raw[\"signing_nonces\"] as Record<string, string> | undefined;\n if (!noncesRaw) {\n throw new Error(\"Missing signing_nonces in commit.json\");\n }\n\n const hidingNonce = Nonce.deserialize(Ed25519Sha512, serde.hexToBytes(noncesRaw[\"hiding\"]));\n const bindingNonce = Nonce.deserialize(Ed25519Sha512, serde.hexToBytes(noncesRaw[\"binding\"]));\n const signingNonces = SigningNonces.fromNonces(Ed25519Sha512, hidingNonce, bindingNonce);\n\n // Deserialize signing commitments\n const commitmentsRaw = raw[\"signing_commitments\"] as SerializedSigningCommitments | undefined;\n if (!commitmentsRaw) {\n throw new Error(\"Missing signing_commitments in commit.json\");\n }\n const signingCommitments = deserializeSigningCommitments(commitmentsRaw);\n\n return {\n nextShareArid,\n targetUr,\n signingNonces,\n signingCommitments,\n };\n}\n\n/**\n * Validate the incoming GSTP request.\n *\n * Port of request validation logic from cmd/sign/participant/round2.rs.\n */\nfunction validateShareRequest(\n sealedRequest: SealedRequestInstance,\n sessionId: ARID,\n expectedCoordinator: XID,\n): void {\n // Check function\n const expectedFunction = EnvelopeFunction.fromString(\"signRound2\");\n const actualFunction = sealedRequest.function();\n // @ts-expect-error - function() returns unknown, but it should have .equals()\n if (actualFunction.equals(expectedFunction) !== true) {\n throw new Error(`Unexpected request function: ${String(sealedRequest.function())}`);\n }\n\n // Check session ID\n if (sealedRequest.id().urString() !== sessionId.urString()) {\n throw new Error(\n `Session ID mismatch (request ${sealedRequest.id().urString()}, expected ${sessionId.urString()})`,\n );\n }\n\n // Check sender (coordinator)\n if (sealedRequest.sender().xid().urString() !== expectedCoordinator.urString()) {\n throw new Error(\n `Unexpected request sender: ${sealedRequest.sender().xid().urString()} (expected coordinator ${expectedCoordinator.urString()})`,\n );\n }\n}\n\n/**\n * Extract all commitments from the signRound2 request.\n *\n * Port of `parse_commitments()` from cmd/sign/participant/round2.rs.\n */\nfunction extractCommitments(\n sealedRequest: SealedRequestInstance,\n receiveState: ReceiveState,\n): Map<string, Ed25519SigningCommitments> {\n const commitments = new Map<string, Ed25519SigningCommitments>();\n\n const commitmentObjects = sealedRequest.objectsForParameter(\"commitment\");\n\n for (const entry of commitmentObjects) {\n // Extract XID subject\n const xid = XIDClass.fromTaggedCbor(entry.subject().tryLeaf());\n\n // Extract commitments from the \"commitments\" predicate\n const commitmentsObjects = entry.objectsForPredicate(\"commitments\");\n if (commitmentsObjects.length === 0) {\n throw new Error(`Missing commitments for participant ${xid.urString()}`);\n }\n\n const commitmentsJson = JSONComponent.fromTaggedCbor(commitmentsObjects[0].subject().tryLeaf());\n const serializedCommitments = JSON.parse(\n commitmentsJson.asStr(),\n ) as SerializedSigningCommitments;\n const signingCommitments = deserializeSigningCommitments(serializedCommitments);\n\n const xidUr = xid.urString();\n if (commitments.has(xidUr)) {\n throw new Error(`Duplicate commitments for participant ${xidUr}`);\n }\n commitments.set(xidUr, signingCommitments);\n }\n\n if (commitments.size === 0) {\n throw new Error(\"signRound2 request contains no commitments\");\n }\n\n // Validate expected participant set\n const expectedSet = new Set(receiveState.participants.map((p) => p.urString()));\n const actualSet = new Set(commitments.keys());\n\n const missing: string[] = [];\n const extra: string[] = [];\n\n for (const xid of expectedSet) {\n if (!actualSet.has(xid)) {\n missing.push(xid);\n }\n }\n for (const xid of actualSet) {\n if (!expectedSet.has(xid)) {\n extra.push(xid);\n }\n }\n\n if (missing.length > 0 || extra.length > 0) {\n throw new Error(\n `signRound2 commitments do not match session participants (missing: ${missing.join(\", \")}; extra: ${extra.join(\", \")})`,\n );\n }\n\n return commitments;\n}\n\n/**\n * Build a map from XID to FROST identifier (sorted participant order).\n *\n * Port of `xid_identifier_map()` from cmd/sign/participant/round2.rs.\n */\nfunction xidIdentifierMap(participants: XID[]): Map<string, FrostIdentifier> {\n const map = new Map<string, FrostIdentifier>();\n for (let i = 0; i < participants.length; i++) {\n const identifier = identifierFromU16(i + 1);\n map.set(participants[i].urString(), identifier);\n }\n return map;\n}\n\n/**\n * Build signing commitments with identifiers.\n *\n * Port of `commitments_with_identifiers()` from cmd/sign/participant/round2.rs.\n */\nfunction commitmentsWithIdentifiers(\n commitments: Map<string, Ed25519SigningCommitments>,\n xidToIdentifier: Map<string, FrostIdentifier>,\n): Map<FrostIdentifier, Ed25519SigningCommitments> {\n const mapped = new Map<FrostIdentifier, Ed25519SigningCommitments>();\n for (const [xidUr, commits] of commitments) {\n const identifier = xidToIdentifier.get(xidUr);\n if (!identifier) {\n throw new Error(`Unknown participant ${xidUr}`);\n }\n mapped.set(identifier, commits);\n }\n return mapped;\n}\n\n/**\n * Build the signRound2Response body envelope.\n *\n * Port of response body construction from cmd/sign/participant/round2.rs.\n */\nfunction buildResponseBody(\n sessionId: ARID,\n signatureShare: Ed25519SignatureShare,\n finalizeArid: ARID,\n): Envelope {\n const shareHex = serializeSignatureShare(signatureShare);\n const shareJson = JSONComponent.fromString(JSON.stringify({ share: shareHex }));\n\n return Envelope.unit()\n .addType(\"signRound2Response\")\n .addAssertion(\"session\", sessionId)\n .addAssertion(\"signature_share\", shareJson)\n .addAssertion(\"response_arid\", finalizeArid);\n}\n\n/**\n * Persist share state to share.json.\n *\n * Port of `persist_share_state()` from cmd/sign/participant/round2.rs.\n */\nfunction persistShareState(\n registryPath: string,\n groupId: ARID,\n sessionId: ARID,\n responseArid: ARID,\n finalizeArid: ARID,\n signatureShare: Ed25519SignatureShare,\n commitments: Map<string, Ed25519SigningCommitments>,\n): void {\n const dir = signingStateDir(registryPath, groupId.hex(), sessionId.hex());\n fs.mkdirSync(dir, { recursive: true });\n\n // Build commitments JSON object\n const commitmentsJson: Record<string, SerializedSigningCommitments> = {};\n for (const [xidUr, commits] of commitments) {\n commitmentsJson[xidUr] = serializeSigningCommitments(commits);\n }\n\n // Build root JSON object\n const root = {\n session: sessionId.urString(),\n response_arid: responseArid.urString(),\n finalize_arid: finalizeArid.urString(),\n signature_share: { share: serializeSignatureShare(signatureShare) },\n commitments: commitmentsJson,\n };\n\n fs.writeFileSync(path.join(dir, \"share.json\"), JSON.stringify(root, null, 2));\n}\n\n/**\n * Execute the sign participant round 2 command.\n *\n * Receives round 2 request and sends signature share.\n *\n * Port of `CommandArgs::exec()` from cmd/sign/participant/round2.rs.\n */\nexport async function round2(\n client: StorageClient,\n options: SignRound2Options,\n cwd: string,\n): Promise<SignRound2Result> {\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n\n const owner = registry.owner();\n if (!owner) {\n throw new Error(\"Registry owner is required\");\n }\n const ownerXidDocument = owner.xidDocument();\n\n const sessionId = parseAridUr(options.sessionId);\n const groupHint = options.groupId ? parseAridUr(options.groupId) : undefined;\n\n // Load receive state (finds group automatically if not specified)\n const receiveState = loadReceiveState(registryPath, sessionId, groupHint);\n const groupId = receiveState.groupId;\n\n const groupRecord = registry.group(groupId);\n if (!groupRecord) {\n throw new Error(\"Group not found in registry\");\n }\n\n // Validate min_signers matches\n if (groupRecord.minSigners() !== receiveState.minSigners) {\n throw new Error(\n `Session min_signers ${receiveState.minSigners} does not match registry ${groupRecord.minSigners()}`,\n );\n }\n\n // Validate participants match\n const registryParticipants = new Set(groupRecord.participants().map((p) => p.xid().urString()));\n const sessionParticipants = new Set(receiveState.participants.map((p) => p.urString()));\n\n if (\n registryParticipants.size !== sessionParticipants.size ||\n ![...registryParticipants].every((p) => sessionParticipants.has(p))\n ) {\n throw new Error(\"Session participants do not match registry group participants\");\n }\n\n // Validate owner participates in this session\n if (!sessionParticipants.has(owner.xid().urString())) {\n throw new Error(\"This participant is not part of the signing session\");\n }\n\n // Get listening ARID from registry\n const listeningAtArid = groupRecord.listeningAtArid();\n if (!listeningAtArid) {\n throw new Error(\n \"No listening ARID for signRound2. Did you run `frost sign participant commit`?\",\n );\n }\n\n // Load commit state and validate\n const commitState = loadCommitState(registryPath, groupId, sessionId);\n\n if (commitState.nextShareArid.urString() !== listeningAtArid.urString()) {\n throw new Error(\n `Listening ARID in registry (${listeningAtArid.urString()}) does not match persisted commit state (${commitState.nextShareArid.urString()})`,\n );\n }\n\n if (commitState.targetUr !== receiveState.targetUr) {\n throw new Error(\"Target envelope in commit state does not match persisted signInvite request\");\n }\n\n // Load key package\n const keyPackagePath = groupRecord.contributions().keyPackage;\n if (!keyPackagePath) {\n throw new Error(\"Key package path not found; did you finish DKG?\");\n }\n\n interface KeyPackageFile {\n group?: string;\n key_package: SerializedKeyPackage;\n }\n\n const keyPackageFile = JSON.parse(fs.readFileSync(keyPackagePath, \"utf-8\")) as KeyPackageFile;\n const keyPackage: FrostKeyPackage = deserializeKeyPackage(keyPackageFile.key_package);\n\n // Create finalize ARID\n const finalizeArid = ARIDClass.new();\n\n // Compute target digest from persisted target envelope\n const targetEnvelope = Envelope.fromURString(receiveState.targetUr);\n const targetDigest: Digest = targetEnvelope.subject().digest();\n\n if (options.verbose === true) {\n console.error(\"Fetching signRound2 request from Hubert...\");\n }\n\n // Fetch request from storage\n const requestEnvelope = await getWithIndicator(\n client,\n listeningAtArid,\n \"signRound2 request\",\n options.timeoutSeconds,\n options.verbose ?? false,\n );\n\n if (!requestEnvelope) {\n throw new Error(\"signRound2 request not found in Hubert storage\");\n }\n\n // Parse sealed request\n const signerPrivateKeys = ownerXidDocument.inceptionPrivateKeys();\n if (!signerPrivateKeys) {\n throw new Error(\"Owner XID document has no private keys\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports, no-undef\n const { SealedRequest: SealedRequestClass } = require(\"@bcts/gstp\") as {\n SealedRequest: {\n tryFromEnvelope: (\n envelope: Envelope,\n expectedSender: XID | undefined,\n now: CborDate,\n recipientPrivateKeys: unknown,\n ) => SealedRequestInstance;\n };\n };\n\n const now = CborDate.now();\n const sealedRequest = SealedRequestClass.tryFromEnvelope(\n requestEnvelope,\n undefined,\n now,\n signerPrivateKeys,\n );\n\n // Validate request\n const expectedCoordinator = groupRecord.coordinator().xid();\n validateShareRequest(sealedRequest, sessionId, expectedCoordinator);\n\n // Extract response ARID from request\n const responseArid: ARID = sealedRequest.extractObjectForParameter(\"response_arid\");\n\n // Extract and validate commitments\n const commitmentsByXid = extractCommitments(sealedRequest, receiveState);\n\n // Verify our commitments match\n const myCommitments = commitmentsByXid.get(owner.xid().urString());\n if (!myCommitments) {\n throw new Error(\"signRound2 request missing commitments for this participant\");\n }\n\n // Compare commitments using serialized form\n const myCommitmentsSerialized = serializeSigningCommitments(myCommitments);\n const storedCommitmentsSerialized = serializeSigningCommitments(commitState.signingCommitments);\n\n if (\n myCommitmentsSerialized.hiding !== storedCommitmentsSerialized.hiding ||\n myCommitmentsSerialized.binding !== storedCommitmentsSerialized.binding\n ) {\n throw new Error(\"signRound2 request commitments do not match locally stored commitments\");\n }\n\n // Build XID to identifier map (sorted participant order)\n const xidToIdentifier = xidIdentifierMap(receiveState.participants);\n\n // Verify our identifier matches key package\n const myIdentifier = xidToIdentifier.get(owner.xid().urString());\n if (!myIdentifier) {\n throw new Error(\"Identifier for participant not found\");\n }\n\n // Verify key package min_signers matches\n if (keyPackage.minSigners !== receiveState.minSigners) {\n throw new Error(\n `Key package min_signers ${keyPackage.minSigners} does not match session ${receiveState.minSigners}`,\n );\n }\n\n // Verify enough commitments\n if (commitmentsByXid.size < receiveState.minSigners) {\n throw new Error(\n `signRound2 request contained ${commitmentsByXid.size} commitments but requires at least ${receiveState.minSigners} signers`,\n );\n }\n\n // Build signing commitments with identifiers\n const signingCommitments = commitmentsWithIdentifiers(commitmentsByXid, xidToIdentifier);\n\n // Create signing package\n const signingPackage = createSigningPackage(signingCommitments, targetDigest.data());\n\n // Generate signature share using FROST round 2\n const signatureShare = signingRound2(signingPackage, commitState.signingNonces, keyPackage);\n\n // Build response body\n const responseBody = buildResponseBody(sessionId, signatureShare, finalizeArid);\n\n // Build sealed response\n // eslint-disable-next-line @typescript-eslint/no-require-imports, no-undef\n const { SealedResponse: SealedResponseClass } = require(\"@bcts/gstp\") as {\n SealedResponse: {\n newSuccess: (\n requestId: ARID,\n sender: XIDDocument,\n ) => {\n withResult: (result: Envelope) => {\n withPeerContinuation: (continuation: unknown) => {\n toEnvelope: (\n expiry: CborDate | undefined,\n signerPrivateKeys: unknown,\n recipient: XIDDocument | undefined,\n ) => Envelope;\n };\n toEnvelope: (\n expiry: CborDate | undefined,\n signerPrivateKeys: unknown,\n recipient: XIDDocument | undefined,\n ) => Envelope;\n };\n };\n };\n };\n\n const sealedResponse = SealedResponseClass.newSuccess(\n sealedRequest.id(),\n ownerXidDocument,\n ).withResult(responseBody);\n\n // Preview mode - print unsealed response\n if (options.preview === true) {\n const unsealed = sealedResponse.toEnvelope(undefined, signerPrivateKeys, undefined);\n console.log(unsealed.urString());\n return {\n listeningArid: finalizeArid.urString(),\n };\n }\n\n // Get coordinator XID document for encryption\n let coordinatorDoc: XIDDocument;\n if (expectedCoordinator.urString() === owner.xid().urString()) {\n coordinatorDoc = ownerXidDocument;\n } else {\n const coordinatorRecord = registry.participant(expectedCoordinator);\n if (!coordinatorRecord) {\n throw new Error(`Coordinator ${expectedCoordinator.urString()} not found in registry`);\n }\n coordinatorDoc = coordinatorRecord.xidDocument();\n }\n\n // Create response envelope with expiry\n const expiry = CborDate.withDurationFromNow(60 * 60); // 1 hour\n const responseEnvelope = sealedResponse.toEnvelope(expiry, signerPrivateKeys, coordinatorDoc);\n\n // Send response\n await putWithIndicator(\n client,\n responseArid,\n responseEnvelope,\n \"Signature Share\",\n options.verbose ?? false,\n );\n\n // Persist share state\n persistShareState(\n registryPath,\n groupId,\n sessionId,\n responseArid,\n finalizeArid,\n signatureShare,\n commitmentsByXid,\n );\n\n // Update registry with finalize listening ARID\n const groupRecordMutable = registry.group(groupId);\n if (groupRecordMutable) {\n groupRecordMutable.setListeningAtArid(finalizeArid);\n registry.save(registryPath);\n }\n\n if (options.verbose === true) {\n console.error(`Posted signature share to ${responseArid.urString()}`);\n }\n\n return {\n listeningArid: finalizeArid.urString(),\n };\n}\n"],"mappings":"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"}
@@ -1,18 +1,18 @@
1
- const require_chunk = require("./chunk-CZWwpsFl.cjs");
2
- const require_proposed_participant = require("./proposed-participant-Dm1Eq6mX.cjs");
1
+ const require_rolldown_runtime = require("./rolldown-runtime-DakpK96I.cjs");
2
+ const require_proposed_participant = require("./proposed-participant-BvHNnpcZ.cjs");
3
3
  const require_registry_index = require("./registry/index.cjs");
4
- const require_common = require("./common-lKP5EzHy.cjs");
5
- const require_busy = require("./busy-EZU7EKr6.cjs");
6
- const require_storage = require("./storage-B-Gu68-O.cjs");
4
+ const require_common = require("./common-3msAx7hO.cjs");
5
+ const require_busy = require("./busy-B_h0bNAJ.cjs");
6
+ const require_registry = require("./registry-D-rFKk9R.cjs");
7
7
  const require_frost_index = require("./frost/index.cjs");
8
8
  let _bcts_components = require("@bcts/components");
9
9
  let _bcts_dcbor = require("@bcts/dcbor");
10
10
  let _bcts_envelope = require("@bcts/envelope");
11
11
  let _bcts_gstp = require("@bcts/gstp");
12
12
  let node_fs = require("node:fs");
13
- node_fs = require_chunk.__toESM(node_fs, 1);
13
+ node_fs = require_rolldown_runtime.__toESM(node_fs, 1);
14
14
  let node_path = require("node:path");
15
- node_path = require_chunk.__toESM(node_path, 1);
15
+ node_path = require_rolldown_runtime.__toESM(node_path, 1);
16
16
  let _frosts_ed25519 = require("@frosts/ed25519");
17
17
  let _frosts_core = require("@frosts/core");
18
18
  //#region src/cmd/dkg/participant/round2.ts
@@ -27,7 +27,7 @@ let _frosts_core = require("@frosts/core");
27
27
  *
28
28
  * @module
29
29
  */
30
- var round2_exports = /* @__PURE__ */ require_chunk.__exportAll({ round2: () => round2 });
30
+ var round2_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({ round2: () => round2 });
31
31
  /**
32
32
  * Load persisted round 1 state from disk.
33
33
  *
@@ -218,7 +218,7 @@ async function round2(_client, options, cwd) {
218
218
  if (listeningAtArid === void 0) throw new Error("No listening ARID for this group. Did you respond to the invite?");
219
219
  const round1State = loadRound1State(registryPath, groupId);
220
220
  if (require_common.isVerbose() || options.verbose === true) console.error("Fetching Round 2 request from Hubert...");
221
- const client = await require_storage.createStorageClient(options.storageSelection);
221
+ const client = await require_registry.createStorageClient(options.storageSelection);
222
222
  const requestEnvelope = await require_busy.getWithIndicator(client, listeningAtArid, "Round 2 request", options.timeoutSeconds, options.verbose ?? false);
223
223
  if (requestEnvelope === null || requestEnvelope === void 0) throw new Error("Round 2 request not found in Hubert storage");
224
224
  const ownerPrivateKeys = owner.xidDocument().inceptionPrivateKeys();
@@ -290,4 +290,4 @@ Object.defineProperty(exports, "round2_exports", {
290
290
  }
291
291
  });
292
292
 
293
- //# sourceMappingURL=round2-LylCa84n.cjs.map
293
+ //# sourceMappingURL=round2-DhdFarwY.cjs.map