@btc-vision/bitcoin 7.0.0-alpha.0 → 7.0.0-alpha.10

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 (369) hide show
  1. package/README.md +455 -155
  2. package/browser/address.d.ts +6 -2
  3. package/browser/address.d.ts.map +1 -1
  4. package/browser/block.d.ts.map +1 -1
  5. package/browser/branded.d.ts +3 -14
  6. package/browser/branded.d.ts.map +1 -1
  7. package/browser/chunks/psbt-parallel-BBFlkmiv.js +10717 -0
  8. package/browser/crypto.d.ts +1 -1
  9. package/browser/ecc/context.d.ts +25 -24
  10. package/browser/ecc/context.d.ts.map +1 -1
  11. package/browser/ecc/index.d.ts +1 -1
  12. package/browser/ecc/index.d.ts.map +1 -1
  13. package/browser/ecc/types.d.ts +10 -123
  14. package/browser/ecc/types.d.ts.map +1 -1
  15. package/browser/env.d.ts +13 -0
  16. package/browser/env.d.ts.map +1 -0
  17. package/browser/index.d.ts +7 -7
  18. package/browser/index.d.ts.map +1 -1
  19. package/browser/index.js +2497 -11686
  20. package/browser/io/BinaryReader.d.ts +15 -15
  21. package/browser/io/BinaryReader.d.ts.map +1 -1
  22. package/browser/io/BinaryWriter.d.ts +17 -17
  23. package/browser/io/BinaryWriter.d.ts.map +1 -1
  24. package/browser/io/hex.d.ts.map +1 -1
  25. package/browser/io/index.d.ts +0 -1
  26. package/browser/io/index.d.ts.map +1 -1
  27. package/browser/opcodes.d.ts +11 -0
  28. package/browser/opcodes.d.ts.map +1 -1
  29. package/browser/payments/bip341.d.ts +1 -1
  30. package/browser/payments/bip341.d.ts.map +1 -1
  31. package/browser/payments/embed.d.ts +1 -1
  32. package/browser/payments/embed.d.ts.map +1 -1
  33. package/browser/payments/p2ms.d.ts.map +1 -1
  34. package/browser/payments/p2op.d.ts +1 -1
  35. package/browser/payments/p2op.d.ts.map +1 -1
  36. package/browser/payments/p2pk.d.ts +1 -1
  37. package/browser/payments/p2pk.d.ts.map +1 -1
  38. package/browser/payments/p2pkh.d.ts +1 -1
  39. package/browser/payments/p2pkh.d.ts.map +1 -1
  40. package/browser/payments/p2sh.d.ts.map +1 -1
  41. package/browser/payments/p2tr.d.ts +2 -2
  42. package/browser/payments/p2tr.d.ts.map +1 -1
  43. package/browser/payments/p2wpkh.d.ts +1 -1
  44. package/browser/payments/p2wpkh.d.ts.map +1 -1
  45. package/browser/payments/p2wsh.d.ts.map +1 -1
  46. package/browser/payments/types.d.ts +1 -1
  47. package/browser/payments/types.d.ts.map +1 -1
  48. package/browser/psbt/PsbtCache.d.ts +54 -0
  49. package/browser/psbt/PsbtCache.d.ts.map +1 -0
  50. package/browser/psbt/PsbtFinalizer.d.ts +21 -0
  51. package/browser/psbt/PsbtFinalizer.d.ts.map +1 -0
  52. package/browser/psbt/PsbtSigner.d.ts +32 -0
  53. package/browser/psbt/PsbtSigner.d.ts.map +1 -0
  54. package/browser/psbt/PsbtTransaction.d.ts +25 -0
  55. package/browser/psbt/PsbtTransaction.d.ts.map +1 -0
  56. package/browser/psbt/bip371.d.ts.map +1 -1
  57. package/browser/psbt/types.d.ts +5 -71
  58. package/browser/psbt/types.d.ts.map +1 -1
  59. package/browser/psbt/validation.d.ts +1 -1
  60. package/browser/psbt/validation.d.ts.map +1 -1
  61. package/browser/psbt.d.ts +26 -40
  62. package/browser/psbt.d.ts.map +1 -1
  63. package/browser/script.d.ts.map +1 -1
  64. package/browser/transaction.d.ts +4 -4
  65. package/browser/transaction.d.ts.map +1 -1
  66. package/browser/types.d.ts +5 -3
  67. package/browser/types.d.ts.map +1 -1
  68. package/browser/workers/WorkerSigningPool.d.ts +24 -17
  69. package/browser/workers/WorkerSigningPool.d.ts.map +1 -1
  70. package/browser/workers/WorkerSigningPool.node.d.ts +19 -12
  71. package/browser/workers/WorkerSigningPool.node.d.ts.map +1 -1
  72. package/browser/workers/WorkerSigningPool.sequential.d.ts +67 -0
  73. package/browser/workers/WorkerSigningPool.sequential.d.ts.map +1 -0
  74. package/browser/workers/WorkerSigningPool.worklet.d.ts +64 -0
  75. package/browser/workers/WorkerSigningPool.worklet.d.ts.map +1 -0
  76. package/browser/workers/index.browser.d.ts +16 -0
  77. package/browser/workers/index.browser.d.ts.map +1 -0
  78. package/browser/workers/index.d.ts +4 -64
  79. package/browser/workers/index.d.ts.map +1 -1
  80. package/browser/workers/index.js +28 -0
  81. package/browser/workers/index.node.d.ts +17 -0
  82. package/browser/workers/index.node.d.ts.map +1 -0
  83. package/browser/workers/index.react-native.d.ts +28 -0
  84. package/browser/workers/index.react-native.d.ts.map +1 -0
  85. package/browser/workers/index.shared.d.ts +15 -0
  86. package/browser/workers/index.shared.d.ts.map +1 -0
  87. package/browser/workers/psbt-parallel.d.ts +2 -3
  88. package/browser/workers/psbt-parallel.d.ts.map +1 -1
  89. package/browser/workers/types.d.ts +17 -0
  90. package/browser/workers/types.d.ts.map +1 -1
  91. package/build/address.d.ts +6 -2
  92. package/build/address.d.ts.map +1 -1
  93. package/build/address.js +32 -19
  94. package/build/address.js.map +1 -1
  95. package/build/bech32utils.js.map +1 -1
  96. package/build/block.d.ts.map +1 -1
  97. package/build/block.js +2 -4
  98. package/build/block.js.map +1 -1
  99. package/build/branded.d.ts +3 -14
  100. package/build/branded.d.ts.map +1 -1
  101. package/build/branded.js +0 -5
  102. package/build/branded.js.map +1 -1
  103. package/build/crypto.d.ts +1 -1
  104. package/build/ecc/context.d.ts +25 -24
  105. package/build/ecc/context.d.ts.map +1 -1
  106. package/build/ecc/context.js +29 -101
  107. package/build/ecc/context.js.map +1 -1
  108. package/build/ecc/index.d.ts +1 -1
  109. package/build/ecc/index.d.ts.map +1 -1
  110. package/build/ecc/types.d.ts +7 -126
  111. package/build/ecc/types.d.ts.map +1 -1
  112. package/build/ecc/types.js +4 -1
  113. package/build/ecc/types.js.map +1 -1
  114. package/build/env.d.ts +13 -0
  115. package/build/env.d.ts.map +1 -0
  116. package/build/env.js +198 -0
  117. package/build/env.js.map +1 -0
  118. package/build/index.d.ts +8 -7
  119. package/build/index.d.ts.map +1 -1
  120. package/build/index.js +9 -7
  121. package/build/index.js.map +1 -1
  122. package/build/io/BinaryReader.d.ts +15 -15
  123. package/build/io/BinaryReader.d.ts.map +1 -1
  124. package/build/io/BinaryReader.js +17 -17
  125. package/build/io/BinaryReader.js.map +1 -1
  126. package/build/io/BinaryWriter.d.ts +17 -17
  127. package/build/io/BinaryWriter.d.ts.map +1 -1
  128. package/build/io/BinaryWriter.js +39 -39
  129. package/build/io/BinaryWriter.js.map +1 -1
  130. package/build/io/hex.d.ts.map +1 -1
  131. package/build/io/hex.js +2 -1
  132. package/build/io/hex.js.map +1 -1
  133. package/build/io/index.d.ts +0 -1
  134. package/build/io/index.d.ts.map +1 -1
  135. package/build/io/index.js +0 -2
  136. package/build/io/index.js.map +1 -1
  137. package/build/opcodes.d.ts +11 -0
  138. package/build/opcodes.d.ts.map +1 -1
  139. package/build/opcodes.js +19 -4
  140. package/build/opcodes.js.map +1 -1
  141. package/build/payments/bip341.d.ts +1 -2
  142. package/build/payments/bip341.d.ts.map +1 -1
  143. package/build/payments/bip341.js +1 -2
  144. package/build/payments/bip341.js.map +1 -1
  145. package/build/payments/embed.d.ts +1 -1
  146. package/build/payments/embed.d.ts.map +1 -1
  147. package/build/payments/embed.js +14 -14
  148. package/build/payments/embed.js.map +1 -1
  149. package/build/payments/p2ms.d.ts.map +1 -1
  150. package/build/payments/p2ms.js +21 -21
  151. package/build/payments/p2ms.js.map +1 -1
  152. package/build/payments/p2op.d.ts +1 -1
  153. package/build/payments/p2op.d.ts.map +1 -1
  154. package/build/payments/p2op.js +18 -18
  155. package/build/payments/p2op.js.map +1 -1
  156. package/build/payments/p2pk.d.ts +1 -1
  157. package/build/payments/p2pk.d.ts.map +1 -1
  158. package/build/payments/p2pk.js +17 -17
  159. package/build/payments/p2pk.js.map +1 -1
  160. package/build/payments/p2pkh.d.ts +1 -1
  161. package/build/payments/p2pkh.d.ts.map +1 -1
  162. package/build/payments/p2pkh.js +20 -20
  163. package/build/payments/p2pkh.js.map +1 -1
  164. package/build/payments/p2sh.d.ts.map +1 -1
  165. package/build/payments/p2sh.js +22 -20
  166. package/build/payments/p2sh.js.map +1 -1
  167. package/build/payments/p2tr.d.ts +2 -2
  168. package/build/payments/p2tr.d.ts.map +1 -1
  169. package/build/payments/p2tr.js +25 -26
  170. package/build/payments/p2tr.js.map +1 -1
  171. package/build/payments/p2wpkh.d.ts +1 -1
  172. package/build/payments/p2wpkh.d.ts.map +1 -1
  173. package/build/payments/p2wpkh.js +20 -20
  174. package/build/payments/p2wpkh.js.map +1 -1
  175. package/build/payments/p2wsh.d.ts.map +1 -1
  176. package/build/payments/p2wsh.js +22 -22
  177. package/build/payments/p2wsh.js.map +1 -1
  178. package/build/payments/types.d.ts +1 -1
  179. package/build/payments/types.d.ts.map +1 -1
  180. package/build/psbt/PsbtCache.d.ts +54 -0
  181. package/build/psbt/PsbtCache.d.ts.map +1 -0
  182. package/build/psbt/PsbtCache.js +249 -0
  183. package/build/psbt/PsbtCache.js.map +1 -0
  184. package/build/psbt/PsbtFinalizer.d.ts +21 -0
  185. package/build/psbt/PsbtFinalizer.d.ts.map +1 -0
  186. package/build/psbt/PsbtFinalizer.js +157 -0
  187. package/build/psbt/PsbtFinalizer.js.map +1 -0
  188. package/build/psbt/PsbtSigner.d.ts +32 -0
  189. package/build/psbt/PsbtSigner.d.ts.map +1 -0
  190. package/build/psbt/PsbtSigner.js +192 -0
  191. package/build/psbt/PsbtSigner.js.map +1 -0
  192. package/build/psbt/PsbtTransaction.d.ts +25 -0
  193. package/build/psbt/PsbtTransaction.d.ts.map +1 -0
  194. package/build/psbt/PsbtTransaction.js +61 -0
  195. package/build/psbt/PsbtTransaction.js.map +1 -0
  196. package/build/psbt/bip371.d.ts.map +1 -1
  197. package/build/psbt/bip371.js +6 -2
  198. package/build/psbt/bip371.js.map +1 -1
  199. package/build/psbt/psbtutils.js +1 -1
  200. package/build/psbt/psbtutils.js.map +1 -1
  201. package/build/psbt/types.d.ts +5 -71
  202. package/build/psbt/types.d.ts.map +1 -1
  203. package/build/psbt/validation.d.ts +1 -1
  204. package/build/psbt/validation.d.ts.map +1 -1
  205. package/build/psbt/validation.js +1 -1
  206. package/build/psbt/validation.js.map +1 -1
  207. package/build/psbt.d.ts +26 -40
  208. package/build/psbt.d.ts.map +1 -1
  209. package/build/psbt.js +180 -808
  210. package/build/psbt.js.map +1 -1
  211. package/build/script.d.ts.map +1 -1
  212. package/build/script.js +4 -4
  213. package/build/script.js.map +1 -1
  214. package/build/transaction.d.ts +4 -4
  215. package/build/transaction.d.ts.map +1 -1
  216. package/build/transaction.js +6 -5
  217. package/build/transaction.js.map +1 -1
  218. package/build/tsconfig.build.tsbuildinfo +1 -1
  219. package/build/types.d.ts +5 -3
  220. package/build/types.d.ts.map +1 -1
  221. package/build/types.js +14 -25
  222. package/build/types.js.map +1 -1
  223. package/build/workers/WorkerSigningPool.d.ts +24 -17
  224. package/build/workers/WorkerSigningPool.d.ts.map +1 -1
  225. package/build/workers/WorkerSigningPool.js +36 -25
  226. package/build/workers/WorkerSigningPool.js.map +1 -1
  227. package/build/workers/WorkerSigningPool.node.d.ts +19 -12
  228. package/build/workers/WorkerSigningPool.node.d.ts.map +1 -1
  229. package/build/workers/WorkerSigningPool.node.js +60 -28
  230. package/build/workers/WorkerSigningPool.node.js.map +1 -1
  231. package/build/workers/WorkerSigningPool.sequential.d.ts +76 -0
  232. package/build/workers/WorkerSigningPool.sequential.d.ts.map +1 -0
  233. package/build/workers/WorkerSigningPool.sequential.js +160 -0
  234. package/build/workers/WorkerSigningPool.sequential.js.map +1 -0
  235. package/build/workers/WorkerSigningPool.worklet.d.ts +79 -0
  236. package/build/workers/WorkerSigningPool.worklet.d.ts.map +1 -0
  237. package/build/workers/WorkerSigningPool.worklet.js +390 -0
  238. package/build/workers/WorkerSigningPool.worklet.js.map +1 -0
  239. package/build/workers/index.browser.d.ts +24 -0
  240. package/build/workers/index.browser.d.ts.map +1 -0
  241. package/build/workers/index.browser.js +30 -0
  242. package/build/workers/index.browser.js.map +1 -0
  243. package/build/workers/index.d.ts +6 -18
  244. package/build/workers/index.d.ts.map +1 -1
  245. package/build/workers/index.js +12 -14
  246. package/build/workers/index.js.map +1 -1
  247. package/build/workers/index.node.d.ts +38 -0
  248. package/build/workers/index.node.d.ts.map +1 -0
  249. package/build/workers/index.node.js +45 -0
  250. package/build/workers/index.node.js.map +1 -0
  251. package/build/workers/index.react-native.d.ts +28 -0
  252. package/build/workers/index.react-native.d.ts.map +1 -0
  253. package/build/workers/index.react-native.js +67 -0
  254. package/build/workers/index.react-native.js.map +1 -0
  255. package/build/workers/index.shared.d.ts +15 -0
  256. package/build/workers/index.shared.d.ts.map +1 -0
  257. package/build/workers/index.shared.js +20 -0
  258. package/build/workers/index.shared.js.map +1 -0
  259. package/build/workers/psbt-parallel.d.ts +2 -3
  260. package/build/workers/psbt-parallel.d.ts.map +1 -1
  261. package/build/workers/psbt-parallel.js +4 -4
  262. package/build/workers/psbt-parallel.js.map +1 -1
  263. package/build/workers/types.d.ts +17 -0
  264. package/build/workers/types.d.ts.map +1 -1
  265. package/build/workers/types.js.map +1 -1
  266. package/package.json +48 -9
  267. package/src/address.ts +53 -21
  268. package/src/bech32utils.ts +3 -3
  269. package/src/block.ts +17 -10
  270. package/src/branded.ts +15 -13
  271. package/src/crypto.ts +1 -1
  272. package/src/ecc/context.ts +36 -136
  273. package/src/ecc/index.ts +2 -2
  274. package/src/ecc/types.ts +7 -145
  275. package/src/env.ts +239 -0
  276. package/src/index.ts +57 -22
  277. package/src/io/BinaryReader.ts +18 -18
  278. package/src/io/BinaryWriter.ts +43 -43
  279. package/src/io/hex.ts +2 -1
  280. package/src/io/index.ts +0 -3
  281. package/src/opcodes.ts +21 -4
  282. package/src/payments/bip341.ts +5 -7
  283. package/src/payments/embed.ts +19 -19
  284. package/src/payments/p2ms.ts +34 -27
  285. package/src/payments/p2op.ts +22 -22
  286. package/src/payments/p2pk.ts +22 -22
  287. package/src/payments/p2pkh.ts +28 -28
  288. package/src/payments/p2sh.ts +33 -30
  289. package/src/payments/p2tr.ts +40 -40
  290. package/src/payments/p2wpkh.ts +30 -30
  291. package/src/payments/p2wsh.ts +29 -29
  292. package/src/payments/types.ts +1 -1
  293. package/src/psbt/PsbtCache.ts +325 -0
  294. package/src/psbt/PsbtFinalizer.ts +213 -0
  295. package/src/psbt/PsbtSigner.ts +302 -0
  296. package/src/psbt/PsbtTransaction.ts +82 -0
  297. package/src/psbt/bip371.ts +7 -3
  298. package/src/psbt/psbtutils.ts +1 -1
  299. package/src/psbt/types.ts +5 -94
  300. package/src/psbt/validation.ts +5 -12
  301. package/src/psbt.ts +376 -1201
  302. package/src/script.ts +6 -9
  303. package/src/transaction.ts +19 -15
  304. package/src/types.ts +33 -45
  305. package/src/workers/WorkerSigningPool.node.ts +72 -36
  306. package/src/workers/WorkerSigningPool.sequential.ts +191 -0
  307. package/src/workers/WorkerSigningPool.ts +48 -39
  308. package/src/workers/WorkerSigningPool.worklet.ts +522 -0
  309. package/src/workers/index.browser.ts +34 -0
  310. package/src/workers/index.node.ts +50 -0
  311. package/src/workers/index.react-native.ts +110 -0
  312. package/src/workers/index.shared.ts +58 -0
  313. package/src/workers/index.ts +14 -65
  314. package/src/workers/psbt-parallel.ts +8 -13
  315. package/src/workers/types.ts +26 -1
  316. package/test/address.spec.ts +2 -2
  317. package/test/bitcoin.core.spec.ts +5 -2
  318. package/test/browser/payments.spec.ts +151 -0
  319. package/test/browser/psbt.spec.ts +1510 -0
  320. package/test/browser/script.spec.ts +223 -0
  321. package/test/browser/setup.ts +13 -0
  322. package/test/browser/workers-signing.spec.ts +537 -0
  323. package/test/crypto.spec.ts +2 -2
  324. package/test/env.spec.ts +418 -0
  325. package/test/fixtures/core/base58_encode_decode.json +12 -48
  326. package/test/fixtures/core/base58_keys_invalid.json +50 -150
  327. package/test/fixtures/core/sighash.json +1 -3
  328. package/test/fixtures/core/tx_valid.json +133 -501
  329. package/test/fixtures/embed.json +3 -11
  330. package/test/fixtures/p2ms.json +21 -91
  331. package/test/fixtures/p2pk.json +5 -24
  332. package/test/fixtures/p2pkh.json +7 -36
  333. package/test/fixtures/p2sh.json +8 -54
  334. package/test/fixtures/p2tr.json +2 -6
  335. package/test/fixtures/p2wpkh.json +7 -36
  336. package/test/fixtures/p2wsh.json +14 -59
  337. package/test/fixtures/psbt.json +2 -6
  338. package/test/fixtures/script.json +12 -48
  339. package/test/integration/addresses.spec.ts +11 -5
  340. package/test/integration/bip32.spec.ts +1 -1
  341. package/test/integration/cltv.spec.ts +10 -6
  342. package/test/integration/csv.spec.ts +10 -9
  343. package/test/integration/payments.spec.ts +8 -4
  344. package/test/integration/taproot.spec.ts +26 -6
  345. package/test/integration/transactions.spec.ts +22 -8
  346. package/test/payments.spec.ts +1 -1
  347. package/test/payments.utils.ts +1 -1
  348. package/test/psbt.spec.ts +250 -64
  349. package/test/script_signature.spec.ts +1 -1
  350. package/test/transaction.spec.ts +18 -5
  351. package/test/tsconfig.json +6 -20
  352. package/test/workers-pool.spec.ts +65 -23
  353. package/test/workers-sequential.spec.ts +669 -0
  354. package/test/workers-signing.spec.ts +7 -3
  355. package/test/workers-worklet.spec.ts +500 -0
  356. package/test/workers.spec.ts +6 -7
  357. package/typedoc.json +39 -0
  358. package/vite.config.browser.ts +31 -6
  359. package/vitest.config.browser.ts +68 -0
  360. package/browser/ecpair.d.ts +0 -99
  361. package/browser/io/MemoryPool.d.ts +0 -220
  362. package/browser/io/MemoryPool.d.ts.map +0 -1
  363. package/build/io/MemoryPool.d.ts +0 -220
  364. package/build/io/MemoryPool.d.ts.map +0 -1
  365. package/build/io/MemoryPool.js +0 -309
  366. package/build/io/MemoryPool.js.map +0 -1
  367. package/src/ecpair.d.ts +0 -99
  368. package/src/io/MemoryPool.ts +0 -343
  369. package/test/taproot-cache.spec.ts +0 -694
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Node.js worker pool entry point.
3
+ *
4
+ * Uses worker_threads for parallel signing. Provides direct access to
5
+ * NodeWorkerSigningPool without runtime detection overhead.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { NodeWorkerSigningPool } from '@btc-vision/bitcoin/workers';
10
+ *
11
+ * const pool = NodeWorkerSigningPool.getInstance({ workerCount: 4 });
12
+ * await pool.initialize();
13
+ * pool.preserveWorkers();
14
+ *
15
+ * const result = await pool.signBatch(tasks, keyPair);
16
+ *
17
+ * await pool.shutdown();
18
+ * ```
19
+ *
20
+ * @packageDocumentation
21
+ */
22
+
23
+ import type { WorkerPoolConfig, SigningPoolLike } from './types.js';
24
+
25
+ export * from './index.shared.js';
26
+
27
+ // Node.js specific exports
28
+ export { NodeWorkerSigningPool, type NodeWorkerPoolConfig } from './WorkerSigningPool.node.js';
29
+
30
+ /**
31
+ * Detects the runtime environment.
32
+ *
33
+ * @returns Always 'node' in this entry point.
34
+ */
35
+ export function detectRuntime(): 'node' | 'browser' | 'react-native' | 'unknown' {
36
+ return 'node';
37
+ }
38
+
39
+ /**
40
+ * Creates a signing pool for the Node.js runtime using worker_threads.
41
+ *
42
+ * @param config - Optional pool configuration
43
+ * @returns A promise resolving to the initialized signing pool
44
+ */
45
+ export async function createSigningPool(config?: WorkerPoolConfig): Promise<SigningPoolLike> {
46
+ const { NodeWorkerSigningPool } = await import('./WorkerSigningPool.node.js');
47
+ const pool = NodeWorkerSigningPool.getInstance(config);
48
+ await pool.initialize();
49
+ return pool;
50
+ }
@@ -0,0 +1,110 @@
1
+ /**
2
+ * React Native entry point for the workers module.
3
+ *
4
+ * Provides the same public API as the browser/Node.js workers module
5
+ * but uses WorkletSigningPool (parallel via react-native-worklets)
6
+ * when available, falling back to SequentialSigningPool (main-thread).
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+
11
+ // Type exports (same as main index.ts)
12
+ export {
13
+ SignatureType,
14
+ type SigningTaskMessage,
15
+ type BatchSigningMessage,
16
+ type BatchSigningTask,
17
+ type BatchSigningResultMessage,
18
+ type BatchSigningTaskResult,
19
+ type BatchSigningTaskError,
20
+ type WorkerInitMessage,
21
+ type WorkerShutdownMessage,
22
+ type WorkerMessage,
23
+ type SigningResultMessage,
24
+ type SigningErrorMessage,
25
+ type WorkerReadyMessage,
26
+ type WorkerShutdownAckMessage,
27
+ type WorkerResponse,
28
+ isSigningError,
29
+ isSigningResult,
30
+ isBatchResult,
31
+ isWorkerReady,
32
+ type WorkerEccLib,
33
+ type WorkerPoolConfig,
34
+ type SigningTask,
35
+ type ParallelSignerKeyPair,
36
+ type ParallelSigningResult,
37
+ type SigningPoolLike,
38
+ WorkerState,
39
+ type PooledWorker,
40
+ } from './types.js';
41
+
42
+ // Sequential pool (React Native fallback)
43
+ export { SequentialSigningPool } from './WorkerSigningPool.sequential.js';
44
+
45
+ // Worklet pool (React Native parallel signing)
46
+ export { WorkletSigningPool } from './WorkerSigningPool.worklet.js';
47
+
48
+ // Alias for API compatibility — consumers using `WorkerSigningPool` get the sequential pool
49
+ export { SequentialSigningPool as WorkerSigningPool } from './WorkerSigningPool.sequential.js';
50
+
51
+ // PSBT parallel signing integration (works with any SigningPoolLike)
52
+ export {
53
+ signPsbtParallel,
54
+ prepareSigningTasks,
55
+ applySignaturesToPsbt,
56
+ type ParallelSignOptions,
57
+ type PsbtParallelKeyPair,
58
+ } from './psbt-parallel.js';
59
+
60
+ /**
61
+ * Detects the runtime environment.
62
+ *
63
+ * @returns Always 'react-native' in this entry point.
64
+ */
65
+ export function detectRuntime(): 'node' | 'browser' | 'react-native' | 'unknown' {
66
+ return 'react-native';
67
+ }
68
+
69
+ /**
70
+ * Cached result of the worklets availability check.
71
+ * `null` = not yet checked, `true` = available, `false` = unavailable.
72
+ */
73
+ let workletsAvailable: boolean | null = null;
74
+
75
+ /**
76
+ * Creates a signing pool appropriate for the React Native runtime.
77
+ *
78
+ * Tries to use WorkletSigningPool (parallel via react-native-worklets).
79
+ * Falls back to SequentialSigningPool if worklets are not installed.
80
+ */
81
+ export async function createSigningPool(
82
+ config?: import('./types.js').WorkerPoolConfig,
83
+ ): Promise<import('./types.js').SigningPoolLike> {
84
+ // Check worklets availability (cached after first probe)
85
+ if (workletsAvailable === null) {
86
+ try {
87
+ await import('react-native-worklets' as string);
88
+ workletsAvailable = true;
89
+ } catch {
90
+ workletsAvailable = false;
91
+ }
92
+ }
93
+
94
+ if (workletsAvailable) {
95
+ try {
96
+ const { WorkletSigningPool } = await import('./WorkerSigningPool.worklet.js');
97
+ const pool = WorkletSigningPool.getInstance(config);
98
+ await pool.initialize();
99
+ return pool;
100
+ } catch {
101
+ // Initialization failed (e.g. eval blocked) — fall through
102
+ workletsAvailable = false;
103
+ }
104
+ }
105
+
106
+ const { SequentialSigningPool } = await import('./WorkerSigningPool.sequential.js');
107
+ const pool = SequentialSigningPool.getInstance(config);
108
+ await pool.initialize();
109
+ return pool;
110
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Shared worker module exports.
3
+ *
4
+ * Contains all platform-agnostic exports used by browser, Node.js, and generic
5
+ * entry points. Platform-specific entry points re-export from this module and
6
+ * add their own `detectRuntime` and `createSigningPool` implementations.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+
11
+ // Type exports
12
+ export {
13
+ SignatureType,
14
+ type SigningTaskMessage,
15
+ type BatchSigningMessage,
16
+ type BatchSigningTask,
17
+ type BatchSigningResultMessage,
18
+ type BatchSigningTaskResult,
19
+ type BatchSigningTaskError,
20
+ type WorkerInitMessage,
21
+ type WorkerShutdownMessage,
22
+ type WorkerMessage,
23
+ type SigningResultMessage,
24
+ type SigningErrorMessage,
25
+ type WorkerReadyMessage,
26
+ type WorkerShutdownAckMessage,
27
+ type WorkerResponse,
28
+ isSigningError,
29
+ isSigningResult,
30
+ isBatchResult,
31
+ isWorkerReady,
32
+ type WorkerEccLib,
33
+ type WorkerPoolConfig,
34
+ type SigningTask,
35
+ type ParallelSignerKeyPair,
36
+ type ParallelSigningResult,
37
+ type SigningPoolLike,
38
+ WorkerState,
39
+ type PooledWorker,
40
+ } from './types.js';
41
+
42
+ // Browser worker pool
43
+ export { WorkerSigningPool, getSigningPool } from './WorkerSigningPool.js';
44
+
45
+ // Worker code generation (for custom implementations)
46
+ export { generateWorkerCode, createWorkerBlobUrl, revokeWorkerBlobUrl } from './signing-worker.js';
47
+
48
+ // ECC bundle (for embedding in custom workers)
49
+ export { ECC_BUNDLE, ECC_BUNDLE_SIZE } from './ecc-bundle.js';
50
+
51
+ // PSBT parallel signing integration
52
+ export {
53
+ signPsbtParallel,
54
+ prepareSigningTasks,
55
+ applySignaturesToPsbt,
56
+ type ParallelSignOptions,
57
+ type PsbtParallelKeyPair,
58
+ } from './psbt-parallel.js';
@@ -1,8 +1,9 @@
1
1
  /**
2
- * Worker-based parallel signing module.
2
+ * Worker-based parallel signing module (generic entry point).
3
3
  *
4
4
  * Provides secure parallel signature computation using worker threads.
5
5
  * Works in both Node.js (worker_threads) and browsers (Web Workers).
6
+ * Uses runtime detection to select the appropriate pool implementation.
6
7
  *
7
8
  * @example
8
9
  * ```typescript
