@did-btcr2/method 0.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +7 -0
  3. package/dist/browser.js +2364 -0
  4. package/dist/browser.js.map +7 -0
  5. package/dist/browser.mjs +2364 -0
  6. package/dist/browser.mjs.map +7 -0
  7. package/dist/cjs/bitcoin/constants.js +20 -0
  8. package/dist/cjs/bitcoin/constants.js.map +1 -0
  9. package/dist/cjs/bitcoin/errors.js +11 -0
  10. package/dist/cjs/bitcoin/errors.js.map +1 -0
  11. package/dist/cjs/bitcoin/index.js +95 -0
  12. package/dist/cjs/bitcoin/index.js.map +1 -0
  13. package/dist/cjs/bitcoin/interface.js +2 -0
  14. package/dist/cjs/bitcoin/interface.js.map +1 -0
  15. package/dist/cjs/bitcoin/network.js +17 -0
  16. package/dist/cjs/bitcoin/network.js.map +1 -0
  17. package/dist/cjs/bitcoin/rest-client.js +289 -0
  18. package/dist/cjs/bitcoin/rest-client.js.map +1 -0
  19. package/dist/cjs/bitcoin/rpc-client.js +722 -0
  20. package/dist/cjs/bitcoin/rpc-client.js.map +1 -0
  21. package/dist/cjs/bitcoin/taproot.js +219 -0
  22. package/dist/cjs/bitcoin/taproot.js.map +1 -0
  23. package/dist/cjs/btcr2/beacon/aggregation/coordinator.js +120 -0
  24. package/dist/cjs/btcr2/beacon/aggregation/coordinator.js.map +1 -0
  25. package/dist/cjs/btcr2/beacon/aggregation/messages/advert.js +24 -0
  26. package/dist/cjs/btcr2/beacon/aggregation/messages/advert.js.map +1 -0
  27. package/dist/cjs/btcr2/beacon/aggregation/messages/base.js +37 -0
  28. package/dist/cjs/btcr2/beacon/aggregation/messages/base.js.map +1 -0
  29. package/dist/cjs/btcr2/beacon/aggregation/messages/cohort-set.js +25 -0
  30. package/dist/cjs/btcr2/beacon/aggregation/messages/cohort-set.js.map +1 -0
  31. package/dist/cjs/btcr2/beacon/aggregation/messages/keygen.js +8 -0
  32. package/dist/cjs/btcr2/beacon/aggregation/messages/keygen.js.map +1 -0
  33. package/dist/cjs/btcr2/beacon/aggregation/messages/opt-in.js +23 -0
  34. package/dist/cjs/btcr2/beacon/aggregation/messages/opt-in.js.map +1 -0
  35. package/dist/cjs/btcr2/beacon/aggregation/messages/sign.js +7 -0
  36. package/dist/cjs/btcr2/beacon/aggregation/messages/sign.js.map +1 -0
  37. package/dist/cjs/btcr2/beacon/aggregation/models/cohort/index.js +92 -0
  38. package/dist/cjs/btcr2/beacon/aggregation/models/cohort/index.js.map +1 -0
  39. package/dist/cjs/btcr2/beacon/aggregation/models/cohort/status.js +8 -0
  40. package/dist/cjs/btcr2/beacon/aggregation/models/cohort/status.js.map +1 -0
  41. package/dist/cjs/btcr2/beacon/aggregation/participant.js +2 -0
  42. package/dist/cjs/btcr2/beacon/aggregation/participant.js.map +1 -0
  43. package/dist/cjs/btcr2/beacon/aggregation/protocol/nostr.js +57 -0
  44. package/dist/cjs/btcr2/beacon/aggregation/protocol/nostr.js.map +1 -0
  45. package/dist/cjs/btcr2/beacon/aggregation/protocol/service.js +2 -0
  46. package/dist/cjs/btcr2/beacon/aggregation/protocol/service.js.map +1 -0
  47. package/dist/cjs/btcr2/beacon/cid-aggregate.js +116 -0
  48. package/dist/cjs/btcr2/beacon/cid-aggregate.js.map +1 -0
  49. package/dist/cjs/btcr2/beacon/factory.js +30 -0
  50. package/dist/cjs/btcr2/beacon/factory.js.map +1 -0
  51. package/dist/cjs/btcr2/beacon/singleton.js +220 -0
  52. package/dist/cjs/btcr2/beacon/singleton.js.map +1 -0
  53. package/dist/cjs/btcr2/beacon/smt-aggregate.js +126 -0
  54. package/dist/cjs/btcr2/beacon/smt-aggregate.js.map +1 -0
  55. package/dist/cjs/btcr2/crud/create.js +102 -0
  56. package/dist/cjs/btcr2/crud/create.js.map +1 -0
  57. package/dist/cjs/btcr2/crud/deactivate.js +14 -0
  58. package/dist/cjs/btcr2/crud/deactivate.js.map +1 -0
  59. package/dist/cjs/btcr2/crud/read.js +686 -0
  60. package/dist/cjs/btcr2/crud/read.js.map +1 -0
  61. package/dist/cjs/btcr2/crud/update.js +195 -0
  62. package/dist/cjs/btcr2/crud/update.js.map +1 -0
  63. package/dist/cjs/btcr2/key-manager/index.js +290 -0
  64. package/dist/cjs/btcr2/key-manager/index.js.map +1 -0
  65. package/dist/cjs/btcr2/key-manager/interface.js +2 -0
  66. package/dist/cjs/btcr2/key-manager/interface.js.map +1 -0
  67. package/dist/cjs/did-btcr2.js +222 -0
  68. package/dist/cjs/did-btcr2.js.map +1 -0
  69. package/dist/cjs/index.js +27 -0
  70. package/dist/cjs/index.js.map +1 -0
  71. package/dist/cjs/interfaces/beacon.js +41 -0
  72. package/dist/cjs/interfaces/beacon.js.map +1 -0
  73. package/dist/cjs/interfaces/crud.js +2 -0
  74. package/dist/cjs/interfaces/crud.js.map +1 -0
  75. package/dist/cjs/interfaces/ibeacon.js +2 -0
  76. package/dist/cjs/interfaces/ibeacon.js.map +1 -0
  77. package/dist/cjs/package.json +1 -0
  78. package/dist/cjs/types/bitcoin.js +62 -0
  79. package/dist/cjs/types/bitcoin.js.map +1 -0
  80. package/dist/cjs/types/crud.js +2 -0
  81. package/dist/cjs/types/crud.js.map +1 -0
  82. package/dist/cjs/utils/appendix.js +221 -0
  83. package/dist/cjs/utils/appendix.js.map +1 -0
  84. package/dist/cjs/utils/beacons.js +206 -0
  85. package/dist/cjs/utils/beacons.js.map +1 -0
  86. package/dist/cjs/utils/did-document-builder.js +61 -0
  87. package/dist/cjs/utils/did-document-builder.js.map +1 -0
  88. package/dist/cjs/utils/did-document.js +380 -0
  89. package/dist/cjs/utils/did-document.js.map +1 -0
  90. package/dist/cjs/utils/general.js +195 -0
  91. package/dist/cjs/utils/general.js.map +1 -0
  92. package/dist/cjs/utils/identifier.js +238 -0
  93. package/dist/cjs/utils/identifier.js.map +1 -0
  94. package/dist/esm/bitcoin/constants.js +20 -0
  95. package/dist/esm/bitcoin/constants.js.map +1 -0
  96. package/dist/esm/bitcoin/errors.js +11 -0
  97. package/dist/esm/bitcoin/errors.js.map +1 -0
  98. package/dist/esm/bitcoin/index.js +95 -0
  99. package/dist/esm/bitcoin/index.js.map +1 -0
  100. package/dist/esm/bitcoin/interface.js +2 -0
  101. package/dist/esm/bitcoin/interface.js.map +1 -0
  102. package/dist/esm/bitcoin/network.js +17 -0
  103. package/dist/esm/bitcoin/network.js.map +1 -0
  104. package/dist/esm/bitcoin/rest-client.js +289 -0
  105. package/dist/esm/bitcoin/rest-client.js.map +1 -0
  106. package/dist/esm/bitcoin/rpc-client.js +722 -0
  107. package/dist/esm/bitcoin/rpc-client.js.map +1 -0
  108. package/dist/esm/bitcoin/taproot.js +219 -0
  109. package/dist/esm/bitcoin/taproot.js.map +1 -0
  110. package/dist/esm/btcr2/beacon/aggregation/coordinator.js +120 -0
  111. package/dist/esm/btcr2/beacon/aggregation/coordinator.js.map +1 -0
  112. package/dist/esm/btcr2/beacon/aggregation/messages/advert.js +24 -0
  113. package/dist/esm/btcr2/beacon/aggregation/messages/advert.js.map +1 -0
  114. package/dist/esm/btcr2/beacon/aggregation/messages/base.js +37 -0
  115. package/dist/esm/btcr2/beacon/aggregation/messages/base.js.map +1 -0
  116. package/dist/esm/btcr2/beacon/aggregation/messages/cohort-set.js +25 -0
  117. package/dist/esm/btcr2/beacon/aggregation/messages/cohort-set.js.map +1 -0
  118. package/dist/esm/btcr2/beacon/aggregation/messages/keygen.js +8 -0
  119. package/dist/esm/btcr2/beacon/aggregation/messages/keygen.js.map +1 -0
  120. package/dist/esm/btcr2/beacon/aggregation/messages/opt-in.js +23 -0
  121. package/dist/esm/btcr2/beacon/aggregation/messages/opt-in.js.map +1 -0
  122. package/dist/esm/btcr2/beacon/aggregation/messages/sign.js +7 -0
  123. package/dist/esm/btcr2/beacon/aggregation/messages/sign.js.map +1 -0
  124. package/dist/esm/btcr2/beacon/aggregation/models/cohort/index.js +92 -0
  125. package/dist/esm/btcr2/beacon/aggregation/models/cohort/index.js.map +1 -0
  126. package/dist/esm/btcr2/beacon/aggregation/models/cohort/status.js +8 -0
  127. package/dist/esm/btcr2/beacon/aggregation/models/cohort/status.js.map +1 -0
  128. package/dist/esm/btcr2/beacon/aggregation/participant.js +2 -0
  129. package/dist/esm/btcr2/beacon/aggregation/participant.js.map +1 -0
  130. package/dist/esm/btcr2/beacon/aggregation/protocol/nostr.js +57 -0
  131. package/dist/esm/btcr2/beacon/aggregation/protocol/nostr.js.map +1 -0
  132. package/dist/esm/btcr2/beacon/aggregation/protocol/service.js +2 -0
  133. package/dist/esm/btcr2/beacon/aggregation/protocol/service.js.map +1 -0
  134. package/dist/esm/btcr2/beacon/cid-aggregate.js +116 -0
  135. package/dist/esm/btcr2/beacon/cid-aggregate.js.map +1 -0
  136. package/dist/esm/btcr2/beacon/factory.js +30 -0
  137. package/dist/esm/btcr2/beacon/factory.js.map +1 -0
  138. package/dist/esm/btcr2/beacon/singleton.js +220 -0
  139. package/dist/esm/btcr2/beacon/singleton.js.map +1 -0
  140. package/dist/esm/btcr2/beacon/smt-aggregate.js +126 -0
  141. package/dist/esm/btcr2/beacon/smt-aggregate.js.map +1 -0
  142. package/dist/esm/btcr2/crud/create.js +102 -0
  143. package/dist/esm/btcr2/crud/create.js.map +1 -0
  144. package/dist/esm/btcr2/crud/deactivate.js +14 -0
  145. package/dist/esm/btcr2/crud/deactivate.js.map +1 -0
  146. package/dist/esm/btcr2/crud/read.js +686 -0
  147. package/dist/esm/btcr2/crud/read.js.map +1 -0
  148. package/dist/esm/btcr2/crud/update.js +195 -0
  149. package/dist/esm/btcr2/crud/update.js.map +1 -0
  150. package/dist/esm/btcr2/key-manager/index.js +290 -0
  151. package/dist/esm/btcr2/key-manager/index.js.map +1 -0
  152. package/dist/esm/btcr2/key-manager/interface.js +2 -0
  153. package/dist/esm/btcr2/key-manager/interface.js.map +1 -0
  154. package/dist/esm/did-btcr2.js +222 -0
  155. package/dist/esm/did-btcr2.js.map +1 -0
  156. package/dist/esm/index.js +27 -0
  157. package/dist/esm/index.js.map +1 -0
  158. package/dist/esm/interfaces/beacon.js +41 -0
  159. package/dist/esm/interfaces/beacon.js.map +1 -0
  160. package/dist/esm/interfaces/crud.js +2 -0
  161. package/dist/esm/interfaces/crud.js.map +1 -0
  162. package/dist/esm/interfaces/ibeacon.js +2 -0
  163. package/dist/esm/interfaces/ibeacon.js.map +1 -0
  164. package/dist/esm/types/bitcoin.js +62 -0
  165. package/dist/esm/types/bitcoin.js.map +1 -0
  166. package/dist/esm/types/crud.js +2 -0
  167. package/dist/esm/types/crud.js.map +1 -0
  168. package/dist/esm/utils/appendix.js +221 -0
  169. package/dist/esm/utils/appendix.js.map +1 -0
  170. package/dist/esm/utils/beacons.js +206 -0
  171. package/dist/esm/utils/beacons.js.map +1 -0
  172. package/dist/esm/utils/did-document-builder.js +61 -0
  173. package/dist/esm/utils/did-document-builder.js.map +1 -0
  174. package/dist/esm/utils/did-document.js +380 -0
  175. package/dist/esm/utils/did-document.js.map +1 -0
  176. package/dist/esm/utils/general.js +195 -0
  177. package/dist/esm/utils/general.js.map +1 -0
  178. package/dist/esm/utils/identifier.js +238 -0
  179. package/dist/esm/utils/identifier.js.map +1 -0
  180. package/dist/types/bitcoin/constants.d.ts +19 -0
  181. package/dist/types/bitcoin/constants.d.ts.map +1 -0
  182. package/dist/types/bitcoin/errors.d.ts +5 -0
  183. package/dist/types/bitcoin/errors.d.ts.map +1 -0
  184. package/dist/types/bitcoin/index.d.ts +75 -0
  185. package/dist/types/bitcoin/index.d.ts.map +1 -0
  186. package/dist/types/bitcoin/interface.d.ts +86 -0
  187. package/dist/types/bitcoin/interface.d.ts.map +1 -0
  188. package/dist/types/bitcoin/network.d.ts +2 -0
  189. package/dist/types/bitcoin/network.d.ts.map +1 -0
  190. package/dist/types/bitcoin/rest-client.d.ts +268 -0
  191. package/dist/types/bitcoin/rest-client.d.ts.map +1 -0
  192. package/dist/types/bitcoin/rpc-client.d.ts +506 -0
  193. package/dist/types/bitcoin/rpc-client.d.ts.map +1 -0
  194. package/dist/types/bitcoin/taproot.d.ts +34 -0
  195. package/dist/types/bitcoin/taproot.d.ts.map +1 -0
  196. package/dist/types/btcr2/beacon/aggregation/coordinator.d.ts +74 -0
  197. package/dist/types/btcr2/beacon/aggregation/coordinator.d.ts.map +1 -0
  198. package/dist/types/btcr2/beacon/aggregation/messages/advert.d.ts +22 -0
  199. package/dist/types/btcr2/beacon/aggregation/messages/advert.d.ts.map +1 -0
  200. package/dist/types/btcr2/beacon/aggregation/messages/base.d.ts +36 -0
  201. package/dist/types/btcr2/beacon/aggregation/messages/base.d.ts.map +1 -0
  202. package/dist/types/btcr2/beacon/aggregation/messages/cohort-set.d.ts +23 -0
  203. package/dist/types/btcr2/beacon/aggregation/messages/cohort-set.d.ts.map +1 -0
  204. package/dist/types/btcr2/beacon/aggregation/messages/keygen.d.ts +6 -0
  205. package/dist/types/btcr2/beacon/aggregation/messages/keygen.d.ts.map +1 -0
  206. package/dist/types/btcr2/beacon/aggregation/messages/opt-in.d.ts +22 -0
  207. package/dist/types/btcr2/beacon/aggregation/messages/opt-in.d.ts.map +1 -0
  208. package/dist/types/btcr2/beacon/aggregation/messages/sign.d.ts +5 -0
  209. package/dist/types/btcr2/beacon/aggregation/messages/sign.d.ts.map +1 -0
  210. package/dist/types/btcr2/beacon/aggregation/models/cohort/index.d.ts +77 -0
  211. package/dist/types/btcr2/beacon/aggregation/models/cohort/index.d.ts.map +1 -0
  212. package/dist/types/btcr2/beacon/aggregation/models/cohort/status.d.ts +7 -0
  213. package/dist/types/btcr2/beacon/aggregation/models/cohort/status.d.ts.map +1 -0
  214. package/dist/types/btcr2/beacon/aggregation/participant.d.ts +1 -0
  215. package/dist/types/btcr2/beacon/aggregation/participant.d.ts.map +1 -0
  216. package/dist/types/btcr2/beacon/aggregation/protocol/nostr.d.ts +36 -0
  217. package/dist/types/btcr2/beacon/aggregation/protocol/nostr.d.ts.map +1 -0
  218. package/dist/types/btcr2/beacon/aggregation/protocol/service.d.ts +6 -0
  219. package/dist/types/btcr2/beacon/aggregation/protocol/service.d.ts.map +1 -0
  220. package/dist/types/btcr2/beacon/cid-aggregate.d.ts +103 -0
  221. package/dist/types/btcr2/beacon/cid-aggregate.d.ts.map +1 -0
  222. package/dist/types/btcr2/beacon/factory.d.ts +17 -0
  223. package/dist/types/btcr2/beacon/factory.d.ts.map +1 -0
  224. package/dist/types/btcr2/beacon/singleton.d.ts +93 -0
  225. package/dist/types/btcr2/beacon/singleton.d.ts.map +1 -0
  226. package/dist/types/btcr2/beacon/smt-aggregate.d.ts +112 -0
  227. package/dist/types/btcr2/beacon/smt-aggregate.d.ts.map +1 -0
  228. package/dist/types/btcr2/crud/create.d.ts +92 -0
  229. package/dist/types/btcr2/crud/create.d.ts.map +1 -0
  230. package/dist/types/btcr2/crud/deactivate.d.ts +13 -0
  231. package/dist/types/btcr2/crud/deactivate.d.ts.map +1 -0
  232. package/dist/types/btcr2/crud/read.d.ts +341 -0
  233. package/dist/types/btcr2/crud/read.d.ts.map +1 -0
  234. package/dist/types/btcr2/crud/update.d.ts +83 -0
  235. package/dist/types/btcr2/crud/update.d.ts.map +1 -0
  236. package/dist/types/btcr2/key-manager/index.d.ts +145 -0
  237. package/dist/types/btcr2/key-manager/index.d.ts.map +1 -0
  238. package/dist/types/btcr2/key-manager/interface.d.ts +113 -0
  239. package/dist/types/btcr2/key-manager/interface.d.ts.map +1 -0
  240. package/dist/types/did-btcr2.d.ts +117 -0
  241. package/dist/types/did-btcr2.d.ts.map +1 -0
  242. package/dist/types/index.d.ts +26 -0
  243. package/dist/types/index.d.ts.map +1 -0
  244. package/dist/types/interfaces/beacon.d.ts +57 -0
  245. package/dist/types/interfaces/beacon.d.ts.map +1 -0
  246. package/dist/types/interfaces/crud.d.ts +35 -0
  247. package/dist/types/interfaces/crud.d.ts.map +1 -0
  248. package/dist/types/interfaces/ibeacon.d.ts +66 -0
  249. package/dist/types/interfaces/ibeacon.d.ts.map +1 -0
  250. package/dist/types/types/bitcoin.d.ts +827 -0
  251. package/dist/types/types/bitcoin.d.ts.map +1 -0
  252. package/dist/types/types/crud.d.ts +38 -0
  253. package/dist/types/types/crud.d.ts.map +1 -0
  254. package/dist/types/utils/appendix.d.ts +118 -0
  255. package/dist/types/utils/appendix.d.ts.map +1 -0
  256. package/dist/types/utils/beacons.d.ts +156 -0
  257. package/dist/types/utils/beacons.d.ts.map +1 -0
  258. package/dist/types/utils/did-document-builder.d.ts +13 -0
  259. package/dist/types/utils/did-document-builder.d.ts.map +1 -0
  260. package/dist/types/utils/did-document.d.ts +211 -0
  261. package/dist/types/utils/did-document.d.ts.map +1 -0
  262. package/dist/types/utils/general.d.ts +85 -0
  263. package/dist/types/utils/general.d.ts.map +1 -0
  264. package/dist/types/utils/identifier.d.ts +59 -0
  265. package/dist/types/utils/identifier.d.ts.map +1 -0
  266. package/package.json +137 -0
  267. package/src/bitcoin/constants.ts +19 -0
  268. package/src/bitcoin/errors.ts +10 -0
  269. package/src/bitcoin/index.ts +154 -0
  270. package/src/bitcoin/interface.ts +160 -0
  271. package/src/bitcoin/network.ts +17 -0
  272. package/src/bitcoin/rest-client.ts +415 -0
  273. package/src/bitcoin/rpc-client.ts +888 -0
  274. package/src/bitcoin/taproot.ts +237 -0
  275. package/src/btcr2/beacon/aggregation/coordinator.ts +135 -0
  276. package/src/btcr2/beacon/aggregation/messages/advert.ts +36 -0
  277. package/src/btcr2/beacon/aggregation/messages/base.ts +59 -0
  278. package/src/btcr2/beacon/aggregation/messages/cohort-set.ts +37 -0
  279. package/src/btcr2/beacon/aggregation/messages/keygen.ts +8 -0
  280. package/src/btcr2/beacon/aggregation/messages/opt-in.ts +35 -0
  281. package/src/btcr2/beacon/aggregation/messages/sign.ts +7 -0
  282. package/src/btcr2/beacon/aggregation/models/cohort/index.ts +112 -0
  283. package/src/btcr2/beacon/aggregation/models/cohort/status.ts +7 -0
  284. package/src/btcr2/beacon/aggregation/participant.ts +0 -0
  285. package/src/btcr2/beacon/aggregation/protocol/nostr.ts +81 -0
  286. package/src/btcr2/beacon/aggregation/protocol/service.ts +6 -0
  287. package/src/btcr2/beacon/cid-aggregate.ts +154 -0
  288. package/src/btcr2/beacon/factory.ts +36 -0
  289. package/src/btcr2/beacon/singleton.ts +257 -0
  290. package/src/btcr2/beacon/smt-aggregate.ts +136 -0
  291. package/src/btcr2/crud/create.ts +160 -0
  292. package/src/btcr2/crud/deactivate.ts +13 -0
  293. package/src/btcr2/crud/read.ts +946 -0
  294. package/src/btcr2/crud/update.ts +277 -0
  295. package/src/btcr2/key-manager/index.ts +364 -0
  296. package/src/btcr2/key-manager/interface.ts +129 -0
  297. package/src/canonicalize.d.ts +6 -0
  298. package/src/did-btcr2.ts +288 -0
  299. package/src/index.ts +34 -0
  300. package/src/interfaces/beacon.ts +68 -0
  301. package/src/interfaces/crud.ts +36 -0
  302. package/src/interfaces/ibeacon.ts +76 -0
  303. package/src/types/bitcoin.ts +1028 -0
  304. package/src/types/crud.ts +41 -0
  305. package/src/utils/appendix.ts +257 -0
  306. package/src/utils/beacons.ts +276 -0
  307. package/src/utils/did-document-builder.ts +73 -0
  308. package/src/utils/did-document.ts +474 -0
  309. package/src/utils/general.ts +204 -0
  310. package/src/utils/identifier.ts +276 -0
