@bsv/sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (464) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
  2. package/.github/ISSUE_TEMPLATE/discussion.md +24 -0
  3. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +23 -0
  4. package/CHANGELOG.md +72 -0
  5. package/CONTRIBUTING.md +85 -0
  6. package/LICENSE.txt +28 -0
  7. package/README.md +87 -0
  8. package/ROADMAP.md +3 -0
  9. package/dist/cjs/mod.js +25 -0
  10. package/dist/cjs/mod.js.map +1 -0
  11. package/dist/cjs/package.json +42 -0
  12. package/dist/cjs/src/compat/BIP39.js +272 -0
  13. package/dist/cjs/src/compat/BIP39.js.map +1 -0
  14. package/dist/cjs/src/compat/BSM.js +77 -0
  15. package/dist/cjs/src/compat/BSM.js.map +1 -0
  16. package/dist/cjs/src/compat/ECIES.js +483 -0
  17. package/dist/cjs/src/compat/ECIES.js.map +1 -0
  18. package/dist/cjs/src/compat/HD.js +326 -0
  19. package/dist/cjs/src/compat/HD.js.map +1 -0
  20. package/dist/cjs/src/compat/Mnemonic.js +298 -0
  21. package/dist/cjs/src/compat/Mnemonic.js.map +1 -0
  22. package/dist/cjs/src/compat/bip-39-wordlist-en.js +2057 -0
  23. package/dist/cjs/src/compat/bip-39-wordlist-en.js.map +1 -0
  24. package/dist/cjs/src/compat/index.js +37 -0
  25. package/dist/cjs/src/compat/index.js.map +1 -0
  26. package/dist/cjs/src/messages/EncryptedMessage.js +69 -0
  27. package/dist/cjs/src/messages/EncryptedMessage.js.map +1 -0
  28. package/dist/cjs/src/messages/SignedMessage.js +85 -0
  29. package/dist/cjs/src/messages/SignedMessage.js.map +1 -0
  30. package/dist/cjs/src/messages/index.js +29 -0
  31. package/dist/cjs/src/messages/index.js.map +1 -0
  32. package/dist/cjs/src/primitives/AESGCM.js +384 -0
  33. package/dist/cjs/src/primitives/AESGCM.js.map +1 -0
  34. package/dist/cjs/src/primitives/BasePoint.js +19 -0
  35. package/dist/cjs/src/primitives/BasePoint.js.map +1 -0
  36. package/dist/cjs/src/primitives/BigNumber.js +4269 -0
  37. package/dist/cjs/src/primitives/BigNumber.js.map +1 -0
  38. package/dist/cjs/src/primitives/Curve.js +1126 -0
  39. package/dist/cjs/src/primitives/Curve.js.map +1 -0
  40. package/dist/cjs/src/primitives/DRBG.js +99 -0
  41. package/dist/cjs/src/primitives/DRBG.js.map +1 -0
  42. package/dist/cjs/src/primitives/ECDSA.js +169 -0
  43. package/dist/cjs/src/primitives/ECDSA.js.map +1 -0
  44. package/dist/cjs/src/primitives/Hash.js +1332 -0
  45. package/dist/cjs/src/primitives/Hash.js.map +1 -0
  46. package/dist/cjs/src/primitives/JacobianPoint.js +400 -0
  47. package/dist/cjs/src/primitives/JacobianPoint.js.map +1 -0
  48. package/dist/cjs/src/primitives/K256.js +111 -0
  49. package/dist/cjs/src/primitives/K256.js.map +1 -0
  50. package/dist/cjs/src/primitives/Mersenne.js +118 -0
  51. package/dist/cjs/src/primitives/Mersenne.js.map +1 -0
  52. package/dist/cjs/src/primitives/MontgomoryMethod.js +150 -0
  53. package/dist/cjs/src/primitives/MontgomoryMethod.js.map +1 -0
  54. package/dist/cjs/src/primitives/Point.js +819 -0
  55. package/dist/cjs/src/primitives/Point.js.map +1 -0
  56. package/dist/cjs/src/primitives/PrivateKey.js +190 -0
  57. package/dist/cjs/src/primitives/PrivateKey.js.map +1 -0
  58. package/dist/cjs/src/primitives/PublicKey.js +151 -0
  59. package/dist/cjs/src/primitives/PublicKey.js.map +1 -0
  60. package/dist/cjs/src/primitives/Random.js +57 -0
  61. package/dist/cjs/src/primitives/Random.js.map +1 -0
  62. package/dist/cjs/src/primitives/ReductionContext.js +490 -0
  63. package/dist/cjs/src/primitives/ReductionContext.js.map +1 -0
  64. package/dist/cjs/src/primitives/Signature.js +220 -0
  65. package/dist/cjs/src/primitives/Signature.js.map +1 -0
  66. package/dist/cjs/src/primitives/SymmetricKey.js +69 -0
  67. package/dist/cjs/src/primitives/SymmetricKey.js.map +1 -0
  68. package/dist/cjs/src/primitives/TransactionSignature.js +172 -0
  69. package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -0
  70. package/dist/cjs/src/primitives/index.js +45 -0
  71. package/dist/cjs/src/primitives/index.js.map +1 -0
  72. package/dist/cjs/src/primitives/utils.js +615 -0
  73. package/dist/cjs/src/primitives/utils.js.map +1 -0
  74. package/dist/cjs/src/script/LockingScript.js +35 -0
  75. package/dist/cjs/src/script/LockingScript.js.map +1 -0
  76. package/dist/cjs/src/script/OP.js +208 -0
  77. package/dist/cjs/src/script/OP.js.map +1 -0
  78. package/dist/cjs/src/script/Script.js +429 -0
  79. package/dist/cjs/src/script/Script.js.map +1 -0
  80. package/dist/cjs/src/script/ScriptChunk.js +3 -0
  81. package/dist/cjs/src/script/ScriptChunk.js.map +1 -0
  82. package/dist/cjs/src/script/ScriptTemplate.js +3 -0
  83. package/dist/cjs/src/script/ScriptTemplate.js.map +1 -0
  84. package/dist/cjs/src/script/Spend.js +1252 -0
  85. package/dist/cjs/src/script/Spend.js.map +1 -0
  86. package/dist/cjs/src/script/UnlockingScript.js +35 -0
  87. package/dist/cjs/src/script/UnlockingScript.js.map +1 -0
  88. package/dist/cjs/src/script/index.js +32 -0
  89. package/dist/cjs/src/script/index.js.map +1 -0
  90. package/dist/cjs/src/script/templates/P2PKH.js +98 -0
  91. package/dist/cjs/src/script/templates/P2PKH.js.map +1 -0
  92. package/dist/cjs/src/script/templates/RPuzzle.js +125 -0
  93. package/dist/cjs/src/script/templates/RPuzzle.js.map +1 -0
  94. package/dist/cjs/src/script/templates/index.js +11 -0
  95. package/dist/cjs/src/script/templates/index.js.map +1 -0
  96. package/dist/cjs/src/transaction/Broadcaster.js +3 -0
  97. package/dist/cjs/src/transaction/Broadcaster.js.map +1 -0
  98. package/dist/cjs/src/transaction/ChainTracker.js +3 -0
  99. package/dist/cjs/src/transaction/ChainTracker.js.map +1 -0
  100. package/dist/cjs/src/transaction/FeeModel.js +3 -0
  101. package/dist/cjs/src/transaction/FeeModel.js.map +1 -0
  102. package/dist/cjs/src/transaction/MerklePath.js +239 -0
  103. package/dist/cjs/src/transaction/MerklePath.js.map +1 -0
  104. package/dist/cjs/src/transaction/Transaction.js +557 -0
  105. package/dist/cjs/src/transaction/Transaction.js.map +1 -0
  106. package/dist/cjs/src/transaction/TransactionInput.js +3 -0
  107. package/dist/cjs/src/transaction/TransactionInput.js.map +1 -0
  108. package/dist/cjs/src/transaction/TransactionOutput.js +3 -0
  109. package/dist/cjs/src/transaction/TransactionOutput.js.map +1 -0
  110. package/dist/cjs/src/transaction/broadcasters/ARC.js +101 -0
  111. package/dist/cjs/src/transaction/broadcasters/ARC.js.map +1 -0
  112. package/dist/cjs/src/transaction/broadcasters/index.js +9 -0
  113. package/dist/cjs/src/transaction/broadcasters/index.js.map +1 -0
  114. package/dist/cjs/src/transaction/fee-models/SatoshisPerKilobyte.js +69 -0
  115. package/dist/cjs/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -0
  116. package/dist/cjs/src/transaction/fee-models/index.js +9 -0
  117. package/dist/cjs/src/transaction/fee-models/index.js.map +1 -0
  118. package/dist/cjs/src/transaction/index.js +11 -0
  119. package/dist/cjs/src/transaction/index.js.map +1 -0
  120. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  121. package/dist/esm/mod.js +9 -0
  122. package/dist/esm/mod.js.map +1 -0
  123. package/dist/esm/src/compat/BIP39.js +272 -0
  124. package/dist/esm/src/compat/BIP39.js.map +1 -0
  125. package/dist/esm/src/compat/BSM.js +45 -0
  126. package/dist/esm/src/compat/BSM.js.map +1 -0
  127. package/dist/esm/src/compat/ECIES.js +454 -0
  128. package/dist/esm/src/compat/ECIES.js.map +1 -0
  129. package/dist/esm/src/compat/HD.js +304 -0
  130. package/dist/esm/src/compat/HD.js.map +1 -0
  131. package/dist/esm/src/compat/Mnemonic.js +272 -0
  132. package/dist/esm/src/compat/Mnemonic.js.map +1 -0
  133. package/dist/esm/src/compat/bip-39-wordlist-en.js +2054 -0
  134. package/dist/esm/src/compat/bip-39-wordlist-en.js.map +1 -0
  135. package/dist/esm/src/compat/index.js +5 -0
  136. package/dist/esm/src/compat/index.js.map +1 -0
  137. package/dist/esm/src/messages/EncryptedMessage.js +61 -0
  138. package/dist/esm/src/messages/EncryptedMessage.js.map +1 -0
  139. package/dist/esm/src/messages/SignedMessage.js +77 -0
  140. package/dist/esm/src/messages/SignedMessage.js.map +1 -0
  141. package/dist/esm/src/messages/index.js +3 -0
  142. package/dist/esm/src/messages/index.js.map +1 -0
  143. package/dist/esm/src/primitives/AESGCM.js +371 -0
  144. package/dist/esm/src/primitives/AESGCM.js.map +1 -0
  145. package/dist/esm/src/primitives/BasePoint.js +16 -0
  146. package/dist/esm/src/primitives/BasePoint.js.map +1 -0
  147. package/dist/esm/src/primitives/BigNumber.js +4304 -0
  148. package/dist/esm/src/primitives/BigNumber.js.map +1 -0
  149. package/dist/esm/src/primitives/Curve.js +1141 -0
  150. package/dist/esm/src/primitives/Curve.js.map +1 -0
  151. package/dist/esm/src/primitives/DRBG.js +98 -0
  152. package/dist/esm/src/primitives/DRBG.js.map +1 -0
  153. package/dist/esm/src/primitives/ECDSA.js +161 -0
  154. package/dist/esm/src/primitives/ECDSA.js.map +1 -0
  155. package/dist/esm/src/primitives/Hash.js +1336 -0
  156. package/dist/esm/src/primitives/Hash.js.map +1 -0
  157. package/dist/esm/src/primitives/JacobianPoint.js +398 -0
  158. package/dist/esm/src/primitives/JacobianPoint.js.map +1 -0
  159. package/dist/esm/src/primitives/K256.js +105 -0
  160. package/dist/esm/src/primitives/K256.js.map +1 -0
  161. package/dist/esm/src/primitives/Mersenne.js +117 -0
  162. package/dist/esm/src/primitives/Mersenne.js.map +1 -0
  163. package/dist/esm/src/primitives/MontgomoryMethod.js +149 -0
  164. package/dist/esm/src/primitives/MontgomoryMethod.js.map +1 -0
  165. package/dist/esm/src/primitives/Point.js +816 -0
  166. package/dist/esm/src/primitives/Point.js.map +1 -0
  167. package/dist/esm/src/primitives/PrivateKey.js +184 -0
  168. package/dist/esm/src/primitives/PrivateKey.js.map +1 -0
  169. package/dist/esm/src/primitives/PublicKey.js +145 -0
  170. package/dist/esm/src/primitives/PublicKey.js.map +1 -0
  171. package/dist/esm/src/primitives/Random.js +56 -0
  172. package/dist/esm/src/primitives/Random.js.map +1 -0
  173. package/dist/esm/src/primitives/ReductionContext.js +486 -0
  174. package/dist/esm/src/primitives/ReductionContext.js.map +1 -0
  175. package/dist/esm/src/primitives/Signature.js +223 -0
  176. package/dist/esm/src/primitives/Signature.js.map +1 -0
  177. package/dist/esm/src/primitives/SymmetricKey.js +63 -0
  178. package/dist/esm/src/primitives/SymmetricKey.js.map +1 -0
  179. package/dist/esm/src/primitives/TransactionSignature.js +144 -0
  180. package/dist/esm/src/primitives/TransactionSignature.js.map +1 -0
  181. package/dist/esm/src/primitives/index.js +9 -0
  182. package/dist/esm/src/primitives/index.js.map +1 -0
  183. package/dist/esm/src/primitives/utils.js +601 -0
  184. package/dist/esm/src/primitives/utils.js.map +1 -0
  185. package/dist/esm/src/script/LockingScript.js +29 -0
  186. package/dist/esm/src/script/LockingScript.js.map +1 -0
  187. package/dist/esm/src/script/OP.js +206 -0
  188. package/dist/esm/src/script/OP.js.map +1 -0
  189. package/dist/esm/src/script/Script.js +424 -0
  190. package/dist/esm/src/script/Script.js.map +1 -0
  191. package/dist/esm/src/script/ScriptChunk.js +2 -0
  192. package/dist/esm/src/script/ScriptChunk.js.map +1 -0
  193. package/dist/esm/src/script/ScriptTemplate.js +2 -0
  194. package/dist/esm/src/script/ScriptTemplate.js.map +1 -0
  195. package/dist/esm/src/script/Spend.js +1240 -0
  196. package/dist/esm/src/script/Spend.js.map +1 -0
  197. package/dist/esm/src/script/UnlockingScript.js +29 -0
  198. package/dist/esm/src/script/UnlockingScript.js.map +1 -0
  199. package/dist/esm/src/script/index.js +7 -0
  200. package/dist/esm/src/script/index.js.map +1 -0
  201. package/dist/esm/src/script/templates/P2PKH.js +92 -0
  202. package/dist/esm/src/script/templates/P2PKH.js.map +1 -0
  203. package/dist/esm/src/script/templates/RPuzzle.js +119 -0
  204. package/dist/esm/src/script/templates/RPuzzle.js.map +1 -0
  205. package/dist/esm/src/script/templates/index.js +3 -0
  206. package/dist/esm/src/script/templates/index.js.map +1 -0
  207. package/dist/esm/src/transaction/Broadcaster.js +2 -0
  208. package/dist/esm/src/transaction/Broadcaster.js.map +1 -0
  209. package/dist/esm/src/transaction/ChainTracker.js +2 -0
  210. package/dist/esm/src/transaction/ChainTracker.js.map +1 -0
  211. package/dist/esm/src/transaction/FeeModel.js +2 -0
  212. package/dist/esm/src/transaction/FeeModel.js.map +1 -0
  213. package/dist/esm/src/transaction/MerklePath.js +237 -0
  214. package/dist/esm/src/transaction/MerklePath.js.map +1 -0
  215. package/dist/esm/src/transaction/Transaction.js +557 -0
  216. package/dist/esm/src/transaction/Transaction.js.map +1 -0
  217. package/dist/esm/src/transaction/TransactionInput.js +2 -0
  218. package/dist/esm/src/transaction/TransactionInput.js.map +1 -0
  219. package/dist/esm/src/transaction/TransactionOutput.js +2 -0
  220. package/dist/esm/src/transaction/TransactionOutput.js.map +1 -0
  221. package/dist/esm/src/transaction/broadcasters/ARC.js +100 -0
  222. package/dist/esm/src/transaction/broadcasters/ARC.js.map +1 -0
  223. package/dist/esm/src/transaction/broadcasters/index.js +2 -0
  224. package/dist/esm/src/transaction/broadcasters/index.js.map +1 -0
  225. package/dist/esm/src/transaction/fee-models/SatoshisPerKilobyte.js +71 -0
  226. package/dist/esm/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -0
  227. package/dist/esm/src/transaction/fee-models/index.js +2 -0
  228. package/dist/esm/src/transaction/fee-models/index.js.map +1 -0
  229. package/dist/esm/src/transaction/index.js +3 -0
  230. package/dist/esm/src/transaction/index.js.map +1 -0
  231. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  232. package/dist/types/mod.d.ts +9 -0
  233. package/dist/types/mod.d.ts.map +1 -0
  234. package/dist/types/src/compat/BIP39.d.ts +132 -0
  235. package/dist/types/src/compat/BIP39.d.ts.map +1 -0
  236. package/dist/types/src/compat/BSM.d.ts +28 -0
  237. package/dist/types/src/compat/BSM.d.ts.map +1 -0
  238. package/dist/types/src/compat/ECIES.d.ts +62 -0
  239. package/dist/types/src/compat/ECIES.d.ts.map +1 -0
  240. package/dist/types/src/compat/HD.d.ts +117 -0
  241. package/dist/types/src/compat/HD.d.ts.map +1 -0
  242. package/dist/types/src/compat/Mnemonic.d.ts +132 -0
  243. package/dist/types/src/compat/Mnemonic.d.ts.map +1 -0
  244. package/dist/types/src/compat/bip-39-wordlist-en.d.ts +5 -0
  245. package/dist/types/src/compat/bip-39-wordlist-en.d.ts.map +1 -0
  246. package/dist/types/src/compat/index.d.ts +5 -0
  247. package/dist/types/src/compat/index.d.ts.map +1 -0
  248. package/dist/types/src/messages/EncryptedMessage.d.ts +20 -0
  249. package/dist/types/src/messages/EncryptedMessage.d.ts.map +1 -0
  250. package/dist/types/src/messages/SignedMessage.d.ts +21 -0
  251. package/dist/types/src/messages/SignedMessage.d.ts.map +1 -0
  252. package/dist/types/src/messages/index.d.ts +3 -0
  253. package/dist/types/src/messages/index.d.ts.map +1 -0
  254. package/dist/types/src/primitives/AESGCM.d.ts +14 -0
  255. package/dist/types/src/primitives/AESGCM.d.ts.map +1 -0
  256. package/dist/types/src/primitives/BasePoint.d.ts +22 -0
  257. package/dist/types/src/primitives/BasePoint.d.ts.map +1 -0
  258. package/dist/types/src/primitives/BigNumber.d.ts +1895 -0
  259. package/dist/types/src/primitives/BigNumber.d.ts.map +1 -0
  260. package/dist/types/src/primitives/Curve.d.ts +55 -0
  261. package/dist/types/src/primitives/Curve.d.ts.map +1 -0
  262. package/dist/types/src/primitives/DRBG.d.ts +54 -0
  263. package/dist/types/src/primitives/DRBG.d.ts.map +1 -0
  264. package/dist/types/src/primitives/ECDSA.d.ts +39 -0
  265. package/dist/types/src/primitives/ECDSA.d.ts.map +1 -0
  266. package/dist/types/src/primitives/Hash.d.ts +411 -0
  267. package/dist/types/src/primitives/Hash.d.ts.map +1 -0
  268. package/dist/types/src/primitives/JacobianPoint.d.ts +164 -0
  269. package/dist/types/src/primitives/JacobianPoint.d.ts.map +1 -0
  270. package/dist/types/src/primitives/K256.d.ts +53 -0
  271. package/dist/types/src/primitives/K256.d.ts.map +1 -0
  272. package/dist/types/src/primitives/Mersenne.d.ts +72 -0
  273. package/dist/types/src/primitives/Mersenne.d.ts.map +1 -0
  274. package/dist/types/src/primitives/MontgomoryMethod.d.ts +96 -0
  275. package/dist/types/src/primitives/MontgomoryMethod.d.ts.map +1 -0
  276. package/dist/types/src/primitives/Point.d.ts +303 -0
  277. package/dist/types/src/primitives/Point.d.ts.map +1 -0
  278. package/dist/types/src/primitives/PrivateKey.d.ts +143 -0
  279. package/dist/types/src/primitives/PrivateKey.d.ts.map +1 -0
  280. package/dist/types/src/primitives/PublicKey.d.ts +108 -0
  281. package/dist/types/src/primitives/PublicKey.d.ts.map +1 -0
  282. package/dist/types/src/primitives/Random.d.ts +14 -0
  283. package/dist/types/src/primitives/Random.d.ts.map +1 -0
  284. package/dist/types/src/primitives/ReductionContext.d.ts +308 -0
  285. package/dist/types/src/primitives/ReductionContext.d.ts.map +1 -0
  286. package/dist/types/src/primitives/Signature.d.ts +100 -0
  287. package/dist/types/src/primitives/Signature.d.ts.map +1 -0
  288. package/dist/types/src/primitives/SymmetricKey.d.ts +44 -0
  289. package/dist/types/src/primitives/SymmetricKey.d.ts.map +1 -0
  290. package/dist/types/src/primitives/TransactionSignature.d.ts +36 -0
  291. package/dist/types/src/primitives/TransactionSignature.d.ts.map +1 -0
  292. package/dist/types/src/primitives/index.d.ts +9 -0
  293. package/dist/types/src/primitives/index.d.ts.map +1 -0
  294. package/dist/types/src/primitives/utils.d.ts +118 -0
  295. package/dist/types/src/primitives/utils.d.ts.map +1 -0
  296. package/dist/types/src/script/LockingScript.d.ts +25 -0
  297. package/dist/types/src/script/LockingScript.d.ts.map +1 -0
  298. package/dist/types/src/script/OP.d.ts +193 -0
  299. package/dist/types/src/script/OP.d.ts.map +1 -0
  300. package/dist/types/src/script/Script.d.ts +148 -0
  301. package/dist/types/src/script/Script.d.ts.map +1 -0
  302. package/dist/types/src/script/ScriptChunk.d.ts +8 -0
  303. package/dist/types/src/script/ScriptChunk.d.ts.map +1 -0
  304. package/dist/types/src/script/ScriptTemplate.d.ts +33 -0
  305. package/dist/types/src/script/ScriptTemplate.d.ts.map +1 -0
  306. package/dist/types/src/script/Spend.d.ts +103 -0
  307. package/dist/types/src/script/Spend.d.ts.map +1 -0
  308. package/dist/types/src/script/UnlockingScript.d.ts +25 -0
  309. package/dist/types/src/script/UnlockingScript.d.ts.map +1 -0
  310. package/dist/types/src/script/index.d.ts +8 -0
  311. package/dist/types/src/script/index.d.ts.map +1 -0
  312. package/dist/types/src/script/templates/P2PKH.d.ts +37 -0
  313. package/dist/types/src/script/templates/P2PKH.d.ts.map +1 -0
  314. package/dist/types/src/script/templates/RPuzzle.d.ts +47 -0
  315. package/dist/types/src/script/templates/RPuzzle.d.ts.map +1 -0
  316. package/dist/types/src/script/templates/index.d.ts +3 -0
  317. package/dist/types/src/script/templates/index.d.ts.map +1 -0
  318. package/dist/types/src/transaction/Broadcaster.d.ts +39 -0
  319. package/dist/types/src/transaction/Broadcaster.d.ts.map +1 -0
  320. package/dist/types/src/transaction/ChainTracker.d.ts +23 -0
  321. package/dist/types/src/transaction/ChainTracker.d.ts.map +1 -0
  322. package/dist/types/src/transaction/FeeModel.d.ts +12 -0
  323. package/dist/types/src/transaction/FeeModel.d.ts.map +1 -0
  324. package/dist/types/src/transaction/MerklePath.d.ts +91 -0
  325. package/dist/types/src/transaction/MerklePath.d.ts.map +1 -0
  326. package/dist/types/src/transaction/Transaction.d.ts +181 -0
  327. package/dist/types/src/transaction/Transaction.d.ts.map +1 -0
  328. package/dist/types/src/transaction/TransactionInput.d.ts +63 -0
  329. package/dist/types/src/transaction/TransactionInput.d.ts.map +1 -0
  330. package/dist/types/src/transaction/TransactionOutput.d.ts +36 -0
  331. package/dist/types/src/transaction/TransactionOutput.d.ts.map +1 -0
  332. package/dist/types/src/transaction/broadcasters/ARC.d.ts +28 -0
  333. package/dist/types/src/transaction/broadcasters/ARC.d.ts.map +1 -0
  334. package/dist/types/src/transaction/broadcasters/index.d.ts +2 -0
  335. package/dist/types/src/transaction/broadcasters/index.d.ts.map +1 -0
  336. package/dist/types/src/transaction/fee-models/SatoshisPerKilobyte.d.ts +26 -0
  337. package/dist/types/src/transaction/fee-models/SatoshisPerKilobyte.d.ts.map +1 -0
  338. package/dist/types/src/transaction/fee-models/index.d.ts +2 -0
  339. package/dist/types/src/transaction/fee-models/index.d.ts.map +1 -0
  340. package/dist/types/src/transaction/index.d.ts +7 -0
  341. package/dist/types/src/transaction/index.d.ts.map +1 -0
  342. package/dist/types/tsconfig.types.tsbuildinfo +1 -0
  343. package/docs/README.md +9 -0
  344. package/docs/compat.md +2856 -0
  345. package/docs/getting-started/COMMONJS.md +94 -0
  346. package/docs/getting-started/REACT-TS.md +131 -0
  347. package/docs/getting-started/TS-NODE.md +106 -0
  348. package/docs/getting-started/VUE.md +103 -0
  349. package/docs/messages.md +146 -0
  350. package/docs/primitives.md +7440 -0
  351. package/docs/script.md +766 -0
  352. package/docs/transaction.md +741 -0
  353. package/jest.config.js +6 -0
  354. package/mod.ts +8 -0
  355. package/package.json +137 -0
  356. package/src/compat/BSM.ts +51 -0
  357. package/src/compat/ECIES.ts +557 -0
  358. package/src/compat/HD.ts +348 -0
  359. package/src/compat/Mnemonic.ts +295 -0
  360. package/src/compat/__tests/BSM.test.ts +38 -0
  361. package/src/compat/__tests/ECIES.test.ts +90 -0
  362. package/src/compat/__tests/HD.test.ts +405 -0
  363. package/src/compat/__tests/Mnemonic.test.ts +177 -0
  364. package/src/compat/__tests/Mnemonic.vectors.ts +172 -0
  365. package/src/compat/bip-39-wordlist-en.ts +2053 -0
  366. package/src/compat/index.ts +4 -0
  367. package/src/messages/EncryptedMessage.ts +70 -0
  368. package/src/messages/SignedMessage.ts +87 -0
  369. package/src/messages/__tests/EncryptedMessage.test.ts +36 -0
  370. package/src/messages/__tests/SignedMessage.test.ts +53 -0
  371. package/src/messages/index.ts +2 -0
  372. package/src/primitives/AESGCM.ts +479 -0
  373. package/src/primitives/BasePoint.ts +21 -0
  374. package/src/primitives/BigNumber.ts +4619 -0
  375. package/src/primitives/Curve.ts +1163 -0
  376. package/src/primitives/DRBG.ts +102 -0
  377. package/src/primitives/ECDSA.ts +164 -0
  378. package/src/primitives/Hash.ts +1420 -0
  379. package/src/primitives/JacobianPoint.ts +410 -0
  380. package/src/primitives/K256.ts +116 -0
  381. package/src/primitives/Mersenne.ts +123 -0
  382. package/src/primitives/MontgomoryMethod.ts +160 -0
  383. package/src/primitives/Point.ts +852 -0
  384. package/src/primitives/PrivateKey.ts +195 -0
  385. package/src/primitives/PublicKey.ts +154 -0
  386. package/src/primitives/Random.ts +55 -0
  387. package/src/primitives/ReductionContext.ts +528 -0
  388. package/src/primitives/Signature.ts +235 -0
  389. package/src/primitives/SymmetricKey.ts +75 -0
  390. package/src/primitives/TransactionSignature.ts +189 -0
  391. package/src/primitives/__tests/AESGCM.test.ts +338 -0
  392. package/src/primitives/__tests/BRC42.private.vectors.ts +33 -0
  393. package/src/primitives/__tests/BRC42.public.vectors.ts +33 -0
  394. package/src/primitives/__tests/BigNumber.arithmatic.test.ts +572 -0
  395. package/src/primitives/__tests/BigNumber.binary.test.ts +203 -0
  396. package/src/primitives/__tests/BigNumber.constructor.test.ts +176 -0
  397. package/src/primitives/__tests/BigNumber.dhGroup.test.ts +18 -0
  398. package/src/primitives/__tests/BigNumber.fixtures.ts +264 -0
  399. package/src/primitives/__tests/BigNumber.serializers.test.ts +157 -0
  400. package/src/primitives/__tests/BigNumber.utils.test.ts +347 -0
  401. package/src/primitives/__tests/Curve.unit.test.ts +192 -0
  402. package/src/primitives/__tests/DRBG.test.ts +18 -0
  403. package/src/primitives/__tests/DRBG.vectors.ts +167 -0
  404. package/src/primitives/__tests/ECDH.test.ts +31 -0
  405. package/src/primitives/__tests/ECDSA.test.ts +58 -0
  406. package/src/primitives/__tests/HMAC.test.ts +59 -0
  407. package/src/primitives/__tests/Hash.test.ts +121 -0
  408. package/src/primitives/__tests/PBKDF2.vectors.ts +119 -0
  409. package/src/primitives/__tests/PrivateKey.test.ts +17 -0
  410. package/src/primitives/__tests/PublicKey.test.ts +66 -0
  411. package/src/primitives/__tests/Random.test.ts +14 -0
  412. package/src/primitives/__tests/Reader.test.ts +296 -0
  413. package/src/primitives/__tests/ReductionContext.test.ts +279 -0
  414. package/src/primitives/__tests/SymmetricKey.test.ts +58 -0
  415. package/src/primitives/__tests/SymmetricKey.vectors.ts +40 -0
  416. package/src/primitives/__tests/Writer.test.ts +198 -0
  417. package/src/primitives/__tests/sighash.vectors.ts +3503 -0
  418. package/src/primitives/__tests/utils.test.ts +108 -0
  419. package/src/primitives/index.ts +8 -0
  420. package/src/primitives/utils.ts +665 -0
  421. package/src/script/LockingScript.ts +30 -0
  422. package/src/script/OP.ts +219 -0
  423. package/src/script/Script.ts +426 -0
  424. package/src/script/ScriptChunk.ts +7 -0
  425. package/src/script/ScriptTemplate.ts +36 -0
  426. package/src/script/Spend.ts +1379 -0
  427. package/src/script/UnlockingScript.ts +30 -0
  428. package/src/script/__tests/Script.test.ts +369 -0
  429. package/src/script/__tests/Spend.test.ts +248 -0
  430. package/src/script/__tests/script.invalid.vectors.ts +925 -0
  431. package/src/script/__tests/script.valid.vectors.ts +1120 -0
  432. package/src/script/__tests/scriptFromVector.ts +42 -0
  433. package/src/script/__tests/spend.valid.vectors.ts +2288 -0
  434. package/src/script/index.ts +7 -0
  435. package/src/script/templates/P2PKH.ts +109 -0
  436. package/src/script/templates/RPuzzle.ts +140 -0
  437. package/src/script/templates/index.ts +2 -0
  438. package/src/transaction/Broadcaster.ts +42 -0
  439. package/src/transaction/ChainTracker.ts +22 -0
  440. package/src/transaction/FeeModel.ts +13 -0
  441. package/src/transaction/MerklePath.ts +259 -0
  442. package/src/transaction/Transaction.ts +602 -0
  443. package/src/transaction/TransactionInput.ts +63 -0
  444. package/src/transaction/TransactionOutput.ts +37 -0
  445. package/src/transaction/__tests/MerklePath.test.ts +181 -0
  446. package/src/transaction/__tests/Transaction.test.ts +413 -0
  447. package/src/transaction/__tests/bigtx.vectors.ts +4 -0
  448. package/src/transaction/__tests/bump.invalid.vectors.ts +8 -0
  449. package/src/transaction/__tests/bump.valid.vectors.ts +4 -0
  450. package/src/transaction/__tests/tx.invalid.vectors.ts +281 -0
  451. package/src/transaction/__tests/tx.valid.vectors.ts +364 -0
  452. package/src/transaction/broadcasters/ARC.ts +106 -0
  453. package/src/transaction/broadcasters/__tests/ARC.test.ts +115 -0
  454. package/src/transaction/broadcasters/index.ts +1 -0
  455. package/src/transaction/fee-models/SatoshisPerKilobyte.ts +71 -0
  456. package/src/transaction/fee-models/index.ts +1 -0
  457. package/src/transaction/index.ts +6 -0
  458. package/ts2md.json +5 -0
  459. package/tsconfig.base.json +26 -0
  460. package/tsconfig.cjs.json +11 -0
  461. package/tsconfig.eslint.json +12 -0
  462. package/tsconfig.esm.json +9 -0
  463. package/tsconfig.json +17 -0
  464. package/tsconfig.types.json +11 -0