@@ -46,63 +47,19 @@
46
47
  * @packageDocumentation
47
48
  */
48
49
 
49
- // Type exports
50
- export {
51
- SignatureType,
52
- type SigningTaskMessage,
53
- type BatchSigningMessage,
54
- type BatchSigningTask,
55
- type BatchSigningResultMessage,
56
- type BatchSigningTaskResult,
57
- type BatchSigningTaskError,
58
- type WorkerInitMessage,
59
- type WorkerShutdownMessage,
60
- type WorkerMessage,
61
- type SigningResultMessage,
62
- type SigningErrorMessage,
63
- type WorkerReadyMessage,
64
- type WorkerShutdownAckMessage,
65
- type WorkerResponse,
66
- isSigningError,
67
- isSigningResult,
68
- isBatchResult,
69
- isWorkerReady,
70
- type WorkerEccLib,
71
- type WorkerPoolConfig,
72
- type SigningTask,
73
- type ParallelSignerKeyPair,
74
- type ParallelSigningResult,
75
- WorkerState,
76
- type PooledWorker,
77
- } from './types.js';
50
+ import type { WorkerPoolConfig, SigningPoolLike } from './types.js';
78
51
 
79
- // Browser worker pool
80
- export { WorkerSigningPool, getSigningPool } from './WorkerSigningPool.js';
81
-
82
- // Worker code generation (for custom implementations)
83
- export { generateWorkerCode, createWorkerBlobUrl, revokeWorkerBlobUrl } from './signing-worker.js';
84
-
85
- // ECC bundle (for embedding in custom workers)
86
- export { ECC_BUNDLE, ECC_BUNDLE_SIZE } from './ecc-bundle.js';
87
-
88
- // Node.js specific exports (use dynamic import in browser builds)
89
- export { type NodeWorkerPoolConfig } from './WorkerSigningPool.node.js';
90
-
91
- // PSBT parallel signing integration
92
- export {
93
- signPsbtParallel,
94
- prepareSigningTasks,
95
- applySignaturesToPsbt,
96
- type ParallelSignOptions,
97
- type PsbtParallelKeyPair,
98
- } from './psbt-parallel.js';
52
+ export * from './index.shared.js';
99
53
 