@@ -0,0 +1,276 @@
1
+ import { BitcoinNetworkNames, Btcr2Error, Btcr2IdentifierTypes, Bytes, INVALID_DID, METHOD_NOT_SUPPORTED } from '@did-btcr2/common';
2
+ import { PublicKey, SchnorrKeyPair } from '@did-btcr2/keypair';
3
+ import { bech32m } from '@scure/base';
4
+ import { DidComponents } from './appendix.js';
5
+
6
+ /**
7
+ * Implements {@link https://dcdpr.github.io/did-btcr2/#syntax | 3 Syntax}.
8
+ * A did:btcr2 DID consists of a did:btcr2 prefix, followed by an id-bech32 value, which is a Bech32m encoding of:
9
+ * - the specification version;
10
+ * - the Bitcoin network identifier; and
11
+ * - either:
12
+ * - a key-value representing a secp256k1 public key; or
13
+ * - a hash-value representing the hash of an initiating external DID document.
14
+ * @class Btc1Identifier
15
+ * @type {Btc1Identifier}
16
+ */
17
+ export class Btc1Identifier {
18
+ /**
19
+ * Implements {@link https://dcdpr.github.io/did-btcr2/#didbtc1-identifier-encoding | 3.2 did:btcr2 Identifier Encoding}.
20
+ *
21
+ * A did:btcr2 DID consists of a did:btcr2 prefix, followed by an id-bech32 value, which is a Bech32m encoding of:
22
+ * - the specification version;
23
+ * - the Bitcoin network identifier; and
24
+ * - either:
25
+ * - a key-value representing a secp256k1 public key; or
26
+ * - a hash-value representing the hash of an initiating external DID document.
27
+ *
28
+ * @param {CreateIdentifierParams} params See {@link CreateIdentifierParams} for details.
29
+ * @param {Btcr2IdentifierTypes} params.idType Identifier type (key or external).
30
+ * @param {string} params.network Bitcoin network name.
31
+ * @param {number} params.version Identifier version.
32
+ * @param {KeyBytes | DocumentBytes} params.genesisBytes Public key or an intermediate document bytes.
33
+ * @returns {string} The new did:btcr2 identifier.
34
+ */
35
+ public static encode({ idType, version, network, genesisBytes }: {
36
+ idType: string;
37
+ version: number;
38
+ network: string | number;
39
+ genesisBytes: Bytes;
40
+ }): string {
41
+ // 1. If idType is not a valid value per above, raise invalidDid error.
42
+ if (!(idType in Btcr2IdentifierTypes)) {
43
+ throw new Btcr2Error('Expected "idType" to be "KEY" or "EXTERNAL"', INVALID_DID, {idType});
44
+ }
45
+
46
+ // 2. If version is greater than 1, raise invalidDid error.
47
+ if (isNaN(version) || version > 1) {
48
+ throw new Btcr2Error('Expected "version" to be 1', INVALID_DID, {version});
49
+ }
50
+
51
+ // 3. If network is not a valid value (bitcoin|signet|regtest|testnet3|testnet4|number), raise invalidDid error.
52
+ if (typeof network === 'string' && !(network in BitcoinNetworkNames)) {
53
+ throw new Btcr2Error('Invalid "network" name', INVALID_DID, {network});
54
+ }
55
+
56
+ // 4. If network is a number and is outside the range of 1-8, raise invalidDid error.
57
+ if(typeof network === 'number' && (network < 0 || network > 8)) {
58
+ throw new Btcr2Error('Invalid "network" number', INVALID_DID, {network});
59
+ }
60
+
61
+ // 5. If idType is “key” and genesisBytes is not a valid compressed secp256k1 public key, raise invalidDid error.
62
+ if (idType === 'KEY') {
63
+ try {
64
+ new PublicKey(genesisBytes);
65
+ } catch {
66
+ throw new Btcr2Error(
67
+ 'Expected "genesisBytes" to be a valid compressed secp256k1 public key',
68
+ INVALID_DID, { genesisBytes }
69
+ );
70
+ }
71
+ }
72
+
73
+ // 6. Map idType to hrp from the following:
74
+ // 6.1 “key” - “k”
75
+ // 6.2 “external” - “x”
76
+ const hrp = idType === 'KEY' ? 'k' : 'x';
77
+
78
+ // 7. Create an empty nibbles numeric array.
79
+ const nibbles: Array<number> = [];
80
+
81
+ // 8. Set fCount equal to (version - 1) / 15, rounded down.
82
+ const fCount = Math.floor((version - 1) / 15);
83
+
84
+ // 9. Append hexadecimal F (decimal 15) to nibbles fCount times.
85
+ for (let i = 0; i < fCount; i++) {
86
+ nibbles.push(15);
87
+ }
88
+
89
+ // 10. Append (version - 1) mod 15 to nibbles.
90
+ nibbles.push((version - 1) % 15);
91
+
92
+ // 11. If network is a string, append the numeric value from the following map to nibbles:
93
+ // "bitcoin" - 0
94
+ // "signet" - 1
95
+ // "regtest" - 2
96
+ // "testnet3" - 3
97
+ // "testnet4" - 4
98
+ // "mutinynet" - 5
99
+ if(typeof network === 'string') {
100
+ nibbles.push(BitcoinNetworkNames[network as keyof typeof BitcoinNetworkNames]);
101
+ } else if (typeof network === 'number') {
102
+ // 12. If network is a number, append network + 11 to nibbles.
103
+ nibbles.push(network + 11);
104
+ }
105
+
106
+ // 13. If the number of entries in nibbles is odd, append 0.
107
+ if (nibbles.length % 2 !== 0) {
108
+ nibbles.push(0);
109
+ }
110
+
111
+ // 14. Create a dataBytes byte array from nibbles, where index is from 0 to nibbles.length / 2 - 1 and
112
+ // encodingBytes[index] = (nibbles[2 * index] << 4) | nibbles[2 * index + 1].
113
+ if (fCount !== 0){
114
+ for(let index in Array.from({ length: (nibbles.length / 2) - 1 })) {
115
+ throw new Btcr2Error('Not implemented', 'NOT_IMPLEMENTED', { index });
116
+ }
117
+ }
118
+ const dataBytes = new Uint8Array([(nibbles[2 * 0] << 4) | nibbles[2 * 0 + 1], ...genesisBytes]);
119
+
120
+ // 15. Set identifier to “did:btcr2:”.
121
+ // 16. Pass hrp and dataBytes to the Bech32m Encoding algorithm, retrieving encodedString.
122
+ // 17. Append encodedString to identifier.
123
+ // 18. Return identifier.
124
+ return `did:btcr2:${bech32m.encodeFromBytes(hrp, dataBytes)}`;
125
+ }
126
+
127
+ /**
128
+ * Implements {@link https://dcdpr.github.io/did-btcr2/#didbtc1-identifier-decoding | 3.3 did:btcr2 Identifier Decoding}.
129
+ * @param {string} identifier The BTCR2 DID to be parsed
130
+ * @returns {DidComponents} The parsed identifier components. See {@link DidComponents} for details.
131
+ * @throws {DidError} if an error occurs while parsing the identifier
132
+ * @throws {DidErrorCode.InvalidDid} if identifier is invalid
133
+ * @throws {DidErrorCode.MethodNotSupported} if the method is not supported
134
+ */
135
+ public static decode(identifier: string): DidComponents {
136
+ // 1. Split identifier into an array of components at the colon : character.
137
+ const components = identifier.split(':');
138
+
139
+ // 2. If the length of the components array is not 3, raise invalidDid error.
140
+ if (components.length !== 3){
141
+ throw new Btcr2Error(`Invalid did: ${identifier}`, INVALID_DID, { identifier });
142
+ }
143
+
144
+ // Deconstruct the components of the identifier: scheme, method, encoded
145
+ const [scheme, method, encoded] = components;
146
+
147
+ // 3. If components[0] is not “did”, raise invalidDid error.
148
+ if (scheme !== 'did') {
149
+ throw new Btcr2Error(`Invalid did: ${identifier}`, INVALID_DID, { identifier });
150
+ }
151
+ // 4. If components[1] is not “btcr2”, raise methodNotSupported error.
152
+ if (method !== 'btcr2') {
153
+ throw new Btcr2Error(`Invalid did method: ${method}`, METHOD_NOT_SUPPORTED, { identifier });
154
+ }
155
+
156
+ // 5. Set encodedString to components[2].
157
+ if (!encoded) {
158
+ throw new Btcr2Error(`Invalid method-specific id: ${identifier}`, INVALID_DID, { identifier });
159
+ }
160
+ // 6. Pass encodedString to the Bech32m Decoding algorithm, retrieving hrp and dataBytes.
161
+ const {prefix: hrp, bytes: dataBytes} = bech32m.decodeToBytes(encoded);
162
+
163
+ // 7. If the Bech32m decoding algorithm fails, raise invalidDid error.
164
+ if (!['x', 'k'].includes(hrp)) {
165
+ throw new Btcr2Error(`Invalid hrp: ${hrp}`, INVALID_DID, { identifier });
166
+ }
167
+ if (!dataBytes) {
168
+ throw new Btcr2Error(`Failed to decode id: ${encoded}`, INVALID_DID, { identifier });
169
+ }
170
+
171
+ // 8. Map hrp to idType from the following:
172
+ // “k” - “key”
173
+ // “x” - “external”
174
+ // other - raise invalidDid error
175
+ const idType = hrp === 'k' ? 'KEY' : 'EXTERNAL';
176
+
177
+ // 9. Set version to 1.
178
+ let version = 1;
179
+ let byteIndex = 0;
180
+ // 10. If at any point in the remaining steps there are not enough nibbles to complete the process,
181
+ // raise invalidDid error.
182
+ let nibblesConsumed = 0;
183
+
184
+ // 11. Start with the first nibble (the higher nibble of the first byte) of dataBytes.
185
+ let currentByte = dataBytes[byteIndex];
186
+ let versionNibble = currentByte >>> 4;
187
+
188
+ // 12. Add the value of the current nibble to version.
189
+ while (versionNibble === 0xF) {
190
+ // 13. If the value of the nibble is hexadecimal F (decimal 15), advance to the next nibble (the lower nibble of
191
+ // the current byte or the higher nibble of the next byte) and return to the previous step.
192
+ version += 15;
193
+
194
+ if (nibblesConsumed % 2 === 0) {
195
+ versionNibble = currentByte & 0x0F;
196
+ } else {
197
+ currentByte = dataBytes[++byteIndex];
198
+ versionNibble = currentByte >>> 4;
199
+ }
200
+ nibblesConsumed += 1;
201
+ // 14. If version is greater than 1, raise invalidDid error.
202
+ if (version > 1) {
203
+ throw new Btcr2Error(`Invalid version: ${version}`, INVALID_DID, { identifier });
204
+ }
205
+ }
206
+
207
+ version += versionNibble;
208
+ nibblesConsumed += 1;
209
+
210
+ // 15. Advance to the next nibble and set networkValue to its value.
211
+ let networkValue: number = nibblesConsumed % 2 === 0
212
+ ? dataBytes[++byteIndex] >>> 4
213
+ : currentByte & 0x0F;
214
+
215
+ nibblesConsumed += 1;
216
+
217
+ // 16. Map networkValue to network from the following:
218
+ // 0 - "bitcoin"
219
+ // 1 - "signet"
220
+ // 2 - "regtest"
221
+ // 3 - "testnet3"
222
+ // 4 - "testnet4"
223
+ // 5 - "mutinynet"
224
+ // 6-7 - raise invalidDid error
225
+ // 8-F - networkValue - 11
226
+ let network: string | number | undefined = BitcoinNetworkNames[networkValue];
227
+ if (!network) {
228
+ if (networkValue >= 0x8 && networkValue <= 0xF) {
229
+ network = networkValue - 11;
230
+ } else {
231
+ throw new Btcr2Error(`Invalid did: ${identifier}`, INVALID_DID, { identifier });
232
+ }
233
+ }
234
+
235
+ // 17. If the number of nibbles consumed is odd:
236
+ if (nibblesConsumed % 2 === 1) {
237
+ // 17.1 Advance to the next nibble and set fillerNibble to its value.
238
+ const fillerNibble = currentByte & 0x0F;
239
+ // 17.2 If fillerNibble is not 0, raise invalidDid error.
240
+ if (fillerNibble !== 0) {
241
+ throw new Btcr2Error(`Invalid did: ${identifier}`, INVALID_DID, { identifier });
242
+ }
243
+ }
244
+
245
+ // 18. Set genesisBytes to the remaining dataBytes.
246
+ const genesisBytes = dataBytes.slice(byteIndex + 1);
247
+
248
+ // 19. If idType is “key” and genesisBytes is not a valid compressed secp256k1 public key, raise invalidDid error.
249
+ if (idType === 'KEY') {
250
+ try {
251
+ new PublicKey(genesisBytes);
252
+ } catch {
253
+ throw new Btcr2Error(`Invalid genesisBytes: ${genesisBytes}`, INVALID_DID, { identifier });
254
+ }
255
+ }
256
+
257
+ // 20. Return idType, version, network, and genesisBytes.
258
+ return {idType, hrp, version, network, genesisBytes} as DidComponents;
259
+ }
260
+
261
+ /**
262
+ * Generates a new did:btcr2 identifier based on a newly generated key pair.
263
+ * @returns {string} The new did:btcr2 identifier.
264
+ */
265
+ public static generate(): { keys: SchnorrKeyPair; identifier: { controller: string; id: string } } {
266
+ const keys = SchnorrKeyPair.generate();
267
+ const did = this.encode({
268
+ idType : Btcr2IdentifierTypes.KEY,
269
+ version : 1,
270
+ network : BitcoinNetworkNames.bitcoin,
271
+ genesisBytes : keys.publicKey.compressed
272
+ });
273
+
274
+ return { keys, identifier: { controller: did, id: '#initialKey'} };
275
+ }
276
+ }