@originals/sdk 1.1.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 (403) hide show
  1. package/.eslintrc.json +33 -0
  2. package/.turbo/turbo-build.log +1 -0
  3. package/.turbo/turbo-test.log +68353 -0
  4. package/dist/adapters/FeeOracleMock.d.ts +6 -0
  5. package/dist/adapters/FeeOracleMock.js +8 -0
  6. package/dist/adapters/index.d.ts +4 -0
  7. package/dist/adapters/index.js +4 -0
  8. package/dist/adapters/providers/OrdHttpProvider.d.ts +56 -0
  9. package/dist/adapters/providers/OrdHttpProvider.js +110 -0
  10. package/dist/adapters/providers/OrdMockProvider.d.ts +70 -0
  11. package/dist/adapters/providers/OrdMockProvider.js +75 -0
  12. package/dist/adapters/types.d.ts +71 -0
  13. package/dist/adapters/types.js +1 -0
  14. package/dist/bitcoin/BitcoinManager.d.ts +15 -0
  15. package/dist/bitcoin/BitcoinManager.js +262 -0
  16. package/dist/bitcoin/BroadcastClient.d.ts +30 -0
  17. package/dist/bitcoin/BroadcastClient.js +35 -0
  18. package/dist/bitcoin/OrdinalsClient.d.ts +21 -0
  19. package/dist/bitcoin/OrdinalsClient.js +105 -0
  20. package/dist/bitcoin/PSBTBuilder.d.ts +24 -0
  21. package/dist/bitcoin/PSBTBuilder.js +80 -0
  22. package/dist/bitcoin/fee-calculation.d.ts +14 -0
  23. package/dist/bitcoin/fee-calculation.js +31 -0
  24. package/dist/bitcoin/providers/OrdNodeProvider.d.ts +38 -0
  25. package/dist/bitcoin/providers/OrdNodeProvider.js +67 -0
  26. package/dist/bitcoin/providers/OrdinalsProvider.d.ts +33 -0
  27. package/dist/bitcoin/providers/OrdinalsProvider.js +50 -0
  28. package/dist/bitcoin/providers/types.d.ts +63 -0
  29. package/dist/bitcoin/providers/types.js +1 -0
  30. package/dist/bitcoin/transactions/commit.d.ts +89 -0
  31. package/dist/bitcoin/transactions/commit.js +311 -0
  32. package/dist/bitcoin/transactions/index.d.ts +7 -0
  33. package/dist/bitcoin/transactions/index.js +8 -0
  34. package/dist/bitcoin/transfer.d.ts +9 -0
  35. package/dist/bitcoin/transfer.js +26 -0
  36. package/dist/bitcoin/utxo-selection.d.ts +78 -0
  37. package/dist/bitcoin/utxo-selection.js +237 -0
  38. package/dist/bitcoin/utxo.d.ts +26 -0
  39. package/dist/bitcoin/utxo.js +78 -0
  40. package/dist/contexts/credentials-v1.json +195 -0
  41. package/dist/contexts/credentials-v2-examples.json +5 -0
  42. package/dist/contexts/credentials-v2.json +301 -0
  43. package/dist/contexts/credentials.json +195 -0
  44. package/dist/contexts/data-integrity-v2.json +81 -0
  45. package/dist/contexts/dids.json +57 -0
  46. package/dist/contexts/ed255192020.json +93 -0
  47. package/dist/contexts/ordinals-plus.json +23 -0
  48. package/dist/contexts/originals.json +22 -0
  49. package/dist/core/OriginalsSDK.d.ts +158 -0
  50. package/dist/core/OriginalsSDK.js +274 -0
  51. package/dist/crypto/Multikey.d.ts +30 -0
  52. package/dist/crypto/Multikey.js +149 -0
  53. package/dist/crypto/Signer.d.ts +21 -0
  54. package/dist/crypto/Signer.js +196 -0
  55. package/dist/crypto/noble-init.d.ts +18 -0
  56. package/dist/crypto/noble-init.js +106 -0
  57. package/dist/did/BtcoDidResolver.d.ts +57 -0
  58. package/dist/did/BtcoDidResolver.js +166 -0
  59. package/dist/did/DIDManager.d.ts +101 -0
  60. package/dist/did/DIDManager.js +493 -0
  61. package/dist/did/Ed25519Verifier.d.ts +30 -0
  62. package/dist/did/Ed25519Verifier.js +59 -0
  63. package/dist/did/KeyManager.d.ts +17 -0
  64. package/dist/did/KeyManager.js +207 -0
  65. package/dist/did/WebVHManager.d.ts +100 -0
  66. package/dist/did/WebVHManager.js +304 -0
  67. package/dist/did/createBtcoDidDocument.d.ts +10 -0
  68. package/dist/did/createBtcoDidDocument.js +42 -0
  69. package/dist/did/providers/OrdinalsClientProviderAdapter.d.ts +23 -0
  70. package/dist/did/providers/OrdinalsClientProviderAdapter.js +51 -0
  71. package/dist/events/EventEmitter.d.ts +115 -0
  72. package/dist/events/EventEmitter.js +198 -0
  73. package/dist/events/index.d.ts +7 -0
  74. package/dist/events/index.js +6 -0
  75. package/dist/events/types.d.ts +286 -0
  76. package/dist/events/types.js +9 -0
  77. package/dist/examples/basic-usage.d.ts +3 -0
  78. package/dist/examples/basic-usage.js +62 -0
  79. package/dist/examples/run.d.ts +1 -0
  80. package/dist/examples/run.js +4 -0
  81. package/dist/index.d.ts +39 -0
  82. package/dist/index.js +47 -0
  83. package/dist/lifecycle/BatchOperations.d.ts +147 -0
  84. package/dist/lifecycle/BatchOperations.js +251 -0
  85. package/dist/lifecycle/LifecycleManager.d.ts +116 -0
  86. package/dist/lifecycle/LifecycleManager.js +971 -0
  87. package/dist/lifecycle/OriginalsAsset.d.ts +164 -0
  88. package/dist/lifecycle/OriginalsAsset.js +380 -0
  89. package/dist/lifecycle/ProvenanceQuery.d.ts +126 -0
  90. package/dist/lifecycle/ProvenanceQuery.js +220 -0
  91. package/dist/lifecycle/ResourceVersioning.d.ts +73 -0
  92. package/dist/lifecycle/ResourceVersioning.js +127 -0
  93. package/dist/migration/MigrationManager.d.ts +86 -0
  94. package/dist/migration/MigrationManager.js +412 -0
  95. package/dist/migration/audit/AuditLogger.d.ts +51 -0
  96. package/dist/migration/audit/AuditLogger.js +156 -0
  97. package/dist/migration/checkpoint/CheckpointManager.d.ts +31 -0
  98. package/dist/migration/checkpoint/CheckpointManager.js +96 -0
  99. package/dist/migration/checkpoint/CheckpointStorage.d.ts +26 -0
  100. package/dist/migration/checkpoint/CheckpointStorage.js +89 -0
  101. package/dist/migration/index.d.ts +22 -0
  102. package/dist/migration/index.js +27 -0
  103. package/dist/migration/operations/BaseMigration.d.ts +48 -0
  104. package/dist/migration/operations/BaseMigration.js +83 -0
  105. package/dist/migration/operations/PeerToBtcoMigration.d.ts +25 -0
  106. package/dist/migration/operations/PeerToBtcoMigration.js +67 -0
  107. package/dist/migration/operations/PeerToWebvhMigration.d.ts +19 -0
  108. package/dist/migration/operations/PeerToWebvhMigration.js +46 -0
  109. package/dist/migration/operations/WebvhToBtcoMigration.d.ts +25 -0
  110. package/dist/migration/operations/WebvhToBtcoMigration.js +67 -0
  111. package/dist/migration/rollback/RollbackManager.d.ts +29 -0
  112. package/dist/migration/rollback/RollbackManager.js +146 -0
  113. package/dist/migration/state/StateMachine.d.ts +25 -0
  114. package/dist/migration/state/StateMachine.js +76 -0
  115. package/dist/migration/state/StateTracker.d.ts +36 -0
  116. package/dist/migration/state/StateTracker.js +123 -0
  117. package/dist/migration/types.d.ts +306 -0
  118. package/dist/migration/types.js +33 -0
  119. package/dist/migration/validation/BitcoinValidator.d.ts +13 -0
  120. package/dist/migration/validation/BitcoinValidator.js +83 -0
  121. package/dist/migration/validation/CredentialValidator.d.ts +13 -0
  122. package/dist/migration/validation/CredentialValidator.js +46 -0
  123. package/dist/migration/validation/DIDCompatibilityValidator.d.ts +16 -0
  124. package/dist/migration/validation/DIDCompatibilityValidator.js +127 -0
  125. package/dist/migration/validation/LifecycleValidator.d.ts +10 -0
  126. package/dist/migration/validation/LifecycleValidator.js +52 -0
  127. package/dist/migration/validation/StorageValidator.d.ts +10 -0
  128. package/dist/migration/validation/StorageValidator.js +65 -0
  129. package/dist/migration/validation/ValidationPipeline.d.ts +29 -0
  130. package/dist/migration/validation/ValidationPipeline.js +180 -0
  131. package/dist/storage/LocalStorageAdapter.d.ts +11 -0
  132. package/dist/storage/LocalStorageAdapter.js +53 -0
  133. package/dist/storage/MemoryStorageAdapter.d.ts +6 -0
  134. package/dist/storage/MemoryStorageAdapter.js +21 -0
  135. package/dist/storage/StorageAdapter.d.ts +16 -0
  136. package/dist/storage/StorageAdapter.js +1 -0
  137. package/dist/storage/index.d.ts +2 -0
  138. package/dist/storage/index.js +2 -0
  139. package/dist/types/bitcoin.d.ts +84 -0
  140. package/dist/types/bitcoin.js +1 -0
  141. package/dist/types/common.d.ts +82 -0
  142. package/dist/types/common.js +1 -0
  143. package/dist/types/credentials.d.ts +75 -0
  144. package/dist/types/credentials.js +1 -0
  145. package/dist/types/did.d.ts +26 -0
  146. package/dist/types/did.js +1 -0
  147. package/dist/types/index.d.ts +5 -0
  148. package/dist/types/index.js +5 -0
  149. package/dist/types/network.d.ts +78 -0
  150. package/dist/types/network.js +145 -0
  151. package/dist/utils/EventLogger.d.ts +71 -0
  152. package/dist/utils/EventLogger.js +232 -0
  153. package/dist/utils/Logger.d.ts +106 -0
  154. package/dist/utils/Logger.js +257 -0
  155. package/dist/utils/MetricsCollector.d.ts +110 -0
  156. package/dist/utils/MetricsCollector.js +264 -0
  157. package/dist/utils/bitcoin-address.d.ts +38 -0
  158. package/dist/utils/bitcoin-address.js +113 -0
  159. package/dist/utils/cbor.d.ts +2 -0
  160. package/dist/utils/cbor.js +9 -0
  161. package/dist/utils/encoding.d.ts +37 -0
  162. package/dist/utils/encoding.js +120 -0
  163. package/dist/utils/hash.d.ts +1 -0
  164. package/dist/utils/hash.js +5 -0
  165. package/dist/utils/retry.d.ts +10 -0
  166. package/dist/utils/retry.js +35 -0
  167. package/dist/utils/satoshi-validation.d.ts +60 -0
  168. package/dist/utils/satoshi-validation.js +156 -0
  169. package/dist/utils/serialization.d.ts +14 -0
  170. package/dist/utils/serialization.js +76 -0
  171. package/dist/utils/telemetry.d.ts +17 -0
  172. package/dist/utils/telemetry.js +24 -0
  173. package/dist/utils/validation.d.ts +5 -0
  174. package/dist/utils/validation.js +98 -0
  175. package/dist/vc/CredentialManager.d.ts +22 -0
  176. package/dist/vc/CredentialManager.js +227 -0
  177. package/dist/vc/Issuer.d.ts +27 -0
  178. package/dist/vc/Issuer.js +70 -0
  179. package/dist/vc/Verifier.d.ts +16 -0
  180. package/dist/vc/Verifier.js +50 -0
  181. package/dist/vc/cryptosuites/bbs.d.ts +44 -0
  182. package/dist/vc/cryptosuites/bbs.js +213 -0
  183. package/dist/vc/cryptosuites/bbsSimple.d.ts +9 -0
  184. package/dist/vc/cryptosuites/bbsSimple.js +12 -0
  185. package/dist/vc/cryptosuites/eddsa.d.ts +30 -0
  186. package/dist/vc/cryptosuites/eddsa.js +81 -0
  187. package/dist/vc/documentLoader.d.ts +16 -0
  188. package/dist/vc/documentLoader.js +59 -0
  189. package/dist/vc/proofs/data-integrity.d.ts +21 -0
  190. package/dist/vc/proofs/data-integrity.js +15 -0
  191. package/dist/vc/utils/jsonld.d.ts +2 -0
  192. package/dist/vc/utils/jsonld.js +15 -0
  193. package/package.json +79 -0
  194. package/src/adapters/FeeOracleMock.ts +9 -0
  195. package/src/adapters/index.ts +5 -0
  196. package/src/adapters/providers/OrdHttpProvider.ts +126 -0
  197. package/src/adapters/providers/OrdMockProvider.ts +101 -0
  198. package/src/adapters/types.ts +66 -0
  199. package/src/bitcoin/BitcoinManager.ts +330 -0
  200. package/src/bitcoin/BroadcastClient.ts +54 -0
  201. package/src/bitcoin/OrdinalsClient.ts +119 -0
  202. package/src/bitcoin/PSBTBuilder.ts +106 -0
  203. package/src/bitcoin/fee-calculation.ts +38 -0
  204. package/src/bitcoin/providers/OrdNodeProvider.ts +92 -0
  205. package/src/bitcoin/providers/OrdinalsProvider.ts +56 -0
  206. package/src/bitcoin/providers/types.ts +59 -0
  207. package/src/bitcoin/transactions/commit.ts +465 -0
  208. package/src/bitcoin/transactions/index.ts +13 -0
  209. package/src/bitcoin/transfer.ts +43 -0
  210. package/src/bitcoin/utxo-selection.ts +322 -0
  211. package/src/bitcoin/utxo.ts +113 -0
  212. package/src/contexts/credentials-v1.json +237 -0
  213. package/src/contexts/credentials-v2-examples.json +5 -0
  214. package/src/contexts/credentials-v2.json +340 -0
  215. package/src/contexts/credentials.json +237 -0
  216. package/src/contexts/data-integrity-v2.json +81 -0
  217. package/src/contexts/dids.json +58 -0
  218. package/src/contexts/ed255192020.json +93 -0
  219. package/src/contexts/ordinals-plus.json +23 -0
  220. package/src/contexts/originals.json +22 -0
  221. package/src/core/OriginalsSDK.ts +416 -0
  222. package/src/crypto/Multikey.ts +194 -0
  223. package/src/crypto/Signer.ts +254 -0
  224. package/src/crypto/noble-init.ts +121 -0
  225. package/src/did/BtcoDidResolver.ts +227 -0
  226. package/src/did/DIDManager.ts +694 -0
  227. package/src/did/Ed25519Verifier.ts +68 -0
  228. package/src/did/KeyManager.ts +236 -0
  229. package/src/did/WebVHManager.ts +489 -0
  230. package/src/did/createBtcoDidDocument.ts +59 -0
  231. package/src/did/providers/OrdinalsClientProviderAdapter.ts +68 -0
  232. package/src/events/EventEmitter.ts +222 -0
  233. package/src/events/index.ts +19 -0
  234. package/src/events/types.ts +331 -0
  235. package/src/examples/basic-usage.ts +78 -0
  236. package/src/examples/run.ts +5 -0
  237. package/src/index.ts +84 -0
  238. package/src/lifecycle/BatchOperations.ts +373 -0
  239. package/src/lifecycle/LifecycleManager.ts +1218 -0
  240. package/src/lifecycle/OriginalsAsset.ts +524 -0
  241. package/src/lifecycle/ProvenanceQuery.ts +280 -0
  242. package/src/lifecycle/ResourceVersioning.ts +163 -0
  243. package/src/migration/MigrationManager.ts +527 -0
  244. package/src/migration/audit/AuditLogger.ts +176 -0
  245. package/src/migration/checkpoint/CheckpointManager.ts +112 -0
  246. package/src/migration/checkpoint/CheckpointStorage.ts +101 -0
  247. package/src/migration/index.ts +33 -0
  248. package/src/migration/operations/BaseMigration.ts +126 -0
  249. package/src/migration/operations/PeerToBtcoMigration.ts +105 -0
  250. package/src/migration/operations/PeerToWebvhMigration.ts +62 -0
  251. package/src/migration/operations/WebvhToBtcoMigration.ts +105 -0
  252. package/src/migration/rollback/RollbackManager.ts +170 -0
  253. package/src/migration/state/StateMachine.ts +92 -0
  254. package/src/migration/state/StateTracker.ts +156 -0
  255. package/src/migration/types.ts +344 -0
  256. package/src/migration/validation/BitcoinValidator.ts +107 -0
  257. package/src/migration/validation/CredentialValidator.ts +62 -0
  258. package/src/migration/validation/DIDCompatibilityValidator.ts +151 -0
  259. package/src/migration/validation/LifecycleValidator.ts +64 -0
  260. package/src/migration/validation/StorageValidator.ts +79 -0
  261. package/src/migration/validation/ValidationPipeline.ts +213 -0
  262. package/src/storage/LocalStorageAdapter.ts +61 -0
  263. package/src/storage/MemoryStorageAdapter.ts +29 -0
  264. package/src/storage/StorageAdapter.ts +25 -0
  265. package/src/storage/index.ts +3 -0
  266. package/src/types/bitcoin.ts +98 -0
  267. package/src/types/common.ts +92 -0
  268. package/src/types/credentials.ts +88 -0
  269. package/src/types/did.ts +31 -0
  270. package/src/types/external-shims.d.ts +53 -0
  271. package/src/types/index.ts +7 -0
  272. package/src/types/network.ts +175 -0
  273. package/src/utils/EventLogger.ts +298 -0
  274. package/src/utils/Logger.ts +322 -0
  275. package/src/utils/MetricsCollector.ts +358 -0
  276. package/src/utils/bitcoin-address.ts +130 -0
  277. package/src/utils/cbor.ts +12 -0
  278. package/src/utils/encoding.ts +127 -0
  279. package/src/utils/hash.ts +6 -0
  280. package/src/utils/retry.ts +46 -0
  281. package/src/utils/satoshi-validation.ts +196 -0
  282. package/src/utils/serialization.ts +96 -0
  283. package/src/utils/telemetry.ts +40 -0
  284. package/src/utils/validation.ts +119 -0
  285. package/src/vc/CredentialManager.ts +273 -0
  286. package/src/vc/Issuer.ts +100 -0
  287. package/src/vc/Verifier.ts +47 -0
  288. package/src/vc/cryptosuites/bbs.ts +253 -0
  289. package/src/vc/cryptosuites/bbsSimple.ts +21 -0
  290. package/src/vc/cryptosuites/eddsa.ts +99 -0
  291. package/src/vc/documentLoader.ts +67 -0
  292. package/src/vc/proofs/data-integrity.ts +33 -0
  293. package/src/vc/utils/jsonld.ts +18 -0
  294. package/test/logs/did_webvh_QmQsRNhXxPSCSeLjpbKYcNMZj8b1kBQAoC6cZmkFAgmpHt_example_com.jsonl +1 -0
  295. package/test/logs/did_webvh_QmSQkpD58qxcqMWHYcEmDUn3wk7hHvJwzYTrZmhh6zjPQ8_example_com_users_alice123_profile.jsonl +1 -0
  296. package/test/logs/did_webvh_QmTMda6VW3cUPdKk5Yc3onnv1vdgEumvWWdP2noAYFSjeG_example_com.jsonl +1 -0
  297. package/test/logs/did_webvh_QmTkb8KnCYcsnKKDCY4eUQuKQdKJLrCinvhw13v3zETxpE_example_com_users_etc_passwd.jsonl +1 -0
  298. package/test/logs/did_webvh_QmTn9FdCfpXFDrxHH52pwB4iNrDFVvNDjJ5FQTcDbmM3Fg_example_com.jsonl +1 -0
  299. package/test/logs/did_webvh_QmUCQUi1xjtJjnSQ1XJZgKqcWgErx1v7E2dz4DAPraAyJP_example_com_etc_passwd.jsonl +1 -0
  300. package/test/logs/did_webvh_QmUENQJCDKBJVRS5BkL6zjaUvcRjkb9xHmy7foCgRjmv3W_example_com.jsonl +1 -0
  301. package/test/logs/did_webvh_QmUPdGyjYBEnQ3aQUkmqyyBKTyjvCP5RZQGiaEDeTtf6dc_example_com.jsonl +1 -0
  302. package/test/logs/did_webvh_QmUoHTuHMWzQM29ZFrE9VLtMxkZ5u869yqee8LwcCLN39M_example_com.jsonl +1 -0
  303. package/test/logs/did_webvh_QmUrnms8G65ggVKsr9oQeWrLUBuGChwQPPb2LCFvaoNxaw_example_com_users_alice.jsonl +1 -0
  304. package/test/logs/did_webvh_QmUwiw3eSXdHG1hPvoAGu3cuK5jF4aXRYDLBAjPXfv1qzb_example_com_level1_level2.jsonl +1 -0
  305. package/test/logs/did_webvh_QmW7bzKh6yFEKNAtmVsrPGvvsMHTUQdzJSNsTZkbuGFpbj_example_com_secret.jsonl +1 -0
  306. package/test/logs/did_webvh_QmXbFTFBBJ8zpjdz9WE1DNN44A2wprFmdvAubjSffeyoAG_example_com.jsonl +1 -0
  307. package/test/logs/did_webvh_QmXyVXFPCTffGb2mTUFDeMCsScjnpLWkyUkVkB6q6QoeBf_example_com_C_Windows_System32.jsonl +1 -0
  308. package/test/logs/did_webvh_QmZK9B81gxZtvo5fYHYKDtKt8zZfZZPhmCMhbujBJuRRzE_example_com_etc_passwd.jsonl +1 -0
  309. package/test/logs/did_webvh_QmbNLCVSdXSVLrwFBvCBQPAabjtRb1SGHjkGVyw3QUbfBL_example_com_users_etc_passwd.jsonl +1 -0
  310. package/test/logs/did_webvh_QmbeaicmGW3Q7Yzbqmftc8a9jLBngokveb5A2KVKfVGZRb_example_com_my_org_user_name_test_123.jsonl +1 -0
  311. package/test/logs/did_webvh_Qmdv7c7AjUreUfoKyvkN2UpAWTozxKsv99srQetPJMJEnp_example_com_users_etc_passwd.jsonl +1 -0
  312. package/test/logs/did_webvh_QmeioWY3uypYLkYpCXe9eCYnn4xBVruP9C1d79azMrTEHG_example_com.jsonl +1 -0
  313. package/test/logs/did_webvh_Qmf4QH5dsA6Ecr5HJ6KaJL9uJRyY8RxrQdqoRCM25DzvPi_example_com_users_alice.jsonl +1 -0
  314. package/tests/__mocks__/bbs-signatures.js +17 -0
  315. package/tests/__mocks__/mf-base58.js +24 -0
  316. package/tests/e2e/README.md +97 -0
  317. package/tests/e2e/example.spec.ts +78 -0
  318. package/tests/fixtures/did-documents.ts +247 -0
  319. package/tests/index.test.ts +21 -0
  320. package/tests/integration/BatchOperations.test.ts +531 -0
  321. package/tests/integration/CompleteLifecycle.e2e.test.ts +735 -0
  322. package/tests/integration/CredentialManager.test.ts +42 -0
  323. package/tests/integration/DIDManager.test.ts +41 -0
  324. package/tests/integration/DidPeerToWebVhFlow.test.ts +351 -0
  325. package/tests/integration/Events.test.ts +435 -0
  326. package/tests/integration/Lifecycle.transfer.btco.integration.test.ts +25 -0
  327. package/tests/integration/LifecycleManager.test.ts +21 -0
  328. package/tests/integration/MultikeyFlow.test.ts +52 -0
  329. package/tests/integration/TelemetryIntegration.test.ts +395 -0
  330. package/tests/integration/WebVhPublish.test.ts +48 -0
  331. package/tests/integration/migration/peer-to-webvh.test.ts +172 -0
  332. package/tests/manual/test-commit-creation.ts +323 -0
  333. package/tests/mocks/MockKeyStore.ts +38 -0
  334. package/tests/mocks/adapters/MemoryStorageAdapter.ts +24 -0
  335. package/tests/mocks/adapters/MockFeeOracle.ts +11 -0
  336. package/tests/mocks/adapters/MockOrdinalsProvider.ts +76 -0
  337. package/tests/mocks/adapters/OrdMockProvider.test.ts +176 -0
  338. package/tests/mocks/adapters/index.ts +6 -0
  339. package/tests/performance/BatchOperations.perf.test.ts +403 -0
  340. package/tests/performance/logging.perf.test.ts +336 -0
  341. package/tests/sdk.test.ts +43 -0
  342. package/tests/security/bitcoin-penetration-tests.test.ts +622 -0
  343. package/tests/setup.bun.ts +69 -0
  344. package/tests/setup.jest.ts +23 -0
  345. package/tests/stress/batch-operations-stress.test.ts +571 -0
  346. package/tests/unit/adapters/FeeOracleMock.test.ts +40 -0
  347. package/tests/unit/bitcoin/BitcoinManager.test.ts +293 -0
  348. package/tests/unit/bitcoin/BroadcastClient.test.ts +52 -0
  349. package/tests/unit/bitcoin/OrdNodeProvider.test.ts +53 -0
  350. package/tests/unit/bitcoin/OrdinalsClient.test.ts +381 -0
  351. package/tests/unit/bitcoin/OrdinalsClientProvider.test.ts +102 -0
  352. package/tests/unit/bitcoin/PSBTBuilder.test.ts +84 -0
  353. package/tests/unit/bitcoin/fee-calculation.test.ts +261 -0
  354. package/tests/unit/bitcoin/transactions/commit.test.ts +649 -0
  355. package/tests/unit/bitcoin/transfer.test.ts +31 -0
  356. package/tests/unit/bitcoin/utxo-selection-new.test.ts +502 -0
  357. package/tests/unit/bitcoin/utxo.more.test.ts +39 -0
  358. package/tests/unit/bitcoin/utxo.selection.test.ts +38 -0
  359. package/tests/unit/core/OriginalsSDK.test.ts +152 -0
  360. package/tests/unit/crypto/Multikey.test.ts +206 -0
  361. package/tests/unit/crypto/Signer.test.ts +408 -0
  362. package/tests/unit/did/BtcoDidResolver.test.ts +611 -0
  363. package/tests/unit/did/DIDManager.more.test.ts +43 -0
  364. package/tests/unit/did/DIDManager.test.ts +185 -0
  365. package/tests/unit/did/Ed25519Verifier.test.ts +160 -0
  366. package/tests/unit/did/KeyManager.test.ts +452 -0
  367. package/tests/unit/did/OrdinalsClientProviderAdapter.test.ts +45 -0
  368. package/tests/unit/did/WebVHManager.test.ts +435 -0
  369. package/tests/unit/did/createBtcoDidDocument.test.ts +67 -0
  370. package/tests/unit/did/providers/OrdinalsClientProviderAdapter.test.ts +159 -0
  371. package/tests/unit/events/EventEmitter.test.ts +407 -0
  372. package/tests/unit/lifecycle/BatchOperations.test.ts +527 -0
  373. package/tests/unit/lifecycle/LifecycleManager.keymanagement.test.ts +312 -0
  374. package/tests/unit/lifecycle/LifecycleManager.prov.test.ts +18 -0
  375. package/tests/unit/lifecycle/LifecycleManager.test.ts +213 -0
  376. package/tests/unit/lifecycle/LifecycleManager.transfer.unit.test.ts +30 -0
  377. package/tests/unit/lifecycle/OriginalsAsset.test.ts +176 -0
  378. package/tests/unit/lifecycle/ProvenanceQuery.test.ts +577 -0
  379. package/tests/unit/lifecycle/ResourceVersioning.test.ts +651 -0
  380. package/tests/unit/storage/MemoryStorageAdapter.test.ts +93 -0
  381. package/tests/unit/types/network.test.ts +255 -0
  382. package/tests/unit/utils/EventIntegration.test.ts +384 -0
  383. package/tests/unit/utils/Logger.test.ts +473 -0
  384. package/tests/unit/utils/MetricsCollector.test.ts +358 -0
  385. package/tests/unit/utils/bitcoin-address.test.ts +250 -0
  386. package/tests/unit/utils/cbor.test.ts +35 -0
  387. package/tests/unit/utils/encoding.test.ts +318 -0
  388. package/tests/unit/utils/hash.test.ts +12 -0
  389. package/tests/unit/utils/retry.test.ts +100 -0
  390. package/tests/unit/utils/satoshi-validation.test.ts +354 -0
  391. package/tests/unit/utils/serialization.test.ts +124 -0
  392. package/tests/unit/utils/telemetry.test.ts +52 -0
  393. package/tests/unit/utils/validation.test.ts +141 -0
  394. package/tests/unit/vc/CredentialManager.test.ts +487 -0
  395. package/tests/unit/vc/Issuer.test.ts +107 -0
  396. package/tests/unit/vc/Verifier.test.ts +525 -0
  397. package/tests/unit/vc/bbs.test.ts +282 -0
  398. package/tests/unit/vc/cryptosuites/eddsa.test.ts +398 -0
  399. package/tests/unit/vc/documentLoader.test.ts +121 -0
  400. package/tests/unit/vc/proofs/data-integrity.test.ts +24 -0
  401. package/tsconfig.json +32 -0
  402. package/tsconfig.test.json +15 -0
  403. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,489 @@