100
54
  /**
101
55
  * Detects the runtime environment and returns the appropriate signing pool.
102
56
  *
103
57
  * @returns 'node' for Node.js, 'browser' for browsers, 'unknown' otherwise
104
58
  */
105
- export function detectRuntime(): 'node' | 'browser' | 'unknown' {
59
+ export function detectRuntime(): 'node' | 'browser' | 'react-native' | 'unknown' {
60
+ if (typeof navigator !== 'undefined' && (navigator as {product?: string}).product === 'ReactNative') {
61
+ return 'react-native';
62
+ }
106
63
  if (typeof process !== 'undefined' && process.versions?.node) {
107
64
  return 'node';
108
65
  }
@@ -133,23 +90,10 @@ export function detectRuntime(): 'node' | 'browser' | 'unknown' {
133
90
  * await pool.shutdown();
134
91
  * ```
135
92
  */
136
- export async function createSigningPool(config?: import('./types.js').WorkerPoolConfig): Promise<{
137
- signBatch: (
138
- tasks: readonly import('./types.js').SigningTask[],
139
- keyPair: import('./types.js').ParallelSignerKeyPair,
140
- ) => Promise<import('./types.js').ParallelSigningResult>;
141
- preserveWorkers: () => void;
142
- releaseWorkers: () => void;
143
- shutdown: () => Promise<void>;
144
- workerCount: number;
145
- idleWorkerCount: number;
146
- busyWorkerCount: number;
147
- isPreservingWorkers: boolean;
148
- }> {
93
+ export async function createSigningPool(config?: WorkerPoolConfig): Promise<SigningPoolLike> {
149
94
  const runtime = detectRuntime();
150
95
 
151
96
  if (runtime === 'node') {
152
- // Dynamic import for Node.js to avoid bundler issues
153
97
  const { NodeWorkerSigningPool } = await import('./WorkerSigningPool.node.js');
154
98
  const pool = NodeWorkerSigningPool.getInstance(config);
155
99
  await pool.initialize();
@@ -159,6 +103,11 @@ export async function createSigningPool(config?: import('./types.js').WorkerPool
159
103
  const pool = WorkerSigningPool.getInstance(config);
160
104
  await pool.initialize();
161
105
  return pool;
106
+ } else if (runtime === 'react-native') {
107
+ const { SequentialSigningPool } = await import('./WorkerSigningPool.sequential.js');
108
+ const pool = SequentialSigningPool.getInstance(config);
109
+ await pool.initialize();
110
+ return pool;
162
111
  } else {
163
112
  throw new Error('Unsupported runtime for worker signing pool');
164
113
  }
@@ -28,18 +28,12 @@
28
28
  * @packageDocumentation
29
29
  */
30
30
 
31
- import type { PsbtInput, TapScriptSig, TapKeySig } from 'bip174';
31
+ import type { PsbtInput, TapKeySig, TapScriptSig } from 'bip174';
32
32
  import type { PublicKey } from '../types.js';
33
33
  import type { Psbt } from '../psbt.js';
34
34
  import { Transaction } from '../transaction.js';
35
- import type {
36
- SigningTask,
37
- ParallelSignerKeyPair,
38
- ParallelSigningResult,
39
- WorkerPoolConfig,
40
- } from './types.js';
35
+ import type { ParallelSignerKeyPair, ParallelSigningResult, SigningPoolLike, SigningTask, WorkerPoolConfig, } from './types.js';
41
36
  import { SignatureType } from './types.js';
42
- import { WorkerSigningPool } from './WorkerSigningPool.js';
43
37
  import { toXOnly } from '../pubkey.js';
44
38
  import { isTaprootInput, serializeTaprootSignature } from '../psbt/bip371.js';
45
39
  import * as bscript from '../script.js';
@@ -113,16 +107,17 @@ export interface PsbtParallelKeyPair extends ParallelSignerKeyPair {
113
107
  export async function signPsbtParallel(
114
108
  psbt: Psbt,
115
109
  keyPair: PsbtParallelKeyPair,
116
- poolOrConfig?: WorkerSigningPool | WorkerPoolConfig,
110
+ poolOrConfig?: SigningPoolLike | WorkerPoolConfig,
117
111
  options: ParallelSignOptions = {},
118
112
  ): Promise<ParallelSigningResult> {
119
113
  // Get or create pool
120
- let pool: WorkerSigningPool;
114
+ let pool: SigningPoolLike;
121
115
  let shouldShutdown = false;
122
116
 
123
- if (poolOrConfig instanceof WorkerSigningPool) {
117
+ if (poolOrConfig && 'signBatch' in poolOrConfig) {
124
118
  pool = poolOrConfig;
125
119
  } else {
120
+ const { WorkerSigningPool } = await import('./WorkerSigningPool.js');
126
121
  pool = WorkerSigningPool.getInstance(poolOrConfig);
127
122
  if (!pool.isPreservingWorkers) {
128
123
  shouldShutdown = true;
@@ -315,12 +310,12 @@ export function applySignaturesToPsbt(
315
310
  } else {
316
311
  // ECDSA signature
317
312
  const encodedSig = bscript.signature.encode(
318
- Buffer.from(sigResult.signature),
313
+ sigResult.signature,
319
314
  input.sighashType ?? Transaction.SIGHASH_ALL,
320
315
  );
321
316
  const partialSig = [
322
317
  {
323
- pubkey: Buffer.from(pubkey),
318
+ pubkey: Uint8Array.from(pubkey),
324
319
  signature: encodedSig,
325
320
  },
326
321
  ];
@@ -153,7 +153,11 @@ export interface BatchSigningResultMessage {
153
153
  /**
154
154
  * All possible messages to worker.
155
155
  */
156
- export type WorkerMessage = SigningTaskMessage | BatchSigningMessage | WorkerInitMessage | WorkerShutdownMessage;
156
+ export type WorkerMessage =
157
+ | SigningTaskMessage
158
+ | BatchSigningMessage
159
+ | WorkerInitMessage
160
+ | WorkerShutdownMessage;
157
161
 
158
162
  /**
159
163
  * Result from worker after signing.
@@ -396,6 +400,27 @@ export const WorkerState = {
396
400
 
397
401
  export type WorkerState = (typeof WorkerState)[keyof typeof WorkerState];
398
402
 
403
+ /**
404
+ * Minimum contract for any signing pool implementation.
405
+ *
406
+ * Implemented by WorkerSigningPool (browser), NodeWorkerSigningPool (Node.js),
407
+ * and SequentialSigningPool (React Native / fallback).
408
+ */
409
+ export interface SigningPoolLike extends Disposable, AsyncDisposable {
410
+ signBatch(
411
+ tasks: readonly SigningTask[],
412
+ keyPair: ParallelSignerKeyPair,
413
+ ): Promise<ParallelSigningResult>;
414
+ preserveWorkers(): void;
415
+ releaseWorkers(): void;
416
+ initialize(): Promise<void>;
417
+ shutdown(): Promise<void>;
418
+ readonly workerCount: number;
419
+ readonly idleWorkerCount: number;
420
+ readonly busyWorkerCount: number;
421
+ readonly isPreservingWorkers: boolean;
422
+ }
423
+
399
424
  /**
400
425
  * Internal worker wrapper for pool management.
401
426
  */
@@ -6,11 +6,11 @@ import { fromBech32 } from '../src/bech32utils.js';
6
6
  import * as bscript from '../src/script.js';
7
7
  import fixtures from './fixtures/address.json' with { type: 'json' };
8
8
 
9
- import { initEccLib } from '../src/index.js';
10
9
  import type { EccLib } from '../src/index.js';
10
+ import { initEccLib } from '../src/index.js';
11
11
  import type { Network } from '../src/networks.js';
12
12
  import * as networks from '../src/networks.js';
13
- import { toHex, fromHex } from '../src/io/index.js';
13
+ import { fromHex, toHex } from '../src/io/index.js';
14
14
  import type { Bytes20 } from '../src/types.js';
15
15
 
16
16
  const NETWORKS: Record<string, Network> = Object.assign(
@@ -3,7 +3,7 @@ import base58 from 'bs58';
3
3
  import { describe, it } from 'vitest';
4
4
  import * as bitcoin from '../src/index.js';
5
5
  import type { Bytes20, Satoshi, Script } from '../src/types.js';
6
- import { toHex, fromHex, reverseCopy } from '../src/io/index.js';
6
+ import { fromHex, reverseCopy, toHex } from '../src/io/index.js';
7
7
  import base58EncodeDecode from './fixtures/core/base58_encode_decode.json' with { type: 'json' };
8
8
  import base58KeysInvalid from './fixtures/core/base58_keys_invalid.json' with { type: 'json' };
9
9
  import base58KeysValid from './fixtures/core/base58_keys_valid.json' with { type: 'json' };
@@ -57,7 +57,10 @@ describe('Bitcoin-core', () => {
57
57
  const version = network[typeMap[params.addrType]];
58
58
 
59
59
  it(`can export ${expected as string}`, () => {
60
- assert.strictEqual(bitcoin.address.toBase58Check(hash as Bytes20, version), expected);
60
+ assert.strictEqual(
61
+ bitcoin.address.toBase58Check(hash as Bytes20, version),
62
+ expected,
63
+ );
61
64
  });
62
65
  });
63
66
  });
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Browser-adapted version of test/payments.spec.ts
3
+ * Replaces fs.readFileSync with static JSON imports.
4
+ */
5
+ import assert from 'assert';
6
+ import * as ecc from 'tiny-secp256k1';
7
+ import { beforeEach, describe, it } from 'vitest';
8
+ import type { EccLib } from '../../src/index.js';
9
+ import { initEccLib } from '../../src/index.js';
10
+ import type { P2SHPayment, PaymentCreator } from '../../src/payments/index.js';
11
+ import { p2pk, p2wsh } from '../../src/payments/index.js';
12
+ import * as u from '../payments.utils.js';
13
+ import { fromHex } from '../../src/io/index.js';
14
+ import type { PublicKey } from '../../src/types.js';
15
+
16
+ // Pre-load all payment modules synchronously-like at import time
17
+ import * as embedModule from '../../src/payments/embed.js';
18
+ import * as p2msModule from '../../src/payments/p2ms.js';
19
+ import * as p2pkModule from '../../src/payments/p2pk.js';
20
+ import * as p2pkhModule from '../../src/payments/p2pkh.js';
21
+ import * as p2shModule from '../../src/payments/p2sh.js';
22
+ import * as p2wpkhModule from '../../src/payments/p2wpkh.js';
23
+ import * as p2wshModule from '../../src/payments/p2wsh.js';
24
+ import * as p2trModule from '../../src/payments/p2tr.js';
25
+
26
+ // Static JSON imports instead of fs.readFileSync
27
+ import embedFixtures from '../fixtures/embed.json' with { type: 'json' };
28
+ import p2msFixtures from '../fixtures/p2ms.json' with { type: 'json' };
29
+ import p2pkFixtures from '../fixtures/p2pk.json' with { type: 'json' };
30
+ import p2pkhFixtures from '../fixtures/p2pkh.json' with { type: 'json' };
31
+ import p2shFixtures from '../fixtures/p2sh.json' with { type: 'json' };
32
+ import p2wpkhFixtures from '../fixtures/p2wpkh.json' with { type: 'json' };
33
+ import p2wshFixtures from '../fixtures/p2wsh.json' with { type: 'json' };
34
+ import p2trFixtures from '../fixtures/p2tr.json' with { type: 'json' };
35
+
36
+ const fixtureMap: Record<string, any> = {
37
+ embed: embedFixtures,
38
+ p2ms: p2msFixtures,
39
+ p2pk: p2pkFixtures,
40
+ p2pkh: p2pkhFixtures,
41
+ p2sh: p2shFixtures,
42
+ p2wpkh: p2wpkhFixtures,
43
+ p2wsh: p2wshFixtures,
44
+ p2tr: p2trFixtures,
45
+ };
46
+
47
+ const paymentModules: Record<string, { [key: string]: PaymentCreator }> = {
48
+ embed: embedModule as any,
49
+ p2ms: p2msModule as any,
50
+ p2pk: p2pkModule as any,
51
+ p2pkh: p2pkhModule as any,
52
+ p2sh: p2shModule as any,
53
+ p2wpkh: p2wpkhModule as any,
54
+ p2wsh: p2wshModule as any,
55
+ p2tr: p2trModule as any,
56
+ };
57
+
58
+ // Initialize ECC library at module load time
59
+ initEccLib(ecc as unknown as EccLib);
60
+
61
+ ['embed', 'p2ms', 'p2pk', 'p2pkh', 'p2sh', 'p2wpkh', 'p2wsh', 'p2tr'].forEach((p) => {
62
+ describe(p, () => {
63
+ // Ensure ECC library is initialized before each test
64
+ beforeEach(() => {
65
+ initEccLib(ecc as unknown as EccLib);
66
+ });
67
+
68
+ const payment = paymentModules[p]!;
69
+ let fn: PaymentCreator;
70
+ if (p === 'embed') {
71
+ fn = payment['p2data']!;
72
+ } else {
73
+ fn = payment[p]!;
74
+ }
75
+
76
+ const fixtures = fixtureMap[p];
77
+ fixtures.valid.forEach((f: any) => {
78
+ it(f.description + ' as expected', () => {
79
+ const args = u.preform(f.arguments);
80
+ const actual = fn(args, f.options);
81
+
82
+ u.equate(actual, f.expected, f.arguments);
83
+ });
84
+
85
+ it(f.description + ' as expected (no validation)', () => {
86
+ const args = u.preform(f.arguments);
87
+ const actual = fn(
88
+ args,
89
+ Object.assign({}, f.options, {
90
+ validate: false,
91
+ }),
92
+ );
93
+
94
+ u.equate(actual, f.expected, f.arguments);
95
+ });
96
+ });
97
+
98
+ if (p === 'p2sh') {
99
+ it('properly assembles nested p2wsh with names', () => {
100
+ const actual = fn({
101
+ redeem: p2wsh({
102
+ redeem: p2pk({
103
+ pubkey: fromHex(
104
+ '03e15819590382a9dd878f01e2f0cbce541564eb415e43b440472d883ecd283058',
105
+ ) as PublicKey,
106
+ }),
107
+ }),
108
+ } as P2SHPayment);
109
+ assert.strictEqual(actual.address, '3MGbrbye4ttNUXM8WAvBFRKry4fkS9fjuw');
110
+ assert.strictEqual(actual.name, 'p2sh-p2wsh-p2pk');
111
+ assert.strictEqual(actual.redeem!.name, 'p2wsh-p2pk');
112
+ assert.strictEqual(actual.redeem!.redeem!.name, 'p2pk');
113
+ });
114
+ }
115
+
116
+ // cross-verify dynamically too
117
+ if (!fixtures.dynamic) return;
118
+ const { depends, details } = fixtures.dynamic;
119
+
120
+ details.forEach((f: any) => {
121
+ const detail = u.preform(f);
122
+ const disabled: any = {};
123
+ if (f.disabled)
124
+ f.disabled.forEach((k: string) => {
125
+ disabled[k] = true;
126
+ });
127
+
128
+ for (const key in depends) {
129
+ if (key in disabled) continue;
130
+ const dependencies = depends[key];
131
+
132
+ dependencies.forEach((dependency: any) => {
133
+ if (!Array.isArray(dependency)) dependency = [dependency];
134
+
135
+ const args = {};
136
+ dependency.forEach((d: any) => {
137
+ u.from(d, detail, args);
138
+ });
139
+ const expected = u.from(key, detail);
140
+
141
+ it(
142
+ f.description + ', ' + key + ' derives from ' + JSON.stringify(dependency),
143
+ () => {
144
+ u.equate(fn(args), expected);
145
+ },
146
+ );
147
+ });
148
+ }
149
+ });
150
+ });
151
+ });