@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,160 @@
1
+ /**
2
+ * Sequential signing pool for environments without worker support (React Native).
3
+ *
4
+ * Signs inputs one-by-one on the main thread using the CryptoBackend
5
+ * from EccContext. Same API shape as WorkerSigningPool so consumers
6
+ * can swap transparently.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import { SignatureType } from './types.js';
11
+ import { EccContext } from '../ecc/context.js';
12
+ /**
13
+ * Sequential signing pool — signs inputs one-by-one on the main thread.
14
+ *
15
+ * Provides the same public API as WorkerSigningPool but without any
16
+ * threading. Intended for React Native or other environments where
17
+ * Web Workers and worker_threads are unavailable.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * import { SequentialSigningPool } from '@btc-vision/bitcoin/workers';
22
+ *
23
+ * const pool = SequentialSigningPool.getInstance();
24
+ * const result = await pool.signBatch(tasks, keyPair);
25
+ * ```
26
+ */
27
+ export class SequentialSigningPool {
28
+ static #instance = null;
29
+ constructor(_config = {}) {
30
+ // Config accepted for API compatibility but not used —
31
+ // sequential pool has no workers to configure.
32
+ }
33
+ /**
34
+ * Number of workers — always 0 for sequential pool.
35
+ */
36
+ get workerCount() {
37
+ return 0;
38
+ }
39
+ /**
40
+ * Idle workers — always 0.
41
+ */
42
+ get idleWorkerCount() {
43
+ return 0;
44
+ }
45
+ /**
46
+ * Busy workers — always 0.
47
+ */
48
+ get busyWorkerCount() {
49
+ return 0;
50
+ }
51
+ /**
52
+ * Whether workers are preserved — always false (no workers to preserve).
53
+ */
54
+ get isPreservingWorkers() {
55
+ return false;
56
+ }
57
+ /**
58
+ * Gets the singleton instance.
59
+ */
60
+ static getInstance(config) {
61
+ if (!SequentialSigningPool.#instance) {
62
+ SequentialSigningPool.#instance = new SequentialSigningPool(config);
63
+ }
64
+ return SequentialSigningPool.#instance;
65
+ }
66
+ /**
67
+ * Resets the singleton instance (for testing).
68
+ */
69
+ static resetInstance() {
70
+ SequentialSigningPool.#instance = null;
71
+ }
72
+ /**
73
+ * No-op — no workers to preserve.
74
+ */
75
+ preserveWorkers() {
76
+ // No-op: no workers to preserve
77
+ }
78
+ /**
79
+ * No-op — no workers to release.
80
+ */
81
+ releaseWorkers() {
82
+ // No-op
83
+ }
84
+ /**
85
+ * No-op — no initialization required.
86
+ */
87
+ async initialize() {
88
+ // No-op: nothing to initialize
89
+ }
90
+ /**
91
+ * Signs tasks sequentially on the main thread.
92
+ */
93
+ // eslint-disable-next-line @typescript-eslint/require-await
94
+ async signBatch(tasks, keyPair) {
95
+ const startTime = performance.now();
96
+ if (tasks.length === 0) {
97
+ return {
98
+ success: true,
99
+ signatures: new Map(),
100
+ errors: new Map(),
101
+ durationMs: performance.now() - startTime,
102
+ };
103
+ }
104
+ const ecc = EccContext.get().lib;
105
+ const privateKey = keyPair.getPrivateKey();
106
+ const signatures = new Map();
107
+ const errors = new Map();
108
+ try {
109
+ for (const task of tasks) {
110
+ try {
111
+ let signature;
112
+ const hash = task.hash;
113
+ const key = privateKey;
114
+ if (task.signatureType === SignatureType.Schnorr) {
115
+ signature = ecc.signSchnorr(hash, key);
116
+ }
117
+ else {
118
+ signature = ecc.sign(hash, key);
119
+ }
120
+ signatures.set(task.inputIndex, {
121
+ type: 'result',
122
+ taskId: task.taskId,
123
+ signature,
124
+ inputIndex: task.inputIndex,
125
+ publicKey: keyPair.publicKey,
126
+ signatureType: task.signatureType,
127
+ leafHash: task.leafHash,
128
+ });
129
+ }
130
+ catch (err) {
131
+ const message = err instanceof Error ? err.message : 'Signing failed';
132
+ errors.set(task.inputIndex, message);
133
+ }
134
+ }
135
+ }
136
+ finally {
137
+ // SECURITY: Zero the private key
138
+ privateKey.fill(0);
139
+ }
140
+ return {
141
+ success: errors.size === 0,
142
+ signatures,
143
+ errors,
144
+ durationMs: performance.now() - startTime,
145
+ };
146
+ }
147
+ /**
148
+ * No-op — no workers to shut down.
149
+ */
150
+ async shutdown() {
151
+ // No-op: nothing to shut down
152
+ }
153
+ [Symbol.dispose]() {
154
+ void this.shutdown();
155
+ }
156
+ async [Symbol.asyncDispose]() {
157
+ await this.shutdown();
158
+ }
159
+ }
160
+ //# sourceMappingURL=WorkerSigningPool.sequential.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerSigningPool.sequential.js","sourceRoot":"","sources":["../../src/workers/WorkerSigningPool.sequential.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Worklet-based parallel signing pool for React Native.
3
+ *
4
+ * Uses `react-native-worklets` (Software Mansion v0.7+) to run signing
5
+ * operations in parallel across multiple worklet runtimes.
6
+ * Each runtime gets its own ECC module instance via eval of the bundled
7
+ * @noble/secp256k1 IIFE string.
8
+ *
9
+ * SECURITY ARCHITECTURE:
10
+ * - Private keys are cloned per-runtime (structuredClone semantics)
11
+ * - Keys are zeroed inside worklet AND in main thread finally block
12
+ * - Tainted runtimes (timeout) are replaced, not reused
13
+ *
14
+ * @packageDocumentation
15
+ */
16
+ import type { ParallelSignerKeyPair, ParallelSigningResult, SigningTask, WorkerPoolConfig } from './types.js';
17
+ /**
18
+ * Worklet-based parallel signing pool for React Native.
19
+ *
20
+ * Mirrors the API of WorkerSigningPool (browser) but uses
21
+ * `react-native-worklets` runtimes instead of Web Workers.
22
+ * `runOnRuntime()` returns a Promise directly — no postMessage protocol.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * import { WorkletSigningPool } from '@btc-vision/bitcoin/workers';
27
+ *
28
+ * const pool = WorkletSigningPool.getInstance();
29
+ * pool.preserveWorkers();
30
+ *
31
+ * const result = await pool.signBatch(tasks, keyPair);
32
+ * await pool.shutdown();
33
+ * ```
34
+ */
35
+ export declare class WorkletSigningPool {
36
+ #private;
37
+ private constructor();
38
+ /** Number of active runtimes. */
39
+ get workerCount(): number;
40
+ /** Idle runtimes (all non-tainted). */
41
+ get idleWorkerCount(): number;
42
+ /** Busy runtimes — always 0 outside of signBatch. */
43
+ get busyWorkerCount(): number;
44
+ /** Whether runtimes are preserved between batches. */
45
+ get isPreservingWorkers(): boolean;
46
+ /**
47
+ * Gets the singleton pool instance.
48
+ *
49
+ * @param config - Optional configuration (only used on first call)
50
+ */
51
+ static getInstance(config?: WorkerPoolConfig): WorkletSigningPool;
52
+ /** Resets the singleton instance (for testing). */
53
+ static resetInstance(): void;
54
+ /** Enable runtime preservation between signing batches. */
55
+ preserveWorkers(): void;
56
+ /** Disable runtime preservation. */
57
+ releaseWorkers(): void;
58
+ /**
59
+ * Initializes the worklet pool.
60
+ *
61
+ * Dynamically imports `react-native-worklets`, creates N runtimes,
62
+ * and injects the ECC bundle into each via eval.
63
+ *
64
+ * @throws If `react-native-worklets` is not installed or eval fails
65
+ */
66
+ initialize(): Promise<void>;
67
+ /**
68
+ * Signs a batch of tasks in parallel across worklet runtimes.
69
+ *
70
+ * SECURITY: Private keys are cloned per-runtime and zeroed both
71
+ * inside the worklet and in the main thread finally block.
72
+ */
73
+ signBatch(tasks: readonly SigningTask[], keyPair: ParallelSignerKeyPair): Promise<ParallelSigningResult>;
74
+ /** Shuts down all runtimes. */
75
+ shutdown(): Promise<void>;
76
+ [Symbol.dispose](): void;
77
+ [Symbol.asyncDispose](): Promise<void>;
78
+ }
79
+ //# sourceMappingURL=WorkerSigningPool.worklet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerSigningPool.worklet.d.ts","sourceRoot":"","sources":["../../src/workers/WorkerSigningPool.worklet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACR,qBAAqB,EACrB,qBAAqB,EAErB,WAAW,EACX,gBAAgB,EACnB,MAAM,YAAY,CAAC;AAuCpB;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,kBAAkB;;IAmB3B,OAAO;IAKP,iCAAiC;IACjC,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,uCAAuC;IACvC,IAAW,eAAe,IAAI,MAAM,CAEnC;IAED,qDAAqD;IACrD,IAAW,eAAe,IAAI,MAAM,CAEnC;IAED,sDAAsD;IACtD,IAAW,mBAAmB,IAAI,OAAO,CAExC;IAED;;;;OAIG;WACW,WAAW,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,kBAAkB;IAOxE,mDAAmD;WACrC,aAAa,IAAI,IAAI;IAOnC,2DAA2D;IACpD,eAAe,IAAI,IAAI;IAI9B,oCAAoC;IAC7B,cAAc,IAAI,IAAI;IAI7B;;;;;;;OAOG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2CxC;;;;;OAKG;IACU,SAAS,CAClB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,OAAO,EAAE,qBAAqB,GAC/B,OAAO,CAAC,qBAAqB,CAAC;IAqFjC,+BAA+B;IAElB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAe/B,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAIlB,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CA0MtD"}
@@ -0,0 +1,390 @@
1
+ /**
2
+ * Worklet-based parallel signing pool for React Native.
3
+ *
4
+ * Uses `react-native-worklets` (Software Mansion v0.7+) to run signing
5
+ * operations in parallel across multiple worklet runtimes.
6
+ * Each runtime gets its own ECC module instance via eval of the bundled
7
+ * @noble/secp256k1 IIFE string.
8
+ *
9
+ * SECURITY ARCHITECTURE:
10
+ * - Private keys are cloned per-runtime (structuredClone semantics)
11
+ * - Keys are zeroed inside worklet AND in main thread finally block
12
+ * - Tainted runtimes (timeout) are replaced, not reused
13
+ *
14
+ * @packageDocumentation
15
+ */
16
+ import { SignatureType } from './types.js';
17
+ /**
18
+ * Default configuration for the worklet pool.
19
+ */
20
+ const DEFAULT_CONFIG = {
21
+ workerCount: 4,
22
+ taskTimeoutMs: 30000,
23
+ maxKeyHoldTimeMs: 5000,
24
+ verifySignatures: true,
25
+ preserveWorkers: false,
26
+ };
27
+ /**
28
+ * Worklet-based parallel signing pool for React Native.
29
+ *
30
+ * Mirrors the API of WorkerSigningPool (browser) but uses
31
+ * `react-native-worklets` runtimes instead of Web Workers.
32
+ * `runOnRuntime()` returns a Promise directly — no postMessage protocol.
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * import { WorkletSigningPool } from '@btc-vision/bitcoin/workers';
37
+ *
38
+ * const pool = WorkletSigningPool.getInstance();
39
+ * pool.preserveWorkers();
40
+ *
41
+ * const result = await pool.signBatch(tasks, keyPair);
42
+ * await pool.shutdown();
43
+ * ```
44
+ */
45
+ export class WorkletSigningPool {
46
+ static #instance = null;
47
+ #config;
48
+ #runtimes = [];
49
+ #workletsModule = null;
50
+ #eccBundleCode = null;
51
+ #preserveWorkers = false;
52
+ #nextRuntimeId = 0;
53
+ #initialized = false;
54
+ #shuttingDown = false;
55
+ /**
56
+ * Whether Uint8Array survives worklet boundary.
57
+ * Detected during initialize(); if false, we encode as number[].
58
+ */
59
+ #uint8ArraySupported = true;
60
+ constructor(config = {}) {
61
+ this.#config = { ...DEFAULT_CONFIG, ...config };
62
+ this.#preserveWorkers = this.#config.preserveWorkers;
63
+ }
64
+ /** Number of active runtimes. */
65
+ get workerCount() {
66
+ return this.#runtimes.length;
67
+ }
68
+ /** Idle runtimes (all non-tainted). */
69
+ get idleWorkerCount() {
70
+ return this.#runtimes.filter((r) => !r.tainted).length;
71
+ }
72
+ /** Busy runtimes — always 0 outside of signBatch. */
73
+ get busyWorkerCount() {
74
+ return 0;
75
+ }
76
+ /** Whether runtimes are preserved between batches. */
77
+ get isPreservingWorkers() {
78
+ return this.#preserveWorkers;
79
+ }
80
+ /**
81
+ * Gets the singleton pool instance.
82
+ *
83
+ * @param config - Optional configuration (only used on first call)
84
+ */
85
+ static getInstance(config) {
86
+ if (!WorkletSigningPool.#instance) {
87
+ WorkletSigningPool.#instance = new WorkletSigningPool(config);
88
+ }
89
+ return WorkletSigningPool.#instance;
90
+ }
91
+ /** Resets the singleton instance (for testing). */
92
+ static resetInstance() {
93
+ if (WorkletSigningPool.#instance) {
94
+ WorkletSigningPool.#instance.shutdown().catch(() => { });
95
+ WorkletSigningPool.#instance = null;
96
+ }
97
+ }
98
+ /** Enable runtime preservation between signing batches. */
99
+ preserveWorkers() {
100
+ this.#preserveWorkers = true;
101
+ }
102
+ /** Disable runtime preservation. */
103
+ releaseWorkers() {
104
+ this.#preserveWorkers = false;
105
+ }
106
+ /**
107
+ * Initializes the worklet pool.
108
+ *
109
+ * Dynamically imports `react-native-worklets`, creates N runtimes,
110
+ * and injects the ECC bundle into each via eval.
111
+ *
112
+ * @throws If `react-native-worklets` is not installed or eval fails
113
+ */
114
+ async initialize() {
115
+ if (this.#initialized) {
116
+ return;
117
+ }
118
+ if (this.#shuttingDown) {
119
+ throw new Error('Cannot initialize pool while shutting down');
120
+ }
121
+ // Lazy dynamic import — module loads even without the dep
122
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
123
+ const worklets = await import('react-native-worklets');
124
+ this.#workletsModule = worklets;
125
+ // Load ECC bundle
126
+ const { ECC_BUNDLE } = await import('./ecc-bundle.js');
127
+ this.#eccBundleCode = ECC_BUNDLE;
128
+ // Create runtimes and inject ECC
129
+ for (let i = 0; i < this.#config.workerCount; i++) {
130
+ await this.#createRuntime();
131
+ }
132
+ // Feature-detect Uint8Array support across worklet boundary
133
+ const firstRuntime = this.#runtimes[0];
134
+ if (firstRuntime) {
135
+ try {
136
+ const result = await this.#workletsModule.runOnRuntime(firstRuntime.runtime, () => {
137
+ const arr = new Uint8Array([1, 2, 3]);
138
+ return arr instanceof Uint8Array;
139
+ });
140
+ this.#uint8ArraySupported = result;
141
+ }
142
+ catch {
143
+ this.#uint8ArraySupported = false;
144
+ }
145
+ }
146
+ this.#initialized = true;
147
+ }
148
+ /**
149
+ * Signs a batch of tasks in parallel across worklet runtimes.
150
+ *
151
+ * SECURITY: Private keys are cloned per-runtime and zeroed both
152
+ * inside the worklet and in the main thread finally block.
153
+ */
154
+ async signBatch(tasks, keyPair) {
155
+ const startTime = performance.now();
156
+ if (!this.#initialized) {
157
+ await this.initialize();
158
+ }
159
+ if (tasks.length === 0) {
160
+ return {
161
+ success: true,
162
+ signatures: new Map(),
163
+ errors: new Map(),
164
+ durationMs: performance.now() - startTime,
165
+ };
166
+ }
167
+ // Distribute tasks round-robin
168
+ const runtimeCount = Math.min(this.#runtimes.length, tasks.length);
169
+ const taskBatches = Array.from({ length: runtimeCount }, () => []);
170
+ for (let i = 0; i < tasks.length; i++) {
171
+ const batch = taskBatches[i % runtimeCount];
172
+ const task = tasks[i];
173
+ if (batch && task) {
174
+ batch.push(task);
175
+ }
176
+ }
177
+ const privateKey = keyPair.getPrivateKey();
178
+ try {
179
+ const batchResults = await Promise.allSettled(taskBatches.map((batch, index) => this.#signBatchOnRuntime(batch, privateKey, keyPair.publicKey, index)));
180
+ const signatures = new Map();
181
+ const errors = new Map();
182
+ for (let i = 0; i < batchResults.length; i++) {
183
+ const result = batchResults[i];
184
+ if (!result)
185
+ continue;
186
+ if (result.status === 'fulfilled') {
187
+ for (const sig of result.value.signatures) {
188
+ signatures.set(sig.inputIndex, sig);
189
+ }
190
+ for (const [idx, errMsg] of result.value.errors) {
191
+ errors.set(idx, errMsg);
192
+ }
193
+ }
194
+ else {
195
+ const reason = result.reason;
196
+ const errorMsg = reason?.message ?? 'Worklet batch signing failed';
197
+ const failedBatch = taskBatches[i];
198
+ if (failedBatch) {
199
+ for (const task of failedBatch) {
200
+ errors.set(task.inputIndex, errorMsg);
201
+ }
202
+ }
203
+ }
204
+ }
205
+ // Cleanup runtimes if not preserving
206
+ if (!this.#preserveWorkers) {
207
+ await this.shutdown();
208
+ }
209
+ return {
210
+ success: errors.size === 0,
211
+ signatures,
212
+ errors,
213
+ durationMs: performance.now() - startTime,
214
+ };
215
+ }
216
+ finally {
217
+ // SECURITY: Zero the key in main thread
218
+ privateKey.fill(0);
219
+ }
220
+ }
221
+ /** Shuts down all runtimes. */
222
+ // eslint-disable-next-line @typescript-eslint/require-await
223
+ async shutdown() {
224
+ if (this.#shuttingDown) {
225
+ return;
226
+ }
227
+ this.#shuttingDown = true;
228
+ // Worklet runtimes don't have a destroy() — clear references for GC
229
+ this.#runtimes.length = 0;
230
+ this.#workletsModule = null;
231
+ this.#eccBundleCode = null;
232
+ this.#initialized = false;
233
+ this.#shuttingDown = false;
234
+ }
235
+ [Symbol.dispose]() {
236
+ void this.shutdown();
237
+ }
238
+ async [Symbol.asyncDispose]() {
239
+ await this.shutdown();
240
+ }
241
+ /**
242
+ * Creates a new worklet runtime and injects the ECC bundle.
243
+ */
244
+ async #createRuntime() {
245
+ if (!this.#workletsModule || !this.#eccBundleCode) {
246
+ throw new Error('Worklets module or ECC bundle not loaded');
247
+ }
248
+ const id = this.#nextRuntimeId++;
249
+ const runtime = this.#workletsModule.createWorkletRuntime(`signing-runtime-${id}`);
250
+ // Inject ECC bundle into the worklet runtime.
251
+ // The bundle declares `var nobleBundle = (()=>{...})()` with "use strict",
252
+ // so a plain eval won't leak it to globalThis. We use `new Function` to
253
+ // execute the bundle and then explicitly assign the result.
254
+ const bundleCode = this.#eccBundleCode;
255
+ await this.#workletsModule.runOnRuntime(runtime, () => {
256
+ 'worklet';
257
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
258
+ const fn = new Function(bundleCode + '; return nobleBundle;');
259
+ globalThis['nobleBundle'] = fn();
260
+ });
261
+ const pooled = { id, runtime, tainted: false };
262
+ this.#runtimes.push(pooled);
263
+ return pooled;
264
+ }
265
+ /**
266
+ * Replaces a tainted runtime with a fresh one.
267
+ */
268
+ async #replaceRuntime(pooled) {
269
+ const idx = this.#runtimes.indexOf(pooled);
270
+ if (idx >= 0) {
271
+ this.#runtimes.splice(idx, 1);
272
+ }
273
+ try {
274
+ await this.#createRuntime();
275
+ }
276
+ catch {
277
+ // If replacement fails, pool continues with fewer runtimes
278
+ }
279
+ }
280
+ /**
281
+ * Signs a batch of tasks on a specific runtime.
282
+ */
283
+ async #signBatchOnRuntime(tasks, privateKey, publicKey, runtimeIndex) {
284
+ if (tasks.length === 0) {
285
+ return { signatures: [], errors: new Map() };
286
+ }
287
+ const pooled = this.#runtimes[runtimeIndex];
288
+ if (!pooled || pooled.tainted) {
289
+ throw new Error(`Runtime ${runtimeIndex} unavailable or tainted`);
290
+ }
291
+ if (!this.#workletsModule) {
292
+ throw new Error('Worklets module not loaded');
293
+ }
294
+ // Prepare data for worklet transfer
295
+ const useArrayEncoding = !this.#uint8ArraySupported;
296
+ const keyData = useArrayEncoding
297
+ ? Array.from(privateKey)
298
+ : new Uint8Array(privateKey);
299
+ const taskData = tasks.map((t) => ({
300
+ taskId: t.taskId,
301
+ inputIndex: t.inputIndex,
302
+ hash: useArrayEncoding ? Array.from(t.hash) : new Uint8Array(t.hash),
303
+ signatureType: t.signatureType,
304
+ lowR: t.lowR,
305
+ sighashType: t.sighashType,
306
+ leafHash: t.leafHash
307
+ ? (useArrayEncoding ? Array.from(t.leafHash) : new Uint8Array(t.leafHash))
308
+ : undefined,
309
+ }));
310
+ const pubKeyData = useArrayEncoding
311
+ ? Array.from(publicKey)
312
+ : new Uint8Array(publicKey);
313
+ // Dispatch to worklet runtime with timeout
314
+ const signingPromise = this.#workletsModule.runOnRuntime(pooled.runtime, () => {
315
+ 'worklet';
316
+ // Inside the worklet runtime, nobleBundle is available from init eval
317
+ // The bundled secp.sign() returns a compact 64-byte Uint8Array directly
318
+ // (not a Signature object). secp.schnorr.sign() also returns Uint8Array.
319
+ const eccModule = globalThis['nobleBundle'];
320
+ const toU8 = (data) => data instanceof Uint8Array ? data : new Uint8Array(data);
321
+ const privKey = toU8(keyData);
322
+ const results = [];
323
+ const errors = [];
324
+ try {
325
+ for (const task of taskData) {
326
+ try {
327
+ const hash = toU8(task.hash);
328
+ let signature;
329
+ if (task.signatureType === 1) {
330
+ signature = eccModule.secp.schnorr.sign(hash, privKey);
331
+ }
332
+ else {
333
+ // prehash: false — input is already a 32-byte hash
334
+ signature = eccModule.secp.sign(hash, privKey, {
335
+ lowS: true,
336
+ prehash: false,
337
+ });
338
+ }
339
+ const entry = {
340
+ type: 'result',
341
+ taskId: task.taskId,
342
+ signature: Array.from(signature),
343
+ inputIndex: task.inputIndex,
344
+ publicKey: Array.from(toU8(pubKeyData)),
345
+ signatureType: task.signatureType,
346
+ };
347
+ if (task.leafHash) {
348
+ entry.leafHash = Array.from(toU8(task.leafHash));
349
+ }
350
+ results.push(entry);
351
+ }
352
+ catch (err) {
353
+ const msg = err instanceof Error ? err.message : 'Signing failed';
354
+ errors.push({ inputIndex: task.inputIndex, error: msg });
355
+ }
356
+ }
357
+ }
358
+ finally {
359
+ // SECURITY: Zero key inside worklet
360
+ privKey.fill(0);
361
+ }
362
+ return { results, errors };
363
+ });
364
+ // Timeout guard
365
+ const timeoutPromise = new Promise((_resolve, reject) => {
366
+ setTimeout(() => {
367
+ pooled.tainted = true;
368
+ this.#replaceRuntime(pooled).catch(() => { });
369
+ reject(new Error(`Worklet signing timeout for ${tasks.length} tasks`));
370
+ }, this.#config.maxKeyHoldTimeMs);
371
+ });
372
+ const raw = await Promise.race([signingPromise, timeoutPromise]);
373
+ // Convert results back to proper types
374
+ const signatures = raw.results.map((r) => ({
375
+ type: 'result',
376
+ taskId: r.taskId,
377
+ signature: new Uint8Array(r.signature),
378
+ inputIndex: r.inputIndex,
379
+ publicKey: new Uint8Array(r.publicKey),
380
+ signatureType: r.signatureType,
381
+ leafHash: r.leafHash ? new Uint8Array(r.leafHash) : undefined,
382
+ }));
383
+ const errors = new Map();
384
+ for (const e of raw.errors) {
385
+ errors.set(e.inputIndex, e.error);
386
+ }
387
+ return { signatures, errors };
388
+ }
389
+ }
390
+ //# sourceMappingURL=WorkerSigningPool.worklet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerSigningPool.worklet.js","sourceRoot":"","sources":["../../src/workers/WorkerSigningPool.worklet.ts"],"names":[],"mappings":"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"}