1
+ import { KeyManager } from './KeyManager';
2
+ import { multikey } from '../crypto/Multikey';
3
+ import { Ed25519Signer } from '../crypto/Signer';
4
+ import { DIDDocument, KeyPair, ExternalSigner, ExternalVerifier } from '../types';
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+
8
+ // Type definitions for didwebvh-ts (to avoid module resolution issues)
9
+ interface VerificationMethod {
10
+ id?: string;
11
+ type: string;
12
+ controller?: string;
13
+ publicKeyMultibase: string;
14
+ secretKeyMultibase?: string;
15
+ purpose?: 'authentication' | 'assertionMethod' | 'keyAgreement' | 'capabilityInvocation' | 'capabilityDelegation';
16
+ }
17
+
18
+ interface SigningInput {
19
+ document: Record<string, unknown>;
20
+ proof: Record<string, unknown>;
21
+ }
22
+
23
+ interface SigningOutput {
24
+ proofValue: string;
25
+ }
26
+
27
+ interface SignerOptions {
28
+ verificationMethod?: VerificationMethod | null;
29
+ useStaticId?: boolean;
30
+ }
31
+
32
+ interface Signer {
33
+ sign(input: SigningInput): Promise<SigningOutput>;
34
+ getVerificationMethodId(): string;
35
+ }
36
+
37
+ interface Verifier {
38
+ verify(signature: Uint8Array, message: Uint8Array, publicKey: Uint8Array): Promise<boolean>;
39
+ }
40
+
41
+ interface DIDLogEntry {
42
+ versionId: string;
43
+ versionTime: string;
44
+ parameters: Record<string, unknown>;
45
+ state: Record<string, unknown>;
46
+ proof?: Record<string, unknown>[];
47
+ }
48
+
49
+ type DIDLog = DIDLogEntry[];
50
+
51
+ /**
52
+ * Adapter to use Originals SDK signers with didwebvh-ts
53
+ */
54
+ class OriginalsWebVHSigner implements Signer, Verifier {
55
+ private privateKeyMultibase: string;
56
+ private signer: Ed25519Signer;
57
+ protected verificationMethod?: VerificationMethod | null;
58
+ protected useStaticId: boolean;
59
+ private prepareDataForSigning: (document: Record<string, unknown>, proof: Record<string, unknown>) => Promise<Uint8Array>;
60
+
61
+ constructor(
62
+ privateKeyMultibase: string,
63
+ verificationMethod: VerificationMethod,
64
+ prepareDataForSigning: (document: Record<string, unknown>, proof: Record<string, unknown>) => Promise<Uint8Array>,
65
+ options: SignerOptions = {}
66
+ ) {
67
+ this.privateKeyMultibase = privateKeyMultibase;
68
+ this.verificationMethod = options.verificationMethod || verificationMethod;
69
+ this.useStaticId = options.useStaticId || false;
70
+ this.signer = new Ed25519Signer();
71
+ this.prepareDataForSigning = prepareDataForSigning;
72
+ }
73
+
74
+ async sign(input: SigningInput): Promise<SigningOutput> {
75
+ // Prepare the data for signing using didwebvh-ts's canonical approach
76
+ const dataToSign = await this.prepareDataForSigning(input.document, input.proof);
77
+
78
+ // Sign using our Ed25519 signer
79
+ const signature: Buffer = await this.signer.sign(
80
+ Buffer.from(dataToSign),
81
+ this.privateKeyMultibase
82
+ );
83
+
84
+ // Encode signature as multibase
85
+ const proofValue = multikey.encodeMultibase(signature);
86
+
87
+ return { proofValue };
88
+ }
89
+
90
+ async verify(signature: Uint8Array, message: Uint8Array, publicKey: Uint8Array): Promise<boolean> {
91
+ // Decode the public key to multibase format
92
+ const publicKeyMultibase = multikey.encodePublicKey(publicKey, 'Ed25519');
93
+
94
+ // Verify using our Ed25519 signer
95
+ const messageBuffer: Buffer = Buffer.from(message);
96
+ const signatureBuffer: Buffer = Buffer.from(signature);
97
+
98
+ return this.signer.verify(
99
+ messageBuffer,
100
+ signatureBuffer,
101
+ publicKeyMultibase
102
+ );
103
+ }
104
+
105
+ getVerificationMethodId(): string {
106
+ // didwebvh-ts requires verification method to be a did:key: identifier
107
+ // Extract the multibase key from the verification method
108
+ const publicKeyMultibase = this.verificationMethod?.publicKeyMultibase;
109
+ if (!publicKeyMultibase) {
110
+ throw new Error('Verification method must have publicKeyMultibase');
111
+ }
112
+ // Return as did:key format which didwebvh-ts expects
113
+ return `did:key:${publicKeyMultibase}`;
114
+ }
115
+ }
116
+
117
+ export interface CreateWebVHOptions {
118
+ domain: string;
119
+ keyPair?: KeyPair;
120
+ paths?: string[];
121
+ portable?: boolean;
122
+ outputDir?: string; // Directory to save the DID log (did.jsonl)
123
+ externalSigner?: ExternalSigner; // External signer (e.g., Privy integration)
124
+ externalVerifier?: ExternalVerifier; // External verifier
125
+ verificationMethods?: VerificationMethod[]; // Pre-configured verification methods
126
+ updateKeys?: string[]; // Pre-configured update keys (e.g., ["did:key:z6Mk..."])
127
+ }
128
+
129
+ export interface CreateWebVHResult {
130
+ did: string;
131
+ didDocument: DIDDocument;
132
+ log: DIDLog;
133
+ keyPair: KeyPair;
134
+ logPath?: string; // Path where the DID log was saved
135
+ }
136
+
137
+ /**
138
+ * WebVH DID Manager for creating and managing did:webvh identifiers
139
+ */
140
+ export class WebVHManager {
141
+ private keyManager: KeyManager;
142
+
143
+ constructor() {
144
+ this.keyManager = new KeyManager();
145
+ }
146
+
147
+ /**
148
+ * Creates a new did:webvh DID with proper cryptographic signing
149
+ * @param options - Creation options including domain and optional key pair or external signer
150
+ * @returns The created DID, document, log, and key pair (if generated)
151
+ */
152
+ async createDIDWebVH(options: CreateWebVHOptions): Promise<CreateWebVHResult> {
153
+ const {
154
+ domain,
155
+ keyPair: providedKeyPair,
156
+ paths = [],
157
+ portable = false,
158
+ outputDir,
159
+ externalSigner,
160
+ externalVerifier,
161
+ verificationMethods: providedVerificationMethods,
162
+ updateKeys: providedUpdateKeys
163
+ } = options;
164
+
165
+ // Dynamically import didwebvh-ts to avoid module resolution issues
166
+ const mod = await import('didwebvh-ts') as unknown as {
167
+ createDID: (options: Record<string, unknown>) => Promise<{
168
+ did: string;
169
+ doc: Record<string, unknown>;
170
+ log: DIDLog;
171
+ }>;
172
+ prepareDataForSigning: (
173
+ document: Record<string, unknown>,
174
+ proof: Record<string, unknown>
175
+ ) => Promise<Uint8Array>;
176
+ };
177
+ const { createDID, prepareDataForSigning } = mod;
178
+
179
+ // Runtime validation of imported module
180
+ if (typeof createDID !== 'function' || typeof prepareDataForSigning !== 'function') {
181
+ throw new Error('Failed to load didwebvh-ts: invalid module exports');
182
+ }
183
+
184
+ let signer: Signer | ExternalSigner;
185
+ let verifier: Verifier | ExternalVerifier;
186
+ let keyPair: KeyPair | undefined;
187
+ let verificationMethods: VerificationMethod[];
188
+ let updateKeys: string[];
189
+
190
+ // Use external signer if provided (e.g., Privy integration)
191
+ if (externalSigner) {
192
+ if (!providedVerificationMethods || providedVerificationMethods.length === 0) {
193
+ throw new Error('verificationMethods are required when using externalSigner');
194
+ }
195
+ if (!providedUpdateKeys || providedUpdateKeys.length === 0) {
196
+ throw new Error('updateKeys are required when using externalSigner');
197
+ }
198
+
199
+ signer = externalSigner;
200
+ verifier = externalVerifier || externalSigner as any; // Use signer as verifier if not provided
201
+ verificationMethods = providedVerificationMethods;
202
+ updateKeys = providedUpdateKeys;
203
+ keyPair = undefined; // No key pair when using external signer
204
+ } else {
205
+ // Generate or use provided key pair (Ed25519 for did:webvh)
206
+ keyPair = providedKeyPair || await this.keyManager.generateKeyPair('Ed25519');
207
+
208
+ // Create verification methods
209
+ verificationMethods = [
210
+ {
211
+ type: 'Multikey',
212
+ publicKeyMultibase: keyPair.publicKey,
213
+ }
214
+ ];
215
+
216
+ // Create signer using our adapter
217
+ const internalSigner = new OriginalsWebVHSigner(
218
+ keyPair.privateKey,
219
+ verificationMethods[0],
220
+ prepareDataForSigning,
221
+ { verificationMethod: verificationMethods[0] }
222
+ );
223
+
224
+ signer = internalSigner;
225
+ verifier = internalSigner; // Use the same signer as verifier
226
+ updateKeys = [`did:key:${keyPair.publicKey}`]; // Use did:key format for authorization
227
+ }
228
+
229
+ // Create the DID using didwebvh-ts
230
+ const result = await createDID({
231
+ domain,
232
+ signer,
233
+ verifier,
234
+ updateKeys,
235
+ verificationMethods,
236
+ context: [
237
+ 'https://www.w3.org/ns/did/v1',
238
+ 'https://w3id.org/security/multikey/v1'
239
+ ],
240
+ paths,
241
+ portable,
242
+ authentication: ['#key-0'],
243
+ assertionMethod: ['#key-0'],
244
+ });
245
+
246
+ // Validate the returned DID document
247
+ if (!this.isDIDDocument(result.doc)) {
248
+ throw new Error('Invalid DID document returned from createDID');
249
+ }
250
+
251
+ // Save the log to did.jsonl if output directory is provided
252
+ let logPath: string | undefined;
253
+ if (outputDir) {
254
+ logPath = await this.saveDIDLog(result.did, result.log, outputDir);
255
+ }
256
+
257
+ return {
258
+ did: result.did,
259
+ didDocument: result.doc,
260
+ log: result.log,
261
+ keyPair: keyPair || { publicKey: '', privateKey: '' }, // Return empty keypair if using external signer
262
+ logPath,
263
+ };
264
+ }
265
+
266
+ /**
267
+ * Validates a path segment to prevent directory traversal attacks
268
+ * @param segment - Path segment to validate
269
+ * @returns true if valid, false otherwise
270
+ */
271
+ private isValidPathSegment(segment: string): boolean {
272
+ // Reject empty segments, dots, or segments with path separators
273
+ if (!segment || segment === '.' || segment === '..') {
274
+ return false;
275
+ }
276
+
277
+ // Reject segments containing path separators or other dangerous characters
278
+ if (segment.includes('/') || segment.includes('\\') || segment.includes('\0')) {
279
+ return false;
280
+ }
281
+
282
+ // Reject absolute paths (starting with / or drive letter on Windows)
283
+ if (path.isAbsolute(segment)) {
284
+ return false;
285
+ }
286
+
287
+ return true;
288
+ }
289
+
290
+ /**
291
+ * Type guard to validate a DID document structure
292
+ * @param doc - Object to validate
293
+ * @returns true if the object is a valid DIDDocument
294
+ */
295
+ private isDIDDocument(doc: unknown): doc is DIDDocument {
296
+ if (!doc || typeof doc !== 'object') {
297
+ return false;
298
+ }
299
+
300
+ const d = doc as Record<string, unknown>;
301
+
302
+ // Check required fields
303
+ if (!Array.isArray(d['@context']) || d['@context'].length === 0) {
304
+ return false;
305
+ }
306
+
307
+ if (typeof d.id !== 'string' || !d.id.startsWith('did:')) {
308
+ return false;
309
+ }
310
+
311
+ return true;
312
+ }
313
+
314
+ /**
315
+ * Saves the DID log to the appropriate did.jsonl path
316
+ * @param did - The DID identifier
317
+ * @param log - The DID log to save
318
+ * @param baseDir - Base directory for saving (e.g., public/.well-known)
319
+ * @returns The full path where the log was saved
320
+ */
321
+ async saveDIDLog(did: string, log: DIDLog, baseDir: string): Promise<string> {
322
+ // Parse the DID to extract domain and path components
323
+ // Format: did:webvh:domain[:port]:path1:path2...
324
+ const didParts = did.split(':');
325
+ if (didParts.length < 3 || didParts[0] !== 'did' || didParts[1] !== 'webvh') {
326
+ throw new Error('Invalid did:webvh format');
327
+ }
328
+
329
+ // Extract path parts (everything after domain)
330
+ const pathParts = didParts.slice(3);
331
+
332
+ // Validate all path segments to prevent directory traversal
333
+ for (const segment of pathParts) {
334
+ if (!this.isValidPathSegment(segment)) {
335
+ throw new Error(`Invalid path segment in DID: "${segment}". Path segments cannot contain '.', '..', path separators, or be absolute paths.`);
336
+ }
337
+ }
338
+
339
+ // Extract and sanitize domain for filesystem safety
340
+ const rawDomain = decodeURIComponent(didParts[2]);
341
+ // Normalize: lowercase and replace any characters not in [a-z0-9._-] with '_'
342
+ const safeDomain = rawDomain
343
+ .toLowerCase()
344
+ .replace(/[^a-z0-9._-]/g, '_');
345
+
346
+ // Validate the sanitized domain (reject '..' and other dangerous patterns)
347
+ if (!this.isValidPathSegment(safeDomain)) {
348
+ throw new Error(`Invalid domain segment in DID: "${rawDomain}"`);
349
+ }
350
+
351
+ // Construct the file path with domain isolation
352
+ // For did:webvh:example.com:user:alice -> baseDir/did/example.com/user/alice/did.jsonl
353
+ // For did:webvh:example.com:alice -> baseDir/did/example.com/alice/did.jsonl
354
+ const segments = [safeDomain, ...pathParts];
355
+ const didPath = path.join(baseDir, 'did', ...segments, 'did.jsonl');
356
+
357
+ // Verify the resolved path is still within baseDir (defense in depth)
358
+ const resolvedBaseDir = path.resolve(baseDir);
359
+ const resolvedPath = path.resolve(didPath);
360
+ const relativePath = path.relative(resolvedBaseDir, resolvedPath);
361
+ if (relativePath.startsWith('..') || path.isAbsolute(relativePath)) {
362
+ throw new Error('Invalid DID path: resolved path is outside base directory');
363
+ }
364
+
365
+ // Create directories if they don't exist
366
+ const dirPath = path.dirname(didPath);
367
+ await fs.promises.mkdir(dirPath, { recursive: true });
368
+
369
+ // Convert log to JSONL format (one JSON object per line)
370
+ const jsonlContent = log.map((entry: DIDLogEntry) => JSON.stringify(entry)).join('\n');
371
+
372
+ // Write the log file
373
+ await fs.promises.writeFile(didPath, jsonlContent, 'utf8');
374
+
375
+ return didPath;
376
+ }
377
+
378
+ /**
379
+ * Loads a DID log from a did.jsonl file
380
+ * @param logPath - Path to the did.jsonl file
381
+ * @returns The loaded DID log
382
+ */
383
+ async loadDIDLog(logPath: string): Promise<DIDLog> {
384
+ const content = await fs.promises.readFile(logPath, 'utf8');
385
+ const lines = content.trim().split('\n');
386
+ return lines.map(line => JSON.parse(line));
387
+ }
388
+
389
+ /**
390
+ * Updates a DID:WebVH document
391
+ * @param did - The DID to update
392
+ * @param currentLog - The current DID log
393
+ * @param updates - Updates to apply to the DID document
394
+ * @param signer - The signer to use (must be authorized in updateKeys)
395
+ * @param verifier - Optional verifier
396
+ * @param outputDir - Optional directory to save the updated log
397
+ * @returns Updated DID document and log
398
+ */
399
+ async updateDIDWebVH(options: {
400
+ did: string;
401
+ currentLog: DIDLog;
402
+ updates: Partial<DIDDocument>;
403
+ signer: ExternalSigner | { privateKey: string; publicKey: string };
404
+ verifier?: ExternalVerifier;
405
+ outputDir?: string;
406
+ }): Promise<{ didDocument: DIDDocument; log: DIDLog; logPath?: string }> {
407
+ const { did, currentLog, updates, signer: providedSigner, verifier: providedVerifier, outputDir } = options;
408
+
409
+ // Dynamically import didwebvh-ts
410
+ const mod = await import('didwebvh-ts') as unknown as {
411
+ updateDID: (options: Record<string, unknown>) => Promise<{
412
+ doc: Record<string, unknown>;
413
+ log: DIDLog;
414
+ }>;
415
+ prepareDataForSigning: (
416
+ document: Record<string, unknown>,
417
+ proof: Record<string, unknown>
418
+ ) => Promise<Uint8Array>;
419
+ };
420
+ const { updateDID, prepareDataForSigning } = mod;
421
+
422
+ if (typeof updateDID !== 'function') {
423
+ throw new Error('Failed to load didwebvh-ts: invalid module exports');
424
+ }
425
+
426
+ let signer: Signer | ExternalSigner;
427
+ let verifier: Verifier | ExternalVerifier | undefined;
428
+
429
+ // Check if using external signer or internal keypair
430
+ if ('sign' in providedSigner && 'getVerificationMethodId' in providedSigner) {
431
+ // External signer
432
+ signer = providedSigner as ExternalSigner;
433
+ verifier = providedVerifier;
434
+ } else {
435
+ // Internal signer with keypair
436
+ const keyPair = providedSigner as { privateKey: string; publicKey: string };
437
+ const verificationMethod: VerificationMethod = {
438
+ type: 'Multikey',
439
+ publicKeyMultibase: keyPair.publicKey,
440
+ };
441
+
442
+ const internalSigner = new OriginalsWebVHSigner(
443
+ keyPair.privateKey,
444
+ verificationMethod,
445
+ prepareDataForSigning,
446
+ { verificationMethod }
447
+ );
448
+
449
+ signer = internalSigner;
450
+ verifier = internalSigner;
451
+ }
452
+
453
+ // Get the current document from the log
454
+ const currentEntry = currentLog[currentLog.length - 1];
455
+ const currentDoc = currentEntry.state as unknown as DIDDocument;
456
+
457
+ // Merge updates with current document
458
+ const updatedDoc = {
459
+ ...currentDoc,
460
+ ...updates,
461
+ id: did, // Ensure ID doesn't change
462
+ };
463
+
464
+ // Update the DID using didwebvh-ts
465
+ const result = await updateDID({
466
+ log: currentLog,
467
+ doc: updatedDoc,
468
+ signer,
469
+ verifier,
470
+ });
471
+
472
+ // Validate the returned DID document
473
+ if (!this.isDIDDocument(result.doc)) {
474
+ throw new Error('Invalid DID document returned from updateDID');
475
+ }
476
+
477
+ // Save the updated log if output directory is provided
478
+ let logPath: string | undefined;
479
+ if (outputDir) {
480
+ logPath = await this.saveDIDLog(did, result.log, outputDir);
481
+ }
482
+
483
+ return {
484
+ didDocument: result.doc,
485
+ log: result.log,
486
+ logPath,
487
+ };
488
+ }
489
+ }
@@ -0,0 +1,59 @@
1
+ import { DIDDocument, VerificationMethod } from '../types/did';
2
+ import { multikey, MultikeyType } from '../crypto/Multikey';
3
+ import { validateSatoshiNumber } from '../utils/satoshi-validation';
4
+
5
+ export type BitcoinNetwork = 'mainnet' | 'regtest' | 'signet';
6
+
7
+ interface CreateBtcoDidDocumentParams {
8
+ publicKey: Uint8Array;
9
+ keyType: MultikeyType;
10
+ controller?: string;
11
+ }
12
+
13
+ function getDidPrefix(network: BitcoinNetwork): string {
14
+ if (network === 'mainnet') return 'did:btco';
15
+ if (network === 'signet') return 'did:btco:sig';
16
+ if (network === 'regtest') return 'did:btco:reg';
17
+ throw new Error(`Unsupported Bitcoin network: ${network}`);
18
+ }
19
+
20
+ function buildVerificationMethod(did: string, params: CreateBtcoDidDocumentParams): VerificationMethod {
21
+ const fragment = '#0';
22
+ const id = `${did}${fragment}`;
23
+ const controller = params.controller ?? did;
24
+ return {
25
+ id,
26
+ type: 'Multikey',
27
+ controller,
28
+ publicKeyMultibase: multikey.encodePublicKey(params.publicKey, params.keyType)
29
+ };
30
+ }
31
+
32
+ export function createBtcoDidDocument(
33
+ satNumber: number | string,
34
+ network: BitcoinNetwork,
35
+ params: CreateBtcoDidDocumentParams
36
+ ): DIDDocument {
37
+ // Validate satNumber parameter at entry
38
+ const validation = validateSatoshiNumber(satNumber);
39
+ if (!validation.valid) {
40
+ throw new Error(`Invalid satoshi number: ${validation.error}`);
41
+ }
42
+
43
+ const did = `${getDidPrefix(network)}:${String(satNumber)}`;
44
+ const vm = buildVerificationMethod(did, params);
45
+
46
+ const document: DIDDocument = {
47
+ '@context': [
48
+ 'https://www.w3.org/ns/did/v1',
49
+ 'https://w3id.org/security/multikey/v1'
50
+ ],
51
+ id: did,
52
+ verificationMethod: [vm],
53
+ authentication: [vm.id],
54
+ assertionMethod: [vm.id]
55
+ };
56
+
57
+ return document;
58
+ }
59
+
@@ -0,0 +1,68 @@
1
+ import type { ResourceProviderLike } from '../BtcoDidResolver';
2
+ import { OrdinalsClient } from '../../bitcoin/OrdinalsClient';
3
+
4
+ export interface OrdinalsClientProviderConfig {
5
+ baseUrl: string;
6
+ fetchFn?: (url: string, init?: RequestInit) => Promise<Response>;
7
+ timeout?: number;
8
+ }
9
+
10
+ export class OrdinalsClientProviderAdapter implements ResourceProviderLike {
11
+ private readonly config: OrdinalsClientProviderConfig;
12
+
13
+ constructor(private client: OrdinalsClient, configOrBaseUrl: string | OrdinalsClientProviderConfig) {
14
+ if (typeof configOrBaseUrl === 'string') {
15
+ this.config = { baseUrl: configOrBaseUrl };
16
+ } else {
17
+ this.config = configOrBaseUrl;
18
+ }
19
+ }
20
+
21
+ async getSatInfo(satNumber: string): Promise<{ inscription_ids: string[] }> {
22
+ return this.client.getSatInfo(satNumber);
23
+ }
24
+
25
+ async resolveInscription(inscriptionId: string): Promise<{ id: string; sat: number; content_type: string; content_url: string }> {
26
+ const base = (this.config.baseUrl || '').replace(/\/$/, '');
27
+ if (!base) {
28
+ throw new Error('OrdinalsClientProviderAdapter requires a baseUrl');
29
+ }
30
+
31
+ try {
32
+ // Use configurable fetch function or default to global fetch
33
+ const fetchFn = this.config.fetchFn || fetch;
34
+ const timeout = this.config.timeout || 10000; // 10 second default timeout
35
+
36
+ const fetchOptions: RequestInit = {
37
+ headers: { 'Accept': 'application/json' },
38
+ signal: AbortSignal.timeout(timeout)
39
+ };
40
+
41
+ const res = await fetchFn(`${base}/inscription/${inscriptionId}`, fetchOptions);
42
+ if (!res.ok) {
43
+ // Log warning but don't throw - allow graceful degradation
44
+ console.warn(`Failed to resolve inscription ${inscriptionId}: HTTP ${res.status}`);
45
+ throw new Error(`HTTP ${res.status}: ${res.statusText}`);
46
+ }
47
+
48
+ const info: any = await res.json();
49
+ return {
50
+ id: info.inscription_id || inscriptionId,
51
+ sat: typeof info.sat === 'number' ? info.sat : Number(info.sat || 0),
52
+ content_type: info.content_type || 'text/plain',
53
+ content_url: info.content_url || `${base}/content/${inscriptionId}`
54
+ };
55
+ } catch (err: any) {
56
+ // Log error for debugging but re-throw for caller to handle
57
+ console.warn(`Failed to resolve inscription ${inscriptionId}:`, err.message || String(err));
58
+ throw new Error(`Failed to resolve inscription: ${inscriptionId}`);
59
+ }
60
+ }
61
+
62
+ async getMetadata(inscriptionId: string): Promise<any> {
63
+ return this.client.getMetadata(inscriptionId);
64
+ }
65
+ }
66
+
67
+ export default OrdinalsClientProviderAdapter;
68
+