@btc-vision/bitcoin 6.3.1 → 6.3.3

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 (374) hide show
  1. package/.babelrc +4 -0
  2. package/.gitattributes +2 -0
  3. package/.nyc_output/6368a5b2-daa5-4821-8ed0-b742d6fc7eab.json +1 -0
  4. package/.nyc_output/processinfo/6368a5b2-daa5-4821-8ed0-b742d6fc7eab.json +1 -0
  5. package/.nyc_output/processinfo/index.json +1 -0
  6. package/.prettierrc.json +12 -0
  7. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/.ready +0 -0
  8. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/.release-please-manifest.json +3 -0
  9. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/CHANGELOG.md +962 -0
  10. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/CONTRIBUTING.md +34 -0
  11. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/LICENSE +24 -0
  12. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/README.md +273 -0
  13. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/SECURITY.md +2 -0
  14. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/addon.gypi +204 -0
  15. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/bin/node-gyp.js +138 -0
  16. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/.release-please-manifest.json +3 -0
  17. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/LICENSE +28 -0
  18. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/data/ninja/build.ninja +4 -0
  19. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/data/win/large-pdb-shim.cc +12 -0
  20. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/GypVsCMake.md +116 -0
  21. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/Hacking.md +46 -0
  22. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/InputFormatReference.md +1080 -0
  23. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/LanguageSpecification.md +430 -0
  24. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/README.md +27 -0
  25. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/Testing.md +450 -0
  26. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/UserDocumentation.md +965 -0
  27. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/gyp +8 -0
  28. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/gyp.bat +5 -0
  29. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/gyp_main.py +45 -0
  30. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py +365 -0
  31. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py +206 -0
  32. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py +1272 -0
  33. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py +1547 -0
  34. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py +59 -0
  35. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py +153 -0
  36. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py +271 -0
  37. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py +574 -0
  38. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/__init__.py +692 -0
  39. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/common.py +711 -0
  40. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/common_test.py +171 -0
  41. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py +169 -0
  42. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py +113 -0
  43. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py +55 -0
  44. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py +0 -0
  45. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py +804 -0
  46. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py +1173 -0
  47. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py +1318 -0
  48. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py +127 -0
  49. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py +103 -0
  50. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py +461 -0
  51. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py +89 -0
  52. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py +57 -0
  53. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py +2745 -0
  54. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py +3976 -0
  55. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py +44 -0
  56. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py +2964 -0
  57. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py +67 -0
  58. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py +1391 -0
  59. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py +25 -0
  60. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/input.py +3115 -0
  61. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/input_test.py +98 -0
  62. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py +771 -0
  63. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +1260 -0
  64. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py +174 -0
  65. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py +61 -0
  66. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py +373 -0
  67. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py +1938 -0
  68. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation_test.py +53 -0
  69. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py +302 -0
  70. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py +3198 -0
  71. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py +65 -0
  72. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/LICENSE +3 -0
  73. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.APACHE +177 -0
  74. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.BSD +23 -0
  75. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/__init__.py +15 -0
  76. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_elffile.py +108 -0
  77. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_manylinux.py +252 -0
  78. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_musllinux.py +83 -0
  79. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_parser.py +359 -0
  80. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_structures.py +61 -0
  81. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_tokenizer.py +192 -0
  82. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/markers.py +252 -0
  83. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/metadata.py +825 -0
  84. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/py.typed +0 -0
  85. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/requirements.py +90 -0
  86. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/specifiers.py +1030 -0
  87. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/tags.py +553 -0
  88. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/utils.py +172 -0
  89. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/version.py +563 -0
  90. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pyproject.toml +120 -0
  91. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/release-please-config.json +11 -0
  92. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/test_gyp.py +261 -0
  93. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/Find-VisualStudio.cs +250 -0
  94. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/build.js +227 -0
  95. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/clean.js +15 -0
  96. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/configure.js +328 -0
  97. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/create-config-gypi.js +150 -0
  98. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/download.js +39 -0
  99. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/find-node-directory.js +63 -0
  100. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/find-python.js +310 -0
  101. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/find-visualstudio.js +590 -0
  102. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/install.js +415 -0
  103. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/list.js +26 -0
  104. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/log.js +168 -0
  105. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/node-gyp.js +188 -0
  106. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/process-release.js +146 -0
  107. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/rebuild.js +12 -0
  108. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/remove.js +43 -0
  109. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/util.js +81 -0
  110. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/macOS_Catalina_acid_test.sh +21 -0
  111. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/package.json +51 -0
  112. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/release-please-config.json +40 -0
  113. package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/src/win_delay_load_hook.cc +39 -0
  114. package/CHANGELOG.md +403 -0
  115. package/CONTRIBUTING.md +83 -0
  116. package/browser/address.d.ts +16 -0
  117. package/{src → browser}/bip66.d.ts +6 -7
  118. package/{src → browser}/block.d.ts +29 -30
  119. package/{src → browser}/bufferutils.d.ts +34 -54
  120. package/browser/crypto/crypto.d.ts +1 -0
  121. package/{src → browser}/crypto.d.ts +13 -18
  122. package/browser/ecc_lib.d.ts +3 -0
  123. package/browser/hooks/AdvancedSignatureManager.d.ts +16 -0
  124. package/{src → browser}/hooks/HookedSigner.d.ts +4 -4
  125. package/browser/hooks/SignatureManager.d.ts +13 -0
  126. package/browser/index.d.ts +58 -0
  127. package/browser/index.js +2 -0
  128. package/browser/index.js.LICENSE.txt +14 -0
  129. package/browser/merkle.d.ts +1 -0
  130. package/browser/networks.d.ts +23 -0
  131. package/{src → browser}/ops.d.ts +126 -126
  132. package/browser/payments/bip341.d.ts +23 -0
  133. package/browser/payments/embed.d.ts +2 -0
  134. package/browser/payments/index.d.ts +43 -0
  135. package/{src → browser}/payments/lazy.d.ts +2 -2
  136. package/browser/payments/p2ms.d.ts +2 -0
  137. package/browser/payments/p2pk.d.ts +2 -0
  138. package/browser/payments/p2pkh.d.ts +2 -0
  139. package/browser/payments/p2sh.d.ts +2 -0
  140. package/browser/payments/p2tr.d.ts +2 -0
  141. package/browser/payments/p2wpkh.d.ts +2 -0
  142. package/browser/payments/p2wsh.d.ts +2 -0
  143. package/browser/psbt/bip371.d.ts +16 -0
  144. package/browser/psbt/psbtutils.d.ts +26 -0
  145. package/{src → browser}/psbt.d.ts +167 -238
  146. package/browser/push_data.d.ts +7 -0
  147. package/browser/script.d.ts +17 -0
  148. package/browser/script_number.d.ts +2 -0
  149. package/browser/script_signature.d.ts +7 -0
  150. package/{src → browser}/transaction.d.ts +48 -60
  151. package/{src → browser}/types.d.ts +37 -54
  152. package/build/address.d.ts +16 -0
  153. package/build/address.js +148 -0
  154. package/build/bip66.d.ts +6 -0
  155. package/build/bip66.js +99 -0
  156. package/build/block.d.ts +29 -0
  157. package/build/block.js +181 -0
  158. package/build/bufferutils.d.ts +34 -0
  159. package/build/bufferutils.js +141 -0
  160. package/build/crypto/crypto.d.ts +1 -0
  161. package/build/crypto/crypto.js +1 -0
  162. package/build/crypto.d.ts +13 -0
  163. package/build/crypto.js +87 -0
  164. package/build/ecc_lib.d.ts +3 -0
  165. package/build/ecc_lib.js +61 -0
  166. package/build/hooks/AdvancedSignatureManager.d.ts +16 -0
  167. package/build/hooks/AdvancedSignatureManager.js +52 -0
  168. package/build/hooks/HookedSigner.d.ts +4 -0
  169. package/build/hooks/HookedSigner.js +64 -0
  170. package/build/hooks/SignatureManager.d.ts +13 -0
  171. package/build/hooks/SignatureManager.js +45 -0
  172. package/build/index.d.ts +58 -0
  173. package/build/index.js +32 -0
  174. package/build/merkle.d.ts +1 -0
  175. package/build/merkle.js +19 -0
  176. package/build/networks.d.ts +23 -0
  177. package/build/networks.js +121 -0
  178. package/build/ops.d.ts +126 -0
  179. package/{src → build}/ops.js +127 -131
  180. package/build/payments/bip341.d.ts +23 -0
  181. package/build/payments/bip341.js +82 -0
  182. package/build/payments/embed.d.ts +2 -0
  183. package/build/payments/embed.js +39 -0
  184. package/build/payments/index.d.ts +43 -0
  185. package/build/payments/index.js +10 -0
  186. package/build/payments/lazy.d.ts +2 -0
  187. package/{src → build}/payments/lazy.js +28 -32
  188. package/build/payments/p2ms.d.ts +2 -0
  189. package/{src → build}/payments/p2ms.js +128 -158
  190. package/build/payments/p2pk.d.ts +2 -0
  191. package/build/payments/p2pk.js +68 -0
  192. package/build/payments/p2pkh.d.ts +2 -0
  193. package/build/payments/p2pkh.js +173 -0
  194. package/build/payments/p2sh.d.ts +2 -0
  195. package/build/payments/p2sh.js +176 -0
  196. package/build/payments/p2tr.d.ts +2 -0
  197. package/build/payments/p2tr.js +254 -0
  198. package/build/payments/p2wpkh.d.ts +2 -0
  199. package/build/payments/p2wpkh.js +130 -0
  200. package/build/payments/p2wsh.d.ts +2 -0
  201. package/build/payments/p2wsh.js +180 -0
  202. package/build/psbt/bip371.d.ts +16 -0
  203. package/build/psbt/bip371.js +246 -0
  204. package/build/psbt/psbtutils.d.ts +26 -0
  205. package/build/psbt/psbtutils.js +177 -0
  206. package/build/psbt.d.ts +167 -0
  207. package/build/psbt.js +1307 -0
  208. package/build/push_data.d.ts +7 -0
  209. package/build/push_data.js +57 -0
  210. package/build/script.d.ts +17 -0
  211. package/build/script.js +167 -0
  212. package/build/script_number.d.ts +2 -0
  213. package/build/script_number.js +49 -0
  214. package/build/script_signature.d.ts +7 -0
  215. package/build/script_signature.js +49 -0
  216. package/build/transaction.d.ts +48 -0
  217. package/build/transaction.js +445 -0
  218. package/build/types.d.ts +37 -0
  219. package/build/types.js +73 -0
  220. package/cjs/package.json +3 -0
  221. package/coverage/tmp/coverage-31752-1735543485354-0.json +1 -0
  222. package/coverage/tmp/coverage-59920-1735543484555-0.json +1 -0
  223. package/coverage/tmp/coverage-66252-1735543483919-0.json +1 -0
  224. package/coverage/tmp/coverage-68440-1735543485236-0.json +1 -0
  225. package/coverage/tmp/coverage-70588-1735543484426-0.json +1 -0
  226. package/coverage/tmp/coverage-79292-1735543485296-0.json +1 -0
  227. package/coverage/tmp/coverage-80212-1735543483980-0.json +1 -0
  228. package/eslint.config.js +56 -0
  229. package/gulpfile.js +42 -0
  230. package/package.json +105 -50
  231. package/src/{address.js → address.ts} +211 -191
  232. package/src/{bip66.js → bip66.ts} +23 -19
  233. package/src/{block.js → block.ts} +114 -105
  234. package/src/{bufferutils.js → bufferutils.ts} +65 -67
  235. package/src/crypto/crypto-browser.js +75 -0
  236. package/src/crypto/crypto.ts +1 -0
  237. package/src/crypto.ts +108 -0
  238. package/src/{ecc_lib.js → ecc_lib.ts} +25 -53
  239. package/src/hooks/{AdvancedSignatureManager.js → AdvancedSignatureManager.ts} +34 -18
  240. package/src/hooks/HookedSigner.ts +108 -0
  241. package/src/hooks/{SignatureManager.js → SignatureManager.ts} +26 -14
  242. package/src/index.ts +86 -0
  243. package/src/{merkle.js → merkle.ts} +8 -7
  244. package/src/{networks.js → networks.ts} +235 -220
  245. package/src/ops.ts +282 -0
  246. package/src/payments/bip341.ts +140 -0
  247. package/src/payments/embed.ts +55 -0
  248. package/src/payments/{index.d.ts → index.ts} +24 -10
  249. package/src/payments/lazy.ts +28 -0
  250. package/src/payments/p2ms.ts +150 -0
  251. package/src/payments/{p2pk.js → p2pk.ts} +85 -82
  252. package/src/payments/p2pkh.ts +206 -0
  253. package/src/payments/{p2sh.js → p2sh.ts} +206 -204
  254. package/src/payments/{p2tr.js → p2tr.ts} +114 -125
  255. package/src/payments/{p2wpkh.js → p2wpkh.ts} +51 -56
  256. package/src/payments/{p2wsh.js → p2wsh.ts} +69 -81
  257. package/src/psbt/{bip371.js → bip371.ts} +441 -424
  258. package/src/psbt/psbtutils.ts +301 -0
  259. package/src/{psbt.js → psbt.ts} +2187 -1828
  260. package/src/{push_data.js → push_data.ts} +35 -21
  261. package/src/{script.js → script.ts} +93 -77
  262. package/src/{script_number.js → script_number.ts} +15 -21
  263. package/src/{script_signature.js → script_signature.ts} +26 -14
  264. package/src/{transaction.js → transaction.ts} +247 -167
  265. package/src/types.ts +122 -0
  266. package/test/address.spec.js +124 -0
  267. package/test/address.spec.ts +177 -0
  268. package/test/bitcoin.core.spec.js +170 -0
  269. package/test/bitcoin.core.spec.ts +234 -0
  270. package/test/block.spec.js +141 -0
  271. package/test/block.spec.ts +194 -0
  272. package/test/bufferutils.spec.js +427 -0
  273. package/test/bufferutils.spec.ts +513 -0
  274. package/test/crypto.spec.js +41 -0
  275. package/test/crypto.spec.ts +55 -0
  276. package/test/fixtures/address.json +329 -0
  277. package/test/fixtures/block.json +148 -0
  278. package/test/fixtures/bufferutils.json +102 -0
  279. package/test/fixtures/core/README.md +26 -0
  280. package/test/fixtures/core/base58_encode_decode.json +50 -0
  281. package/test/fixtures/core/base58_keys_invalid.json +152 -0
  282. package/test/fixtures/core/base58_keys_valid.json +452 -0
  283. package/test/fixtures/core/blocks.json +27 -0
  284. package/test/fixtures/core/sig_canonical.json +7 -0
  285. package/test/fixtures/core/sig_noncanonical.json +33 -0
  286. package/test/fixtures/core/sighash.json +3505 -0
  287. package/test/fixtures/core/tx_valid.json +2023 -0
  288. package/test/fixtures/crypto.json +43 -0
  289. package/test/fixtures/ecdsa.json +217 -0
  290. package/test/fixtures/ecpair.json +141 -0
  291. package/test/fixtures/embed.json +108 -0
  292. package/test/fixtures/p2ms.json +434 -0
  293. package/test/fixtures/p2pk.json +179 -0
  294. package/test/fixtures/p2pkh.json +276 -0
  295. package/test/fixtures/p2sh.json +508 -0
  296. package/test/fixtures/p2tr.json +1198 -0
  297. package/test/fixtures/p2wpkh.json +290 -0
  298. package/test/fixtures/p2wsh.json +489 -0
  299. package/test/fixtures/psbt.json +924 -0
  300. package/test/fixtures/script.json +465 -0
  301. package/test/fixtures/script_number.json +225 -0
  302. package/test/fixtures/signature.json +140 -0
  303. package/test/fixtures/transaction.json +916 -0
  304. package/test/integration/_regtest.js +7 -0
  305. package/test/integration/_regtest.ts +6 -0
  306. package/test/integration/addresses.spec.js +116 -0
  307. package/test/integration/addresses.spec.ts +154 -0
  308. package/test/integration/bip32.spec.js +85 -0
  309. package/test/integration/bip32.spec.ts +151 -0
  310. package/test/integration/blocks.spec.js +26 -0
  311. package/test/integration/blocks.spec.ts +28 -0
  312. package/test/integration/cltv.spec.js +199 -0
  313. package/test/integration/cltv.spec.ts +283 -0
  314. package/test/integration/csv.spec.js +362 -0
  315. package/test/integration/csv.spec.ts +527 -0
  316. package/test/integration/payments.spec.js +98 -0
  317. package/test/integration/payments.spec.ts +135 -0
  318. package/test/integration/taproot.spec.js +532 -0
  319. package/test/integration/taproot.spec.ts +707 -0
  320. package/test/integration/transactions.spec.js +561 -0
  321. package/test/integration/transactions.spec.ts +769 -0
  322. package/test/payments.spec.js +97 -0
  323. package/test/payments.spec.ts +125 -0
  324. package/test/payments.utils.js +190 -0
  325. package/test/payments.utils.ts +208 -0
  326. package/test/psbt.spec.js +1044 -0
  327. package/test/psbt.spec.ts +1414 -0
  328. package/test/script.spec.js +151 -0
  329. package/test/script.spec.ts +210 -0
  330. package/test/script_number.spec.js +24 -0
  331. package/test/script_number.spec.ts +29 -0
  332. package/test/script_signature.spec.js +52 -0
  333. package/test/script_signature.spec.ts +66 -0
  334. package/test/transaction.spec.js +269 -0
  335. package/test/transaction.spec.ts +387 -0
  336. package/test/ts-node-register.js +5 -0
  337. package/test/tsconfig.json +45 -0
  338. package/test/types.spec.js +46 -0
  339. package/test/types.spec.ts +58 -0
  340. package/tsconfig.base.json +27 -0
  341. package/tsconfig.json +19 -0
  342. package/tsconfig.webpack.json +18 -0
  343. package/webpack.config.js +79 -0
  344. package/src/address.d.ts +0 -42
  345. package/src/crypto.js +0 -128
  346. package/src/ecc_lib.d.ts +0 -17
  347. package/src/hooks/AdvancedSignatureManager.d.ts +0 -44
  348. package/src/hooks/HookedSigner.js +0 -90
  349. package/src/hooks/SignatureManager.d.ts +0 -35
  350. package/src/index.d.ts +0 -42
  351. package/src/index.js +0 -87
  352. package/src/merkle.d.ts +0 -10
  353. package/src/networks.d.ts +0 -83
  354. package/src/payments/bip341.d.ts +0 -49
  355. package/src/payments/bip341.js +0 -124
  356. package/src/payments/embed.d.ts +0 -9
  357. package/src/payments/embed.js +0 -54
  358. package/src/payments/index.js +0 -69
  359. package/src/payments/p2ms.d.ts +0 -9
  360. package/src/payments/p2pk.d.ts +0 -10
  361. package/src/payments/p2pkh.d.ts +0 -10
  362. package/src/payments/p2pkh.js +0 -143
  363. package/src/payments/p2sh.d.ts +0 -10
  364. package/src/payments/p2tr.d.ts +0 -10
  365. package/src/payments/p2wpkh.d.ts +0 -10
  366. package/src/payments/p2wsh.d.ts +0 -10
  367. package/src/psbt/bip371.d.ts +0 -42
  368. package/src/psbt/psbtutils.d.ts +0 -64
  369. package/src/psbt/psbtutils.js +0 -191
  370. package/src/push_data.d.ts +0 -29
  371. package/src/script.d.ts +0 -42
  372. package/src/script_number.d.ts +0 -19
  373. package/src/script_signature.d.ts +0 -21
  374. package/src/types.js +0 -106
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const assert = require("assert");
4
+ const ecpair_1 = require("ecpair");
5
+ const ecc = require("tiny-secp256k1");
6
+ const mocha_1 = require("mocha");
7
+ const bitcoin = require("../..");
8
+ const _regtest_1 = require("./_regtest");
9
+ const ECPair = (0, ecpair_1.default)(ecc);
10
+ const regtest = _regtest_1.regtestUtils.network;
11
+ const bip65 = require('bip65');
12
+ function toOutputScript(address) {
13
+ return bitcoin.address.toOutputScript(address, regtest);
14
+ }
15
+ function idToHash(txid) {
16
+ return Buffer.from(txid, 'hex').reverse();
17
+ }
18
+ const alice = ECPair.fromWIF('cScfkGjbzzoeewVWmU2hYPUHeVGJRDdFt7WhmrVVGkxpmPP8BHWe', regtest);
19
+ const bob = ECPair.fromWIF('cMkopUXKWsEzAjfa1zApksGRwjVpJRB3831qM9W4gKZsLwjHXA9x', regtest);
20
+ (0, mocha_1.describe)('bitcoinjs-lib (transactions w/ CLTV)', () => {
21
+ // force update MTP
22
+ (0, mocha_1.before)(async () => {
23
+ await _regtest_1.regtestUtils.mine(11);
24
+ });
25
+ const hashType = bitcoin.Transaction.SIGHASH_ALL;
26
+ function cltvCheckSigOutput(aQ, bQ, lockTime) {
27
+ return bitcoin.script.fromASM(`
28
+ OP_IF
29
+ ${bitcoin.script.number.encode(lockTime).toString('hex')}
30
+ OP_CHECKLOCKTIMEVERIFY
31
+ OP_DROP
32
+ OP_ELSE
33
+ ${bQ.publicKey.toString('hex')}
34
+ OP_CHECKSIGVERIFY
35
+ OP_ENDIF
36
+ ${aQ.publicKey.toString('hex')}
37
+ OP_CHECKSIG
38
+ `
39
+ .trim()
40
+ .replace(/\s+/g, ' '));
41
+ }
42
+ function utcNow() {
43
+ return Math.floor(Date.now() / 1000);
44
+ }
45
+ // expiry past, {Alice's signature} OP_TRUE
46
+ (0, mocha_1.it)('can create (and broadcast via 3PBP) a Transaction where Alice can redeem ' +
47
+ 'the output after the expiry (in the past)', async () => {
48
+ // 3 hours ago
49
+ const lockTime = bip65.encode({ utc: utcNow() - 3600 * 3 });
50
+ const redeemScript = cltvCheckSigOutput(alice, bob, lockTime);
51
+ const { address } = bitcoin.payments.p2sh({
52
+ redeem: { output: redeemScript, network: regtest },
53
+ network: regtest,
54
+ });
55
+ // fund the P2SH(CLTV) address
56
+ const unspent = await _regtest_1.regtestUtils.faucet(address, 1e5);
57
+ const tx = new bitcoin.Transaction();
58
+ tx.locktime = lockTime;
59
+ // Note: nSequence MUST be <= 0xfffffffe otherwise OP_CHECKLOCKTIMEVERIFY will fail.
60
+ tx.addInput(idToHash(unspent.txId), unspent.vout, 0xfffffffe);
61
+ tx.addOutput(toOutputScript(_regtest_1.regtestUtils.RANDOM_ADDRESS), 7e4);
62
+ // {Alice's signature} OP_TRUE
63
+ const signatureHash = tx.hashForSignature(0, redeemScript, hashType);
64
+ const redeemScriptSig = bitcoin.payments.p2sh({
65
+ redeem: {
66
+ input: bitcoin.script.compile([
67
+ bitcoin.script.signature.encode(alice.sign(signatureHash), hashType),
68
+ bitcoin.opcodes.OP_TRUE,
69
+ ]),
70
+ output: redeemScript,
71
+ },
72
+ }).input;
73
+ tx.setInputScript(0, redeemScriptSig);
74
+ await _regtest_1.regtestUtils.broadcast(tx.toHex());
75
+ await _regtest_1.regtestUtils.verify({
76
+ txId: tx.getId(),
77
+ address: _regtest_1.regtestUtils.RANDOM_ADDRESS,
78
+ vout: 0,
79
+ value: 7e4,
80
+ });
81
+ });
82
+ // expiry will pass, {Alice's signature} OP_TRUE
83
+ (0, mocha_1.it)('can create (and broadcast via 3PBP) a Transaction where Alice can redeem ' +
84
+ 'the output after the expiry (in the future)', async () => {
85
+ const height = await _regtest_1.regtestUtils.height();
86
+ // 5 blocks from now
87
+ const lockTime = bip65.encode({ blocks: height + 5 });
88
+ const redeemScript = cltvCheckSigOutput(alice, bob, lockTime);
89
+ const { address } = bitcoin.payments.p2sh({
90
+ redeem: { output: redeemScript, network: regtest },
91
+ network: regtest,
92
+ });
93
+ // fund the P2SH(CLTV) address
94
+ const unspent = await _regtest_1.regtestUtils.faucet(address, 1e5);
95
+ const tx = new bitcoin.Transaction();
96
+ tx.locktime = lockTime;
97
+ // Note: nSequence MUST be <= 0xfffffffe otherwise OP_CHECKLOCKTIMEVERIFY will fail.
98
+ tx.addInput(idToHash(unspent.txId), unspent.vout, 0xfffffffe);
99
+ tx.addOutput(toOutputScript(_regtest_1.regtestUtils.RANDOM_ADDRESS), 7e4);
100
+ // {Alice's signature} OP_TRUE
101
+ const signatureHash = tx.hashForSignature(0, redeemScript, hashType);
102
+ const redeemScriptSig = bitcoin.payments.p2sh({
103
+ redeem: {
104
+ input: bitcoin.script.compile([
105
+ bitcoin.script.signature.encode(alice.sign(signatureHash), hashType),
106
+ bitcoin.opcodes.OP_TRUE,
107
+ ]),
108
+ output: redeemScript,
109
+ },
110
+ }).input;
111
+ tx.setInputScript(0, redeemScriptSig);
112
+ // TODO: test that it failures _prior_ to expiry, unfortunately, race conditions when run concurrently
113
+ // ...
114
+ // into the future!
115
+ await _regtest_1.regtestUtils.mine(5);
116
+ await _regtest_1.regtestUtils.broadcast(tx.toHex());
117
+ await _regtest_1.regtestUtils.verify({
118
+ txId: tx.getId(),
119
+ address: _regtest_1.regtestUtils.RANDOM_ADDRESS,
120
+ vout: 0,
121
+ value: 7e4,
122
+ });
123
+ });
124
+ // expiry ignored, {Bob's signature} {Alice's signature} OP_FALSE
125
+ (0, mocha_1.it)('can create (and broadcast via 3PBP) a Transaction where Alice and Bob can ' +
126
+ 'redeem the output at any time', async () => {
127
+ // two hours ago
128
+ const lockTime = bip65.encode({ utc: utcNow() - 3600 * 2 });
129
+ const redeemScript = cltvCheckSigOutput(alice, bob, lockTime);
130
+ const { address } = bitcoin.payments.p2sh({
131
+ redeem: { output: redeemScript, network: regtest },
132
+ network: regtest,
133
+ });
134
+ // fund the P2SH(CLTV) address
135
+ const unspent = await _regtest_1.regtestUtils.faucet(address, 2e5);
136
+ const tx = new bitcoin.Transaction();
137
+ tx.locktime = lockTime;
138
+ // Note: nSequence MUST be <= 0xfffffffe otherwise OP_CHECKLOCKTIMEVERIFY will fail.
139
+ tx.addInput(idToHash(unspent.txId), unspent.vout, 0xfffffffe);
140
+ tx.addOutput(toOutputScript(_regtest_1.regtestUtils.RANDOM_ADDRESS), 8e4);
141
+ // {Alice's signature} {Bob's signature} OP_FALSE
142
+ const signatureHash = tx.hashForSignature(0, redeemScript, hashType);
143
+ const redeemScriptSig = bitcoin.payments.p2sh({
144
+ redeem: {
145
+ input: bitcoin.script.compile([
146
+ bitcoin.script.signature.encode(alice.sign(signatureHash), hashType),
147
+ bitcoin.script.signature.encode(bob.sign(signatureHash), hashType),
148
+ bitcoin.opcodes.OP_FALSE,
149
+ ]),
150
+ output: redeemScript,
151
+ },
152
+ }).input;
153
+ tx.setInputScript(0, redeemScriptSig);
154
+ await _regtest_1.regtestUtils.broadcast(tx.toHex());
155
+ await _regtest_1.regtestUtils.verify({
156
+ txId: tx.getId(),
157
+ address: _regtest_1.regtestUtils.RANDOM_ADDRESS,
158
+ vout: 0,
159
+ value: 8e4,
160
+ });
161
+ });
162
+ // expiry in the future, {Alice's signature} OP_TRUE
163
+ (0, mocha_1.it)('can create (but fail to broadcast via 3PBP) a Transaction where Alice ' +
164
+ 'attempts to redeem before the expiry', async () => {
165
+ // two hours from now
166
+ const lockTime = bip65.encode({ utc: utcNow() + 3600 * 2 });
167
+ const redeemScript = cltvCheckSigOutput(alice, bob, lockTime);
168
+ const { address } = bitcoin.payments.p2sh({
169
+ redeem: { output: redeemScript, network: regtest },
170
+ network: regtest,
171
+ });
172
+ // fund the P2SH(CLTV) address
173
+ const unspent = await _regtest_1.regtestUtils.faucet(address, 2e4);
174
+ const tx = new bitcoin.Transaction();
175
+ tx.locktime = lockTime;
176
+ // Note: nSequence MUST be <= 0xfffffffe otherwise OP_CHECKLOCKTIMEVERIFY will fail.
177
+ tx.addInput(idToHash(unspent.txId), unspent.vout, 0xfffffffe);
178
+ tx.addOutput(toOutputScript(_regtest_1.regtestUtils.RANDOM_ADDRESS), 1e4);
179
+ // {Alice's signature} OP_TRUE
180
+ const signatureHash = tx.hashForSignature(0, redeemScript, hashType);
181
+ const redeemScriptSig = bitcoin.payments.p2sh({
182
+ redeem: {
183
+ input: bitcoin.script.compile([
184
+ bitcoin.script.signature.encode(alice.sign(signatureHash), hashType),
185
+ bitcoin.script.signature.encode(bob.sign(signatureHash), hashType),
186
+ bitcoin.opcodes.OP_TRUE,
187
+ ]),
188
+ output: redeemScript,
189
+ },
190
+ }).input;
191
+ tx.setInputScript(0, redeemScriptSig);
192
+ await _regtest_1.regtestUtils.broadcast(tx.toHex()).catch(err => {
193
+ assert.throws(() => {
194
+ if (err)
195
+ throw err;
196
+ }, /Error: non-final/);
197
+ });
198
+ });
199
+ });
@@ -0,0 +1,283 @@
1
+ import * as assert from 'assert';
2
+ import ECPairFactory from 'ecpair';
3
+ import * as ecc from 'tiny-secp256k1';
4
+ import { before, describe, it } from 'mocha';
5
+ import * as bitcoin from '../..';
6
+ import { regtestUtils } from './_regtest';
7
+
8
+ const ECPair = ECPairFactory(ecc);
9
+ const regtest = regtestUtils.network;
10
+ const bip65 = require('bip65');
11
+
12
+ function toOutputScript(address: string): Buffer {
13
+ return bitcoin.address.toOutputScript(address, regtest);
14
+ }
15
+
16
+ function idToHash(txid: string): Buffer {
17
+ return Buffer.from(txid, 'hex').reverse();
18
+ }
19
+
20
+ const alice = ECPair.fromWIF(
21
+ 'cScfkGjbzzoeewVWmU2hYPUHeVGJRDdFt7WhmrVVGkxpmPP8BHWe',
22
+ regtest,
23
+ );
24
+ const bob = ECPair.fromWIF(
25
+ 'cMkopUXKWsEzAjfa1zApksGRwjVpJRB3831qM9W4gKZsLwjHXA9x',
26
+ regtest,
27
+ );
28
+
29
+ describe('bitcoinjs-lib (transactions w/ CLTV)', () => {
30
+ // force update MTP
31
+ before(async () => {
32
+ await regtestUtils.mine(11);
33
+ });
34
+
35
+ const hashType = bitcoin.Transaction.SIGHASH_ALL;
36
+
37
+ interface KeyPair {
38
+ publicKey: Buffer;
39
+ }
40
+
41
+ function cltvCheckSigOutput(
42
+ aQ: KeyPair,
43
+ bQ: KeyPair,
44
+ lockTime: number,
45
+ ): Buffer {
46
+ return bitcoin.script.fromASM(
47
+ `
48
+ OP_IF
49
+ ${bitcoin.script.number.encode(lockTime).toString('hex')}
50
+ OP_CHECKLOCKTIMEVERIFY
51
+ OP_DROP
52
+ OP_ELSE
53
+ ${bQ.publicKey.toString('hex')}
54
+ OP_CHECKSIGVERIFY
55
+ OP_ENDIF
56
+ ${aQ.publicKey.toString('hex')}
57
+ OP_CHECKSIG
58
+ `
59
+ .trim()
60
+ .replace(/\s+/g, ' '),
61
+ );
62
+ }
63
+
64
+ function utcNow(): number {
65
+ return Math.floor(Date.now() / 1000);
66
+ }
67
+
68
+ // expiry past, {Alice's signature} OP_TRUE
69
+ it(
70
+ 'can create (and broadcast via 3PBP) a Transaction where Alice can redeem ' +
71
+ 'the output after the expiry (in the past)',
72
+ async () => {
73
+ // 3 hours ago
74
+ const lockTime = bip65.encode({ utc: utcNow() - 3600 * 3 });
75
+ const redeemScript = cltvCheckSigOutput(alice, bob, lockTime);
76
+ const { address } = bitcoin.payments.p2sh({
77
+ redeem: { output: redeemScript, network: regtest },
78
+ network: regtest,
79
+ });
80
+
81
+ // fund the P2SH(CLTV) address
82
+ const unspent = await regtestUtils.faucet(address!, 1e5);
83
+ const tx = new bitcoin.Transaction();
84
+ tx.locktime = lockTime;
85
+ // Note: nSequence MUST be <= 0xfffffffe otherwise OP_CHECKLOCKTIMEVERIFY will fail.
86
+ tx.addInput(idToHash(unspent.txId), unspent.vout, 0xfffffffe);
87
+ tx.addOutput(toOutputScript(regtestUtils.RANDOM_ADDRESS), 7e4);
88
+
89
+ // {Alice's signature} OP_TRUE
90
+ const signatureHash = tx.hashForSignature(
91
+ 0,
92
+ redeemScript,
93
+ hashType,
94
+ );
95
+ const redeemScriptSig = bitcoin.payments.p2sh({
96
+ redeem: {
97
+ input: bitcoin.script.compile([
98
+ bitcoin.script.signature.encode(
99
+ alice.sign(signatureHash),
100
+ hashType,
101
+ ),
102
+ bitcoin.opcodes.OP_TRUE,
103
+ ]),
104
+ output: redeemScript,
105
+ },
106
+ }).input;
107
+ tx.setInputScript(0, redeemScriptSig!);
108
+
109
+ await regtestUtils.broadcast(tx.toHex());
110
+
111
+ await regtestUtils.verify({
112
+ txId: tx.getId(),
113
+ address: regtestUtils.RANDOM_ADDRESS,
114
+ vout: 0,
115
+ value: 7e4,
116
+ });
117
+ },
118
+ );
119
+
120
+ // expiry will pass, {Alice's signature} OP_TRUE
121
+ it(
122
+ 'can create (and broadcast via 3PBP) a Transaction where Alice can redeem ' +
123
+ 'the output after the expiry (in the future)',
124
+ async () => {
125
+ const height = await regtestUtils.height();
126
+ // 5 blocks from now
127
+ const lockTime = bip65.encode({ blocks: height + 5 });
128
+ const redeemScript = cltvCheckSigOutput(alice, bob, lockTime);
129
+ const { address } = bitcoin.payments.p2sh({
130
+ redeem: { output: redeemScript, network: regtest },
131
+ network: regtest,
132
+ });
133
+
134
+ // fund the P2SH(CLTV) address
135
+ const unspent = await regtestUtils.faucet(address!, 1e5);
136
+ const tx = new bitcoin.Transaction();
137
+ tx.locktime = lockTime;
138
+ // Note: nSequence MUST be <= 0xfffffffe otherwise OP_CHECKLOCKTIMEVERIFY will fail.
139
+ tx.addInput(idToHash(unspent.txId), unspent.vout, 0xfffffffe);
140
+ tx.addOutput(toOutputScript(regtestUtils.RANDOM_ADDRESS), 7e4);
141
+
142
+ // {Alice's signature} OP_TRUE
143
+ const signatureHash = tx.hashForSignature(
144
+ 0,
145
+ redeemScript,
146
+ hashType,
147
+ );
148
+ const redeemScriptSig = bitcoin.payments.p2sh({
149
+ redeem: {
150
+ input: bitcoin.script.compile([
151
+ bitcoin.script.signature.encode(
152
+ alice.sign(signatureHash),
153
+ hashType,
154
+ ),
155
+ bitcoin.opcodes.OP_TRUE,
156
+ ]),
157
+ output: redeemScript,
158
+ },
159
+ }).input;
160
+ tx.setInputScript(0, redeemScriptSig!);
161
+
162
+ // TODO: test that it failures _prior_ to expiry, unfortunately, race conditions when run concurrently
163
+ // ...
164
+ // into the future!
165
+ await regtestUtils.mine(5);
166
+ await regtestUtils.broadcast(tx.toHex());
167
+ await regtestUtils.verify({
168
+ txId: tx.getId(),
169
+ address: regtestUtils.RANDOM_ADDRESS,
170
+ vout: 0,
171
+ value: 7e4,
172
+ });
173
+ },
174
+ );
175
+
176
+ // expiry ignored, {Bob's signature} {Alice's signature} OP_FALSE
177
+ it(
178
+ 'can create (and broadcast via 3PBP) a Transaction where Alice and Bob can ' +
179
+ 'redeem the output at any time',
180
+ async () => {
181
+ // two hours ago
182
+ const lockTime = bip65.encode({ utc: utcNow() - 3600 * 2 });
183
+ const redeemScript = cltvCheckSigOutput(alice, bob, lockTime);
184
+ const { address } = bitcoin.payments.p2sh({
185
+ redeem: { output: redeemScript, network: regtest },
186
+ network: regtest,
187
+ });
188
+
189
+ // fund the P2SH(CLTV) address
190
+ const unspent = await regtestUtils.faucet(address!, 2e5);
191
+ const tx = new bitcoin.Transaction();
192
+ tx.locktime = lockTime;
193
+ // Note: nSequence MUST be <= 0xfffffffe otherwise OP_CHECKLOCKTIMEVERIFY will fail.
194
+ tx.addInput(idToHash(unspent.txId), unspent.vout, 0xfffffffe);
195
+ tx.addOutput(toOutputScript(regtestUtils.RANDOM_ADDRESS), 8e4);
196
+
197
+ // {Alice's signature} {Bob's signature} OP_FALSE
198
+ const signatureHash = tx.hashForSignature(
199
+ 0,
200
+ redeemScript,
201
+ hashType,
202
+ );
203
+ const redeemScriptSig = bitcoin.payments.p2sh({
204
+ redeem: {
205
+ input: bitcoin.script.compile([
206
+ bitcoin.script.signature.encode(
207
+ alice.sign(signatureHash),
208
+ hashType,
209
+ ),
210
+ bitcoin.script.signature.encode(
211
+ bob.sign(signatureHash),
212
+ hashType,
213
+ ),
214
+ bitcoin.opcodes.OP_FALSE,
215
+ ]),
216
+ output: redeemScript,
217
+ },
218
+ }).input;
219
+ tx.setInputScript(0, redeemScriptSig!);
220
+
221
+ await regtestUtils.broadcast(tx.toHex());
222
+ await regtestUtils.verify({
223
+ txId: tx.getId(),
224
+ address: regtestUtils.RANDOM_ADDRESS,
225
+ vout: 0,
226
+ value: 8e4,
227
+ });
228
+ },
229
+ );
230
+
231
+ // expiry in the future, {Alice's signature} OP_TRUE
232
+ it(
233
+ 'can create (but fail to broadcast via 3PBP) a Transaction where Alice ' +
234
+ 'attempts to redeem before the expiry',
235
+ async () => {
236
+ // two hours from now
237
+ const lockTime = bip65.encode({ utc: utcNow() + 3600 * 2 });
238
+ const redeemScript = cltvCheckSigOutput(alice, bob, lockTime);
239
+ const { address } = bitcoin.payments.p2sh({
240
+ redeem: { output: redeemScript, network: regtest },
241
+ network: regtest,
242
+ });
243
+
244
+ // fund the P2SH(CLTV) address
245
+ const unspent = await regtestUtils.faucet(address!, 2e4);
246
+ const tx = new bitcoin.Transaction();
247
+ tx.locktime = lockTime;
248
+ // Note: nSequence MUST be <= 0xfffffffe otherwise OP_CHECKLOCKTIMEVERIFY will fail.
249
+ tx.addInput(idToHash(unspent.txId), unspent.vout, 0xfffffffe);
250
+ tx.addOutput(toOutputScript(regtestUtils.RANDOM_ADDRESS), 1e4);
251
+
252
+ // {Alice's signature} OP_TRUE
253
+ const signatureHash = tx.hashForSignature(
254
+ 0,
255
+ redeemScript,
256
+ hashType,
257
+ );
258
+ const redeemScriptSig = bitcoin.payments.p2sh({
259
+ redeem: {
260
+ input: bitcoin.script.compile([
261
+ bitcoin.script.signature.encode(
262
+ alice.sign(signatureHash),
263
+ hashType,
264
+ ),
265
+ bitcoin.script.signature.encode(
266
+ bob.sign(signatureHash),
267
+ hashType,
268
+ ),
269
+ bitcoin.opcodes.OP_TRUE,
270
+ ]),
271
+ output: redeemScript,
272
+ },
273
+ }).input;
274
+ tx.setInputScript(0, redeemScriptSig!);
275
+
276
+ await regtestUtils.broadcast(tx.toHex()).catch(err => {
277
+ assert.throws(() => {
278
+ if (err) throw err;
279
+ }, /Error: non-final/);
280
+ });
281
+ },
282
+ );
283
+ });