@did-btcr2/method 0.25.2 → 0.26.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 (233) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/browser.js +125307 -122227
  3. package/dist/browser.mjs +125266 -122186
  4. package/dist/cjs/index.js +5043 -43
  5. package/dist/esm/core/beacon/aggregation/cohort/index.js.map +1 -1
  6. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.js.map +1 -1
  7. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.js.map +1 -1
  8. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.js.map +1 -1
  9. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/opt-in.js.map +1 -1
  10. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/subscribe.js.map +1 -1
  11. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.js.map +1 -1
  12. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/authorization-request.js.map +1 -1
  13. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.js.map +1 -1
  14. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/request-signature.js.map +1 -1
  15. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/signature-authorization.js.map +1 -1
  16. package/dist/esm/core/beacon/aggregation/communication/adapter/did-comm.js.map +1 -1
  17. package/dist/esm/core/beacon/aggregation/communication/adapter/nostr.js +1 -2
  18. package/dist/esm/core/beacon/aggregation/communication/adapter/nostr.js.map +1 -1
  19. package/dist/esm/core/beacon/aggregation/coordinator.js.map +1 -1
  20. package/dist/esm/core/beacon/aggregation/participant.js.map +1 -1
  21. package/dist/esm/core/beacon/aggregation/session/index.js.map +1 -1
  22. package/dist/esm/core/beacon/cas-beacon.js +6 -4
  23. package/dist/esm/core/beacon/cas-beacon.js.map +1 -1
  24. package/dist/esm/core/beacon/signal-discovery.js +1 -1
  25. package/dist/esm/core/beacon/signal-discovery.js.map +1 -1
  26. package/dist/esm/core/beacon/singleton-beacon.js +3 -3
  27. package/dist/esm/core/beacon/singleton-beacon.js.map +1 -1
  28. package/dist/esm/core/beacon/utils.js.map +1 -1
  29. package/dist/esm/core/identifier.js.map +1 -1
  30. package/dist/esm/core/resolver.js +41 -35
  31. package/dist/esm/core/resolver.js.map +1 -1
  32. package/dist/esm/core/update.js.map +1 -1
  33. package/dist/esm/did-btcr2.js +1 -1
  34. package/dist/esm/did-btcr2.js.map +1 -1
  35. package/dist/esm/utils/appendix.js +7 -6
  36. package/dist/esm/utils/appendix.js.map +1 -1
  37. package/dist/esm/utils/did-document-builder.js.map +1 -1
  38. package/dist/esm/utils/did-document.js +2 -2
  39. package/dist/esm/utils/did-document.js.map +1 -1
  40. package/dist/types/core/beacon/aggregation/cohort/index.d.ts +2 -2
  41. package/dist/types/core/beacon/aggregation/cohort/index.d.ts.map +1 -1
  42. package/dist/types/core/beacon/aggregation/cohort/messages/index.d.ts +10 -10
  43. package/dist/types/core/beacon/aggregation/cohort/messages/index.d.ts.map +1 -1
  44. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.d.ts +1 -1
  45. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.d.ts.map +1 -1
  46. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.d.ts +1 -1
  47. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.d.ts.map +1 -1
  48. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.d.ts +1 -1
  49. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.d.ts.map +1 -1
  50. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/opt-in.d.ts +1 -1
  51. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/opt-in.d.ts.map +1 -1
  52. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/subscribe.d.ts +1 -1
  53. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/subscribe.d.ts.map +1 -1
  54. package/dist/types/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.d.ts +1 -1
  55. package/dist/types/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.d.ts.map +1 -1
  56. package/dist/types/core/beacon/aggregation/cohort/messages/sign/authorization-request.d.ts +1 -1
  57. package/dist/types/core/beacon/aggregation/cohort/messages/sign/authorization-request.d.ts.map +1 -1
  58. package/dist/types/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.d.ts +1 -1
  59. package/dist/types/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.d.ts.map +1 -1
  60. package/dist/types/core/beacon/aggregation/cohort/messages/sign/request-signature.d.ts +1 -1
  61. package/dist/types/core/beacon/aggregation/cohort/messages/sign/request-signature.d.ts.map +1 -1
  62. package/dist/types/core/beacon/aggregation/cohort/messages/sign/signature-authorization.d.ts +1 -1
  63. package/dist/types/core/beacon/aggregation/cohort/messages/sign/signature-authorization.d.ts.map +1 -1
  64. package/dist/types/core/beacon/aggregation/communication/adapter/did-comm.d.ts +4 -4
  65. package/dist/types/core/beacon/aggregation/communication/adapter/did-comm.d.ts.map +1 -1
  66. package/dist/types/core/beacon/aggregation/communication/adapter/nostr.d.ts +6 -6
  67. package/dist/types/core/beacon/aggregation/communication/adapter/nostr.d.ts.map +1 -1
  68. package/dist/types/core/beacon/aggregation/communication/factory.d.ts +1 -1
  69. package/dist/types/core/beacon/aggregation/communication/factory.d.ts.map +1 -1
  70. package/dist/types/core/beacon/aggregation/communication/service.d.ts +3 -3
  71. package/dist/types/core/beacon/aggregation/communication/service.d.ts.map +1 -1
  72. package/dist/types/core/beacon/aggregation/coordinator.d.ts +3 -3
  73. package/dist/types/core/beacon/aggregation/coordinator.d.ts.map +1 -1
  74. package/dist/types/core/beacon/aggregation/participant.d.ts +6 -6
  75. package/dist/types/core/beacon/aggregation/participant.d.ts.map +1 -1
  76. package/dist/types/core/beacon/aggregation/session/index.d.ts +2 -2
  77. package/dist/types/core/beacon/aggregation/session/index.d.ts.map +1 -1
  78. package/dist/types/core/beacon/beacon.d.ts +5 -5
  79. package/dist/types/core/beacon/beacon.d.ts.map +1 -1
  80. package/dist/types/core/beacon/cas-beacon.d.ts +5 -5
  81. package/dist/types/core/beacon/cas-beacon.d.ts.map +1 -1
  82. package/dist/types/core/beacon/factory.d.ts +2 -2
  83. package/dist/types/core/beacon/factory.d.ts.map +1 -1
  84. package/dist/types/core/beacon/interfaces.d.ts +3 -3
  85. package/dist/types/core/beacon/interfaces.d.ts.map +1 -1
  86. package/dist/types/core/beacon/signal-discovery.d.ts +3 -3
  87. package/dist/types/core/beacon/signal-discovery.d.ts.map +1 -1
  88. package/dist/types/core/beacon/singleton-beacon.d.ts +5 -5
  89. package/dist/types/core/beacon/singleton-beacon.d.ts.map +1 -1
  90. package/dist/types/core/beacon/smt-beacon.d.ts +5 -5
  91. package/dist/types/core/beacon/smt-beacon.d.ts.map +1 -1
  92. package/dist/types/core/beacon/utils.d.ts +4 -4
  93. package/dist/types/core/beacon/utils.d.ts.map +1 -1
  94. package/dist/types/core/identifier.d.ts +2 -2
  95. package/dist/types/core/identifier.d.ts.map +1 -1
  96. package/dist/types/core/interfaces.d.ts +2 -2
  97. package/dist/types/core/interfaces.d.ts.map +1 -1
  98. package/dist/types/core/resolver.d.ts +8 -8
  99. package/dist/types/core/resolver.d.ts.map +1 -1
  100. package/dist/types/core/types.d.ts +6 -5
  101. package/dist/types/core/types.d.ts.map +1 -1
  102. package/dist/types/core/update.d.ts +5 -5
  103. package/dist/types/core/update.d.ts.map +1 -1
  104. package/dist/types/did-btcr2.d.ts +6 -6
  105. package/dist/types/did-btcr2.d.ts.map +1 -1
  106. package/dist/types/utils/appendix.d.ts +7 -7
  107. package/dist/types/utils/appendix.d.ts.map +1 -1
  108. package/dist/types/utils/did-document-builder.d.ts +3 -2
  109. package/dist/types/utils/did-document-builder.d.ts.map +1 -1
  110. package/dist/types/utils/did-document.d.ts +3 -3
  111. package/dist/types/utils/did-document.d.ts.map +1 -1
  112. package/package.json +7 -6
  113. package/src/core/beacon/aggregation/cohort/index.ts +3 -2
  114. package/src/core/beacon/aggregation/cohort/messages/index.ts +10 -10
  115. package/src/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.ts +2 -1
  116. package/src/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.ts +2 -1
  117. package/src/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.ts +2 -1
  118. package/src/core/beacon/aggregation/cohort/messages/keygen/opt-in.ts +2 -1
  119. package/src/core/beacon/aggregation/cohort/messages/keygen/subscribe.ts +2 -1
  120. package/src/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.ts +2 -1
  121. package/src/core/beacon/aggregation/cohort/messages/sign/authorization-request.ts +2 -1
  122. package/src/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.ts +2 -1
  123. package/src/core/beacon/aggregation/cohort/messages/sign/request-signature.ts +2 -1
  124. package/src/core/beacon/aggregation/cohort/messages/sign/signature-authorization.ts +2 -1
  125. package/src/core/beacon/aggregation/communication/adapter/did-comm.ts +5 -4
  126. package/src/core/beacon/aggregation/communication/adapter/nostr.ts +9 -7
  127. package/src/core/beacon/aggregation/communication/factory.ts +1 -1
  128. package/src/core/beacon/aggregation/communication/service.ts +3 -3
  129. package/src/core/beacon/aggregation/coordinator.ts +12 -8
  130. package/src/core/beacon/aggregation/participant.ts +12 -7
  131. package/src/core/beacon/aggregation/session/index.ts +3 -2
  132. package/src/core/beacon/beacon.ts +5 -5
  133. package/src/core/beacon/cas-beacon.ts +13 -9
  134. package/src/core/beacon/factory.ts +2 -2
  135. package/src/core/beacon/interfaces.ts +3 -3
  136. package/src/core/beacon/signal-discovery.ts +5 -4
  137. package/src/core/beacon/singleton-beacon.ts +8 -7
  138. package/src/core/beacon/smt-beacon.ts +5 -5
  139. package/src/core/beacon/utils.ts +6 -4
  140. package/src/core/identifier.ts +3 -2
  141. package/src/core/interfaces.ts +2 -2
  142. package/src/core/resolver.ts +59 -51
  143. package/src/core/types.ts +6 -5
  144. package/src/core/update.ts +11 -7
  145. package/src/did-btcr2.ts +12 -10
  146. package/src/utils/appendix.ts +14 -16
  147. package/src/utils/did-document-builder.ts +3 -2
  148. package/src/utils/did-document.ts +10 -8
  149. package/dist/cjs/core/beacon/aggregation/cohort/index.js +0 -237
  150. package/dist/cjs/core/beacon/aggregation/cohort/index.js.map +0 -1
  151. package/dist/cjs/core/beacon/aggregation/cohort/messages/base.js +0 -26
  152. package/dist/cjs/core/beacon/aggregation/cohort/messages/base.js.map +0 -1
  153. package/dist/cjs/core/beacon/aggregation/cohort/messages/constants.js +0 -11
  154. package/dist/cjs/core/beacon/aggregation/cohort/messages/constants.js.map +0 -1
  155. package/dist/cjs/core/beacon/aggregation/cohort/messages/index.js +0 -98
  156. package/dist/cjs/core/beacon/aggregation/cohort/messages/index.js.map +0 -1
  157. package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.js +0 -31
  158. package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.js.map +0 -1
  159. package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.js +0 -29
  160. package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.js.map +0 -1
  161. package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.js +0 -27
  162. package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.js.map +0 -1
  163. package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/opt-in.js +0 -23
  164. package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/opt-in.js.map +0 -1
  165. package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/subscribe.js +0 -28
  166. package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/subscribe.js.map +0 -1
  167. package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.js +0 -29
  168. package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.js.map +0 -1
  169. package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/authorization-request.js +0 -30
  170. package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/authorization-request.js.map +0 -1
  171. package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.js +0 -30
  172. package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.js.map +0 -1
  173. package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/request-signature.js +0 -30
  174. package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/request-signature.js.map +0 -1
  175. package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/signature-authorization.js +0 -31
  176. package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/signature-authorization.js.map +0 -1
  177. package/dist/cjs/core/beacon/aggregation/cohort/status.js +0 -8
  178. package/dist/cjs/core/beacon/aggregation/cohort/status.js.map +0 -1
  179. package/dist/cjs/core/beacon/aggregation/communication/adapter/did-comm.js +0 -121
  180. package/dist/cjs/core/beacon/aggregation/communication/adapter/did-comm.js.map +0 -1
  181. package/dist/cjs/core/beacon/aggregation/communication/adapter/nostr.js +0 -246
  182. package/dist/cjs/core/beacon/aggregation/communication/adapter/nostr.js.map +0 -1
  183. package/dist/cjs/core/beacon/aggregation/communication/error.js +0 -12
  184. package/dist/cjs/core/beacon/aggregation/communication/error.js.map +0 -1
  185. package/dist/cjs/core/beacon/aggregation/communication/factory.js +0 -21
  186. package/dist/cjs/core/beacon/aggregation/communication/factory.js.map +0 -1
  187. package/dist/cjs/core/beacon/aggregation/communication/service.js +0 -2
  188. package/dist/cjs/core/beacon/aggregation/communication/service.js.map +0 -1
  189. package/dist/cjs/core/beacon/aggregation/coordinator.js +0 -343
  190. package/dist/cjs/core/beacon/aggregation/coordinator.js.map +0 -1
  191. package/dist/cjs/core/beacon/aggregation/participant.js +0 -435
  192. package/dist/cjs/core/beacon/aggregation/participant.js.map +0 -1
  193. package/dist/cjs/core/beacon/aggregation/session/index.js +0 -244
  194. package/dist/cjs/core/beacon/aggregation/session/index.js.map +0 -1
  195. package/dist/cjs/core/beacon/aggregation/session/status.js +0 -11
  196. package/dist/cjs/core/beacon/aggregation/session/status.js.map +0 -1
  197. package/dist/cjs/core/beacon/beacon.js +0 -25
  198. package/dist/cjs/core/beacon/beacon.js.map +0 -1
  199. package/dist/cjs/core/beacon/cas-beacon.js +0 -152
  200. package/dist/cjs/core/beacon/cas-beacon.js.map +0 -1
  201. package/dist/cjs/core/beacon/error.js +0 -37
  202. package/dist/cjs/core/beacon/error.js.map +0 -1
  203. package/dist/cjs/core/beacon/factory.js +0 -29
  204. package/dist/cjs/core/beacon/factory.js.map +0 -1
  205. package/dist/cjs/core/beacon/interfaces.js +0 -2
  206. package/dist/cjs/core/beacon/interfaces.js.map +0 -1
  207. package/dist/cjs/core/beacon/signal-discovery.js +0 -183
  208. package/dist/cjs/core/beacon/signal-discovery.js.map +0 -1
  209. package/dist/cjs/core/beacon/singleton-beacon.js +0 -107
  210. package/dist/cjs/core/beacon/singleton-beacon.js.map +0 -1
  211. package/dist/cjs/core/beacon/smt-beacon.js +0 -39
  212. package/dist/cjs/core/beacon/smt-beacon.js.map +0 -1
  213. package/dist/cjs/core/beacon/utils.js +0 -163
  214. package/dist/cjs/core/beacon/utils.js.map +0 -1
  215. package/dist/cjs/core/identifier.js +0 -248
  216. package/dist/cjs/core/identifier.js.map +0 -1
  217. package/dist/cjs/core/interfaces.js +0 -2
  218. package/dist/cjs/core/interfaces.js.map +0 -1
  219. package/dist/cjs/core/resolver.js +0 -476
  220. package/dist/cjs/core/resolver.js.map +0 -1
  221. package/dist/cjs/core/types.js +0 -2
  222. package/dist/cjs/core/types.js.map +0 -1
  223. package/dist/cjs/core/update.js +0 -112
  224. package/dist/cjs/core/update.js.map +0 -1
  225. package/dist/cjs/did-btcr2.js +0 -193
  226. package/dist/cjs/did-btcr2.js.map +0 -1
  227. package/dist/cjs/index.js.map +0 -1
  228. package/dist/cjs/utils/appendix.js +0 -203
  229. package/dist/cjs/utils/appendix.js.map +0 -1
  230. package/dist/cjs/utils/did-document-builder.js +0 -60
  231. package/dist/cjs/utils/did-document-builder.js.map +0 -1
  232. package/dist/cjs/utils/did-document.js +0 -424
  233. package/dist/cjs/utils/did-document.js.map +0 -1