@@ -0,0 +1,665 @@
1
+ import BigNumber from './BigNumber.js'
2
+ import { hash256 } from './Hash.js'
3
+
4
+ /**
5
+ * Appends a '0' to a single-character word to ensure it has two characters.
6
+ * @param {string} word - The input word.
7
+ * @returns {string} - The word with a leading '0' if it's a single character; otherwise, the original word.
8
+ */
9
+ export const zero2 = (word: string): string => {
10
+ if (word.length === 1) {
11
+ return '0' + word
12
+ } else {
13
+ return word
14
+ }
15
+ }
16
+
17
+ /**
18
+ * Converts an array of numbers to a hexadecimal string representation.
19
+ * @param {number[]} msg - The input array of numbers.
20
+ * @returns {string} - The hexadecimal string representation of the input array.
21
+ */
22
+ export const toHex = (msg: number[]): string => {
23
+ let res = ''
24
+ for (let i = 0; i < msg.length; i++) {
25
+ res += zero2(msg[i].toString(16))
26
+ }
27
+ return res
28
+ }
29
+
30
+ /**
31
+ * Converts various message formats into an array of numbers.
32
+ * Supports arrays, hexadecimal strings, base64 strings, and UTF-8 strings.
33
+ *
34
+ * @param {any} msg - The input message (array or string).
35
+ * @param {('hex' | 'utf8')} enc - Specifies the string encoding, if applicable.
36
+ * @returns {any[]} - Array representation of the input.
37
+ */
38
+ export const toArray = (msg: any, enc?: 'hex' | 'utf8' | 'base64'): any[] => {
39
+ // Return a copy if already an array
40
+ if (Array.isArray(msg)) { return msg.slice() }
41
+
42
+ // Return empty array for falsy values
43
+ if (!(msg as boolean)) { return [] }
44
+ const res: any[] = []
45
+
46
+ // Convert non-string messages to numbers
47
+ if (typeof msg !== 'string') {
48
+ for (let i = 0; i < msg.length; i++) { res[i] = msg[i] | 0 }
49
+ return res
50
+ }
51
+
52
+ // Handle hexadecimal encoding
53
+ if (enc === 'hex') {
54
+ msg = msg.replace(/[^a-z0-9]+/ig, '')
55
+ if (msg.length % 2 !== 0) { msg = '0' + (msg as string) }
56
+ for (let i = 0; i < msg.length; i += 2) {
57
+ res.push(
58
+ parseInt((msg[i] as string) + (msg[i + 1] as string), 16)
59
+ )
60
+ }
61
+
62
+ // Handle base64
63
+ } else if (enc === 'base64') {
64
+ const base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
65
+ const result: number[] = []
66
+ let currentBit: number = 0
67
+ let currentByte: number = 0
68
+
69
+ for (const char of msg.replace(/=+$/, '')) {
70
+ currentBit = (currentBit << 6) | base64Chars.indexOf(char)
71
+ currentByte += 6
72
+
73
+ if (currentByte >= 8) {
74
+ currentByte -= 8
75
+ result.push((currentBit >> currentByte) & 0xFF)
76
+ currentBit &= (1 << currentByte) - 1
77
+ }
78
+ }
79
+
80
+ return result
81
+ } else {
82
+ // Handle UTF-8 encoding
83
+ for (let i = 0; i < msg.length; i++) {
84
+ const c = msg.charCodeAt(i)
85
+ const hi = c >> 8
86
+ const lo = c & 0xff
87
+ if (hi as unknown as boolean) {
88
+ res.push(hi, lo)
89
+ } else {
90
+ res.push(lo)
91
+ }
92
+ }
93
+ }
94
+ return res
95
+ }
96
+
97
+ /**
98
+ * Converts an array of numbers to a UTF-8 encoded string.
99
+ * @param {number[]} arr - The input array of numbers.
100
+ * @returns {string} - The UTF-8 encoded string.
101
+ */
102
+ const toUTF8 = (arr: number[]): string => {
103
+ let result = ''
104
+
105
+ for (let i = 0; i < arr.length; i++) {
106
+ const byte = arr[i]
107
+
108
+ // 1-byte sequence (0xxxxxxx)
109
+ if (byte <= 0x7F) {
110
+ result += String.fromCharCode(byte)
111
+ }
112
+ // 2-byte sequence (110xxxxx 10xxxxxx)
113
+ else if (byte >= 0xC0 && byte <= 0xDF) {
114
+ const byte2 = arr[++i]
115
+ const codePoint = ((byte & 0x1F) << 6) | (byte2 & 0x3F)
116
+ result += String.fromCharCode(codePoint)
117
+ }
118
+ // 3-byte sequence (1110xxxx 10xxxxxx 10xxxxxx)
119
+ else if (byte >= 0xE0 && byte <= 0xEF) {
120
+ const byte2 = arr[++i]
121
+ const byte3 = arr[++i]
122
+ const codePoint = ((byte & 0x0F) << 12) | ((byte2 & 0x3F) << 6) | (byte3 & 0x3F)
123
+ result += String.fromCharCode(codePoint)
124
+ }
125
+ // 4-byte sequence (11110xxx 10xxxxxx 10xxxxxx 10xxxxxx)
126
+ else if (byte >= 0xF0 && byte <= 0xF7) {
127
+ const byte2 = arr[++i]
128
+ const byte3 = arr[++i]
129
+ const byte4 = arr[++i]
130
+ const codePoint = ((byte & 0x07) << 18) | ((byte2 & 0x3F) << 12) | ((byte3 & 0x3F) << 6) | (byte4 & 0x3F)
131
+
132
+ // Convert to UTF-16 surrogate pair
133
+ const surrogate1 = 0xD800 + ((codePoint - 0x10000) >> 10)
134
+ const surrogate2 = 0xDC00 + ((codePoint - 0x10000) & 0x3FF)
135
+ result += String.fromCharCode(surrogate1, surrogate2)
136
+ }
137
+ }
138
+
139
+ return result
140
+ }
141
+
142
+ /**
143
+ * Encodes an array of numbers into a specified encoding ('hex' or 'utf8'). If no encoding is provided, returns the original array.
144
+ * @param {number[]} arr - The input array of numbers.
145
+ * @param {('hex' | 'utf8')} enc - The desired encoding.
146
+ * @returns {string | number[]} - The encoded message as a string (for 'hex' and 'utf8') or the original array.
147
+ */
148
+ export const encode = (arr: number[], enc?: 'hex' | 'utf8'): string | number[] => {
149
+ switch (enc) {
150
+ case 'hex':
151
+ return toHex(arr)
152
+ case 'utf8':
153
+ return toUTF8(arr)
154
+ // If no encoding is provided, return the original array
155
+ default:
156
+ return arr
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Converts an array of bytes (each between 0 and 255) into a base64 encoded string.
162
+ *
163
+ * @param {number[]} byteArray - An array of numbers where each number is a byte (0-255).
164
+ * @returns {string} The base64 encoded string.
165
+ *
166
+ * @example
167
+ * const bytes = [72, 101, 108, 108, 111]; // Represents the string "Hello"
168
+ * console.log(toBase64(bytes)); // Outputs: SGVsbG8=
169
+ */
170
+ export function toBase64(byteArray: number[]): string {
171
+ const base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
172
+ let result = ''
173
+ let i: number
174
+
175
+ for (i = 0; i < byteArray.length; i += 3) {
176
+ const byte1 = byteArray[i]
177
+ const byte2 = i + 1 < byteArray.length ? byteArray[i + 1] : 0
178
+ const byte3 = i + 2 < byteArray.length ? byteArray[i + 2] : 0
179
+
180
+ const encoded1 = byte1 >> 2
181
+ const encoded2 = ((byte1 & 0x03) << 4) | (byte2 >> 4)
182
+ const encoded3 = ((byte2 & 0x0F) << 2) | (byte3 >> 6)
183
+ const encoded4 = byte3 & 0x3F
184
+
185
+ result += base64Chars.charAt(encoded1) + base64Chars.charAt(encoded2)
186
+ result += i + 1 < byteArray.length ? base64Chars.charAt(encoded3) : '='
187
+ result += i + 2 < byteArray.length ? base64Chars.charAt(encoded4) : '='
188
+ }
189
+
190
+ return result
191
+ }
192
+
193
+ const base58chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
194
+
195
+ /**
196
+ * Converts a string from base58 to a binary array
197
+ * @param str - The string representation
198
+ * @returns The binary representation
199
+ */
200
+ export const fromBase58 = (str: string): number[] => {
201
+ if (!str || typeof str !== "string")
202
+ throw new Error(`Expected base58 string but got “${str}”`)
203
+ if (str.match(/[IOl0]/gmu))
204
+ throw new Error(
205
+ `Invalid base58 character “${str.match(/[IOl0]/gmu)}”`
206
+ )
207
+ const lz = str.match(/^1+/gmu)
208
+ const psz: number = lz ? lz[0].length : 0
209
+ const size =
210
+ ((str.length - psz) * (Math.log(58) / Math.log(256)) + 1) >>> 0
211
+
212
+ const uint8 = new Uint8Array([
213
+ ...new Uint8Array(psz),
214
+ ...str
215
+ .match(/.{1}/gmu)
216
+ .map((i) => base58chars.indexOf(i))
217
+ .reduce((acc, i) => {
218
+ acc = acc.map((j) => {
219
+ const x = j * 58 + i;
220
+ i = x >> 8;
221
+ return x;
222
+ });
223
+ return acc;
224
+ }, new Uint8Array(size))
225
+ .reverse()
226
+ .filter(
227
+ (
228
+ (lastValue) => (value) =>
229
+ // @ts-ignore
230
+ (lastValue = lastValue || value)
231
+ )(false)
232
+ )
233
+ ])
234
+ return [...uint8]
235
+ }
236
+
237
+ /**
238
+ * Converts a binary array into a base58 string
239
+ * @param bin - The binary array to convert to base58
240
+ * @returns The base58 string representation
241
+ */
242
+ export const toBase58 = (bin: number[]): string => {
243
+ const base58Map = Array(256).fill(-1);
244
+ for (let i = 0; i < base58chars.length; ++i)
245
+ base58Map[base58chars.charCodeAt(i)] = i;
246
+
247
+ const result = []
248
+
249
+ for (const byte of bin) {
250
+ let carry = byte
251
+ for (let j = 0; j < result.length; ++j) {
252
+ // @ts-ignore
253
+ const x = (base58Map[result[j]] << 8) + carry
254
+ result[j] = base58chars.charCodeAt(x % 58)
255
+ carry = (x / 58) | 0
256
+ }
257
+ while (carry) {
258
+ result.push(base58chars.charCodeAt(carry % 58))
259
+ carry = (carry / 58) | 0
260
+ }
261
+ }
262
+
263
+ for (const byte of bin)
264
+ if (byte) break
265
+ else result.push("1".charCodeAt(0))
266
+
267
+ result.reverse()
268
+
269
+ return String.fromCharCode(...result)
270
+ }
271
+
272
+ /**
273
+ * Converts a binary array into a base58check string with a checksum
274
+ * @param bin - The binary array to convert to base58check
275
+ * @returns The base58check string representation
276
+ */
277
+ export const toBase58Check = (bin: number[], prefix: number[] = [0]) => {
278
+ let hash = hash256([...prefix, ...bin]) as number[]
279
+ hash = [...prefix, ...bin, ...hash.slice(0, 4)]
280
+ return toBase58(hash)
281
+ }
282
+
283
+ /**
284
+ * Converts a base58check string into a binary array after validating the checksum
285
+ * @param str - The base58check string to convert to binary
286
+ * @param enc - If hex, the return values will be hex strings, arrays of numbers otherwise
287
+ * @param prefixLength - The length of the prefix. Optional, defaults to 1.
288
+ * @returns The binary array representation
289
+ */
290
+ export const fromBase58Check = (str: string, enc?: 'hex', prefixLength: number = 1) => {
291
+ const bin = fromBase58(str)
292
+ let prefix: string | number[] = bin.slice(0, prefixLength)
293
+ let data: string | number[] = bin.slice(prefixLength, -4)
294
+ let hash = [...prefix, ...data]
295
+ hash = hash256(hash) as number[]
296
+ bin.slice(-4).forEach((check, index) => {
297
+ if (check !== hash[index]) {
298
+ throw new Error('Invalid checksum')
299
+ }
300
+ })
301
+ if (enc === 'hex') {
302
+ prefix = toHex(prefix)
303
+ data = toHex(data)
304
+ }
305
+ return { prefix, data }
306
+ }
307
+
308
+ export class Writer {
309
+ public bufs: number[][]
310
+
311
+ constructor(bufs?: number[][]) {
312
+ this.bufs = bufs || []
313
+ }
314
+
315
+ getLength(): number {
316
+ let len = 0
317
+ for (const buf of this.bufs) {
318
+ len = len + buf.length
319
+ }
320
+ return len
321
+ }
322
+
323
+ toArray(): number[] {
324
+ const ret = []
325
+ for (const x of this.bufs) {
326
+ ret.push(...x)
327
+ }
328
+ return ret
329
+ }
330
+
331
+ write(buf: number[]): Writer {
332
+ this.bufs.push(buf)
333
+ return this
334
+ }
335
+
336
+ writeReverse(buf: number[]): Writer {
337
+ const buf2: number[] = new Array(buf.length)
338
+ for (let i = 0; i < buf2.length; i++) {
339
+ buf2[i] = buf[buf.length - 1 - i]
340
+ }
341
+ this.bufs.push(buf2)
342
+ return this
343
+ }
344
+
345
+ writeUInt8(n: number): Writer {
346
+ const buf = new Array(1)
347
+ buf[0] = n
348
+ this.write(buf)
349
+ return this
350
+ }
351
+
352
+ writeInt8(n: number): Writer {
353
+ const buf = new Array(1)
354
+ buf[0] = n & 0xFF
355
+ this.write(buf)
356
+ return this
357
+ }
358
+
359
+ writeUInt16BE(n: number): Writer {
360
+ this.bufs.push([
361
+ (n >> 8) & 0xFF, // shift right 8 bits to get the high byte
362
+ n & 0xFF // low byte is just the last 8 bits
363
+ ])
364
+ return this
365
+ }
366
+
367
+ writeInt16BE(n: number): Writer {
368
+ return this.writeUInt16BE(n & 0xFFFF) // Mask with 0xFFFF to get the lower 16 bits
369
+ }
370
+
371
+ writeUInt16LE(n: number): Writer {
372
+ this.bufs.push([
373
+ n & 0xFF, // low byte is just the last 8 bits
374
+ (n >> 8) & 0xFF // shift right 8 bits to get the high byte
375
+ ])
376
+ return this
377
+ }
378
+
379
+ writeInt16LE(n: number): Writer {
380
+ return this.writeUInt16LE(n & 0xFFFF) // Mask with 0xFFFF to get the lower 16 bits
381
+ }
382
+
383
+ writeUInt32BE(n: number): Writer {
384
+ this.bufs.push([
385
+ (n >> 24) & 0xFF, // highest byte
386
+ (n >> 16) & 0xFF,
387
+ (n >> 8) & 0xFF,
388
+ n & 0xFF // lowest byte
389
+ ])
390
+ return this
391
+ }
392
+
393
+ writeInt32BE(n: number): Writer {
394
+ return this.writeUInt32BE(n >>> 0) // Using unsigned right shift to handle negative numbers
395
+ }
396
+
397
+ writeUInt32LE(n: number): Writer {
398
+ this.bufs.push([
399
+ n & 0xFF, // lowest byte
400
+ (n >> 8) & 0xFF,
401
+ (n >> 16) & 0xFF,
402
+ (n >> 24) & 0xFF // highest byte
403
+ ])
404
+ return this
405
+ }
406
+
407
+ writeInt32LE(n: number): Writer {
408
+ return this.writeUInt32LE(n >>> 0) // Using unsigned right shift to handle negative numbers
409
+ }
410
+
411
+ writeUInt64BEBn(bn: BigNumber): Writer {
412
+ const buf = bn.toArray('be', 8)
413
+ this.write(buf)
414
+ return this
415
+ }
416
+
417
+ writeUInt64LEBn(bn: BigNumber): Writer {
418
+ const buf = bn.toArray('be', 8)
419
+ this.writeReverse(buf)
420
+ return this
421
+ }
422
+
423
+ writeUInt64LE(n: number): Writer {
424
+ const buf = new BigNumber(n).toArray('be', 8)
425
+ this.writeReverse(buf)
426
+ return this
427
+ }
428
+
429
+ writeVarIntNum(n: number): Writer {
430
+ const buf = Writer.varIntNum(n)
431
+ this.write(buf)
432
+ return this
433
+ }
434
+
435
+ writeVarIntBn(bn: BigNumber): Writer {
436
+ const buf = Writer.varIntBn(bn)
437
+ this.write(buf)
438
+ return this
439
+ }
440
+
441
+ static varIntNum(n: number): number[] {
442
+ let buf: number[]
443
+ if (n < 253) {
444
+ buf = [n] // 1 byte
445
+ } else if (n < 0x10000) {
446
+ // 253 followed by the number in little-endian format
447
+ buf = [
448
+ 253, // 0xfd
449
+ n & 0xFF, // low byte
450
+ (n >> 8) & 0xFF // high byte
451
+ ]
452
+ } else if (n < 0x100000000) {
453
+ // 254 followed by the number in little-endian format
454
+ buf = [
455
+ 254, // 0xfe
456
+ n & 0xFF,
457
+ (n >> 8) & 0xFF,
458
+ (n >> 16) & 0xFF,
459
+ (n >> 24) & 0xFF
460
+ ]
461
+ } else {
462
+ // 255 followed by the number in little-endian format
463
+ // Since JavaScript bitwise operations work on 32 bits, we need to handle 64-bit numbers in two parts
464
+ const low = n & 0xFFFFFFFF
465
+ const high = Math.floor(n / 0x100000000) & 0xFFFFFFFF
466
+ buf = [
467
+ 255, // 0xff
468
+ low & 0xFF,
469
+ (low >> 8) & 0xFF,
470
+ (low >> 16) & 0xFF,
471
+ (low >> 24) & 0xFF,
472
+ high & 0xFF,
473
+ (high >> 8) & 0xFF,
474
+ (high >> 16) & 0xFF,
475
+ (high >> 24) & 0xFF
476
+ ]
477
+ }
478
+ return buf
479
+ }
480
+
481
+ static varIntBn(bn: BigNumber): number[] {
482
+ let buf: number[]
483
+ if (bn.ltn(253)) {
484
+ const n = bn.toNumber()
485
+ // No need for bitwise operation as the value is within a byte's range
486
+ buf = [n]
487
+ } else if (bn.ltn(0x10000)) {
488
+ const n = bn.toNumber()
489
+ // Value fits in a uint16
490
+ buf = [253, n & 0xFF, (n >> 8) & 0xFF]
491
+ } else if (bn.lt(new BigNumber(0x100000000))) {
492
+ const n = bn.toNumber()
493
+ // Value fits in a uint32
494
+ buf = [254, n & 0xFF, (n >> 8) & 0xFF, (n >> 16) & 0xFF, (n >> 24) & 0xFF]
495
+ } else {
496
+ const bw = new Writer()
497
+ bw.writeUInt8(255)
498
+ bw.writeUInt64LEBn(bn)
499
+ buf = bw.toArray()
500
+ }
501
+ return buf
502
+ }
503
+ }
504
+
505
+ export class Reader {
506
+ public bin: number[]
507
+ public pos: number
508
+
509
+ constructor(bin: number[] = [], pos: number = 0) {
510
+ this.bin = bin
511
+ this.pos = pos
512
+ }
513
+
514
+ public eof(): boolean {
515
+ return this.pos >= this.bin.length
516
+ }
517
+
518
+ public read(len = this.bin.length): number[] {
519
+ const bin = this.bin.slice(this.pos, this.pos + len)
520
+ this.pos = this.pos + len
521
+ return bin
522
+ }
523
+
524
+ public readReverse(len = this.bin.length): number[] {
525
+ const bin = this.bin.slice(this.pos, this.pos + len)
526
+ this.pos = this.pos + len
527
+ const buf2 = new Array(bin.length)
528
+ for (let i = 0; i < buf2.length; i++) {
529
+ buf2[i] = bin[bin.length - 1 - i]
530
+ }
531
+ return buf2
532
+ }
533
+
534
+ public readUInt8(): number {
535
+ const val = this.bin[this.pos]
536
+ this.pos += 1
537
+ return val
538
+ }
539
+
540
+ public readInt8(): number {
541
+ const val = this.bin[this.pos]
542
+ this.pos += 1
543
+ // If the sign bit is set, convert to negative value
544
+ return (val & 0x80) !== 0 ? val - 0x100 : val
545
+ }
546
+
547
+ public readUInt16BE(): number {
548
+ const val = (this.bin[this.pos] << 8) | this.bin[this.pos + 1]
549
+ this.pos += 2
550
+ return val
551
+ }
552
+
553
+ public readInt16BE(): number {
554
+ const val = this.readUInt16BE()
555
+ // If the sign bit is set, convert to negative value
556
+ return (val & 0x8000) !== 0 ? val - 0x10000 : val
557
+ }
558
+
559
+ public readUInt16LE(): number {
560
+ const val = this.bin[this.pos] | (this.bin[this.pos + 1] << 8)
561
+ this.pos += 2
562
+ return val
563
+ }
564
+
565
+ public readInt16LE(): number {
566
+ const val = this.readUInt16LE()
567
+ // If the sign bit is set, convert to negative value
568
+ const x = (val & 0x8000) !== 0 ? val - 0x10000 : val
569
+ return x
570
+ }
571
+
572
+ public readUInt32BE(): number {
573
+ const val =
574
+ (this.bin[this.pos] * 0x1000000) + // Shift the first byte by 24 bits
575
+ ((this.bin[this.pos + 1] << 16) | // Shift the second byte by 16 bits
576
+ (this.bin[this.pos + 2] << 8) | // Shift the third byte by 8 bits
577
+ this.bin[this.pos + 3]) // The fourth byte
578
+ this.pos += 4
579
+ return val
580
+ }
581
+
582
+ public readInt32BE(): number {
583
+ const val = this.readUInt32BE()
584
+ // If the sign bit is set, convert to negative value
585
+ return (val & 0x80000000) !== 0 ? val - 0x100000000 : val
586
+ }
587
+
588
+ public readUInt32LE(): number {
589
+ const val =
590
+ (this.bin[this.pos] |
591
+ (this.bin[this.pos + 1] << 8) |
592
+ (this.bin[this.pos + 2] << 16) |
593
+ (this.bin[this.pos + 3] << 24)) >>> 0
594
+ this.pos += 4
595
+ return val
596
+ }
597
+
598
+ public readInt32LE(): number {
599
+ const val = this.readUInt32LE()
600
+ // Explicitly check if the sign bit is set and then convert to a negative value
601
+ return (val & 0x80000000) !== 0 ? val - 0x100000000 : val
602
+ }
603
+
604
+ public readUInt64BEBn(): BigNumber {
605
+ const bin = this.bin.slice(this.pos, this.pos + 8)
606
+ const bn = new BigNumber(bin)
607
+ this.pos = this.pos + 8
608
+ return bn
609
+ }
610
+
611
+ public readUInt64LEBn(): BigNumber {
612
+ const bin = this.readReverse(8)
613
+ const bn = new BigNumber(bin)
614
+ return bn
615
+ }
616
+
617
+ public readVarIntNum(): number {
618
+ const first = this.readUInt8()
619
+ let bn: BigNumber
620
+ let n: number
621
+ switch (first) {
622
+ case 0xfd:
623
+ return this.readUInt16LE()
624
+ case 0xfe:
625
+ return this.readUInt32LE()
626
+ case 0xff:
627
+ bn = this.readUInt64LEBn()
628
+ if (bn.lte(new BigNumber(2).pow(new BigNumber(53)))) {
629
+ return bn.toNumber()
630
+ } else {
631
+ throw new Error('number too large to retain precision - use readVarIntBn')
632
+ }
633
+ default:
634
+ return first
635
+ }
636
+ }
637
+
638
+ public readVarInt(): number[] {
639
+ const first = this.bin[this.pos]
640
+ switch (first) {
641
+ case 0xfd:
642
+ return this.read(1 + 2)
643
+ case 0xfe:
644
+ return this.read(1 + 4)
645
+ case 0xff:
646
+ return this.read(1 + 8)
647
+ default:
648
+ return this.read(1)
649
+ }
650
+ }
651
+
652
+ public readVarIntBn(): BigNumber {
653
+ const first = this.readUInt8()
654
+ switch (first) {
655
+ case 0xfd:
656
+ return new BigNumber(this.readUInt16LE())
657
+ case 0xfe:
658
+ return new BigNumber(this.readUInt32LE())
659
+ case 0xff:
660
+ return this.readUInt64LEBn()
661
+ default:
662
+ return new BigNumber(first)
663
+ }
664
+ }
665
+ }
@@ -0,0 +1,30 @@
1
+ import Script from './Script.js'
2
+
3
+ /**
4
+ * The LockingScript class represents a locking script in a Bitcoin SV transaction.
5
+ * It extends the Script class and is used specifically for output scripts that lock funds.
6
+ *
7
+ * Inherits all properties and methods from the Script class.
8
+ *
9
+ * @extends {Script}
10
+ * @see {@link Script} for more information on Script.
11
+ */
12
+ export default class LockingScript extends Script {
13
+ /**
14
+ * @method isLockingScript
15
+ * Determines if the script is a locking script.
16
+ * @returns {boolean} Always returns true for a LockingScript instance.
17
+ */
18
+ isLockingScript (): boolean {
19
+ return true
20
+ }
21
+
22
+ /**
23
+ * @method isUnlockingScript
24
+ * Determines if the script is an unlocking script.
25
+ * @returns {boolean} Always returns false for a LockingScript instance.
26
+ */
27
+ isUnlockingScript (): boolean {
28
+ return false
29
+ }
30
+ }