@did-btcr2/method 0.26.0 → 0.27.0

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 (282) hide show
  1. package/README.md +86 -233
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/browser.js +24111 -20342
  4. package/dist/browser.mjs +24111 -20342
  5. package/dist/cjs/index.js +2463 -2174
  6. package/dist/esm/core/aggregation/cohort.js +178 -0
  7. package/dist/esm/core/aggregation/cohort.js.map +1 -0
  8. package/dist/esm/core/aggregation/errors.js +22 -0
  9. package/dist/esm/core/aggregation/errors.js.map +1 -0
  10. package/dist/esm/core/{beacon/aggregation/cohort → aggregation}/messages/base.js +0 -1
  11. package/dist/esm/core/aggregation/messages/base.js.map +1 -0
  12. package/dist/esm/core/aggregation/messages/constants.js +26 -0
  13. package/dist/esm/core/aggregation/messages/constants.js.map +1 -0
  14. package/dist/esm/core/aggregation/messages/factories.js +113 -0
  15. package/dist/esm/core/aggregation/messages/factories.js.map +1 -0
  16. package/dist/esm/core/aggregation/messages/guards.js +37 -0
  17. package/dist/esm/core/aggregation/messages/guards.js.map +1 -0
  18. package/dist/esm/core/aggregation/messages/index.js +5 -0
  19. package/dist/esm/core/aggregation/messages/index.js.map +1 -0
  20. package/dist/esm/core/aggregation/participant.js +376 -0
  21. package/dist/esm/core/aggregation/participant.js.map +1 -0
  22. package/dist/esm/core/aggregation/phases.js +39 -0
  23. package/dist/esm/core/aggregation/phases.js.map +1 -0
  24. package/dist/esm/core/aggregation/runner/events.js +2 -0
  25. package/dist/esm/core/aggregation/runner/events.js.map +1 -0
  26. package/dist/esm/core/aggregation/runner/index.js +5 -0
  27. package/dist/esm/core/aggregation/runner/index.js.map +1 -0
  28. package/dist/esm/core/aggregation/runner/participant-runner.js +282 -0
  29. package/dist/esm/core/aggregation/runner/participant-runner.js.map +1 -0
  30. package/dist/esm/core/aggregation/runner/service-runner.js +290 -0
  31. package/dist/esm/core/aggregation/runner/service-runner.js.map +1 -0
  32. package/dist/esm/core/aggregation/runner/typed-emitter.js +80 -0
  33. package/dist/esm/core/aggregation/runner/typed-emitter.js.map +1 -0
  34. package/dist/esm/core/aggregation/service.js +416 -0
  35. package/dist/esm/core/aggregation/service.js.map +1 -0
  36. package/dist/esm/core/aggregation/signing-session.js +133 -0
  37. package/dist/esm/core/aggregation/signing-session.js.map +1 -0
  38. package/dist/esm/core/aggregation/transport/didcomm.js +32 -0
  39. package/dist/esm/core/aggregation/transport/didcomm.js.map +1 -0
  40. package/dist/esm/core/aggregation/transport/error.js +12 -0
  41. package/dist/esm/core/aggregation/transport/error.js.map +1 -0
  42. package/dist/esm/core/aggregation/transport/factory.js +20 -0
  43. package/dist/esm/core/aggregation/transport/factory.js.map +1 -0
  44. package/dist/esm/core/aggregation/transport/index.js +6 -0
  45. package/dist/esm/core/aggregation/transport/index.js.map +1 -0
  46. package/dist/esm/core/aggregation/transport/nostr.js +262 -0
  47. package/dist/esm/core/aggregation/transport/nostr.js.map +1 -0
  48. package/dist/esm/core/aggregation/transport/transport.js +2 -0
  49. package/dist/esm/core/aggregation/transport/transport.js.map +1 -0
  50. package/dist/esm/core/beacon/beacon.js +80 -0
  51. package/dist/esm/core/beacon/beacon.js.map +1 -1
  52. package/dist/esm/core/beacon/cas-beacon.js +15 -56
  53. package/dist/esm/core/beacon/cas-beacon.js.map +1 -1
  54. package/dist/esm/core/beacon/error.js +0 -10
  55. package/dist/esm/core/beacon/error.js.map +1 -1
  56. package/dist/esm/core/beacon/fee-estimator.js +30 -0
  57. package/dist/esm/core/beacon/fee-estimator.js.map +1 -0
  58. package/dist/esm/core/beacon/singleton-beacon.js +10 -53
  59. package/dist/esm/core/beacon/singleton-beacon.js.map +1 -1
  60. package/dist/esm/core/beacon/smt-beacon.js +85 -9
  61. package/dist/esm/core/beacon/smt-beacon.js.map +1 -1
  62. package/dist/esm/core/identifier.js +13 -0
  63. package/dist/esm/core/identifier.js.map +1 -1
  64. package/dist/esm/core/resolver.js +9 -0
  65. package/dist/esm/core/resolver.js.map +1 -1
  66. package/dist/esm/index.js +14 -24
  67. package/dist/esm/index.js.map +1 -1
  68. package/dist/types/core/aggregation/cohort.d.ts +94 -0
  69. package/dist/types/core/aggregation/cohort.d.ts.map +1 -0
  70. package/dist/types/core/aggregation/errors.d.ts +14 -0
  71. package/dist/types/core/aggregation/errors.d.ts.map +1 -0
  72. package/dist/types/core/{beacon/aggregation/cohort → aggregation}/messages/base.d.ts +7 -1
  73. package/dist/types/core/aggregation/messages/base.d.ts.map +1 -0
  74. package/dist/types/core/aggregation/messages/constants.d.ts +23 -0
  75. package/dist/types/core/aggregation/messages/constants.d.ts.map +1 -0
  76. package/dist/types/core/aggregation/messages/factories.d.ts +177 -0
  77. package/dist/types/core/aggregation/messages/factories.d.ts.map +1 -0
  78. package/dist/types/core/aggregation/messages/guards.d.ts +11 -0
  79. package/dist/types/core/aggregation/messages/guards.d.ts.map +1 -0
  80. package/dist/types/core/aggregation/messages/index.d.ts +5 -0
  81. package/dist/types/core/aggregation/messages/index.d.ts.map +1 -0
  82. package/dist/types/core/aggregation/participant.d.ts +101 -0
  83. package/dist/types/core/aggregation/participant.d.ts.map +1 -0
  84. package/dist/types/core/aggregation/phases.d.ts +49 -0
  85. package/dist/types/core/aggregation/phases.d.ts.map +1 -0
  86. package/dist/types/core/aggregation/runner/events.d.ts +89 -0
  87. package/dist/types/core/aggregation/runner/events.d.ts.map +1 -0
  88. package/dist/types/core/aggregation/runner/index.d.ts +5 -0
  89. package/dist/types/core/aggregation/runner/index.d.ts.map +1 -0
  90. package/dist/types/core/aggregation/runner/participant-runner.d.ts +107 -0
  91. package/dist/types/core/aggregation/runner/participant-runner.d.ts.map +1 -0
  92. package/dist/types/core/aggregation/runner/service-runner.d.ts +102 -0
  93. package/dist/types/core/aggregation/runner/service-runner.d.ts.map +1 -0
  94. package/dist/types/core/aggregation/runner/typed-emitter.d.ts +41 -0
  95. package/dist/types/core/aggregation/runner/typed-emitter.d.ts.map +1 -0
  96. package/dist/types/core/aggregation/service.d.ts +112 -0
  97. package/dist/types/core/aggregation/service.d.ts.map +1 -0
  98. package/dist/types/core/aggregation/signing-session.d.ts +69 -0
  99. package/dist/types/core/aggregation/signing-session.d.ts.map +1 -0
  100. package/dist/types/core/aggregation/transport/didcomm.d.ts +20 -0
  101. package/dist/types/core/aggregation/transport/didcomm.d.ts.map +1 -0
  102. package/dist/types/core/{beacon/aggregation/communication → aggregation/transport}/error.d.ts +2 -2
  103. package/dist/types/core/aggregation/transport/error.d.ts.map +1 -0
  104. package/dist/types/core/aggregation/transport/factory.d.ts +13 -0
  105. package/dist/types/core/aggregation/transport/factory.d.ts.map +1 -0
  106. package/dist/types/core/aggregation/transport/index.d.ts +6 -0
  107. package/dist/types/core/aggregation/transport/index.d.ts.map +1 -0
  108. package/dist/types/core/aggregation/transport/nostr.d.ts +55 -0
  109. package/dist/types/core/aggregation/transport/nostr.d.ts.map +1 -0
  110. package/dist/types/core/aggregation/transport/transport.d.ts +37 -0
  111. package/dist/types/core/aggregation/transport/transport.d.ts.map +1 -0
  112. package/dist/types/core/beacon/beacon.d.ts +37 -2
  113. package/dist/types/core/beacon/beacon.d.ts.map +1 -1
  114. package/dist/types/core/beacon/cas-beacon.d.ts +19 -7
  115. package/dist/types/core/beacon/cas-beacon.d.ts.map +1 -1
  116. package/dist/types/core/beacon/error.d.ts +0 -6
  117. package/dist/types/core/beacon/error.d.ts.map +1 -1
  118. package/dist/types/core/beacon/fee-estimator.d.ts +40 -0
  119. package/dist/types/core/beacon/fee-estimator.d.ts.map +1 -0
  120. package/dist/types/core/beacon/interfaces.d.ts +8 -0
  121. package/dist/types/core/beacon/interfaces.d.ts.map +1 -1
  122. package/dist/types/core/beacon/singleton-beacon.d.ts +9 -2
  123. package/dist/types/core/beacon/singleton-beacon.d.ts.map +1 -1
  124. package/dist/types/core/beacon/smt-beacon.d.ts +27 -7
  125. package/dist/types/core/beacon/smt-beacon.d.ts.map +1 -1
  126. package/dist/types/core/identifier.d.ts +8 -0
  127. package/dist/types/core/identifier.d.ts.map +1 -1
  128. package/dist/types/core/interfaces.d.ts +2 -2
  129. package/dist/types/core/resolver.d.ts +11 -1
  130. package/dist/types/core/resolver.d.ts.map +1 -1
  131. package/dist/types/index.d.ts +9 -24
  132. package/dist/types/index.d.ts.map +1 -1
  133. package/package.json +31 -30
  134. package/src/core/aggregation/cohort.ts +247 -0
  135. package/src/core/aggregation/errors.ts +25 -0
  136. package/src/core/{beacon/aggregation/cohort → aggregation}/messages/base.ts +8 -3
  137. package/src/core/aggregation/messages/constants.ts +28 -0
  138. package/src/core/aggregation/messages/factories.ts +240 -0
  139. package/src/core/aggregation/messages/guards.ts +55 -0
  140. package/src/core/aggregation/messages/index.ts +4 -0
  141. package/src/core/aggregation/participant.ts +510 -0
  142. package/src/core/aggregation/phases.ts +82 -0
  143. package/src/core/aggregation/runner/events.ts +77 -0
  144. package/src/core/aggregation/runner/index.ts +4 -0
  145. package/src/core/aggregation/runner/participant-runner.ts +360 -0
  146. package/src/core/aggregation/runner/service-runner.ts +365 -0
  147. package/src/core/aggregation/runner/typed-emitter.ts +87 -0
  148. package/src/core/aggregation/service.ts +547 -0
  149. package/src/core/aggregation/signing-session.ts +209 -0
  150. package/src/core/aggregation/transport/didcomm.ts +42 -0
  151. package/src/core/aggregation/transport/error.ts +13 -0
  152. package/src/core/aggregation/transport/factory.ts +29 -0
  153. package/src/core/aggregation/transport/index.ts +5 -0
  154. package/src/core/aggregation/transport/nostr.ts +333 -0
  155. package/src/core/aggregation/transport/transport.ts +46 -0
  156. package/src/core/beacon/beacon.ts +122 -2
  157. package/src/core/beacon/cas-beacon.ts +28 -76
  158. package/src/core/beacon/error.ts +0 -12
  159. package/src/core/beacon/fee-estimator.ts +52 -0
  160. package/src/core/beacon/interfaces.ts +10 -1
  161. package/src/core/beacon/singleton-beacon.ts +14 -75
  162. package/src/core/beacon/smt-beacon.ts +109 -11
  163. package/src/core/identifier.ts +17 -0
  164. package/src/core/interfaces.ts +2 -2
  165. package/src/core/resolver.ts +25 -2
  166. package/src/index.ts +15 -29
  167. package/dist/esm/core/beacon/aggregation/cohort/index.js +0 -237
  168. package/dist/esm/core/beacon/aggregation/cohort/index.js.map +0 -1
  169. package/dist/esm/core/beacon/aggregation/cohort/messages/base.js.map +0 -1
  170. package/dist/esm/core/beacon/aggregation/cohort/messages/constants.js +0 -11
  171. package/dist/esm/core/beacon/aggregation/cohort/messages/constants.js.map +0 -1
  172. package/dist/esm/core/beacon/aggregation/cohort/messages/index.js +0 -98
  173. package/dist/esm/core/beacon/aggregation/cohort/messages/index.js.map +0 -1
  174. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.js +0 -31
  175. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.js.map +0 -1
  176. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.js +0 -29
  177. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.js.map +0 -1
  178. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.js +0 -27
  179. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.js.map +0 -1
  180. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/opt-in.js +0 -23
  181. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/opt-in.js.map +0 -1
  182. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/subscribe.js +0 -28
  183. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/subscribe.js.map +0 -1
  184. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.js +0 -29
  185. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.js.map +0 -1
  186. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/authorization-request.js +0 -30
  187. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/authorization-request.js.map +0 -1
  188. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.js +0 -30
  189. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.js.map +0 -1
  190. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/request-signature.js +0 -30
  191. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/request-signature.js.map +0 -1
  192. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/signature-authorization.js +0 -31
  193. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/signature-authorization.js.map +0 -1
  194. package/dist/esm/core/beacon/aggregation/cohort/status.js +0 -8
  195. package/dist/esm/core/beacon/aggregation/cohort/status.js.map +0 -1
  196. package/dist/esm/core/beacon/aggregation/communication/adapter/did-comm.js +0 -121
  197. package/dist/esm/core/beacon/aggregation/communication/adapter/did-comm.js.map +0 -1
  198. package/dist/esm/core/beacon/aggregation/communication/adapter/nostr.js +0 -245
  199. package/dist/esm/core/beacon/aggregation/communication/adapter/nostr.js.map +0 -1
  200. package/dist/esm/core/beacon/aggregation/communication/error.js +0 -12
  201. package/dist/esm/core/beacon/aggregation/communication/error.js.map +0 -1
  202. package/dist/esm/core/beacon/aggregation/communication/factory.js +0 -21
  203. package/dist/esm/core/beacon/aggregation/communication/factory.js.map +0 -1
  204. package/dist/esm/core/beacon/aggregation/communication/service.js +0 -2
  205. package/dist/esm/core/beacon/aggregation/communication/service.js.map +0 -1
  206. package/dist/esm/core/beacon/aggregation/coordinator.js +0 -343
  207. package/dist/esm/core/beacon/aggregation/coordinator.js.map +0 -1
  208. package/dist/esm/core/beacon/aggregation/participant.js +0 -435
  209. package/dist/esm/core/beacon/aggregation/participant.js.map +0 -1
  210. package/dist/esm/core/beacon/aggregation/session/index.js +0 -244
  211. package/dist/esm/core/beacon/aggregation/session/index.js.map +0 -1
  212. package/dist/esm/core/beacon/aggregation/session/status.js +0 -11
  213. package/dist/esm/core/beacon/aggregation/session/status.js.map +0 -1
  214. package/dist/types/core/beacon/aggregation/cohort/index.d.ts +0 -136
  215. package/dist/types/core/beacon/aggregation/cohort/index.d.ts.map +0 -1
  216. package/dist/types/core/beacon/aggregation/cohort/messages/base.d.ts.map +0 -1
  217. package/dist/types/core/beacon/aggregation/cohort/messages/constants.d.ts +0 -11
  218. package/dist/types/core/beacon/aggregation/cohort/messages/constants.d.ts.map +0 -1
  219. package/dist/types/core/beacon/aggregation/cohort/messages/index.d.ts +0 -65
  220. package/dist/types/core/beacon/aggregation/cohort/messages/index.d.ts.map +0 -1
  221. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.d.ts +0 -29
  222. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.d.ts.map +0 -1
  223. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.d.ts +0 -26
  224. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.d.ts.map +0 -1
  225. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.d.ts +0 -24
  226. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.d.ts.map +0 -1
  227. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/opt-in.d.ts +0 -20
  228. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/opt-in.d.ts.map +0 -1
  229. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/subscribe.d.ts +0 -25
  230. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/subscribe.d.ts.map +0 -1
  231. package/dist/types/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.d.ts +0 -25
  232. package/dist/types/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.d.ts.map +0 -1
  233. package/dist/types/core/beacon/aggregation/cohort/messages/sign/authorization-request.d.ts +0 -26
  234. package/dist/types/core/beacon/aggregation/cohort/messages/sign/authorization-request.d.ts.map +0 -1
  235. package/dist/types/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.d.ts +0 -26
  236. package/dist/types/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.d.ts.map +0 -1
  237. package/dist/types/core/beacon/aggregation/cohort/messages/sign/request-signature.d.ts +0 -26
  238. package/dist/types/core/beacon/aggregation/cohort/messages/sign/request-signature.d.ts.map +0 -1
  239. package/dist/types/core/beacon/aggregation/cohort/messages/sign/signature-authorization.d.ts +0 -27
  240. package/dist/types/core/beacon/aggregation/cohort/messages/sign/signature-authorization.d.ts.map +0 -1
  241. package/dist/types/core/beacon/aggregation/cohort/status.d.ts +0 -8
  242. package/dist/types/core/beacon/aggregation/cohort/status.d.ts.map +0 -1
  243. package/dist/types/core/beacon/aggregation/communication/adapter/did-comm.d.ts +0 -89
  244. package/dist/types/core/beacon/aggregation/communication/adapter/did-comm.d.ts.map +0 -1
  245. package/dist/types/core/beacon/aggregation/communication/adapter/nostr.d.ts +0 -103
  246. package/dist/types/core/beacon/aggregation/communication/adapter/nostr.d.ts.map +0 -1
  247. package/dist/types/core/beacon/aggregation/communication/error.d.ts.map +0 -1
  248. package/dist/types/core/beacon/aggregation/communication/factory.d.ts +0 -10
  249. package/dist/types/core/beacon/aggregation/communication/factory.d.ts.map +0 -1
  250. package/dist/types/core/beacon/aggregation/communication/service.d.ts +0 -36
  251. package/dist/types/core/beacon/aggregation/communication/service.d.ts.map +0 -1
  252. package/dist/types/core/beacon/aggregation/coordinator.d.ts +0 -116
  253. package/dist/types/core/beacon/aggregation/coordinator.d.ts.map +0 -1
  254. package/dist/types/core/beacon/aggregation/participant.d.ts +0 -192
  255. package/dist/types/core/beacon/aggregation/participant.d.ts.map +0 -1
  256. package/dist/types/core/beacon/aggregation/session/index.d.ts +0 -156
  257. package/dist/types/core/beacon/aggregation/session/index.d.ts.map +0 -1
  258. package/dist/types/core/beacon/aggregation/session/status.d.ts +0 -11
  259. package/dist/types/core/beacon/aggregation/session/status.d.ts.map +0 -1
  260. package/src/core/beacon/aggregation/cohort/index.ts +0 -305
  261. package/src/core/beacon/aggregation/cohort/messages/constants.ts +0 -12
  262. package/src/core/beacon/aggregation/cohort/messages/index.ts +0 -143
  263. package/src/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.ts +0 -44
  264. package/src/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.ts +0 -40
  265. package/src/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.ts +0 -35
  266. package/src/core/beacon/aggregation/cohort/messages/keygen/opt-in.ts +0 -34
  267. package/src/core/beacon/aggregation/cohort/messages/keygen/subscribe.ts +0 -36
  268. package/src/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.ts +0 -39
  269. package/src/core/beacon/aggregation/cohort/messages/sign/authorization-request.ts +0 -40
  270. package/src/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.ts +0 -40
  271. package/src/core/beacon/aggregation/cohort/messages/sign/request-signature.ts +0 -40
  272. package/src/core/beacon/aggregation/cohort/messages/sign/signature-authorization.ts +0 -41
  273. package/src/core/beacon/aggregation/cohort/status.ts +0 -7
  274. package/src/core/beacon/aggregation/communication/adapter/did-comm.ts +0 -148
  275. package/src/core/beacon/aggregation/communication/adapter/nostr.ts +0 -323
  276. package/src/core/beacon/aggregation/communication/error.ts +0 -13
  277. package/src/core/beacon/aggregation/communication/factory.ts +0 -25
  278. package/src/core/beacon/aggregation/communication/service.ts +0 -42
  279. package/src/core/beacon/aggregation/coordinator.ts +0 -419
  280. package/src/core/beacon/aggregation/participant.ts +0 -517
  281. package/src/core/beacon/aggregation/session/index.ts +0 -301
  282. package/src/core/beacon/aggregation/session/status.ts +0 -18
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Tiny strongly-typed event emitter.
3
+ *
4
+ * Browser-compatible (no Node.js `events` module). Uses a generic event map
5
+ * to give compile-time safety on event names and listener signatures.
6
+ *
7
+ * @example
8
+ * type MyEvents = {
9
+ * 'connected': [{ host: string }];
10
+ * 'data': [Uint8Array];
11
+ * 'error': [Error];
12
+ * };
13
+ *
14
+ * class MyClient extends TypedEventEmitter<MyEvents> {
15
+ * doStuff() {
16
+ * this.emit('connected', { host: 'example.com' }); // ✓ typed
17
+ * this.emit('data', new Uint8Array([1, 2])); // ✓ typed
18
+ * }
19
+ * }
20
+ *
21
+ * const client = new MyClient();
22
+ * client.on('connected', ({ host }) => console.log(host)); // ✓ typed
23
+ */
24
+ export class TypedEventEmitter {
25
+ #listeners = new Map();
26
+ /** Subscribe to an event. */
27
+ on(event, listener) {
28
+ let set = this.#listeners.get(event);
29
+ if (!set) {
30
+ set = new Set();
31
+ this.#listeners.set(event, set);
32
+ }
33
+ set.add(listener);
34
+ return this;
35
+ }
36
+ /** Subscribe to an event, automatically unsubscribing after the first call. */
37
+ once(event, listener) {
38
+ const wrapped = ((...args) => {
39
+ this.off(event, wrapped);
40
+ listener(...args);
41
+ });
42
+ return this.on(event, wrapped);
43
+ }
44
+ /** Unsubscribe a specific listener. */
45
+ off(event, listener) {
46
+ this.#listeners.get(event)?.delete(listener);
47
+ return this;
48
+ }
49
+ /** Emit an event to all subscribed listeners. */
50
+ emit(event, ...args) {
51
+ const set = this.#listeners.get(event);
52
+ if (!set || set.size === 0)
53
+ return false;
54
+ for (const listener of set) {
55
+ try {
56
+ listener(...args);
57
+ }
58
+ catch (err) {
59
+ // Listener errors must not break other listeners
60
+ console.error(`Listener for event "${String(event)}" threw:`, err);
61
+ }
62
+ }
63
+ return true;
64
+ }
65
+ /** Remove all listeners (optionally for a specific event). */
66
+ removeAllListeners(event) {
67
+ if (event === undefined) {
68
+ this.#listeners.clear();
69
+ }
70
+ else {
71
+ this.#listeners.delete(event);
72
+ }
73
+ return this;
74
+ }
75
+ /** Number of listeners for an event. */
76
+ listenerCount(event) {
77
+ return this.#listeners.get(event)?.size ?? 0;
78
+ }
79
+ }
80
+ //# sourceMappingURL=typed-emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typed-emitter.js","sourceRoot":"","sources":["../../../../../src/core/aggregation/runner/typed-emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,MAAM,OAAO,iBAAiB;IAC5B,UAAU,GAA0C,IAAI,GAAG,EAAE,CAAC;IAE9D,6BAA6B;IAC7B,EAAE,CAAyB,KAAQ,EAAE,QAA6B;QAChE,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,IAAG,CAAC,GAAG,EAAE,CAAC;YACR,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,QAAyB,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+EAA+E;IAC/E,IAAI,CAAyB,KAAQ,EAAE,QAA6B;QAClE,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,IAAe,EAAE,EAAE;YACtC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAA8B,CAAC,CAAC;YAChD,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,OAA8B,CAAC,CAAC;IACxD,CAAC;IAED,uCAAuC;IACvC,GAAG,CAAyB,KAAQ,EAAE,QAA6B;QACjE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,QAAyB,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iDAAiD;IACjD,IAAI,CAAyB,KAAQ,EAAE,GAAG,IAAe;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACvC,IAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACxC,KAAI,MAAM,QAAQ,IAAI,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;YACpB,CAAC;YAAC,OAAM,GAAG,EAAE,CAAC;gBACZ,iDAAiD;gBACjD,OAAO,CAAC,KAAK,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8DAA8D;IAC9D,kBAAkB,CAAyB,KAAS;QAClD,IAAG,KAAK,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wCAAwC;IACxC,aAAa,CAAyB,KAAQ;QAC5C,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;IAC/C,CAAC;CACF"}
@@ -0,0 +1,416 @@
1
+ import { bytesToHex } from '@noble/hashes/utils';
2
+ import { AggregationCohort } from './cohort.js';
3
+ import { AggregationServiceError } from './errors.js';
4
+ import { COHORT_OPT_IN, NONCE_CONTRIBUTION, SIGNATURE_AUTHORIZATION, SUBMIT_UPDATE, VALIDATION_ACK, } from './messages/constants.js';
5
+ import { createAuthorizationRequestMessage, createCohortAdvertMessage, createCohortOptInAcceptMessage, createCohortReadyMessage, createDistributeAggregatedDataMessage, createAggregatedNonceMessage, } from './messages/factories.js';
6
+ import { ServiceCohortPhase } from './phases.js';
7
+ import { BeaconSigningSession } from './signing-session.js';
8
+ /**
9
+ * Sans-I/O state machine for an Aggregation Service.
10
+ *
11
+ * Manages multiple cohorts simultaneously. The service operator drives the
12
+ * state machine via `receive()` (for incoming messages) and explicit action
13
+ * methods (advertising, accepting opt-ins, finalizing keygen, building
14
+ * aggregated data, starting signing). All outgoing messages are returned for
15
+ * the caller to send via whatever transport.
16
+ *
17
+ * @class AggregationService
18
+ */
19
+ export class AggregationService {
20
+ did;
21
+ keys;
22
+ /** Per-cohort state, keyed by cohortId. */
23
+ #cohortStates = new Map();
24
+ constructor({ did, keys }) {
25
+ this.did = did;
26
+ this.keys = keys;
27
+ }
28
+ receive(message) {
29
+ const type = message.type;
30
+ switch (type) {
31
+ case COHORT_OPT_IN:
32
+ this.#handleOptIn(message);
33
+ break;
34
+ case SUBMIT_UPDATE:
35
+ this.#handleSubmitUpdate(message);
36
+ break;
37
+ case VALIDATION_ACK:
38
+ this.#handleValidationAck(message);
39
+ break;
40
+ case NONCE_CONTRIBUTION:
41
+ this.#handleNonceContribution(message);
42
+ break;
43
+ case SIGNATURE_AUTHORIZATION:
44
+ this.#handleSignatureAuthorization(message);
45
+ break;
46
+ default:
47
+ // Unknown message type — silently ignore
48
+ break;
49
+ }
50
+ }
51
+ /**
52
+ * Create a new cohort with the given config. Returns the cohort ID.
53
+ * Cohort starts in `Created` phase — call `advertise()` to broadcast.
54
+ */
55
+ createCohort(config) {
56
+ const cohort = new AggregationCohort({
57
+ serviceDid: this.did,
58
+ minParticipants: config.minParticipants,
59
+ network: config.network,
60
+ beaconType: config.beaconType,
61
+ });
62
+ this.#cohortStates.set(cohort.id, {
63
+ phase: ServiceCohortPhase.Created,
64
+ cohort,
65
+ config,
66
+ pendingOptIns: new Map(),
67
+ acceptedParticipants: new Set(),
68
+ });
69
+ return cohort.id;
70
+ }
71
+ /**
72
+ * Advertise a cohort to discover participants.
73
+ * Returns the advert message to broadcast.
74
+ */
75
+ advertise(cohortId) {
76
+ const state = this.#cohortStates.get(cohortId);
77
+ if (!state) {
78
+ throw new AggregationServiceError(`Cohort ${cohortId} not found.`, 'COHORT_NOT_FOUND', { cohortId });
79
+ }
80
+ if (state.phase !== ServiceCohortPhase.Created) {
81
+ throw new AggregationServiceError(`Cannot advertise cohort ${cohortId}: phase is ${state.phase}.`, 'INVALID_PHASE', { cohortId, phase: state.phase });
82
+ }
83
+ const message = createCohortAdvertMessage({
84
+ from: this.did,
85
+ cohortId,
86
+ cohortSize: state.config.minParticipants,
87
+ beaconType: state.config.beaconType,
88
+ network: state.config.network,
89
+ communicationPk: this.keys.publicKey.compressed,
90
+ });
91
+ state.phase = ServiceCohortPhase.Advertised;
92
+ return [message];
93
+ }
94
+ /** Pending opt-ins awaiting operator approval. */
95
+ pendingOptIns(cohortId) {
96
+ const state = this.#cohortStates.get(cohortId);
97
+ if (!state)
98
+ return new Map();
99
+ // Return only those not yet accepted
100
+ const map = new Map();
101
+ for (const [did, optIn] of state.pendingOptIns) {
102
+ if (!state.acceptedParticipants.has(did)) {
103
+ map.set(did, optIn);
104
+ }
105
+ }
106
+ return map;
107
+ }
108
+ #handleOptIn(message) {
109
+ const cohortId = message.body?.cohortId;
110
+ if (!cohortId)
111
+ return;
112
+ const state = this.#cohortStates.get(cohortId);
113
+ if (!state)
114
+ return;
115
+ if (state.phase !== ServiceCohortPhase.Advertised)
116
+ return;
117
+ const participantDid = message.from;
118
+ const participantPk = message.body?.participantPk;
119
+ const communicationPk = message.body?.communicationPk;
120
+ if (!participantPk || !communicationPk)
121
+ return;
122
+ state.pendingOptIns.set(participantDid, {
123
+ cohortId,
124
+ participantDid,
125
+ participantPk,
126
+ communicationPk,
127
+ });
128
+ }
129
+ /**
130
+ * Service operator accepts a participant's opt-in.
131
+ * Returns the accept message to send.
132
+ */
133
+ acceptParticipant(cohortId, participantDid) {
134
+ const state = this.#cohortStates.get(cohortId);
135
+ if (!state) {
136
+ throw new AggregationServiceError(`Cohort ${cohortId} not found.`, 'COHORT_NOT_FOUND', { cohortId });
137
+ }
138
+ const optIn = state.pendingOptIns.get(participantDid);
139
+ if (!optIn) {
140
+ throw new AggregationServiceError(`No pending opt-in from ${participantDid} for cohort ${cohortId}.`, 'NO_OPT_IN', { cohortId, participantDid });
141
+ }
142
+ if (state.acceptedParticipants.has(participantDid)) {
143
+ throw new AggregationServiceError(`Participant ${participantDid} already accepted into cohort ${cohortId}.`, 'ALREADY_ACCEPTED', { cohortId, participantDid });
144
+ }
145
+ state.acceptedParticipants.add(participantDid);
146
+ state.cohort.participants.push(participantDid);
147
+ state.cohort.cohortKeys = [...state.cohort.cohortKeys, optIn.participantPk];
148
+ return [createCohortOptInAcceptMessage({
149
+ from: this.did,
150
+ to: participantDid,
151
+ cohortId,
152
+ })];
153
+ }
154
+ /**
155
+ * Finalize cohort keygen: compute MuSig2 Taproot beacon address and send
156
+ * COHORT_READY messages to all accepted participants.
157
+ */
158
+ finalizeKeygen(cohortId) {
159
+ const state = this.#cohortStates.get(cohortId);
160
+ if (!state) {
161
+ throw new AggregationServiceError(`Cohort ${cohortId} not found.`, 'COHORT_NOT_FOUND', { cohortId });
162
+ }
163
+ if (state.phase !== ServiceCohortPhase.Advertised) {
164
+ throw new AggregationServiceError(`Cannot finalize keygen for cohort ${cohortId}: phase is ${state.phase}.`, 'INVALID_PHASE', { cohortId, phase: state.phase });
165
+ }
166
+ if (state.acceptedParticipants.size < state.config.minParticipants) {
167
+ throw new AggregationServiceError(`Cohort ${cohortId} has only ${state.acceptedParticipants.size} accepted participants, need ${state.config.minParticipants}.`, 'NOT_ENOUGH_PARTICIPANTS', { cohortId });
168
+ }
169
+ const beaconAddress = state.cohort.computeBeaconAddress();
170
+ state.phase = ServiceCohortPhase.CohortSet;
171
+ const messages = [];
172
+ for (const participantDid of state.cohort.participants) {
173
+ messages.push(createCohortReadyMessage({
174
+ from: this.did,
175
+ to: participantDid,
176
+ cohortId,
177
+ beaconAddress,
178
+ cohortKeys: state.cohort.cohortKeys,
179
+ }));
180
+ }
181
+ return messages;
182
+ }
183
+ /** Updates collected so far for a cohort. */
184
+ collectedUpdates(cohortId) {
185
+ const state = this.#cohortStates.get(cohortId);
186
+ if (!state)
187
+ return new Map();
188
+ return state.cohort.pendingUpdates;
189
+ }
190
+ #handleSubmitUpdate(message) {
191
+ const cohortId = message.body?.cohortId;
192
+ if (!cohortId)
193
+ return;
194
+ const state = this.#cohortStates.get(cohortId);
195
+ if (!state)
196
+ return;
197
+ if (state.phase !== ServiceCohortPhase.CohortSet && state.phase !== ServiceCohortPhase.CollectingUpdates)
198
+ return;
199
+ const signedUpdate = message.body?.signedUpdate;
200
+ if (!signedUpdate)
201
+ return;
202
+ state.cohort.addUpdate(message.from, signedUpdate);
203
+ if (state.phase === ServiceCohortPhase.CohortSet) {
204
+ state.phase = ServiceCohortPhase.CollectingUpdates;
205
+ }
206
+ if (state.cohort.hasAllUpdates()) {
207
+ state.phase = ServiceCohortPhase.UpdatesCollected;
208
+ }
209
+ }
210
+ /**
211
+ * Build the aggregated data structure (CAS Announcement or SMT tree) and
212
+ * return distribute messages to send to all participants for validation.
213
+ */
214
+ buildAndDistribute(cohortId) {
215
+ const state = this.#cohortStates.get(cohortId);
216
+ if (!state) {
217
+ throw new AggregationServiceError(`Cohort ${cohortId} not found.`, 'COHORT_NOT_FOUND', { cohortId });
218
+ }
219
+ if (state.phase !== ServiceCohortPhase.UpdatesCollected) {
220
+ throw new AggregationServiceError(`Cannot build aggregated data for cohort ${cohortId}: phase is ${state.phase}.`, 'INVALID_PHASE', { cohortId, phase: state.phase });
221
+ }
222
+ if (state.config.beaconType === 'CASBeacon') {
223
+ state.cohort.buildCASAnnouncement();
224
+ }
225
+ else if (state.config.beaconType === 'SMTBeacon') {
226
+ state.cohort.buildSMTTree();
227
+ }
228
+ else {
229
+ throw new AggregationServiceError(`Unsupported beacon type: ${state.config.beaconType}`, 'UNSUPPORTED_BEACON_TYPE', { cohortId, beaconType: state.config.beaconType });
230
+ }
231
+ const signalBytesHex = bytesToHex(state.cohort.signalBytes);
232
+ state.phase = ServiceCohortPhase.DataDistributed;
233
+ const messages = [];
234
+ for (const participantDid of state.cohort.participants) {
235
+ messages.push(createDistributeAggregatedDataMessage({
236
+ from: this.did,
237
+ to: participantDid,
238
+ cohortId,
239
+ beaconType: state.config.beaconType,
240
+ signalBytesHex,
241
+ casAnnouncement: state.config.beaconType === 'CASBeacon' ? state.cohort.casAnnouncement : undefined,
242
+ smtProof: state.config.beaconType === 'SMTBeacon' ? state.cohort.smtProofs?.get(participantDid) : undefined,
243
+ }));
244
+ }
245
+ return messages;
246
+ }
247
+ validationProgress(cohortId) {
248
+ const state = this.#cohortStates.get(cohortId);
249
+ if (!state) {
250
+ return { approved: new Set(), rejected: new Set(), pending: new Set(), total: 0 };
251
+ }
252
+ const approved = state.cohort.validationAcks;
253
+ const rejected = state.cohort.validationRejections;
254
+ const allParticipants = new Set(state.cohort.participants);
255
+ const responded = new Set([...approved, ...rejected]);
256
+ const pending = new Set([...allParticipants].filter(p => !responded.has(p)));
257
+ return {
258
+ approved,
259
+ rejected,
260
+ pending,
261
+ total: allParticipants.size,
262
+ };
263
+ }
264
+ #handleValidationAck(message) {
265
+ const cohortId = message.body?.cohortId;
266
+ if (!cohortId)
267
+ return;
268
+ const state = this.#cohortStates.get(cohortId);
269
+ if (!state)
270
+ return;
271
+ if (state.phase !== ServiceCohortPhase.DataDistributed)
272
+ return;
273
+ const approved = message.body?.approved;
274
+ if (approved === undefined)
275
+ return;
276
+ state.cohort.addValidation(message.from, approved);
277
+ // Transition to Validated only when all participants approved.
278
+ // Transition to Failed when all responses are in but at least one rejected.
279
+ if (state.cohort.isFullyValidated()) {
280
+ state.phase = ServiceCohortPhase.Validated;
281
+ }
282
+ else if (state.cohort.hasAllValidationResponses()) {
283
+ state.phase = ServiceCohortPhase.Failed;
284
+ }
285
+ }
286
+ /**
287
+ * Start a signing session by creating auth requests for all participants.
288
+ * The caller provides the transaction data — typically built via
289
+ * `buildBeaconTransaction()` against a Bitcoin connection.
290
+ */
291
+ startSigning(cohortId, txData) {
292
+ const state = this.#cohortStates.get(cohortId);
293
+ if (!state) {
294
+ throw new AggregationServiceError(`Cohort ${cohortId} not found.`, 'COHORT_NOT_FOUND', { cohortId });
295
+ }
296
+ if (state.phase !== ServiceCohortPhase.Validated) {
297
+ throw new AggregationServiceError(`Cannot start signing for cohort ${cohortId}: phase is ${state.phase}.`, 'INVALID_PHASE', { cohortId, phase: state.phase });
298
+ }
299
+ const session = new BeaconSigningSession({
300
+ cohort: state.cohort,
301
+ pendingTx: txData.tx,
302
+ prevOutScripts: txData.prevOutScripts,
303
+ prevOutValues: txData.prevOutValues,
304
+ });
305
+ state.signingSession = session;
306
+ state.phase = ServiceCohortPhase.SigningStarted;
307
+ const messages = [];
308
+ for (const participantDid of state.cohort.participants) {
309
+ messages.push(createAuthorizationRequestMessage({
310
+ from: this.did,
311
+ to: participantDid,
312
+ cohortId,
313
+ sessionId: session.id,
314
+ pendingTx: txData.tx.toHex(),
315
+ prevOutValue: txData.prevOutValues[0]?.toString() ?? '0',
316
+ }));
317
+ }
318
+ return messages;
319
+ }
320
+ #handleNonceContribution(message) {
321
+ const cohortId = message.body?.cohortId;
322
+ if (!cohortId)
323
+ return;
324
+ const state = this.#cohortStates.get(cohortId);
325
+ if (!state || !state.signingSession)
326
+ return;
327
+ if (state.phase !== ServiceCohortPhase.SigningStarted)
328
+ return;
329
+ const sessionId = message.body?.sessionId;
330
+ if (sessionId !== state.signingSession.id)
331
+ return;
332
+ const nonceContribution = message.body?.nonceContribution;
333
+ if (!nonceContribution)
334
+ return;
335
+ state.signingSession.addNonceContribution(message.from, nonceContribution);
336
+ if (state.signingSession.nonceContributions.size === state.cohort.participants.length) {
337
+ state.phase = ServiceCohortPhase.NoncesCollected;
338
+ }
339
+ }
340
+ /**
341
+ * Generate the aggregated nonce and return messages to send to participants.
342
+ * Call after `validationProgress(cohortId).approved.size === total`.
343
+ */
344
+ sendAggregatedNonce(cohortId) {
345
+ const state = this.#cohortStates.get(cohortId);
346
+ if (!state) {
347
+ throw new AggregationServiceError(`Cohort ${cohortId} not found.`, 'COHORT_NOT_FOUND', { cohortId });
348
+ }
349
+ if (state.phase !== ServiceCohortPhase.NoncesCollected || !state.signingSession) {
350
+ throw new AggregationServiceError(`Cannot send aggregated nonce for cohort ${cohortId}: phase is ${state.phase}.`, 'INVALID_PHASE', { cohortId, phase: state.phase });
351
+ }
352
+ const aggregatedNonce = state.signingSession.generateAggregatedNonce();
353
+ state.phase = ServiceCohortPhase.AwaitingPartialSigs;
354
+ const messages = [];
355
+ for (const participantDid of state.cohort.participants) {
356
+ messages.push(createAggregatedNonceMessage({
357
+ from: this.did,
358
+ to: participantDid,
359
+ cohortId,
360
+ sessionId: state.signingSession.id,
361
+ aggregatedNonce,
362
+ }));
363
+ }
364
+ return messages;
365
+ }
366
+ #handleSignatureAuthorization(message) {
367
+ const cohortId = message.body?.cohortId;
368
+ if (!cohortId)
369
+ return;
370
+ const state = this.#cohortStates.get(cohortId);
371
+ if (!state || !state.signingSession)
372
+ return;
373
+ if (state.phase !== ServiceCohortPhase.AwaitingPartialSigs)
374
+ return;
375
+ const sessionId = message.body?.sessionId;
376
+ if (sessionId !== state.signingSession.id)
377
+ return;
378
+ const partialSignature = message.body?.partialSignature;
379
+ if (!partialSignature)
380
+ return;
381
+ state.signingSession.addPartialSignature(message.from, partialSignature);
382
+ if (state.signingSession.partialSignatures.size === state.cohort.participants.length) {
383
+ // All partial sigs received — generate final signature
384
+ const signature = state.signingSession.generateFinalSignature();
385
+ // Set Taproot key-path witness
386
+ state.signingSession.pendingTx.setWitness(0, [signature]);
387
+ state.result = {
388
+ cohortId,
389
+ signature,
390
+ signedTx: state.signingSession.pendingTx,
391
+ };
392
+ state.phase = ServiceCohortPhase.Complete;
393
+ }
394
+ }
395
+ getResult(cohortId) {
396
+ return this.#cohortStates.get(cohortId)?.result;
397
+ }
398
+ getCohortPhase(cohortId) {
399
+ return this.#cohortStates.get(cohortId)?.phase;
400
+ }
401
+ getCohort(cohortId) {
402
+ return this.#cohortStates.get(cohortId)?.cohort;
403
+ }
404
+ /**
405
+ * Get the signing session ID for a cohort, if a signing session has been started.
406
+ * @param {string} cohortId - The cohort ID.
407
+ * @returns {string | undefined} The session ID, or undefined if no session is active.
408
+ */
409
+ getSigningSessionId(cohortId) {
410
+ return this.#cohortStates.get(cohortId)?.signingSession?.id;
411
+ }
412
+ get cohorts() {
413
+ return [...this.#cohortStates.values()].map(s => s.cohort);
414
+ }
415
+ }
416
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../src/core/aggregation/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ import * as musig2 from '@scure/btc-signer/musig2';
2
+ import { Transaction } from 'bitcoinjs-lib';
3
+ import { SigningSessionError } from './errors.js';
4
+ import { SigningSessionPhase } from './phases.js';
5
+ /**
6
+ * MuSig2 signing session for a beacon transaction.
7
+ *
8
+ * Implements the BIP-327 signing protocol over a Taproot key-path-only
9
+ * transaction. The session is used by both AggregationService (collecting
10
+ * nonces and partial signatures, computing the final signature) and
11
+ * AggregationParticipant (generating their nonce and partial signature).
12
+ *
13
+ * @class BeaconSigningSession
14
+ */
15
+ export class BeaconSigningSession {
16
+ /** Unique identifier for this signing session. */
17
+ id;
18
+ /** The cohort this session signs for. */
19
+ cohort;
20
+ /** The Bitcoin transaction being signed. */
21
+ pendingTx;
22
+ /** Previous output scripts for Taproot sighash computation (BIP-341). */
23
+ prevOutScripts;
24
+ /** Previous output values for Taproot sighash computation. */
25
+ prevOutValues;
26
+ /** Map of participant publicKey-hex → public nonce contribution. */
27
+ nonceContributions = new Map();
28
+ /** Aggregated MuSig2 nonce (66 bytes). */
29
+ aggregatedNonce;
30
+ /** Map of participant DID → partial signature. */
31
+ partialSignatures = new Map();
32
+ /** Final 64-byte Schnorr signature. */
33
+ signature;
34
+ /** Current signing session phase. */
35
+ phase;
36
+ /** Participant's secret nonce (held only by the participant during signing). */
37
+ secretNonce;
38
+ constructor({ id, cohort, pendingTx, prevOutScripts, prevOutValues }) {
39
+ this.id = id || crypto.randomUUID();
40
+ this.cohort = cohort;
41
+ this.pendingTx = pendingTx;
42
+ this.prevOutScripts = prevOutScripts || [];
43
+ this.prevOutValues = prevOutValues || [];
44
+ this.phase = SigningSessionPhase.AwaitingNonceContributions;
45
+ }
46
+ /**
47
+ * Computes the Taproot sighash (BIP-341) for the first input.
48
+ */
49
+ get sigHash() {
50
+ if (!this.prevOutScripts.length || !this.prevOutValues.length) {
51
+ throw new SigningSessionError('Cannot compute sighash: missing prevOutScripts or prevOutValues.', 'SIGHASH_ERROR');
52
+ }
53
+ return this.pendingTx.hashForWitnessV1(0, this.prevOutScripts, this.prevOutValues, Transaction.SIGHASH_DEFAULT);
54
+ }
55
+ addNonceContribution(participantDid, nonceContribution) {
56
+ if (this.phase !== SigningSessionPhase.AwaitingNonceContributions) {
57
+ throw new SigningSessionError(`Nonce contributions not expected. Current phase: ${this.phase}`, 'INVALID_PHASE', { phase: this.phase });
58
+ }
59
+ if (nonceContribution.length !== 66) {
60
+ throw new SigningSessionError(`Invalid nonce contribution: expected 66 bytes, got ${nonceContribution.length}.`, 'INVALID_NONCE_LENGTH');
61
+ }
62
+ if (this.nonceContributions.has(participantDid)) {
63
+ throw new SigningSessionError(`Duplicate nonce contribution from ${participantDid}.`, 'DUPLICATE_NONCE');
64
+ }
65
+ this.nonceContributions.set(participantDid, nonceContribution);
66
+ if (this.nonceContributions.size === this.cohort.participants.length) {
67
+ this.phase = SigningSessionPhase.NonceContributionsReceived;
68
+ }
69
+ }
70
+ generateAggregatedNonce() {
71
+ if (this.phase !== SigningSessionPhase.NonceContributionsReceived) {
72
+ throw new SigningSessionError(`Cannot aggregate nonces: phase is ${this.phase}, expected NonceContributionsReceived.`, 'INVALID_PHASE');
73
+ }
74
+ this.aggregatedNonce = musig2.nonceAggregate([...this.nonceContributions.values()]);
75
+ this.phase = SigningSessionPhase.AwaitingPartialSignatures;
76
+ return this.aggregatedNonce;
77
+ }
78
+ addPartialSignature(participantDid, partialSig) {
79
+ if (this.phase !== SigningSessionPhase.AwaitingPartialSignatures) {
80
+ throw new SigningSessionError(`Partial signatures not expected. Current phase: ${this.phase}`, 'INVALID_PHASE');
81
+ }
82
+ if (this.partialSignatures.has(participantDid)) {
83
+ throw new SigningSessionError(`Duplicate partial signature from ${participantDid}.`, 'DUPLICATE_PARTIAL_SIG');
84
+ }
85
+ this.partialSignatures.set(participantDid, partialSig);
86
+ if (this.partialSignatures.size === this.cohort.participants.length) {
87
+ this.phase = SigningSessionPhase.PartialSignaturesReceived;
88
+ }
89
+ }
90
+ generateFinalSignature() {
91
+ if (this.phase !== SigningSessionPhase.PartialSignaturesReceived) {
92
+ throw new SigningSessionError(`Cannot generate final signature: phase is ${this.phase}.`, 'INVALID_PHASE');
93
+ }
94
+ if (!this.aggregatedNonce) {
95
+ throw new SigningSessionError('Aggregated nonce missing.', 'MISSING_AGGREGATED_NONCE');
96
+ }
97
+ const session = new musig2.Session(this.aggregatedNonce, this.cohort.cohortKeys, this.sigHash, [this.cohort.trMerkleRoot], [true]);
98
+ this.signature = session.partialSigAgg([...this.partialSignatures.values()]);
99
+ this.phase = SigningSessionPhase.Complete;
100
+ return this.signature;
101
+ }
102
+ /**
103
+ * Generates a fresh MuSig2 nonce contribution for the participant.
104
+ * Stores the secret nonce internally for use in `generatePartialSignature()`.
105
+ */
106
+ generateNonceContribution(participantPublicKey, participantSecretKey) {
107
+ const aggPublicKey = musig2.keyAggExport(musig2.keyAggregate(this.cohort.cohortKeys));
108
+ const nonces = musig2.nonceGen(participantPublicKey, participantSecretKey, aggPublicKey);
109
+ this.secretNonce = nonces.secret;
110
+ return nonces.public;
111
+ }
112
+ /**
113
+ * Generates a partial signature using the participant's secret key + secret nonce.
114
+ * Requires the aggregated nonce to have been set first (via the service).
115
+ */
116
+ generatePartialSignature(participantSecretKey) {
117
+ if (!this.aggregatedNonce) {
118
+ throw new SigningSessionError('Aggregated nonce not available.', 'MISSING_AGGREGATED_NONCE');
119
+ }
120
+ if (!this.secretNonce) {
121
+ throw new SigningSessionError('Secret nonce not available — generateNonceContribution() must be called first.', 'MISSING_SECRET_NONCE');
122
+ }
123
+ const session = new musig2.Session(this.aggregatedNonce, this.cohort.cohortKeys, this.sigHash, [this.cohort.trMerkleRoot], [true]);
124
+ return session.sign(this.secretNonce, participantSecretKey);
125
+ }
126
+ isComplete() {
127
+ return this.phase === SigningSessionPhase.Complete;
128
+ }
129
+ isFailed() {
130
+ return this.phase === SigningSessionPhase.Failed;
131
+ }
132
+ }
133
+ //# sourceMappingURL=signing-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signing-session.js","sourceRoot":"","sources":["../../../../src/core/aggregation/signing-session.ts"],"names":[],"mappings":"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"}