@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,344 @@
1
+ /**
2
+ * Migration system types and interfaces
3
+ * Defines all types used across the migration infrastructure
4
+ */
5
+
6
+ import { DIDDocument, VerifiableCredential } from '../types';
7
+
8
+ /**
9
+ * DID layer types
10
+ */
11
+ export type DIDLayer = 'peer' | 'webvh' | 'btco';
12
+
13
+ /**
14
+ * Migration state enum
15
+ */
16
+ export enum MigrationStateEnum {
17
+ PENDING = 'pending', // Migration queued
18
+ VALIDATING = 'validating', // Running validation pipeline
19
+ CHECKPOINTED = 'checkpointed', // Checkpoint created
20
+ IN_PROGRESS = 'in_progress', // Active migration
21
+ ANCHORING = 'anchoring', // Bitcoin anchoring (btco only)
22
+ COMPLETED = 'completed', // Successfully completed
23
+ FAILED = 'failed', // Failed, rollback initiated
24
+ ROLLED_BACK = 'rolled_back', // Rolled back successfully
25
+ QUARANTINED = 'quarantined' // Rollback failed, needs manual intervention
26
+ }
27
+
28
+ /**
29
+ * Migration error types
30
+ */
31
+ export enum MigrationErrorType {
32
+ VALIDATION_ERROR = 'validation_error', // Pre-migration validation failed
33
+ STORAGE_ERROR = 'storage_error', // Storage adapter failure
34
+ BITCOIN_ERROR = 'bitcoin_error', // Bitcoin anchoring failed
35
+ CREDENTIAL_ERROR = 'credential_error', // Credential re-issuance failed
36
+ NETWORK_ERROR = 'network_error', // Network/connectivity failure
37
+ ROLLBACK_ERROR = 'rollback_error', // Rollback failed (critical)
38
+ TIMEOUT_ERROR = 'timeout_error', // Operation timeout
39
+ UNKNOWN_ERROR = 'unknown_error' // Unexpected error
40
+ }
41
+
42
+ /**
43
+ * Migration options for initiating a migration
44
+ */
45
+ export interface MigrationOptions {
46
+ sourceDid: string; // Source DID to migrate from
47
+ targetLayer: DIDLayer; // Target layer
48
+ credentialIssuance?: boolean; // Require VC issuance (default: true)
49
+ batchMode?: boolean; // Batch operation flag
50
+ partialMode?: { // For large files
51
+ chunkSize: number; // Bytes per chunk
52
+ resumable: boolean; // Support resume
53
+ };
54
+ estimateCostOnly?: boolean; // Return cost estimate without migrating
55
+ metadata?: Record<string, any>; // Additional migration metadata
56
+ domain?: string; // For webvh migrations
57
+ satoshi?: string; // For btco migrations
58
+ feeRate?: number; // For btco migrations
59
+ }
60
+
61
+ /**
62
+ * Batch migration options
63
+ */
64
+ export interface BatchMigrationOptions extends MigrationOptions {
65
+ maxConcurrent?: number; // Max concurrent migrations
66
+ continueOnError?: boolean; // Continue batch if individual migration fails
67
+ }
68
+
69
+ /**
70
+ * Cost estimate for a migration
71
+ */
72
+ export interface CostEstimate {
73
+ storageCost: number; // Storage cost in currency units
74
+ networkFees: number; // Bitcoin network fees (btco only)
75
+ totalCost: number; // Total cost
76
+ currency: string; // Currency unit (e.g., 'sats', 'USD')
77
+ }
78
+
79
+ /**
80
+ * Validation error
81
+ */
82
+ export interface ValidationError {
83
+ code: string;
84
+ message: string;
85
+ field?: string;
86
+ details?: any;
87
+ }
88
+
89
+ /**
90
+ * Validation warning
91
+ */
92
+ export interface ValidationWarning {
93
+ code: string;
94
+ message: string;
95
+ field?: string;
96
+ }
97
+
98
+ /**
99
+ * Migration validation result
100
+ */
101
+ export interface MigrationValidationResult {
102
+ valid: boolean;
103
+ errors: ValidationError[]; // Blocking errors
104
+ warnings: ValidationWarning[]; // Non-blocking issues
105
+ estimatedCost: CostEstimate;
106
+ estimatedDuration: number; // milliseconds
107
+ }
108
+
109
+ /**
110
+ * Migration checkpoint data
111
+ */
112
+ export interface MigrationCheckpoint {
113
+ checkpointId?: string;
114
+ migrationId: string;
115
+ timestamp: number;
116
+ sourceDid: string;
117
+ sourceLayer: DIDLayer;
118
+ didDocument: DIDDocument;
119
+ credentials: VerifiableCredential[];
120
+ storageReferences: Record<string, any>;
121
+ lifecycleState: any;
122
+ ownershipProofs: any[];
123
+ metadata: Record<string, any>;
124
+ }
125
+
126
+ /**
127
+ * Rollback result
128
+ */
129
+ export interface RollbackResult {
130
+ success: boolean;
131
+ migrationId: string;
132
+ checkpointId?: string;
133
+ restoredState: MigrationStateEnum;
134
+ duration: number; // milliseconds
135
+ errors?: MigrationError[];
136
+ }
137
+
138
+ /**
139
+ * Migration state tracking
140
+ */
141
+ export interface MigrationState {
142
+ migrationId: string;
143
+ state: MigrationStateEnum;
144
+ sourceDid: string;
145
+ sourceLayer: DIDLayer;
146
+ targetDid?: string;
147
+ targetLayer: DIDLayer;
148
+ progress: number; // 0-100
149
+ currentOperation: string;
150
+ startTime: number;
151
+ endTime?: number;
152
+ error?: MigrationError;
153
+ checkpointId?: string;
154
+ }
155
+
156
+ /**
157
+ * Migration error details
158
+ */
159
+ export interface MigrationError {
160
+ type: MigrationErrorType;
161
+ code: string;
162
+ message: string;
163
+ technicalDetails?: string;
164
+ suggestedRecovery?: string;
165
+ migrationId?: string;
166
+ sourceDid?: string;
167
+ targetDid?: string;
168
+ timestamp: number;
169
+ stack?: string;
170
+ }
171
+
172
+ /**
173
+ * Migration audit record
174
+ */
175
+ export interface MigrationAuditRecord {
176
+ migrationId: string;
177
+ timestamp: number;
178
+ initiator: string; // User/system identifier
179
+ sourceDid: string;
180
+ sourceLayer: DIDLayer;
181
+ targetDid: string | null; // null if failed before creation
182
+ targetLayer: DIDLayer;
183
+ finalState: MigrationStateEnum;
184
+ validationResults: MigrationValidationResult;
185
+ costActual: CostEstimate; // Actual costs incurred
186
+ duration: number; // milliseconds
187
+ checkpointId?: string; // For rollback reference
188
+ errors: MigrationError[]; // Any errors encountered
189
+ metadata: Record<string, any>; // Custom metadata
190
+ signature?: string; // Cryptographic signature
191
+ }
192
+
193
+ /**
194
+ * Migration result
195
+ */
196
+ export interface MigrationResult {
197
+ migrationId: string;
198
+ success: boolean;
199
+ sourceDid: string;
200
+ targetDid?: string;
201
+ sourceLayer: DIDLayer;
202
+ targetLayer: DIDLayer;
203
+ state: MigrationStateEnum;
204
+ duration: number;
205
+ cost: CostEstimate;
206
+ auditRecord?: MigrationAuditRecord; // Optional - undefined when AuditLogger disabled (v1.0)
207
+ error?: MigrationError;
208
+ }
209
+
210
+ /**
211
+ * Batch migration result
212
+ */
213
+ export interface BatchMigrationResult {
214
+ batchId: string;
215
+ total: number;
216
+ completed: number;
217
+ failed: number;
218
+ inProgress: number;
219
+ results: Map<string, MigrationResult>; // sourceDid → result
220
+ overallProgress: number; // 0-100
221
+ startTime: number;
222
+ endTime?: number;
223
+ errors: MigrationError[];
224
+ }
225
+
226
+ /**
227
+ * Partial migration progress
228
+ */
229
+ export interface PartialMigrationProgress {
230
+ totalChunks: number;
231
+ completedChunks: number;
232
+ currentChunk: number;
233
+ bytesTransferred: number;
234
+ totalBytes: number;
235
+ percentComplete: number;
236
+ estimatedTimeRemaining: number; // milliseconds
237
+ }
238
+
239
+ /**
240
+ * Migration event types
241
+ */
242
+ export type MigrationEventType =
243
+ | 'migration:started'
244
+ | 'migration:validated'
245
+ | 'migration:checkpointed'
246
+ | 'migration:in_progress'
247
+ | 'migration:anchoring'
248
+ | 'migration:completed'
249
+ | 'migration:failed'
250
+ | 'migration:rolledback'
251
+ | 'migration:quarantine'
252
+ | 'batch:progress';
253
+
254
+ /**
255
+ * Migration event payload
256
+ */
257
+ export interface MigrationEvent {
258
+ type: MigrationEventType;
259
+ migrationId: string;
260
+ timestamp: number;
261
+ state: MigrationStateEnum;
262
+ data?: any;
263
+ }
264
+
265
+ /**
266
+ * Storage migration context
267
+ */
268
+ export interface StorageMigrationContext {
269
+ sourceDid: string;
270
+ targetDid: string;
271
+ sourceLayer: DIDLayer;
272
+ targetLayer: DIDLayer;
273
+ resources: Array<{
274
+ id: string;
275
+ hash: string;
276
+ contentType: string;
277
+ size: number;
278
+ url?: string;
279
+ }>;
280
+ }
281
+
282
+ /**
283
+ * Bitcoin anchoring context
284
+ */
285
+ export interface BitcoinAnchoringContext {
286
+ didDocument: DIDDocument;
287
+ migrationMetadata: Record<string, any>;
288
+ network: 'mainnet' | 'testnet' | 'signet';
289
+ feeRate?: number;
290
+ satoshi?: string;
291
+ }
292
+
293
+ /**
294
+ * Lifecycle migration context
295
+ */
296
+ export interface LifecycleMigrationContext {
297
+ sourceDid: string;
298
+ targetDid: string;
299
+ currentState: any;
300
+ eventHistory: any[];
301
+ migrationId: string;
302
+ }
303
+
304
+ /**
305
+ * Validator interface
306
+ */
307
+ export interface IValidator {
308
+ validate(options: MigrationOptions): Promise<MigrationValidationResult>;
309
+ }
310
+
311
+ /**
312
+ * Checkpoint manager interface
313
+ */
314
+ export interface ICheckpointManager {
315
+ createCheckpoint(migrationId: string, options: MigrationOptions): Promise<MigrationCheckpoint>;
316
+ getCheckpoint(checkpointId: string): Promise<MigrationCheckpoint | null>;
317
+ deleteCheckpoint(checkpointId: string): Promise<void>;
318
+ }
319
+
320
+ /**
321
+ * Rollback manager interface
322
+ */
323
+ export interface IRollbackManager {
324
+ rollback(migrationId: string, checkpointId: string): Promise<RollbackResult>;
325
+ }
326
+
327
+ /**
328
+ * State tracker interface
329
+ */
330
+ export interface IStateTracker {
331
+ createMigration(options: MigrationOptions): Promise<MigrationState>;
332
+ updateState(migrationId: string, updates: Partial<MigrationState>): Promise<void>;
333
+ getState(migrationId: string): Promise<MigrationState | null>;
334
+ queryStates(filters: Partial<MigrationState>): Promise<MigrationState[]>;
335
+ }
336
+
337
+ /**
338
+ * Audit logger interface
339
+ */
340
+ export interface IAuditLogger {
341
+ logMigration(record: MigrationAuditRecord): Promise<void>;
342
+ getMigrationHistory(did: string): Promise<MigrationAuditRecord[]>;
343
+ getSystemMigrationLogs(filters: any): Promise<MigrationAuditRecord[]>;
344
+ }
@@ -0,0 +1,107 @@
1
+ /**
2
+ * BitcoinValidator - Validates Bitcoin network requirements for btco migrations
3
+ */
4
+
5
+ import {
6
+ MigrationOptions,
7
+ MigrationValidationResult,
8
+ ValidationError,
9
+ ValidationWarning,
10
+ IValidator
11
+ } from '../types';
12
+ import { OriginalsConfig } from '../../types';
13
+ import { BitcoinManager } from '../../bitcoin/BitcoinManager';
14
+
15
+ export class BitcoinValidator implements IValidator {
16
+ constructor(
17
+ private config: OriginalsConfig,
18
+ private bitcoinManager: BitcoinManager
19
+ ) {}
20
+
21
+ async validate(options: MigrationOptions): Promise<MigrationValidationResult> {
22
+ const errors: ValidationError[] = [];
23
+ const warnings: ValidationWarning[] = [];
24
+
25
+ try {
26
+ // Only validate for btco migrations
27
+ if (options.targetLayer !== 'btco') {
28
+ return this.createResult(true, errors, warnings, 0, 0);
29
+ }
30
+
31
+ // Check if Bitcoin provider is configured
32
+ const ordinalsProvider = this.config.ordinalsProvider;
33
+ if (!ordinalsProvider) {
34
+ errors.push({
35
+ code: 'BITCOIN_PROVIDER_REQUIRED',
36
+ message: 'Ordinals provider is required for btco migrations',
37
+ details: { targetLayer: options.targetLayer }
38
+ });
39
+ return this.createResult(false, errors, warnings, 0, 0);
40
+ }
41
+
42
+ // Estimate Bitcoin network fees
43
+ let networkFees = 0;
44
+ let estimatedDuration = 600000; // 10 minutes default
45
+
46
+ try {
47
+ // Estimate fee for a typical inscription (assume 1KB data)
48
+ const estimatedSize = 1024; // bytes
49
+ const feeRate = options.feeRate || 10; // sats/vB
50
+ networkFees = estimatedSize * feeRate;
51
+
52
+ // Check if fee is within reasonable limits
53
+ if (feeRate > 1000) {
54
+ warnings.push({
55
+ code: 'HIGH_FEE_RATE',
56
+ message: `Fee rate of ${feeRate} sat/vB is unusually high`,
57
+ field: 'feeRate'
58
+ });
59
+ }
60
+ } catch (error) {
61
+ warnings.push({
62
+ code: 'FEE_ESTIMATION_FAILED',
63
+ message: `Could not estimate Bitcoin network fees: ${error instanceof Error ? error.message : String(error)}`
64
+ });
65
+ networkFees = 10240; // Default fallback: ~1KB at 10 sat/vB
66
+ }
67
+
68
+ // Validate network (should be signet for testnet)
69
+ if (this.config.network !== 'mainnet' && this.config.network !== 'signet') {
70
+ warnings.push({
71
+ code: 'NETWORK_MISMATCH',
72
+ message: `Network '${this.config.network}' will use signet for Bitcoin anchoring`
73
+ });
74
+ }
75
+
76
+ return this.createResult(true, errors, warnings, networkFees, estimatedDuration);
77
+ } catch (error) {
78
+ errors.push({
79
+ code: 'BITCOIN_VALIDATION_ERROR',
80
+ message: 'Error validating Bitcoin requirements',
81
+ details: { error: error instanceof Error ? error.message : String(error) }
82
+ });
83
+ return this.createResult(false, errors, warnings, 0, 0);
84
+ }
85
+ }
86
+
87
+ private createResult(
88
+ valid: boolean,
89
+ errors: ValidationError[],
90
+ warnings: ValidationWarning[],
91
+ networkFees: number,
92
+ duration: number
93
+ ): MigrationValidationResult {
94
+ return {
95
+ valid,
96
+ errors,
97
+ warnings,
98
+ estimatedCost: {
99
+ storageCost: 0,
100
+ networkFees,
101
+ totalCost: networkFees,
102
+ currency: 'sats'
103
+ },
104
+ estimatedDuration: duration
105
+ };
106
+ }
107
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * CredentialValidator - Validates credential compatibility for migration
3
+ */
4
+
5
+ import {
6
+ MigrationOptions,
7
+ MigrationValidationResult,
8
+ ValidationError,
9
+ ValidationWarning,
10
+ IValidator
11
+ } from '../types';
12
+ import { OriginalsConfig } from '../../types';
13
+ import { CredentialManager } from '../../vc/CredentialManager';
14
+
15
+ export class CredentialValidator implements IValidator {
16
+ constructor(
17
+ private config: OriginalsConfig,
18
+ private credentialManager: CredentialManager
19
+ ) {}
20
+
21
+ async validate(options: MigrationOptions): Promise<MigrationValidationResult> {
22
+ const errors: ValidationError[] = [];
23
+ const warnings: ValidationWarning[] = [];
24
+
25
+ try {
26
+ // Credential validation is optional if credentialIssuance is false
27
+ if (options.credentialIssuance === false) {
28
+ return this.createResult(true, errors, warnings);
29
+ }
30
+
31
+ // All credential types are compatible with all layers
32
+ // This validator primarily checks that credential issuance is possible
33
+
34
+ // For now, credentials are always compatible
35
+ // Future enhancements could include schema validation
36
+
37
+ return this.createResult(true, errors, warnings);
38
+ } catch (error) {
39
+ errors.push({
40
+ code: 'CREDENTIAL_VALIDATION_ERROR',
41
+ message: 'Error validating credential compatibility',
42
+ details: { error: error instanceof Error ? error.message : String(error) }
43
+ });
44
+ return this.createResult(false, errors, warnings);
45
+ }
46
+ }
47
+
48
+ private createResult(valid: boolean, errors: ValidationError[], warnings: ValidationWarning[]): MigrationValidationResult {
49
+ return {
50
+ valid,
51
+ errors,
52
+ warnings,
53
+ estimatedCost: {
54
+ storageCost: 0,
55
+ networkFees: 0,
56
+ totalCost: 0,
57
+ currency: 'sats'
58
+ },
59
+ estimatedDuration: 50 // Credential validation typically takes ~50ms
60
+ };
61
+ }
62
+ }
@@ -0,0 +1,151 @@
1
+ /**
2
+ * DIDCompatibilityValidator - Validates DID document compatibility between layers
3
+ */
4
+
5
+ import {
6
+ MigrationOptions,
7
+ MigrationValidationResult,
8
+ ValidationError,
9
+ ValidationWarning,
10
+ IValidator
11
+ } from '../types';
12
+ import { OriginalsConfig } from '../../types';
13
+ import { DIDManager } from '../../did/DIDManager';
14
+
15
+ export class DIDCompatibilityValidator implements IValidator {
16
+ constructor(
17
+ private config: OriginalsConfig,
18
+ private didManager: DIDManager
19
+ ) {}
20
+
21
+ async validate(options: MigrationOptions): Promise<MigrationValidationResult> {
22
+ const errors: ValidationError[] = [];
23
+ const warnings: ValidationWarning[] = [];
24
+
25
+ try {
26
+ // Resolve source DID
27
+ const sourceDid = await this.didManager.resolveDID(options.sourceDid);
28
+ if (!sourceDid) {
29
+ errors.push({
30
+ code: 'SOURCE_DID_NOT_FOUND',
31
+ message: `Could not resolve source DID: ${options.sourceDid}`,
32
+ field: 'sourceDid'
33
+ });
34
+ return this.createResult(false, errors, warnings);
35
+ }
36
+
37
+ // Extract source layer from DID
38
+ const sourceLayer = this.extractLayer(options.sourceDid);
39
+ if (!sourceLayer) {
40
+ errors.push({
41
+ code: 'INVALID_SOURCE_DID_FORMAT',
42
+ message: 'Source DID has unsupported format',
43
+ field: 'sourceDid',
44
+ details: { did: options.sourceDid }
45
+ });
46
+ return this.createResult(false, errors, warnings);
47
+ }
48
+
49
+ // Validate migration path
50
+ const pathErrors = this.validateMigrationPath(sourceLayer, options.targetLayer);
51
+ errors.push(...pathErrors);
52
+
53
+ if (errors.length > 0) {
54
+ return this.createResult(false, errors, warnings);
55
+ }
56
+
57
+ // Validate verification methods compatibility
58
+ if (sourceDid.verificationMethod && Array.isArray(sourceDid.verificationMethod)) {
59
+ for (const vm of sourceDid.verificationMethod) {
60
+ if (!this.isVerificationMethodCompatible(vm, options.targetLayer)) {
61
+ warnings.push({
62
+ code: 'VERIFICATION_METHOD_INCOMPATIBLE',
63
+ message: `Verification method ${vm.id} may not be compatible with ${options.targetLayer}`,
64
+ field: 'verificationMethod'
65
+ });
66
+ }
67
+ }
68
+ }
69
+
70
+ // Validate service endpoints
71
+ if (sourceDid.service && Array.isArray(sourceDid.service)) {
72
+ if (options.targetLayer === 'peer' && sourceDid.service.length > 0) {
73
+ warnings.push({
74
+ code: 'SERVICE_ENDPOINTS_ON_PEER',
75
+ message: 'Service endpoints on peer DIDs may have limited discoverability'
76
+ });
77
+ }
78
+ }
79
+
80
+ return this.createResult(true, errors, warnings);
81
+ } catch (error) {
82
+ errors.push({
83
+ code: 'DID_VALIDATION_ERROR',
84
+ message: 'Error validating DID compatibility',
85
+ details: { error: error instanceof Error ? error.message : String(error) }
86
+ });
87
+ return this.createResult(false, errors, warnings);
88
+ }
89
+ }
90
+
91
+ private extractLayer(did: string): string | null {
92
+ if (did.startsWith('did:peer:')) return 'peer';
93
+ if (did.startsWith('did:webvh:')) return 'webvh';
94
+ if (did.startsWith('did:btco:')) return 'btco';
95
+ return null;
96
+ }
97
+
98
+ private validateMigrationPath(sourceLayer: string, targetLayer: string): ValidationError[] {
99
+ const errors: ValidationError[] = [];
100
+
101
+ // Check for invalid reverse migrations
102
+ const layerOrder = { peer: 0, webvh: 1, btco: 2 };
103
+ const sourceOrder = layerOrder[sourceLayer as keyof typeof layerOrder];
104
+ const targetOrder = layerOrder[targetLayer as keyof typeof layerOrder];
105
+
106
+ if (sourceOrder === undefined || targetOrder === undefined) {
107
+ errors.push({
108
+ code: 'INVALID_LAYER',
109
+ message: 'Invalid source or target layer',
110
+ details: { sourceLayer, targetLayer }
111
+ });
112
+ return errors;
113
+ }
114
+
115
+ if (sourceOrder >= targetOrder) {
116
+ errors.push({
117
+ code: 'INVALID_MIGRATION_PATH',
118
+ message: `Cannot migrate from ${sourceLayer} to ${targetLayer}. Migrations must move forward through layers (peer → webvh → btco)`,
119
+ details: { sourceLayer, targetLayer }
120
+ });
121
+ }
122
+
123
+ return errors;
124
+ }
125
+
126
+ private isVerificationMethodCompatible(vm: any, targetLayer: string): boolean {
127
+ // All verification method types are compatible with all layers
128
+ // This is a placeholder for more sophisticated compatibility checks
129
+ if (!vm.type) return false;
130
+
131
+ // Common types that are widely supported
132
+ const supportedTypes = ['Multikey', 'Ed25519VerificationKey2020', 'EcdsaSecp256k1VerificationKey2019'];
133
+
134
+ return supportedTypes.includes(vm.type);
135
+ }
136
+
137
+ private createResult(valid: boolean, errors: ValidationError[], warnings: ValidationWarning[]): MigrationValidationResult {
138
+ return {
139
+ valid,
140
+ errors,
141
+ warnings,
142
+ estimatedCost: {
143
+ storageCost: 0,
144
+ networkFees: 0,
145
+ totalCost: 0,
146
+ currency: 'sats'
147
+ },
148
+ estimatedDuration: 100 // DID validation typically takes ~100ms
149
+ };
150
+ }
151
+ }