@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,23 @@
1
+ // Ensure globalThis.crypto is available for noble libraries in Node test env
2
+ import { webcrypto } from 'node:crypto';
3
+ import * as ed25519 from '@noble/ed25519';
4
+ import { createHash } from 'node:crypto';
5
+
6
+ // Ensure Jest matchers are properly extended
7
+ import 'jest';
8
+
9
+ if (typeof globalThis.crypto === 'undefined') {
10
+ // @ts-ignore
11
+ globalThis.crypto = webcrypto as unknown as Crypto;
12
+ }
13
+
14
+ // Configure noble ed25519 to use sha512 via Node crypto
15
+ // @ts-ignore
16
+ ed25519.etc.sha512Sync = (...msgs: Uint8Array[]) => {
17
+ const hasher = createHash('sha512');
18
+ for (const m of msgs) hasher.update(Buffer.from(m));
19
+ return new Uint8Array(hasher.digest());
20
+ };
21
+
22
+
23
+
@@ -0,0 +1,571 @@
1
+ /**
2
+ * Batch Operations Stress and Load Testing
3
+ *
4
+ * This test suite performs stress testing on batch operations,
5
+ * migration processes, and concurrent transaction handling.
6
+ */
7
+
8
+ import { describe, it, expect, beforeEach } from 'bun:test';
9
+ import { OriginalsSDK } from '../../src/core/OriginalsSDK';
10
+ import { OrdMockProvider } from '../../src/adapters/providers/OrdMockProvider';
11
+ import { BatchOperationExecutor } from '../../src/lifecycle/BatchOperations';
12
+ import { MemoryKeyStore } from '../../src/storage/MemoryKeyStore';
13
+ import type { AssetResource, OriginalsConfig } from '../../src/types';
14
+
15
+ describe('Batch Operations Stress Tests', () => {
16
+ let sdk: OriginalsSDK;
17
+ let config: OriginalsConfig;
18
+
19
+ beforeEach(() => {
20
+ config = {
21
+ network: 'regtest',
22
+ defaultKeyType: 'ES256K',
23
+ ordinalsProvider: new OrdMockProvider(),
24
+ enableLogging: false
25
+ };
26
+ sdk = OriginalsSDK.create(config);
27
+ });
28
+
29
+ describe('1. Batch Size Scaling Tests', () => {
30
+ it('should handle 10 assets (baseline)', async () => {
31
+ const batchSize = 10;
32
+ const resourcesList = createTestResourcesList(batchSize);
33
+
34
+ const startTime = Date.now();
35
+ const result = await sdk.lifecycle.batchCreateAssets(resourcesList, {
36
+ continueOnError: false,
37
+ maxConcurrent: 1
38
+ });
39
+ const duration = Date.now() - startTime;
40
+
41
+ expect(result.successful).toHaveLength(batchSize);
42
+ expect(result.failed).toHaveLength(0);
43
+
44
+ logPerformanceMetrics('10 assets batch', batchSize, duration, result);
45
+ }, 30000);
46
+
47
+ it('should handle 100 assets (typical load)', async () => {
48
+ const batchSize = 100;
49
+ const resourcesList = createTestResourcesList(batchSize);
50
+
51
+ const startTime = Date.now();
52
+ const result = await sdk.lifecycle.batchCreateAssets(resourcesList, {
53
+ continueOnError: true,
54
+ maxConcurrent: 5
55
+ });
56
+ const duration = Date.now() - startTime;
57
+
58
+ expect(result.totalProcessed).toBe(batchSize);
59
+ expect(result.successful.length + result.failed.length).toBe(batchSize);
60
+
61
+ logPerformanceMetrics('100 assets batch', batchSize, duration, result);
62
+ }, 60000);
63
+
64
+ it('should handle 1000 assets (stress test)', async () => {
65
+ const batchSize = 1000;
66
+ const resourcesList = createTestResourcesList(batchSize);
67
+
68
+ const startTime = Date.now();
69
+ const result = await sdk.lifecycle.batchCreateAssets(resourcesList, {
70
+ continueOnError: true,
71
+ maxConcurrent: 10
72
+ });
73
+ const duration = Date.now() - startTime;
74
+
75
+ expect(result.totalProcessed).toBe(batchSize);
76
+
77
+ logPerformanceMetrics('1000 assets batch', batchSize, duration, result);
78
+
79
+ // Performance expectations
80
+ const avgTimePerAsset = duration / batchSize;
81
+ expect(avgTimePerAsset).toBeLessThan(100); // Should average < 100ms per asset
82
+
83
+ console.log(`[STRESS] Average time per asset: ${avgTimePerAsset.toFixed(2)}ms`);
84
+ }, 120000);
85
+
86
+ it('should handle 10000 assets (breaking point test)', async () => {
87
+ const batchSize = 10000;
88
+ const resourcesList = createTestResourcesList(batchSize);
89
+
90
+ const startTime = Date.now();
91
+ const startMemory = process.memoryUsage().heapUsed;
92
+
93
+ const result = await sdk.lifecycle.batchCreateAssets(resourcesList, {
94
+ continueOnError: true,
95
+ maxConcurrent: 20,
96
+ timeoutMs: 60000
97
+ });
98
+
99
+ const duration = Date.now() - startTime;
100
+ const endMemory = process.memoryUsage().heapUsed;
101
+ const memoryDelta = (endMemory - startMemory) / 1024 / 1024; // MB
102
+
103
+ expect(result.totalProcessed).toBe(batchSize);
104
+
105
+ logPerformanceMetrics('10000 assets batch', batchSize, duration, result);
106
+
107
+ console.log(`[STRESS] Memory usage: ${memoryDelta.toFixed(2)}MB`);
108
+ console.log(`[STRESS] Memory per asset: ${(memoryDelta / batchSize * 1024).toFixed(2)}KB`);
109
+
110
+ // Memory should not grow unreasonably
111
+ expect(memoryDelta).toBeLessThan(500); // Should use < 500MB for 10k assets
112
+ }, 300000);
113
+ });
114
+
115
+ describe('2. Concurrent Batch Operation Tests', () => {
116
+ it('should handle 1 concurrent batch (baseline)', async () => {
117
+ const result = await runConcurrentBatches(1, 50);
118
+
119
+ expect(result.allSuccessful).toBeGreaterThan(0);
120
+
121
+ logConcurrencyMetrics('1 concurrent batch', 1, 50, result);
122
+ }, 60000);
123
+
124
+ it('should handle 10 concurrent batches', async () => {
125
+ const result = await runConcurrentBatches(10, 20);
126
+
127
+ expect(result.allSuccessful).toBeGreaterThan(0);
128
+
129
+ logConcurrencyMetrics('10 concurrent batches', 10, 20, result);
130
+ }, 120000);
131
+
132
+ it('should handle 100 concurrent batches (high concurrency)', async () => {
133
+ const result = await runConcurrentBatches(100, 10);
134
+
135
+ expect(result.totalBatches).toBe(100);
136
+
137
+ logConcurrencyMetrics('100 concurrent batches', 100, 10, result);
138
+
139
+ // Calculate error rate
140
+ const errorRate = (result.allFailed / result.totalItems) * 100;
141
+ expect(errorRate).toBeLessThan(5); // < 5% error rate acceptable under high load
142
+
143
+ console.log(`[STRESS] Error rate under high concurrency: ${errorRate.toFixed(2)}%`);
144
+ }, 300000);
145
+
146
+ it('should handle mixed concurrent operations', async () => {
147
+ const operations = [
148
+ sdk.lifecycle.batchCreateAssets(createTestResourcesList(50)),
149
+ sdk.lifecycle.batchCreateAssets(createTestResourcesList(50)),
150
+ sdk.lifecycle.batchCreateAssets(createTestResourcesList(50)),
151
+ ];
152
+
153
+ const startTime = Date.now();
154
+ const results = await Promise.all(operations);
155
+ const duration = Date.now() - startTime;
156
+
157
+ const totalSuccessful = results.reduce((sum, r) => sum + r.successful.length, 0);
158
+ const totalFailed = results.reduce((sum, r) => sum + r.failed.length, 0);
159
+
160
+ console.log(`[STRESS] Mixed concurrent operations:`);
161
+ console.log(` - Total successful: ${totalSuccessful}`);
162
+ console.log(` - Total failed: ${totalFailed}`);
163
+ console.log(` - Duration: ${duration}ms`);
164
+ console.log(` - Throughput: ${(totalSuccessful / (duration / 1000)).toFixed(2)} assets/sec`);
165
+ }, 120000);
166
+ });
167
+
168
+ describe('3. Batch Inscription Stress Tests', () => {
169
+ it('should handle batch inscription with single transaction mode', async () => {
170
+ // Create assets first
171
+ const resourcesList = createTestResourcesList(10);
172
+ const createResult = await sdk.lifecycle.batchCreateAssets(resourcesList);
173
+
174
+ expect(createResult.successful).toHaveLength(10);
175
+
176
+ const assets = createResult.successful.map(s => s.result);
177
+
178
+ // Inscribe in batch with single transaction
179
+ const startTime = Date.now();
180
+ const inscribeResult = await sdk.lifecycle.batchInscribeOnBitcoin(assets, {
181
+ singleTransaction: true,
182
+ feeRate: 10,
183
+ continueOnError: false
184
+ });
185
+ const duration = Date.now() - startTime;
186
+
187
+ expect(inscribeResult.successful).toHaveLength(10);
188
+
189
+ console.log(`[STRESS] Batch inscription (single tx):`);
190
+ console.log(` - Assets: 10`);
191
+ console.log(` - Duration: ${duration}ms`);
192
+ console.log(` - Mode: Single transaction`);
193
+ }, 60000);
194
+
195
+ it('should handle batch inscription with individual transactions', async () => {
196
+ const resourcesList = createTestResourcesList(10);
197
+ const createResult = await sdk.lifecycle.batchCreateAssets(resourcesList);
198
+ const assets = createResult.successful.map(s => s.result);
199
+
200
+ const startTime = Date.now();
201
+ const inscribeResult = await sdk.lifecycle.batchInscribeOnBitcoin(assets, {
202
+ singleTransaction: false,
203
+ feeRate: 10,
204
+ continueOnError: true,
205
+ maxConcurrent: 3
206
+ });
207
+ const duration = Date.now() - startTime;
208
+
209
+ expect(inscribeResult.totalProcessed).toBe(10);
210
+
211
+ console.log(`[STRESS] Batch inscription (individual txs):`);
212
+ console.log(` - Assets: 10`);
213
+ console.log(` - Duration: ${duration}ms`);
214
+ console.log(` - Mode: Individual transactions`);
215
+ console.log(` - Concurrency: 3`);
216
+ }, 60000);
217
+
218
+ it('should compare cost savings between modes', async () => {
219
+ const resourcesList = createTestResourcesList(50);
220
+ const createResult = await sdk.lifecycle.batchCreateAssets(resourcesList);
221
+ const assets = createResult.successful.map(s => s.result);
222
+
223
+ // Test single transaction mode
224
+ const singleTxStart = Date.now();
225
+ const singleTxResult = await sdk.lifecycle.batchInscribeOnBitcoin(
226
+ assets.slice(0, 25),
227
+ {
228
+ singleTransaction: true,
229
+ feeRate: 10
230
+ }
231
+ );
232
+ const singleTxDuration = Date.now() - singleTxStart;
233
+
234
+ // Test individual transaction mode
235
+ const individualTxStart = Date.now();
236
+ const individualTxResult = await sdk.lifecycle.batchInscribeOnBitcoin(
237
+ assets.slice(25, 50),
238
+ {
239
+ singleTransaction: false,
240
+ feeRate: 10,
241
+ maxConcurrent: 5
242
+ }
243
+ );
244
+ const individualTxDuration = Date.now() - individualTxStart;
245
+
246
+ console.log(`[STRESS] Cost comparison:`);
247
+ console.log(` Single TX mode:`);
248
+ console.log(` - Duration: ${singleTxDuration}ms`);
249
+ console.log(` - Assets: 25`);
250
+ console.log(` Individual TX mode:`);
251
+ console.log(` - Duration: ${individualTxDuration}ms`);
252
+ console.log(` - Assets: 25`);
253
+ console.log(` - Concurrency: 5`);
254
+ console.log(` Performance ratio: ${(individualTxDuration / singleTxDuration).toFixed(2)}x`);
255
+ }, 120000);
256
+ });
257
+
258
+ describe('4. Migration Operation Stress Tests', () => {
259
+ it('should handle 1000 assets migrating through layers', async () => {
260
+ const batchSize = 1000;
261
+ const resourcesList = createTestResourcesList(batchSize);
262
+
263
+ // Create assets (did:peer layer)
264
+ const createResult = await sdk.lifecycle.batchCreateAssets(resourcesList, {
265
+ maxConcurrent: 10
266
+ });
267
+
268
+ expect(createResult.successful).toHaveLength(batchSize);
269
+
270
+ const startTime = Date.now();
271
+ let migratedCount = 0;
272
+
273
+ // Migrate to did:webvh layer
274
+ for (const { result: asset } of createResult.successful.slice(0, 100)) {
275
+ try {
276
+ await sdk.lifecycle.publishToWeb(asset, 'localhost:3000');
277
+ migratedCount++;
278
+ } catch (error) {
279
+ // Expected to fail in test environment
280
+ }
281
+ }
282
+
283
+ const duration = Date.now() - startTime;
284
+
285
+ console.log(`[STRESS] Migration stress test:`);
286
+ console.log(` - Assets created: ${batchSize}`);
287
+ console.log(` - Assets migrated: ${migratedCount}`);
288
+ console.log(` - Duration: ${duration}ms`);
289
+ console.log(` - Avg time per migration: ${migratedCount > 0 ? (duration / migratedCount).toFixed(2) : 'N/A'}ms`);
290
+ }, 120000);
291
+
292
+ it('should handle concurrent migrations', async () => {
293
+ const resourcesList = createTestResourcesList(30);
294
+ const createResult = await sdk.lifecycle.batchCreateAssets(resourcesList);
295
+ const assets = createResult.successful.map(s => s.result);
296
+
297
+ const startTime = Date.now();
298
+
299
+ // Attempt concurrent migrations
300
+ const migrations = assets.slice(0, 10).map(asset =>
301
+ sdk.lifecycle.publishToWeb(asset, 'localhost:3000').catch(e => e)
302
+ );
303
+
304
+ await Promise.allSettled(migrations);
305
+
306
+ const duration = Date.now() - startTime;
307
+
308
+ console.log(`[STRESS] Concurrent migrations:`);
309
+ console.log(` - Concurrent operations: 10`);
310
+ console.log(` - Duration: ${duration}ms`);
311
+ }, 60000);
312
+ });
313
+
314
+ describe('5. Error Recovery and Retry Stress Tests', () => {
315
+ it('should handle batch with 50% failure rate and retry', async () => {
316
+ const executor = new BatchOperationExecutor();
317
+ let callCount = 0;
318
+
319
+ const items = Array.from({ length: 100 }, (_, i) => i);
320
+
321
+ const result = await executor.execute(
322
+ items,
323
+ async (item) => {
324
+ callCount++;
325
+ // Simulate 50% failure on first attempt
326
+ if (callCount % 2 === 0 && callCount <= 100) {
327
+ throw new Error('Simulated failure');
328
+ }
329
+ return item * 2;
330
+ },
331
+ {
332
+ continueOnError: true,
333
+ retryCount: 2,
334
+ retryDelay: 10,
335
+ maxConcurrent: 5
336
+ }
337
+ );
338
+
339
+ console.log(`[STRESS] Error recovery test:`);
340
+ console.log(` - Total items: 100`);
341
+ console.log(` - Successful: ${result.successful.length}`);
342
+ console.log(` - Failed: ${result.failed.length}`);
343
+ console.log(` - Total calls (with retries): ${callCount}`);
344
+ console.log(` - Duration: ${result.totalDuration}ms`);
345
+ }, 60000);
346
+
347
+ it('should handle exponential backoff under stress', async () => {
348
+ const executor = new BatchOperationExecutor();
349
+ const retryTimes: number[] = [];
350
+
351
+ const items = Array.from({ length: 10 }, (_, i) => i);
352
+
353
+ await executor.execute(
354
+ items,
355
+ async (item, index) => {
356
+ retryTimes.push(Date.now());
357
+ if (retryTimes.length <= 20) { // Fail first few
358
+ throw new Error('Force retry');
359
+ }
360
+ return item;
361
+ },
362
+ {
363
+ continueOnError: true,
364
+ retryCount: 3,
365
+ retryDelay: 100,
366
+ maxConcurrent: 1
367
+ }
368
+ );
369
+
370
+ // Analyze retry delays
371
+ const delays: number[] = [];
372
+ for (let i = 1; i < Math.min(retryTimes.length, 10); i++) {
373
+ delays.push(retryTimes[i] - retryTimes[i - 1]);
374
+ }
375
+
376
+ console.log(`[STRESS] Exponential backoff analysis:`);
377
+ console.log(` - Retry delays: ${delays.map(d => d + 'ms').join(', ')}`);
378
+ console.log(` - Average delay: ${(delays.reduce((a, b) => a + b, 0) / delays.length).toFixed(2)}ms`);
379
+ }, 30000);
380
+ });
381
+
382
+ describe('6. Memory and Resource Tests', () => {
383
+ it('should not leak memory during repeated batch operations', async () => {
384
+ const iterations = 10;
385
+ const batchSize = 100;
386
+
387
+ const memoryReadings: number[] = [];
388
+
389
+ for (let i = 0; i < iterations; i++) {
390
+ const resourcesList = createTestResourcesList(batchSize);
391
+
392
+ await sdk.lifecycle.batchCreateAssets(resourcesList, {
393
+ maxConcurrent: 5
394
+ });
395
+
396
+ // Force garbage collection if available
397
+ if (global.gc) {
398
+ global.gc();
399
+ }
400
+
401
+ const memUsage = process.memoryUsage().heapUsed / 1024 / 1024; // MB
402
+ memoryReadings.push(memUsage);
403
+
404
+ console.log(`[STRESS] Iteration ${i + 1}: ${memUsage.toFixed(2)}MB`);
405
+ }
406
+
407
+ // Check for memory leak (memory shouldn't grow linearly)
408
+ const firstHalf = memoryReadings.slice(0, 5).reduce((a, b) => a + b) / 5;
409
+ const secondHalf = memoryReadings.slice(5).reduce((a, b) => a + b) / 5;
410
+ const growth = ((secondHalf - firstHalf) / firstHalf) * 100;
411
+
412
+ console.log(`[STRESS] Memory growth: ${growth.toFixed(2)}%`);
413
+ expect(Math.abs(growth)).toBeLessThan(50); // Memory shouldn't grow > 50%
414
+ }, 180000);
415
+
416
+ it('should handle resource cleanup after timeout', async () => {
417
+ const executor = new BatchOperationExecutor();
418
+
419
+ const result = await executor.execute(
420
+ [1, 2, 3, 4, 5],
421
+ async (item) => {
422
+ // Simulate long-running operation
423
+ await new Promise(resolve => setTimeout(resolve, 100));
424
+ return item * 2;
425
+ },
426
+ {
427
+ timeoutMs: 50, // Timeout before completion
428
+ continueOnError: true
429
+ }
430
+ );
431
+
432
+ expect(result.failed.length).toBeGreaterThan(0);
433
+ console.log(`[STRESS] Timeout handling: ${result.failed.length} operations timed out`);
434
+ }, 10000);
435
+ });
436
+
437
+ describe('7. Throughput Benchmarks', () => {
438
+ it('should measure peak throughput for asset creation', async () => {
439
+ const testDuration = 5000; // 5 seconds
440
+ const startTime = Date.now();
441
+ let totalCreated = 0;
442
+
443
+ while (Date.now() - startTime < testDuration) {
444
+ const batch = createTestResourcesList(10);
445
+ const result = await sdk.lifecycle.batchCreateAssets(batch, {
446
+ maxConcurrent: 5
447
+ });
448
+ totalCreated += result.successful.length;
449
+ }
450
+
451
+ const actualDuration = Date.now() - startTime;
452
+ const throughput = (totalCreated / actualDuration) * 1000; // per second
453
+
454
+ console.log(`[BENCHMARK] Asset creation throughput:`);
455
+ console.log(` - Total created: ${totalCreated}`);
456
+ console.log(` - Duration: ${actualDuration}ms`);
457
+ console.log(` - Throughput: ${throughput.toFixed(2)} assets/sec`);
458
+
459
+ expect(throughput).toBeGreaterThan(10); // Should create at least 10 assets/sec
460
+ }, 10000);
461
+ });
462
+ });
463
+
464
+ // Helper functions
465
+
466
+ function createTestResourcesList(count: number): AssetResource[][] {
467
+ return Array.from({ length: count }, (_, i) => [
468
+ {
469
+ id: `resource-${i}-${Date.now()}`,
470
+ type: 'DigitalArt',
471
+ contentType: 'application/json',
472
+ hash: Buffer.from(`hash-${i}`).toString('hex'),
473
+ content: JSON.stringify({ test: `data-${i}` })
474
+ }
475
+ ]);
476
+ }
477
+
478
+ interface ConcurrencyResult {
479
+ totalBatches: number;
480
+ totalItems: number;
481
+ allSuccessful: number;
482
+ allFailed: number;
483
+ duration: number;
484
+ avgBatchDuration: number;
485
+ }
486
+
487
+ async function runConcurrentBatches(
488
+ batchCount: number,
489
+ itemsPerBatch: number
490
+ ): Promise<ConcurrencyResult> {
491
+ const config: OriginalsConfig = {
492
+ network: 'regtest',
493
+ defaultKeyType: 'ES256K',
494
+ ordinalsProvider: new OrdMockProvider(),
495
+ enableLogging: false
496
+ };
497
+
498
+ const startTime = Date.now();
499
+
500
+ const batches = Array.from({ length: batchCount }, () => {
501
+ const sdk = OriginalsSDK.create(config);
502
+ const resourcesList = createTestResourcesList(itemsPerBatch);
503
+ return sdk.lifecycle.batchCreateAssets(resourcesList, {
504
+ maxConcurrent: 1,
505
+ continueOnError: true
506
+ });
507
+ });
508
+
509
+ const results = await Promise.all(batches);
510
+ const duration = Date.now() - startTime;
511
+
512
+ const allSuccessful = results.reduce((sum, r) => sum + r.successful.length, 0);
513
+ const allFailed = results.reduce((sum, r) => sum + r.failed.length, 0);
514
+ const avgBatchDuration = results.reduce((sum, r) => sum + r.totalDuration, 0) / batchCount;
515
+
516
+ return {
517
+ totalBatches: batchCount,
518
+ totalItems: batchCount * itemsPerBatch,
519
+ allSuccessful,
520
+ allFailed,
521
+ duration,
522
+ avgBatchDuration
523
+ };
524
+ }
525
+
526
+ function logPerformanceMetrics(
527
+ testName: string,
528
+ itemCount: number,
529
+ duration: number,
530
+ result: any
531
+ ): void {
532
+ const throughput = (itemCount / duration) * 1000; // items per second
533
+
534
+ console.log(`\n[PERFORMANCE] ${testName}:`);
535
+ console.log(` - Total items: ${itemCount}`);
536
+ console.log(` - Successful: ${result.successful.length}`);
537
+ console.log(` - Failed: ${result.failed.length}`);
538
+ console.log(` - Duration: ${duration}ms`);
539
+ console.log(` - Throughput: ${throughput.toFixed(2)} items/sec`);
540
+ console.log(` - Avg time per item: ${(duration / itemCount).toFixed(2)}ms`);
541
+ }
542
+
543
+ function logConcurrencyMetrics(
544
+ testName: string,
545
+ batchCount: number,
546
+ itemsPerBatch: number,
547
+ result: ConcurrencyResult
548
+ ): void {
549
+ const throughput = (result.totalItems / result.duration) * 1000;
550
+
551
+ console.log(`\n[CONCURRENCY] ${testName}:`);
552
+ console.log(` - Concurrent batches: ${batchCount}`);
553
+ console.log(` - Items per batch: ${itemsPerBatch}`);
554
+ console.log(` - Total items: ${result.totalItems}`);
555
+ console.log(` - Successful: ${result.allSuccessful}`);
556
+ console.log(` - Failed: ${result.allFailed}`);
557
+ console.log(` - Total duration: ${result.duration}ms`);
558
+ console.log(` - Avg batch duration: ${result.avgBatchDuration.toFixed(2)}ms`);
559
+ console.log(` - Overall throughput: ${throughput.toFixed(2)} items/sec`);
560
+ }
561
+
562
+ console.log('\n=== Batch Operations Stress Test Suite Complete ===\n');
563
+ console.log('This test suite validates performance and stability under:');
564
+ console.log('- Varying batch sizes (10 to 10,000 assets)');
565
+ console.log('- High concurrency (up to 100 concurrent batches)');
566
+ console.log('- Batch inscription modes (single tx vs individual txs)');
567
+ console.log('- Migration operations under load');
568
+ console.log('- Error recovery and retry mechanisms');
569
+ console.log('- Memory and resource management');
570
+ console.log('- Throughput benchmarks');
571
+ console.log('\n=================================================\n');
@@ -0,0 +1,40 @@
1
+ import { describe, test, expect } from 'bun:test';
2
+ import { FeeOracleMock } from '../../../src/adapters/FeeOracleMock';
3
+
4
+ describe('FeeOracleMock', () => {
5
+ test('constructor initializes with default fee rate', async () => {
6
+ const oracle = new FeeOracleMock();
7
+ const rate = await oracle.estimateFeeRate();
8
+ expect(rate).toBe(7);
9
+ });
10
+
11
+ test('constructor accepts custom fee rate', async () => {
12
+ const oracle = new FeeOracleMock(10);
13
+ const rate = await oracle.estimateFeeRate();
14
+ expect(rate).toBe(10);
15
+ });
16
+
17
+ test('estimateFeeRate returns rate for 1 block', async () => {
18
+ const oracle = new FeeOracleMock(7);
19
+ const rate = await oracle.estimateFeeRate(1);
20
+ expect(rate).toBe(7);
21
+ });
22
+
23
+ test('estimateFeeRate decreases for higher target blocks', async () => {
24
+ const oracle = new FeeOracleMock(7);
25
+ const rate = await oracle.estimateFeeRate(3);
26
+ expect(rate).toBe(5); // 7 - (3 - 1) = 5
27
+ });
28
+
29
+ test('estimateFeeRate returns minimum of 1', async () => {
30
+ const oracle = new FeeOracleMock(2);
31
+ const rate = await oracle.estimateFeeRate(10);
32
+ expect(rate).toBe(1); // Math.max(1, 2 - 9) = 1
33
+ });
34
+
35
+ test('estimateFeeRate works without target blocks parameter', async () => {
36
+ const oracle = new FeeOracleMock(5);
37
+ const rate = await oracle.estimateFeeRate();
38
+ expect(rate).toBe(5);
39
+ });
40
+ });