@@ -1,183 +0,0 @@
1
- import { GENESIS_TX_ID, TXIN_WITNESS_COINBASE } from '@did-btcr2/bitcoin';
2
- import { ResolveError } from '@did-btcr2/common';
3
- import { BeaconUtils } from './utils.js';
4
- /**
5
- * Static utility class for discovering Beacon Signals on the Bitcoin blockchain.
6
- * Extracted from {@link Resolve} for single-responsibility and independent testability.
7
- *
8
- * @class BeaconSignalDiscovery
9
- */
10
- export class BeaconSignalDiscovery {
11
- /**
12
- * Retrieves the beacon signals for the given array of BeaconService objects
13
- * using an esplora/electrs REST API connection via a bitcoin I/O driver.
14
- * @param {Array<BeaconService>} beaconServices Array of BeaconService objects to retrieve signals for
15
- * @param {BitcoinConnection} bitcoin Bitcoin network connection to use for REST calls
16
- * @returns {Promise<Map<BeaconService, Array<BeaconSignal>>>} Map of beacon service to its discovered signals
17
- */
18
- static async indexer(beaconServices, bitcoin) {
19
- const beaconServiceSignals = new Map();
20
- // Fetch the current block count once before the loop
21
- const currentBlockCount = await bitcoin.rest.block.count();
22
- // Iterate over each beacon
23
- for (const beaconService of beaconServices) {
24
- beaconServiceSignals.set(beaconService, []);
25
- // Get the transactions for the beacon address via REST
26
- const beaconSignals = await bitcoin.rest.address.getTxs(BeaconUtils.parseBitcoinAddress(beaconService.serviceEndpoint));
27
- // If no signals are found, continue
28
- if (!beaconSignals || !beaconSignals.length) {
29
- continue;
30
- }
31
- // Iterate over each signal
32
- for (const beaconSignal of beaconSignals) {
33
- // Get the last vout in the transaction
34
- const signalVout = beaconSignal.vout.slice(-1)[0];
35
- /**
36
- * Look for OP_RETURN in last vout scriptpubkey_asm
37
- * Vout (rest) format:
38
- * {
39
- * scriptpubkey: '6a20570f177c65e64fb5cf61180b664cdddf09ab76153c2b192e22006e5b22a3917a',
40
- * scriptpubkey_asm: 'OP_RETURN OP_PUSHBYTES_32 570f177c65e64fb5cf61180b664cdddf09ab76153c2b192e22006e5b22a3917a',
41
- * scriptpubkey_type: 'op_return',
42
- * value: 0
43
- * }
44
- */
45
- if (!signalVout || !signalVout.scriptpubkey_asm.includes('OP_RETURN')) {
46
- continue;
47
- }
48
- // Construct output map for easier access
49
- const outputMap = new Map(Object.entries(signalVout));
50
- // Grab the signal vout scriptpubkey
51
- const signalVoutScriptPubkey = outputMap.get('scriptpubkey_asm');
52
- // If the signal vout scriptpubkey does not exist, continue to next signal
53
- if (!signalVoutScriptPubkey) {
54
- continue;
55
- }
56
- // Extract hex string hash of the signal bytes from the scriptpubkey
57
- const updateHash = signalVoutScriptPubkey.split(' ').slice(-1)[0];
58
- if (!updateHash) {
59
- continue;
60
- }
61
- // Use the pre-fetched block count instead of calling per-signal
62
- const confirmations = currentBlockCount - beaconSignal.status.block_height + 1;
63
- // Push the beacon signal object to the signals array for the beacon service
64
- beaconServiceSignals.get(beaconService)?.push({
65
- tx: beaconSignal,
66
- signalBytes: updateHash,
67
- blockMetadata: {
68
- confirmations,
69
- height: beaconSignal.status.block_height,
70
- time: beaconSignal.status.block_time,
71
- }
72
- });
73
- }
74
- }
75
- return beaconServiceSignals;
76
- }
77
- /**
78
- * Traverse the full blockchain from genesis to chain top looking for beacon signals.
79
- * @param {Array<BeaconService>} beaconServices Array of BeaconService objects to search for signals.
80
- * @param {BitcoinConnection} bitcoin Bitcoin network connection to use for RPC calls.
81
- * @returns {Promise<Map<BeaconService, Array<BeaconSignal>>>} Map of beacon service to its discovered signals.
82
- */
83
- static async fullnode(beaconServices, bitcoin) {
84
- const beaconServiceSignals = new Map();
85
- for (const beaconService of beaconServices) {
86
- beaconServiceSignals.set(beaconService, []);
87
- }
88
- // Get the RPC connection from the bitcoin network
89
- const rpc = bitcoin.rpc;
90
- // Ensure that the RPC connection is available
91
- if (!rpc) {
92
- throw new ResolveError('RPC connection is not available', 'RPC_CONNECTION_ERROR', bitcoin);
93
- }
94
- // Get the current block height once before the loop
95
- const targetHeight = await rpc.getBlockCount();
96
- // Hoist the beacon services map before the loop
97
- const beaconServicesMap = BeaconUtils.getBeaconServicesMap(beaconServices);
98
- // Set genesis height
99
- let height = 0;
100
- // Opt into rpc connection to get the block data at the blockhash
101
- let block = await bitcoin.rpc.getBlock({ height });
102
- console.info(`Searching for beacon signals, please wait ...`);
103
- while (block.height <= targetHeight) {
104
- // Iterate over each transaction in the block
105
- for (const tx of block.tx) {
106
- // If the txid is a coinbase, continue ...
107
- if (tx.txid === GENESIS_TX_ID) {
108
- continue;
109
- }
110
- // Iterate over each input in the transaction
111
- for (const vin of tx.vin) {
112
- // If the vin is a coinbase transaction, continue ...
113
- if (vin.coinbase) {
114
- continue;
115
- }
116
- // If the vin txinwitness contains a coinbase did, continue ...
117
- if (vin.txinwitness && vin.txinwitness.length === 1 && vin.txinwitness[0] === TXIN_WITNESS_COINBASE) {
118
- continue;
119
- }
120
- // If the txid from the vin is undefined, continue ...
121
- if (!vin.txid) {
122
- continue;
123
- }
124
- // If the vout from the vin is undefined, continue ...
125
- if (vin.vout === undefined) {
126
- continue;
127
- }
128
- // Get the previous output transaction data
129
- const prevout = await rpc.getRawTransaction(vin.txid, 2);
130
- // If the previous output vout at the vin.vout index is undefined, continue ...
131
- if (!prevout.vout[vin.vout]) {
132
- continue;
133
- }
134
- // Get the address from the scriptPubKey from the prevvout
135
- const scriptPubKey = prevout.vout[vin.vout].scriptPubKey;
136
- // If the scriptPubKey.address is undefined, continue ...
137
- if (!scriptPubKey.address) {
138
- continue;
139
- }
140
- // Use the hoisted beaconServicesMap instead of rebuilding per-vin
141
- const beaconService = beaconServicesMap.get(scriptPubKey.address);
142
- if (!beaconService) {
143
- continue;
144
- }
145
- // Look for 'OP_RETURN' in the scriptPubKey asm
146
- const txVoutScriptPubkeyAsm = prevout.vout[vin.vout].scriptPubKey.asm;
147
- if (!txVoutScriptPubkeyAsm.includes('OP_RETURN')) {
148
- continue;
149
- }
150
- // Log the found txid and beacon
151
- console.info(`Tx ${tx.txid} contains beacon service address ${scriptPubKey.address} and OP_RETURN!`, tx);
152
- // Extract hex string hash of the signal bytes from the scriptpubkey
153
- const updateHash = txVoutScriptPubkeyAsm.split(' ').slice(-1)[0];
154
- if (!updateHash) {
155
- continue;
156
- }
157
- // Push the beacon signal object to the beacon signals array for that beacon service
158
- beaconServiceSignals.get(beaconService)?.push({
159
- tx,
160
- signalBytes: updateHash,
161
- blockMetadata: {
162
- height: block.height,
163
- time: block.time,
164
- confirmations: block.confirmations
165
- }
166
- });
167
- }
168
- ;
169
- }
170
- // Increment the height
171
- height += 1;
172
- // Use pre-fetched targetHeight instead of calling rpc.getBlockCount() every iteration
173
- if (height > targetHeight) {
174
- console.info(`Chain tip reached ${height}, breaking ...`);
175
- break;
176
- }
177
- // Reset the block var to the next block data
178
- block = await rpc.getBlock({ height });
179
- }
180
- return beaconServiceSignals;
181
- }
182
- }
183
- //# sourceMappingURL=signal-discovery.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"signal-discovery.js","sourceRoot":"","sources":["../../../../src/core/beacon/signal-discovery.ts"],"names":[],"mappings":"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"}
@@ -1,107 +0,0 @@
1
- import { canonicalize, decode, encode, hash } from '@did-btcr2/common';
2
- import { SchnorrKeyPair } from '@did-btcr2/keypair';
3
- import { hexToBytes } from '@noble/hashes/utils';
4
- import { opcodes, Psbt, script } from 'bitcoinjs-lib';
5
- import { Beacon } from './beacon.js';
6
- import { SingletonBeaconError } from './error.js';
7
- /**
8
- * Implements {@link https://dcdpr.github.io/did-btcr2/terminology.html#singleton-beacon | Singleton Beacon}.
9
- * @class SingletonBeacon
10
- * @type {SingletonBeacon}
11
- * @extends {Beacon}
12
- */
13
- export class SingletonBeacon extends Beacon {
14
- /**
15
- * Creates an instance of SingletonBeacon.
16
- * @param {BeaconService} service The BeaconService object representing the funded beacon to announce the update to.
17
- */
18
- constructor(service) {
19
- super({ ...service, type: 'SingletonBeacon' });
20
- }
21
- /**
22
- * Processes an array of Beacon Signals associated with a Singleton Beacon Service.
23
- * @param {Array<BeaconSignal>} signals The beacon signals discovered on-chain.
24
- * @param {SidecarData} sidecar The processed sidecar data.
25
- * @returns {BeaconProcessResult} Successfully resolved updates and any data needs.
26
- */
27
- processSignals(signals, sidecar) {
28
- const updates = new Array();
29
- const needs = new Array();
30
- for (const signal of signals) {
31
- // Decode signal bytes from hex and re-encode to base64url for sidecar lookup
32
- const updateHash = encode(decode(signal.signalBytes, 'hex'));
33
- // Look up the signed update in sidecar updateMap
34
- const signedUpdate = sidecar.updateMap.get(updateHash);
35
- if (!signedUpdate) {
36
- // Data not available — emit a need instead of throwing
37
- needs.push({
38
- kind: 'NeedSignedUpdate',
39
- updateHash,
40
- beaconServiceId: this.service.id
41
- });
42
- continue;
43
- }
44
- updates.push([signedUpdate, signal.blockMetadata]);
45
- }
46
- return { updates, needs };
47
- }
48
- /**
49
- * Broadcasts a SingletonBeacon signal to the Bitcoin network.
50
- * @param {SignedBTCR2Update} signedUpdate The signed BTCR2 update to broadcast.
51
- * @param {KeyBytes} secretKey The secret key for signing the Bitcoin transaction.
52
- * @param {BitcoinConnection} bitcoin The Bitcoin network connection.
53
- * @returns {Promise<SignedBTCR2Update>} The signed update that was broadcast.
54
- * @throws {SingletonBeaconError} if the bitcoin address is invalid or unfunded.
55
- */
56
- async broadcastSignal(signedUpdate, secretKey, bitcoin) {
57
- // Convert the serviceEndpoint to a bitcoin address by removing the 'bitcoin:' prefix
58
- const bitcoinAddress = this.service.serviceEndpoint.replace('bitcoin:', '');
59
- // Query the Bitcoin network for UTXOs associated with the bitcoinAddress
60
- const utxos = await bitcoin.rest.address.getUtxos(bitcoinAddress);
61
- // If no utxos are found, throw an error indicating the address is unfunded.
62
- if (!utxos.length) {
63
- throw new SingletonBeaconError('No UTXOs found, please fund address!', 'UNFUNDED_BEACON_ADDRESS', { bitcoinAddress });
64
- }
65
- // Sort utxos by block height and take the most recent one
66
- const utxo = utxos.sort((a, b) => b.status.block_height - a.status.block_height).shift();
67
- // If no utxos are found, throw an error.
68
- if (!utxo) {
69
- throw new SingletonBeaconError('Beacon bitcoin address unfunded or utxos unconfirmed.', 'UNFUNDED_BEACON_ADDRESS', { bitcoinAddress });
70
- }
71
- // Get the previous tx to the utxo being spent
72
- const prevTx = await bitcoin.rest.transaction.getHex(utxo.txid);
73
- // Canonicalize and hash the signed update for OP_RETURN output
74
- const updateHash = hash(canonicalize(signedUpdate));
75
- // Construct a spend transaction
76
- const spendTx = new Psbt({ network: bitcoin.data })
77
- // Spend tx contains the utxo as its input
78
- .addInput({
79
- hash: utxo.txid,
80
- index: utxo.vout,
81
- nonWitnessUtxo: hexToBytes(prevTx)
82
- })
83
- // Add a change output minus a fee of 500 sats
84
- // TODO: calculate fee based on transaction vsize and current fee rates
85
- .addOutput({ address: bitcoinAddress, value: BigInt(utxo.value) - BigInt(500) })
86
- // Add an OP_RETURN output containing the update hash
87
- .addOutput({ script: script.compile([opcodes.OP_RETURN, updateHash]), value: 0n });
88
- // Construct a key pair and PSBT signer from the secret key
89
- const keyPair = SchnorrKeyPair.fromSecret(secretKey);
90
- const signer = {
91
- publicKey: keyPair.publicKey.compressed,
92
- sign: (hash) => keyPair.secretKey.sign(hash, { scheme: 'ecdsa' }),
93
- };
94
- // Sign 0th input, finalize extract to hex in prep for broadcast
95
- const signedTx = spendTx.signInput(0, signer)
96
- .finalizeAllInputs()
97
- .extractTransaction()
98
- .toHex();
99
- // Broadcast spendTx to the Bitcoin network.
100
- const txid = await bitcoin.rest.transaction.send(signedTx);
101
- // Log the txid of the broadcasted transaction
102
- console.info(`Singleton Beacon Signal Broadcasted with txid: ${txid}`);
103
- // Return the signed update
104
- return signedUpdate;
105
- }
106
- }
107
- //# sourceMappingURL=singleton-beacon.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"singleton-beacon.js","sourceRoot":"","sources":["../../../../src/core/beacon/singleton-beacon.ts"],"names":[],"mappings":"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"}
@@ -1,39 +0,0 @@
1
- import { Beacon } from './beacon.js';
2
- import { SMTBeaconError } from './error.js';
3
- /**
4
- * Implements {@link https://dcdpr.github.io/did-btcr2/terminology.html#smt-beacon | SMTBeacon}.
5
- * @class SMTBeacon
6
- * @type {SMTBeacon}
7
- * @extends {Beacon}
8
- */
9
- export class SMTBeacon extends Beacon {
10
- /**
11
- * Creates an instance of SMTBeacon.
12
- * @param {BeaconService} service The Beacon service.
13
- */
14
- constructor(service) {
15
- super({ ...service, type: 'SMTBeacon' });
16
- }
17
- /**
18
- * Implements {@link https://dcdpr.github.io/did-btcr2/operations/resolve.html#process-smt-beacon | 7.2.e.1 Process SMT Beacon}.
19
- * @param {Array<BeaconSignal>} signals The array of Beacon Signals to process.
20
- * @param {SidecarData} sidecar The sidecar data associated with the SMT Beacon.
21
- * @returns {BeaconProcessResult} The processed signals.
22
- * @throws {SMTBeaconError} if processing fails.
23
- */
24
- processSignals(signals, sidecar) {
25
- throw new SMTBeaconError('Method not implemented.', `METHOD_NOT_IMPLEMENTED`, { signals, sidecar });
26
- }
27
- /**
28
- * Broadcast CAS Beacon signal to the Bitcoin network.
29
- * @param {SignedBTCR2Update} signedUpdate The signed BTCR2 update to broadcast.
30
- * @param {KeyBytes} secretKey The secret key for signing the Bitcoin transaction.
31
- * @param {BitcoinConnection} bitcoin The Bitcoin network connection.
32
- * @return {Promise<SignedBTCR2Update>} The signed update that was broadcasted.
33
- * @throws {SMTBeaconError} if broadcasting fails.
34
- */
35
- async broadcastSignal(signedUpdate, secretKey, bitcoin) {
36
- throw new SMTBeaconError('Method not implemented.', `METHOD_NOT_IMPLEMENTED`, { signedUpdate, secretKey, bitcoin });
37
- }
38
- }
39
- //# sourceMappingURL=smt-beacon.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"smt-beacon.js","sourceRoot":"","sources":["../../../../src/core/beacon/smt-beacon.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C;;;;;GAKG;AACH,MAAM,OAAO,SAAU,SAAQ,MAAM;IACnC;;;OAGG;IACH,YAAY,OAAsB;QAChC,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;OAMG;IACH,cAAc,CACZ,OAA4B,EAC5B,OAAoB;QAEpB,MAAM,IAAI,cAAc,CAAC,yBAAyB,EAAE,wBAAwB,EAAE,EAAC,OAAO,EAAE,OAAO,EAAC,CAAC,CAAC;IACpG,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,eAAe,CACnB,YAA+B,EAC/B,SAAmB,EACnB,OAA0B;QAE1B,MAAM,IAAI,cAAc,CAAC,yBAAyB,EAAE,wBAAwB,EAAE,EAAC,YAAY,EAAE,SAAS,EAAE,OAAO,EAAC,CAAC,CAAC;IACpH,CAAC;CACF"}
@@ -1,163 +0,0 @@
1
- import { getNetwork } from '@did-btcr2/bitcoin';
2
- import { DidMethodError, MethodError } from '@did-btcr2/common';
3
- import { payments } from 'bitcoinjs-lib';
4
- import { Appendix } from '../../utils/appendix.js';
5
- import { Identifier } from '../identifier.js';
6
- import { BeaconError } from './error.js';
7
- /**
8
- * Static class of utility functions for the Beacon Service
9
- * @class BeaconUtils
10
- * @type {BeaconUtils}
11
- */
12
- export class BeaconUtils {
13
- /**
14
- * Converts a BIP21 Bitcoin URI to a Bitcoin address
15
- * @param {string} uri The BIP21 Bitcoin URI to convert
16
- * @returns {string} The Bitcoin address extracted from the URI
17
- * @throws {DidMethodError} if the URI is not a valid Bitcoin URI
18
- */
19
- static parseBitcoinAddress(uri) {
20
- if (!uri.startsWith('bitcoin:')) {
21
- throw new MethodError('Invalid Bitcoin URI format', 'BEACON_SERVICE_ERROR', { uri });
22
- }
23
- return uri.replace('bitcoin:', '').split('?')[0];
24
- }
25
- /**
26
- * Validates that the given object is a Beacon Service
27
- * @param {BeaconService} obj The object to validate
28
- * @returns {boolean} A boolean indicating whether the object is a Beacon Service
29
- */
30
- static isBeaconService(obj) {
31
- // Return false if the given obj is not a valid DidService.
32
- if (!Appendix.isDidService(obj))
33
- return false;
34
- // Return false if the type is not a valid beacon service type.
35
- if (!['SingletonBeacon', 'CASBeacon', 'SMTBeacon'].includes(obj.type))
36
- return false;
37
- // Return false if the serviceEndpoint is not a valid BIP21 bitcoin address.
38
- if ([obj.serviceEndpoint].flat().some(ep => typeof ep === 'string' && !ep.startsWith('bitcoin:')))
39
- return false;
40
- // Else return true
41
- return true;
42
- }
43
- /**
44
- * Extracts the services from a given DID Document
45
- * @param {DidDocument} didDocument The DID Document to extract the services from
46
- * @returns {DidService[]} An array of DidService objects
47
- * @throws {TypeError} if the didDocument is not provided
48
- */
49
- static getBeaconServices(didDocument) {
50
- // Filter for valid beacon service objects.
51
- return (didDocument.service.filter(this.isBeaconService) ?? []);
52
- }
53
- /**
54
- * Create the 3 default Beacon Service Endpoints for a given `k` (public-key-based) identifier.
55
- * @param {string} did The DID for which to create the beacon services.
56
- * @returns {Array<Array<string>>} 2D Array of bitcoin addresses (p2pkh, p2wpkh, p2tr).
57
- * @throws {DidMethodError} if the bitcoin address is invalid.
58
- */
59
- static createBeaconServices(did, beaconType) {
60
- try {
61
- // Get the Network class
62
- const addrTypes = ['p2pkh', 'p2wpkh', 'p2tr'];
63
- // Map over the address types and create the beacon services
64
- return addrTypes.map((addrType) => this.createBeaconService(did, addrType, beaconType));
65
- }
66
- catch (error) {
67
- throw new BeaconError('Failed to create beacon services: ' + error.message, 'BEACON_SERVICE_ERROR', { did, beaconType });
68
- }
69
- }
70
- /**
71
- * Generate a set of Beacon Services for a given public key.
72
- * @param {string} did The did for the beacon service.
73
- * @param {string} addressType The type of bitcoin address to generate (p2pkh, p2wpkh, p2tr).
74
- * @param {string} beaconType The type of beacon service to create.
75
- * @returns {BeaconService} A BeaconService object.
76
- * @throws {DidMethodError} if the bitcoin address is invalid.
77
- */
78
- static createBeaconService(did, addressType, beaconType) {
79
- try {
80
- // Decode the DID to get the network and genesis bytes
81
- const components = Identifier.decode(did);
82
- // Get the Network class
83
- const network = getNetwork(components.network);
84
- // Get the genesis bytes
85
- const pubkey = components.genesisBytes;
86
- // Build the id
87
- const id = `${did}#initial${addressType.toUpperCase()}`;
88
- // Generate the bitcoin address
89
- const serviceEndpoint = `bitcoin:${payments[addressType]({ pubkey, network }).address}`;
90
- // Return the beacon serviceD
91
- return { id, type: beaconType, serviceEndpoint, };
92
- }
93
- catch (error) {
94
- throw new BeaconError('Failed to create beacon service: ' + error.message, 'BEACON_SERVICE_ERROR', { did, beaconType });
95
- }
96
- }
97
- /**
98
- * Generate three default Beacon Service Endpoints for a given `k` (public-key-based) identifier.
99
- * @param {string} did The DID for which to create the beacon services.
100
- * @returns {Array<Array<string>>} 2D Array of bitcoin addresses (p2pkh, p2wpkh, p2tr).
101
- * @throws {DidMethodError} if the bitcoin address is invalid.
102
- */
103
- static generateBeaconServices({ id, publicKey, network, beaconType }) {
104
- try {
105
- // Generate the bitcoin addresses for the given public key and network
106
- const p2pkh = payments.p2pkh({ pubkey: publicKey, network }).address;
107
- const p2wpkh = payments.p2wpkh({ pubkey: publicKey, network }).address;
108
- const p2tr = payments.p2tr({ network, internalPubkey: publicKey.slice(1, 33) }).address;
109
- // Check that all addresses were generated successfully
110
- if (!p2pkh || !p2wpkh || !p2tr) {
111
- throw new DidMethodError('Failed to generate bitcoin addresses');
112
- }
113
- // Return the beacon services with the generated addresses as service endpoints
114
- return [
115
- {
116
- id: `${id}#initialP2PKH`,
117
- type: beaconType,
118
- serviceEndpoint: `bitcoin:${p2pkh}`
119
- },
120
- {
121
- id: `${id}#initialP2WPKH`,
122
- type: beaconType,
123
- serviceEndpoint: `bitcoin:${p2wpkh}`
124
- },
125
- {
126
- id: `${id}#initialP2TR`,
127
- type: beaconType,
128
- serviceEndpoint: `bitcoin:${p2tr}`
129
- },
130
- ];
131
- }
132
- catch (error) {
133
- throw new BeaconError('Failed to create beacon services: ' + error.message, 'BEACON_SERVICE_ERROR', { id, publicKey, network, beaconType });
134
- }
135
- }
136
- /**
137
- * Convert beacon service endpoints from BIP-21 URIs to addresses.
138
- * @param {BeaconService} beacon The beacon service to parse.
139
- * @returns {BeaconServiceAddress} The beacon service with the address field extracted from the serviceEndpoint.
140
- */
141
- static parseBeaconServiceEndpoint(beacon) {
142
- return { ...beacon, serviceEndpoint: beacon.serviceEndpoint.replace('bitcoin:', '') };
143
- }
144
- /**
145
- * Create a map of address => beaconService with address field.
146
- * @param {Array<BeaconService>} beacons The list of beacon services.
147
- * @returns {Map<string, BeaconService>} A map of address => beaconService.
148
- */
149
- static getBeaconServicesMap(beacons) {
150
- return new Map(beacons
151
- .map(this.parseBeaconServiceEndpoint)
152
- .map((beacon) => ([beacon.serviceEndpoint, beacon])));
153
- }
154
- /**
155
- * Get the beacon service ids from a list of beacon services.
156
- * @param {DidDocument} didDocument The DID Document to extract the services from.
157
- * @returns {string[]} An array of beacon service ids.
158
- */
159
- static getBeaconServiceIds(didDocument) {
160
- return this.getBeaconServices(didDocument).map((beacon) => beacon.id);
161
- }
162
- }
163
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/core/beacon/utils.ts"],"names":[],"mappings":"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"}