@bsv/sdk 1.3.12 → 1.3.14

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 (607) hide show
  1. package/dist/cjs/package.json +15 -3
  2. package/dist/cjs/src/auth/Peer.js +83 -57
  3. package/dist/cjs/src/auth/Peer.js.map +1 -1
  4. package/dist/cjs/src/auth/SessionManager.js +14 -9
  5. package/dist/cjs/src/auth/SessionManager.js.map +1 -1
  6. package/dist/cjs/src/auth/certificates/Certificate.js +16 -10
  7. package/dist/cjs/src/auth/certificates/Certificate.js.map +1 -1
  8. package/dist/cjs/src/auth/certificates/MasterCertificate.js +25 -23
  9. package/dist/cjs/src/auth/certificates/MasterCertificate.js.map +1 -1
  10. package/dist/cjs/src/auth/certificates/VerifiableCertificate.js +2 -2
  11. package/dist/cjs/src/auth/certificates/VerifiableCertificate.js.map +1 -1
  12. package/dist/cjs/src/auth/certificates/__tests/CompletedProtoWallet.js +62 -46
  13. package/dist/cjs/src/auth/certificates/__tests/CompletedProtoWallet.js.map +1 -1
  14. package/dist/cjs/src/auth/clients/AuthFetch.js +1 -0
  15. package/dist/cjs/src/auth/clients/AuthFetch.js.map +1 -1
  16. package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js +70 -43
  17. package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js.map +1 -1
  18. package/dist/cjs/src/auth/utils/createNonce.js +2 -1
  19. package/dist/cjs/src/auth/utils/createNonce.js.map +1 -1
  20. package/dist/cjs/src/auth/utils/getVerifiableCertificates.js.map +1 -1
  21. package/dist/cjs/src/auth/utils/validateCertificates.js +5 -2
  22. package/dist/cjs/src/auth/utils/validateCertificates.js.map +1 -1
  23. package/dist/cjs/src/auth/utils/verifyNonce.js +2 -1
  24. package/dist/cjs/src/auth/utils/verifyNonce.js.map +1 -1
  25. package/dist/cjs/src/compat/BSM.js +7 -17
  26. package/dist/cjs/src/compat/BSM.js.map +1 -1
  27. package/dist/cjs/src/compat/ECIES.js +172 -133
  28. package/dist/cjs/src/compat/ECIES.js.map +1 -1
  29. package/dist/cjs/src/compat/HD.js +63 -73
  30. package/dist/cjs/src/compat/HD.js.map +1 -1
  31. package/dist/cjs/src/compat/Mnemonic.js +102 -106
  32. package/dist/cjs/src/compat/Mnemonic.js.map +1 -1
  33. package/dist/cjs/src/compat/Utxo.js +2 -2
  34. package/dist/cjs/src/compat/Utxo.js.map +1 -1
  35. package/dist/cjs/src/compat/index.js +7 -17
  36. package/dist/cjs/src/compat/index.js.map +1 -1
  37. package/dist/cjs/src/messages/EncryptedMessage.js +3 -1
  38. package/dist/cjs/src/messages/EncryptedMessage.js.map +1 -1
  39. package/dist/cjs/src/messages/SignedMessage.js +1 -0
  40. package/dist/cjs/src/messages/SignedMessage.js.map +1 -1
  41. package/dist/cjs/src/messages/index.js +7 -17
  42. package/dist/cjs/src/messages/index.js.map +1 -1
  43. package/dist/cjs/src/overlay-tools/LookupResolver.js +54 -35
  44. package/dist/cjs/src/overlay-tools/LookupResolver.js.map +1 -1
  45. package/dist/cjs/src/overlay-tools/OverlayAdminTokenTemplate.js +32 -20
  46. package/dist/cjs/src/overlay-tools/OverlayAdminTokenTemplate.js.map +1 -1
  47. package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js +40 -28
  48. package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js.map +1 -1
  49. package/dist/cjs/src/primitives/AESGCM.js +6 -5
  50. package/dist/cjs/src/primitives/AESGCM.js.map +1 -1
  51. package/dist/cjs/src/primitives/BasePoint.js +1 -1
  52. package/dist/cjs/src/primitives/BasePoint.js.map +1 -1
  53. package/dist/cjs/src/primitives/BigNumber.js +50 -62
  54. package/dist/cjs/src/primitives/BigNumber.js.map +1 -1
  55. package/dist/cjs/src/primitives/Curve.js +46 -22
  56. package/dist/cjs/src/primitives/Curve.js.map +1 -1
  57. package/dist/cjs/src/primitives/DRBG.js +2 -8
  58. package/dist/cjs/src/primitives/DRBG.js.map +1 -1
  59. package/dist/cjs/src/primitives/ECDSA.js +51 -35
  60. package/dist/cjs/src/primitives/ECDSA.js.map +1 -1
  61. package/dist/cjs/src/primitives/Hash.js +191 -216
  62. package/dist/cjs/src/primitives/Hash.js.map +1 -1
  63. package/dist/cjs/src/primitives/JacobianPoint.js +19 -5
  64. package/dist/cjs/src/primitives/JacobianPoint.js.map +1 -1
  65. package/dist/cjs/src/primitives/K256.js.map +1 -1
  66. package/dist/cjs/src/primitives/Mersenne.js.map +1 -1
  67. package/dist/cjs/src/primitives/MontgomoryMethod.js.map +1 -1
  68. package/dist/cjs/src/primitives/Point.js +117 -88
  69. package/dist/cjs/src/primitives/Point.js.map +1 -1
  70. package/dist/cjs/src/primitives/Polynomial.js +4 -2
  71. package/dist/cjs/src/primitives/Polynomial.js.map +1 -1
  72. package/dist/cjs/src/primitives/PrivateKey.js +32 -33
  73. package/dist/cjs/src/primitives/PrivateKey.js.map +1 -1
  74. package/dist/cjs/src/primitives/PublicKey.js.map +1 -1
  75. package/dist/cjs/src/primitives/Random.js +6 -5
  76. package/dist/cjs/src/primitives/Random.js.map +1 -1
  77. package/dist/cjs/src/primitives/ReductionContext.js +1 -1
  78. package/dist/cjs/src/primitives/ReductionContext.js.map +1 -1
  79. package/dist/cjs/src/primitives/Schnorr.js +21 -15
  80. package/dist/cjs/src/primitives/Schnorr.js.map +1 -1
  81. package/dist/cjs/src/primitives/Signature.js +8 -7
  82. package/dist/cjs/src/primitives/Signature.js.map +1 -1
  83. package/dist/cjs/src/primitives/SymmetricKey.js +13 -13
  84. package/dist/cjs/src/primitives/SymmetricKey.js.map +1 -1
  85. package/dist/cjs/src/primitives/TransactionSignature.js +31 -29
  86. package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -1
  87. package/dist/cjs/src/primitives/index.js +7 -17
  88. package/dist/cjs/src/primitives/index.js.map +1 -1
  89. package/dist/cjs/src/primitives/utils.js +79 -68
  90. package/dist/cjs/src/primitives/utils.js.map +1 -1
  91. package/dist/cjs/src/script/OP.js +3 -3
  92. package/dist/cjs/src/script/OP.js.map +1 -1
  93. package/dist/cjs/src/script/Script.js +12 -10
  94. package/dist/cjs/src/script/Script.js.map +1 -1
  95. package/dist/cjs/src/script/Spend.js +47 -49
  96. package/dist/cjs/src/script/Spend.js.map +1 -1
  97. package/dist/cjs/src/script/templates/P2PKH.js +24 -12
  98. package/dist/cjs/src/script/templates/P2PKH.js.map +1 -1
  99. package/dist/cjs/src/script/templates/PushDrop.js +28 -23
  100. package/dist/cjs/src/script/templates/PushDrop.js.map +1 -1
  101. package/dist/cjs/src/script/templates/RPuzzle.js +10 -6
  102. package/dist/cjs/src/script/templates/RPuzzle.js.map +1 -1
  103. package/dist/cjs/src/totp/totp.js +2 -1
  104. package/dist/cjs/src/totp/totp.js.map +1 -1
  105. package/dist/cjs/src/transaction/Beef.js +177 -154
  106. package/dist/cjs/src/transaction/Beef.js.map +1 -1
  107. package/dist/cjs/src/transaction/BeefParty.js +24 -24
  108. package/dist/cjs/src/transaction/BeefParty.js.map +1 -1
  109. package/dist/cjs/src/transaction/BeefTx.js +26 -18
  110. package/dist/cjs/src/transaction/BeefTx.js.map +1 -1
  111. package/dist/cjs/src/transaction/Broadcaster.js +3 -2
  112. package/dist/cjs/src/transaction/Broadcaster.js.map +1 -1
  113. package/dist/cjs/src/transaction/MerklePath.js +64 -37
  114. package/dist/cjs/src/transaction/MerklePath.js.map +1 -1
  115. package/dist/cjs/src/transaction/Transaction.js +111 -137
  116. package/dist/cjs/src/transaction/Transaction.js.map +1 -1
  117. package/dist/cjs/src/transaction/broadcasters/ARC.js +25 -16
  118. package/dist/cjs/src/transaction/broadcasters/ARC.js.map +1 -1
  119. package/dist/cjs/src/transaction/broadcasters/DefaultBroadcaster.js +2 -1
  120. package/dist/cjs/src/transaction/broadcasters/DefaultBroadcaster.js.map +1 -1
  121. package/dist/cjs/src/transaction/broadcasters/WhatsOnChainBroadcaster.js.map +1 -1
  122. package/dist/cjs/src/transaction/chaintrackers/DefaultChainTracker.js +2 -1
  123. package/dist/cjs/src/transaction/chaintrackers/DefaultChainTracker.js.map +1 -1
  124. package/dist/cjs/src/transaction/chaintrackers/WhatsOnChain.js +3 -3
  125. package/dist/cjs/src/transaction/chaintrackers/WhatsOnChain.js.map +1 -1
  126. package/dist/cjs/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -1
  127. package/dist/cjs/src/transaction/http/DefaultHttpClient.js +5 -3
  128. package/dist/cjs/src/transaction/http/DefaultHttpClient.js.map +1 -1
  129. package/dist/cjs/src/transaction/http/FetchHttpClient.js +5 -2
  130. package/dist/cjs/src/transaction/http/FetchHttpClient.js.map +1 -1
  131. package/dist/cjs/src/transaction/http/NodejsHttpClient.js +5 -3
  132. package/dist/cjs/src/transaction/http/NodejsHttpClient.js.map +1 -1
  133. package/dist/cjs/src/transaction/http/index.js.map +1 -1
  134. package/dist/cjs/src/transaction/index.js.map +1 -1
  135. package/dist/cjs/src/wallet/CachedKeyDeriver.js +91 -66
  136. package/dist/cjs/src/wallet/CachedKeyDeriver.js.map +1 -1
  137. package/dist/cjs/src/wallet/KeyDeriver.js +61 -52
  138. package/dist/cjs/src/wallet/KeyDeriver.js.map +1 -1
  139. package/dist/cjs/src/wallet/ProtoWallet.js +79 -29
  140. package/dist/cjs/src/wallet/ProtoWallet.js.map +1 -1
  141. package/dist/cjs/src/wallet/WalletClient.js +7 -2
  142. package/dist/cjs/src/wallet/WalletClient.js.map +1 -1
  143. package/dist/cjs/src/wallet/WalletError.js +2 -2
  144. package/dist/cjs/src/wallet/WalletError.js.map +1 -1
  145. package/dist/cjs/src/wallet/substrates/HTTPWalletJSON.js +4 -3
  146. package/dist/cjs/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
  147. package/dist/cjs/src/wallet/substrates/HTTPWalletWire.js +2 -2
  148. package/dist/cjs/src/wallet/substrates/HTTPWalletWire.js.map +1 -1
  149. package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js +1239 -1261
  150. package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
  151. package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js +102 -43
  152. package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
  153. package/dist/cjs/src/wallet/substrates/XDM.js +8 -3
  154. package/dist/cjs/src/wallet/substrates/XDM.js.map +1 -1
  155. package/dist/cjs/src/wallet/substrates/window.CWI.js +28 -28
  156. package/dist/cjs/src/wallet/substrates/window.CWI.js.map +1 -1
  157. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  158. package/dist/esm/mod.js +15 -15
  159. package/dist/esm/src/auth/Peer.js +75 -54
  160. package/dist/esm/src/auth/Peer.js.map +1 -1
  161. package/dist/esm/src/auth/SessionManager.js +14 -9
  162. package/dist/esm/src/auth/SessionManager.js.map +1 -1
  163. package/dist/esm/src/auth/certificates/Certificate.js +15 -11
  164. package/dist/esm/src/auth/certificates/Certificate.js.map +1 -1
  165. package/dist/esm/src/auth/certificates/MasterCertificate.js +25 -23
  166. package/dist/esm/src/auth/certificates/MasterCertificate.js.map +1 -1
  167. package/dist/esm/src/auth/certificates/VerifiableCertificate.js +2 -2
  168. package/dist/esm/src/auth/certificates/VerifiableCertificate.js.map +1 -1
  169. package/dist/esm/src/auth/certificates/__tests/CompletedProtoWallet.js +64 -47
  170. package/dist/esm/src/auth/certificates/__tests/CompletedProtoWallet.js.map +1 -1
  171. package/dist/esm/src/auth/clients/AuthFetch.js +1 -0
  172. package/dist/esm/src/auth/clients/AuthFetch.js.map +1 -1
  173. package/dist/esm/src/auth/transports/SimplifiedFetchTransport.js +69 -43
  174. package/dist/esm/src/auth/transports/SimplifiedFetchTransport.js.map +1 -1
  175. package/dist/esm/src/auth/utils/createNonce.js.map +1 -1
  176. package/dist/esm/src/auth/utils/getVerifiableCertificates.js +1 -1
  177. package/dist/esm/src/auth/utils/getVerifiableCertificates.js.map +1 -1
  178. package/dist/esm/src/auth/utils/validateCertificates.js +6 -3
  179. package/dist/esm/src/auth/utils/validateCertificates.js.map +1 -1
  180. package/dist/esm/src/auth/utils/verifyNonce.js.map +1 -1
  181. package/dist/esm/src/compat/BSM.js.map +1 -1
  182. package/dist/esm/src/compat/ECIES.js +165 -116
  183. package/dist/esm/src/compat/ECIES.js.map +1 -1
  184. package/dist/esm/src/compat/HD.js +56 -56
  185. package/dist/esm/src/compat/HD.js.map +1 -1
  186. package/dist/esm/src/compat/Mnemonic.js +95 -89
  187. package/dist/esm/src/compat/Mnemonic.js.map +1 -1
  188. package/dist/esm/src/compat/Utxo.js +1 -1
  189. package/dist/esm/src/compat/Utxo.js.map +1 -1
  190. package/dist/esm/src/messages/EncryptedMessage.js +3 -1
  191. package/dist/esm/src/messages/EncryptedMessage.js.map +1 -1
  192. package/dist/esm/src/messages/SignedMessage.js +1 -0
  193. package/dist/esm/src/messages/SignedMessage.js.map +1 -1
  194. package/dist/esm/src/overlay-tools/LookupResolver.js +53 -35
  195. package/dist/esm/src/overlay-tools/LookupResolver.js.map +1 -1
  196. package/dist/esm/src/overlay-tools/OverlayAdminTokenTemplate.js +32 -20
  197. package/dist/esm/src/overlay-tools/OverlayAdminTokenTemplate.js.map +1 -1
  198. package/dist/esm/src/overlay-tools/SHIPBroadcaster.js +40 -28
  199. package/dist/esm/src/overlay-tools/SHIPBroadcaster.js.map +1 -1
  200. package/dist/esm/src/primitives/AESGCM.js +1 -0
  201. package/dist/esm/src/primitives/AESGCM.js.map +1 -1
  202. package/dist/esm/src/primitives/BasePoint.js +1 -1
  203. package/dist/esm/src/primitives/BasePoint.js.map +1 -1
  204. package/dist/esm/src/primitives/BigNumber.js +50 -62
  205. package/dist/esm/src/primitives/BigNumber.js.map +1 -1
  206. package/dist/esm/src/primitives/Curve.js +45 -22
  207. package/dist/esm/src/primitives/Curve.js.map +1 -1
  208. package/dist/esm/src/primitives/DRBG.js +2 -8
  209. package/dist/esm/src/primitives/DRBG.js.map +1 -1
  210. package/dist/esm/src/primitives/ECDSA.js +50 -35
  211. package/dist/esm/src/primitives/ECDSA.js.map +1 -1
  212. package/dist/esm/src/primitives/Hash.js +188 -213
  213. package/dist/esm/src/primitives/Hash.js.map +1 -1
  214. package/dist/esm/src/primitives/JacobianPoint.js +18 -5
  215. package/dist/esm/src/primitives/JacobianPoint.js.map +1 -1
  216. package/dist/esm/src/primitives/K256.js.map +1 -1
  217. package/dist/esm/src/primitives/Mersenne.js.map +1 -1
  218. package/dist/esm/src/primitives/MontgomoryMethod.js.map +1 -1
  219. package/dist/esm/src/primitives/Point.js +107 -88
  220. package/dist/esm/src/primitives/Point.js.map +1 -1
  221. package/dist/esm/src/primitives/Polynomial.js +4 -2
  222. package/dist/esm/src/primitives/Polynomial.js.map +1 -1
  223. package/dist/esm/src/primitives/PrivateKey.js +25 -16
  224. package/dist/esm/src/primitives/PrivateKey.js.map +1 -1
  225. package/dist/esm/src/primitives/PublicKey.js.map +1 -1
  226. package/dist/esm/src/primitives/Random.js +7 -6
  227. package/dist/esm/src/primitives/Random.js.map +1 -1
  228. package/dist/esm/src/primitives/ReductionContext.js +1 -1
  229. package/dist/esm/src/primitives/ReductionContext.js.map +1 -1
  230. package/dist/esm/src/primitives/Schnorr.js +21 -15
  231. package/dist/esm/src/primitives/Schnorr.js.map +1 -1
  232. package/dist/esm/src/primitives/Signature.js +8 -7
  233. package/dist/esm/src/primitives/Signature.js.map +1 -1
  234. package/dist/esm/src/primitives/SymmetricKey.js +13 -13
  235. package/dist/esm/src/primitives/SymmetricKey.js.map +1 -1
  236. package/dist/esm/src/primitives/TransactionSignature.js +22 -12
  237. package/dist/esm/src/primitives/TransactionSignature.js.map +1 -1
  238. package/dist/esm/src/primitives/utils.js +76 -66
  239. package/dist/esm/src/primitives/utils.js.map +1 -1
  240. package/dist/esm/src/script/OP.js +3 -3
  241. package/dist/esm/src/script/OP.js.map +1 -1
  242. package/dist/esm/src/script/Script.js +12 -10
  243. package/dist/esm/src/script/Script.js.map +1 -1
  244. package/dist/esm/src/script/Spend.js +39 -32
  245. package/dist/esm/src/script/Spend.js.map +1 -1
  246. package/dist/esm/src/script/templates/P2PKH.js +26 -11
  247. package/dist/esm/src/script/templates/P2PKH.js.map +1 -1
  248. package/dist/esm/src/script/templates/PushDrop.js +29 -22
  249. package/dist/esm/src/script/templates/PushDrop.js.map +1 -1
  250. package/dist/esm/src/script/templates/RPuzzle.js +11 -6
  251. package/dist/esm/src/script/templates/RPuzzle.js.map +1 -1
  252. package/dist/esm/src/totp/totp.js +2 -1
  253. package/dist/esm/src/totp/totp.js.map +1 -1
  254. package/dist/esm/src/transaction/Beef.js +176 -154
  255. package/dist/esm/src/transaction/Beef.js.map +1 -1
  256. package/dist/esm/src/transaction/BeefParty.js +24 -24
  257. package/dist/esm/src/transaction/BeefParty.js.map +1 -1
  258. package/dist/esm/src/transaction/BeefTx.js +26 -18
  259. package/dist/esm/src/transaction/BeefTx.js.map +1 -1
  260. package/dist/esm/src/transaction/Broadcaster.js.map +1 -1
  261. package/dist/esm/src/transaction/MerklePath.js +61 -36
  262. package/dist/esm/src/transaction/MerklePath.js.map +1 -1
  263. package/dist/esm/src/transaction/Transaction.js +105 -138
  264. package/dist/esm/src/transaction/Transaction.js.map +1 -1
  265. package/dist/esm/src/transaction/broadcasters/ARC.js +25 -16
  266. package/dist/esm/src/transaction/broadcasters/ARC.js.map +1 -1
  267. package/dist/esm/src/transaction/broadcasters/DefaultBroadcaster.js.map +1 -1
  268. package/dist/esm/src/transaction/broadcasters/WhatsOnChainBroadcaster.js.map +1 -1
  269. package/dist/esm/src/transaction/chaintrackers/WhatsOnChain.js +3 -3
  270. package/dist/esm/src/transaction/chaintrackers/WhatsOnChain.js.map +1 -1
  271. package/dist/esm/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -1
  272. package/dist/esm/src/transaction/http/DefaultHttpClient.js +3 -2
  273. package/dist/esm/src/transaction/http/DefaultHttpClient.js.map +1 -1
  274. package/dist/esm/src/transaction/http/FetchHttpClient.js +4 -2
  275. package/dist/esm/src/transaction/http/FetchHttpClient.js.map +1 -1
  276. package/dist/esm/src/transaction/http/NodejsHttpClient.js +5 -3
  277. package/dist/esm/src/transaction/http/NodejsHttpClient.js.map +1 -1
  278. package/dist/esm/src/transaction/http/index.js.map +1 -1
  279. package/dist/esm/src/transaction/index.js.map +1 -1
  280. package/dist/esm/src/wallet/CachedKeyDeriver.js +91 -66
  281. package/dist/esm/src/wallet/CachedKeyDeriver.js.map +1 -1
  282. package/dist/esm/src/wallet/KeyDeriver.js +60 -52
  283. package/dist/esm/src/wallet/KeyDeriver.js.map +1 -1
  284. package/dist/esm/src/wallet/ProtoWallet.js +75 -29
  285. package/dist/esm/src/wallet/ProtoWallet.js.map +1 -1
  286. package/dist/esm/src/wallet/WalletClient.js +7 -2
  287. package/dist/esm/src/wallet/WalletClient.js.map +1 -1
  288. package/dist/esm/src/wallet/WalletError.js +2 -2
  289. package/dist/esm/src/wallet/WalletError.js.map +1 -1
  290. package/dist/esm/src/wallet/substrates/HTTPWalletJSON.js +4 -4
  291. package/dist/esm/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
  292. package/dist/esm/src/wallet/substrates/HTTPWalletWire.js +2 -2
  293. package/dist/esm/src/wallet/substrates/HTTPWalletWire.js.map +1 -1
  294. package/dist/esm/src/wallet/substrates/WalletWireProcessor.js +1239 -1261
  295. package/dist/esm/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
  296. package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js +95 -43
  297. package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
  298. package/dist/esm/src/wallet/substrates/XDM.js +8 -3
  299. package/dist/esm/src/wallet/substrates/XDM.js.map +1 -1
  300. package/dist/esm/src/wallet/substrates/window.CWI.js +28 -28
  301. package/dist/esm/src/wallet/substrates/window.CWI.js.map +1 -1
  302. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  303. package/dist/types/mod.d.ts +15 -15
  304. package/dist/types/src/auth/Peer.d.ts +10 -10
  305. package/dist/types/src/auth/Peer.d.ts.map +1 -1
  306. package/dist/types/src/auth/SessionManager.d.ts +4 -4
  307. package/dist/types/src/auth/SessionManager.d.ts.map +1 -1
  308. package/dist/types/src/auth/certificates/Certificate.d.ts +6 -6
  309. package/dist/types/src/auth/certificates/Certificate.d.ts.map +1 -1
  310. package/dist/types/src/auth/certificates/MasterCertificate.d.ts +5 -5
  311. package/dist/types/src/auth/certificates/MasterCertificate.d.ts.map +1 -1
  312. package/dist/types/src/auth/certificates/VerifiableCertificate.d.ts.map +1 -1
  313. package/dist/types/src/auth/certificates/__tests/CompletedProtoWallet.d.ts +23 -22
  314. package/dist/types/src/auth/certificates/__tests/CompletedProtoWallet.d.ts.map +1 -1
  315. package/dist/types/src/auth/clients/AuthFetch.d.ts.map +1 -1
  316. package/dist/types/src/auth/transports/SimplifiedFetchTransport.d.ts +1 -1
  317. package/dist/types/src/auth/transports/SimplifiedFetchTransport.d.ts.map +1 -1
  318. package/dist/types/src/auth/utils/createNonce.d.ts.map +1 -1
  319. package/dist/types/src/auth/utils/getVerifiableCertificates.d.ts +3 -3
  320. package/dist/types/src/auth/utils/getVerifiableCertificates.d.ts.map +1 -1
  321. package/dist/types/src/auth/utils/validateCertificates.d.ts +2 -2
  322. package/dist/types/src/auth/utils/validateCertificates.d.ts.map +1 -1
  323. package/dist/types/src/auth/utils/verifyNonce.d.ts +1 -1
  324. package/dist/types/src/auth/utils/verifyNonce.d.ts.map +1 -1
  325. package/dist/types/src/compat/BSM.d.ts +1 -1
  326. package/dist/types/src/compat/BSM.d.ts.map +1 -1
  327. package/dist/types/src/compat/ECIES.d.ts +36 -36
  328. package/dist/types/src/compat/ECIES.d.ts.map +1 -1
  329. package/dist/types/src/compat/HD.d.ts +51 -51
  330. package/dist/types/src/compat/HD.d.ts.map +1 -1
  331. package/dist/types/src/compat/Mnemonic.d.ts +79 -79
  332. package/dist/types/src/compat/Mnemonic.d.ts.map +1 -1
  333. package/dist/types/src/compat/Utxo.d.ts.map +1 -1
  334. package/dist/types/src/messages/EncryptedMessage.d.ts.map +1 -1
  335. package/dist/types/src/messages/SignedMessage.d.ts.map +1 -1
  336. package/dist/types/src/overlay-tools/LookupResolver.d.ts +9 -9
  337. package/dist/types/src/overlay-tools/LookupResolver.d.ts.map +1 -1
  338. package/dist/types/src/overlay-tools/OverlayAdminTokenTemplate.d.ts +17 -17
  339. package/dist/types/src/overlay-tools/OverlayAdminTokenTemplate.d.ts.map +1 -1
  340. package/dist/types/src/overlay-tools/SHIPBroadcaster.d.ts +14 -14
  341. package/dist/types/src/overlay-tools/SHIPBroadcaster.d.ts.map +1 -1
  342. package/dist/types/src/primitives/AESGCM.d.ts.map +1 -1
  343. package/dist/types/src/primitives/BasePoint.d.ts +8 -8
  344. package/dist/types/src/primitives/BasePoint.d.ts.map +1 -1
  345. package/dist/types/src/primitives/BigNumber.d.ts.map +1 -1
  346. package/dist/types/src/primitives/Curve.d.ts +14 -7
  347. package/dist/types/src/primitives/Curve.d.ts.map +1 -1
  348. package/dist/types/src/primitives/DRBG.d.ts.map +1 -1
  349. package/dist/types/src/primitives/ECDSA.d.ts +1 -1
  350. package/dist/types/src/primitives/ECDSA.d.ts.map +1 -1
  351. package/dist/types/src/primitives/Hash.d.ts +11 -11
  352. package/dist/types/src/primitives/Hash.d.ts.map +1 -1
  353. package/dist/types/src/primitives/JacobianPoint.d.ts.map +1 -1
  354. package/dist/types/src/primitives/Point.d.ts +14 -10
  355. package/dist/types/src/primitives/Point.d.ts.map +1 -1
  356. package/dist/types/src/primitives/Polynomial.d.ts.map +1 -1
  357. package/dist/types/src/primitives/PrivateKey.d.ts +2 -2
  358. package/dist/types/src/primitives/PrivateKey.d.ts.map +1 -1
  359. package/dist/types/src/primitives/PublicKey.d.ts.map +1 -1
  360. package/dist/types/src/primitives/Random.d.ts.map +1 -1
  361. package/dist/types/src/primitives/Schnorr.d.ts +14 -14
  362. package/dist/types/src/primitives/Schnorr.d.ts.map +1 -1
  363. package/dist/types/src/primitives/Signature.d.ts +1 -1
  364. package/dist/types/src/primitives/Signature.d.ts.map +1 -1
  365. package/dist/types/src/primitives/SymmetricKey.d.ts +13 -13
  366. package/dist/types/src/primitives/SymmetricKey.d.ts.map +1 -1
  367. package/dist/types/src/primitives/TransactionSignature.d.ts +4 -4
  368. package/dist/types/src/primitives/TransactionSignature.d.ts.map +1 -1
  369. package/dist/types/src/primitives/utils.d.ts +3 -6
  370. package/dist/types/src/primitives/utils.d.ts.map +1 -1
  371. package/dist/types/src/script/Script.d.ts +3 -3
  372. package/dist/types/src/script/Script.d.ts.map +1 -1
  373. package/dist/types/src/script/ScriptTemplate.d.ts +2 -2
  374. package/dist/types/src/script/ScriptTemplate.d.ts.map +1 -1
  375. package/dist/types/src/script/Spend.d.ts.map +1 -1
  376. package/dist/types/src/script/templates/P2PKH.d.ts.map +1 -1
  377. package/dist/types/src/script/templates/PushDrop.d.ts +1 -2
  378. package/dist/types/src/script/templates/PushDrop.d.ts.map +1 -1
  379. package/dist/types/src/script/templates/RPuzzle.d.ts.map +1 -1
  380. package/dist/types/src/totp/totp.d.ts.map +1 -1
  381. package/dist/types/src/transaction/Beef.d.ts +96 -96
  382. package/dist/types/src/transaction/Beef.d.ts.map +1 -1
  383. package/dist/types/src/transaction/BeefParty.d.ts +22 -22
  384. package/dist/types/src/transaction/BeefParty.d.ts.map +1 -1
  385. package/dist/types/src/transaction/BeefTx.d.ts +5 -5
  386. package/dist/types/src/transaction/BeefTx.d.ts.map +1 -1
  387. package/dist/types/src/transaction/Broadcaster.d.ts.map +1 -1
  388. package/dist/types/src/transaction/ChainTracker.d.ts +2 -2
  389. package/dist/types/src/transaction/FeeModel.d.ts.map +1 -1
  390. package/dist/types/src/transaction/MerklePath.d.ts.map +1 -1
  391. package/dist/types/src/transaction/Transaction.d.ts +4 -12
  392. package/dist/types/src/transaction/Transaction.d.ts.map +1 -1
  393. package/dist/types/src/transaction/TransactionOutput.d.ts.map +1 -1
  394. package/dist/types/src/transaction/broadcasters/ARC.d.ts +1 -1
  395. package/dist/types/src/transaction/broadcasters/ARC.d.ts.map +1 -1
  396. package/dist/types/src/transaction/broadcasters/DefaultBroadcaster.d.ts.map +1 -1
  397. package/dist/types/src/transaction/broadcasters/WhatsOnChainBroadcaster.d.ts.map +1 -1
  398. package/dist/types/src/transaction/chaintrackers/DefaultChainTracker.d.ts.map +1 -1
  399. package/dist/types/src/transaction/chaintrackers/WhatsOnChain.d.ts.map +1 -1
  400. package/dist/types/src/transaction/fee-models/SatoshisPerKilobyte.d.ts.map +1 -1
  401. package/dist/types/src/transaction/http/DefaultHttpClient.d.ts +1 -1
  402. package/dist/types/src/transaction/http/DefaultHttpClient.d.ts.map +1 -1
  403. package/dist/types/src/transaction/http/FetchHttpClient.d.ts +5 -5
  404. package/dist/types/src/transaction/http/FetchHttpClient.d.ts.map +1 -1
  405. package/dist/types/src/transaction/http/HttpClient.d.ts +4 -4
  406. package/dist/types/src/transaction/http/HttpClient.d.ts.map +1 -1
  407. package/dist/types/src/transaction/http/NodejsHttpClient.d.ts +3 -3
  408. package/dist/types/src/transaction/http/NodejsHttpClient.d.ts.map +1 -1
  409. package/dist/types/src/transaction/http/index.d.ts.map +1 -1
  410. package/dist/types/src/transaction/index.d.ts.map +1 -1
  411. package/dist/types/src/wallet/CachedKeyDeriver.d.ts +58 -58
  412. package/dist/types/src/wallet/CachedKeyDeriver.d.ts.map +1 -1
  413. package/dist/types/src/wallet/KeyDeriver.d.ts +78 -78
  414. package/dist/types/src/wallet/KeyDeriver.d.ts.map +1 -1
  415. package/dist/types/src/wallet/ProtoWallet.d.ts +10 -10
  416. package/dist/types/src/wallet/ProtoWallet.d.ts.map +1 -1
  417. package/dist/types/src/wallet/Wallet.interfaces.d.ts +151 -152
  418. package/dist/types/src/wallet/Wallet.interfaces.d.ts.map +1 -1
  419. package/dist/types/src/wallet/WalletClient.d.ts +5 -5
  420. package/dist/types/src/wallet/WalletClient.d.ts.map +1 -1
  421. package/dist/types/src/wallet/substrates/HTTPWalletJSON.d.ts +6 -6
  422. package/dist/types/src/wallet/substrates/HTTPWalletJSON.d.ts.map +1 -1
  423. package/dist/types/src/wallet/substrates/HTTPWalletWire.d.ts.map +1 -1
  424. package/dist/types/src/wallet/substrates/WalletWireProcessor.d.ts.map +1 -1
  425. package/dist/types/src/wallet/substrates/WalletWireTransceiver.d.ts.map +1 -1
  426. package/dist/types/src/wallet/substrates/XDM.d.ts +1 -1
  427. package/dist/types/src/wallet/substrates/XDM.d.ts.map +1 -1
  428. package/dist/types/src/wallet/substrates/window.CWI.d.ts +6 -6
  429. package/dist/types/src/wallet/substrates/window.CWI.d.ts.map +1 -1
  430. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  431. package/dist/umd/bundle.js +1 -1
  432. package/docs/auth.md +92 -82
  433. package/docs/compat.md +24 -24
  434. package/docs/messages.md +7 -5
  435. package/docs/overlay-tools.md +21 -21
  436. package/docs/primitives.md +336 -315
  437. package/docs/script.md +35 -35
  438. package/docs/swagger/dist/swagger-initializer.js +7 -7
  439. package/docs/swagger/dist/swagger-ui-bundle.js +1 -1
  440. package/docs/swagger/dist/swagger-ui-es-bundle-core.js +2 -2
  441. package/docs/swagger/dist/swagger-ui-es-bundle.js +1 -1
  442. package/docs/swagger/dist/swagger-ui-standalone-preset.js +1 -1
  443. package/docs/swagger/dist/swagger-ui.js +2 -2
  444. package/docs/totp.md +5 -5
  445. package/docs/transaction.md +103 -105
  446. package/docs/wallet-substrates.md +17 -17
  447. package/docs/wallet.md +202 -204
  448. package/mod.ts +15 -15
  449. package/package.json +15 -3
  450. package/src/auth/Peer.ts +271 -121
  451. package/src/auth/SessionManager.ts +17 -10
  452. package/src/auth/__tests/Peer.test.ts +361 -179
  453. package/src/auth/__tests/SessionManager.test.ts +67 -19
  454. package/src/auth/__tests/build.test.ts +11 -0
  455. package/src/auth/certificates/Certificate.ts +27 -14
  456. package/src/auth/certificates/MasterCertificate.ts +106 -62
  457. package/src/auth/certificates/VerifiableCertificate.ts +30 -8
  458. package/src/auth/certificates/__tests/Certificate.test.ts +32 -17
  459. package/src/auth/certificates/__tests/CompletedProtoWallet.ts +171 -68
  460. package/src/auth/certificates/__tests/MasterCertificate.test.ts +63 -47
  461. package/src/auth/certificates/__tests/VerifiableCertificate.test.ts +42 -31
  462. package/src/auth/certificates/index.ts +1 -1
  463. package/src/auth/clients/AuthFetch.ts +1 -0
  464. package/src/auth/clients/index.ts +1 -1
  465. package/src/auth/transports/SimplifiedFetchTransport.ts +145 -72
  466. package/src/auth/transports/index.ts +1 -1
  467. package/src/auth/utils/__tests/cryptononce.test.ts +52 -23
  468. package/src/auth/utils/__tests/getVerifiableCertificates.test.ts +56 -30
  469. package/src/auth/utils/__tests/validateCertificates.test.ts +53 -31
  470. package/src/auth/utils/createNonce.ts +11 -3
  471. package/src/auth/utils/getVerifiableCertificates.ts +12 -7
  472. package/src/auth/utils/validateCertificates.ts +57 -39
  473. package/src/auth/utils/verifyNonce.ts +6 -2
  474. package/src/compat/BSM.ts +10 -2
  475. package/src/compat/ECIES.ts +265 -141
  476. package/src/compat/HD.ts +81 -63
  477. package/src/compat/Mnemonic.ts +104 -91
  478. package/src/compat/Utxo.ts +8 -5
  479. package/src/compat/__tests/BSM.test.ts +42 -16
  480. package/src/compat/__tests/ECIES.test.ts +117 -52
  481. package/src/compat/__tests/HD.test.ts +55 -42
  482. package/src/compat/__tests/Mnemonic.test.ts +11 -12
  483. package/src/compat/__tests/Mnemonic.vectors.ts +110 -55
  484. package/src/messages/EncryptedMessage.ts +6 -2
  485. package/src/messages/SignedMessage.ts +14 -8
  486. package/src/messages/__tests/EncryptedMessage.test.ts +23 -24
  487. package/src/messages/__tests/SignedMessage.test.ts +17 -11
  488. package/src/overlay-tools/LookupResolver.ts +108 -56
  489. package/src/overlay-tools/OverlayAdminTokenTemplate.ts +52 -23
  490. package/src/overlay-tools/SHIPBroadcaster.ts +135 -59
  491. package/src/overlay-tools/__tests/LookupResolver.test.ts +723 -323
  492. package/src/overlay-tools/__tests/OverlayAdminTokenTemplate.test.ts +50 -22
  493. package/src/overlay-tools/__tests/SHIPBroadcaster.test.ts +607 -290
  494. package/src/primitives/AESGCM.ts +2 -0
  495. package/src/primitives/BasePoint.ts +4 -4
  496. package/src/primitives/BigNumber.ts +99 -90
  497. package/src/primitives/Curve.ts +117 -46
  498. package/src/primitives/DRBG.ts +9 -11
  499. package/src/primitives/ECDSA.ts +109 -63
  500. package/src/primitives/Hash.ts +492 -321
  501. package/src/primitives/JacobianPoint.ts +67 -19
  502. package/src/primitives/Point.ts +254 -152
  503. package/src/primitives/Polynomial.ts +8 -3
  504. package/src/primitives/PrivateKey.ts +41 -17
  505. package/src/primitives/PublicKey.ts +13 -3
  506. package/src/primitives/Random.ts +14 -8
  507. package/src/primitives/ReductionContext.ts +1 -1
  508. package/src/primitives/Schnorr.ts +40 -18
  509. package/src/primitives/Signature.ts +26 -16
  510. package/src/primitives/SymmetricKey.ts +14 -14
  511. package/src/primitives/TransactionSignature.ts +41 -17
  512. package/src/primitives/__tests/AESGCM.test.ts +457 -151
  513. package/src/primitives/__tests/BRC42.private.vectors.ts +30 -15
  514. package/src/primitives/__tests/BRC42.public.vectors.ts +30 -15
  515. package/src/primitives/__tests/BigNumber.arithmatic.test.ts +344 -125
  516. package/src/primitives/__tests/BigNumber.binary.test.ts +148 -67
  517. package/src/primitives/__tests/BigNumber.constructor.test.ts +65 -25
  518. package/src/primitives/__tests/BigNumber.dhGroup.test.ts +15 -11
  519. package/src/primitives/__tests/BigNumber.fixtures.ts +16 -8
  520. package/src/primitives/__tests/BigNumber.serializers.test.ts +41 -15
  521. package/src/primitives/__tests/BigNumber.utils.test.ts +132 -42
  522. package/src/primitives/__tests/Curve.unit.test.ts +75 -53
  523. package/src/primitives/__tests/DRBG.test.ts +1 -1
  524. package/src/primitives/__tests/DRBG.vectors.ts +45 -75
  525. package/src/primitives/__tests/ECDH.test.ts +15 -8
  526. package/src/primitives/__tests/ECDSA.test.ts +12 -6
  527. package/src/primitives/__tests/HMAC.test.ts +24 -18
  528. package/src/primitives/__tests/Hash.test.ts +57 -46
  529. package/src/primitives/__tests/PBKDF2.vectors.ts +130 -117
  530. package/src/primitives/__tests/PrivateKey.split.test.ts +33 -11
  531. package/src/primitives/__tests/PrivateKey.test.ts +11 -10
  532. package/src/primitives/__tests/PublicKey.test.ts +64 -53
  533. package/src/primitives/__tests/Random.test.ts +1 -1
  534. package/src/primitives/__tests/Reader.test.ts +240 -219
  535. package/src/primitives/__tests/ReductionContext.test.ts +98 -61
  536. package/src/primitives/__tests/Schnorr.test.ts +249 -237
  537. package/src/primitives/__tests/SymmetricKey.test.ts +18 -15
  538. package/src/primitives/__tests/SymmetricKey.vectors.ts +16 -8
  539. package/src/primitives/__tests/Writer.test.ts +23 -13
  540. package/src/primitives/__tests/bug-31.test.ts +6 -10
  541. package/src/primitives/__tests/utils.test.ts +70 -19
  542. package/src/primitives/utils.ts +103 -79
  543. package/src/script/Script.ts +18 -12
  544. package/src/script/ScriptTemplate.ts +3 -5
  545. package/src/script/Spend.ts +306 -108
  546. package/src/script/__tests/Script.test.ts +73 -55
  547. package/src/script/__tests/Spend.test.ts +208 -83
  548. package/src/script/__tests/SpendComplex.test.ts +19 -13
  549. package/src/script/__tests/script.invalid.vectors.ts +428 -1796
  550. package/src/script/__tests/script.valid.vectors.ts +728 -2764
  551. package/src/script/templates/P2PKH.ts +34 -12
  552. package/src/script/templates/PushDrop.ts +65 -31
  553. package/src/script/templates/RPuzzle.ts +29 -8
  554. package/src/script/templates/__tests/PushDrop.test.ts +146 -41
  555. package/src/totp/__tests/totp.test.ts +45 -44
  556. package/src/totp/totp.ts +3 -2
  557. package/src/transaction/Beef.ts +269 -174
  558. package/src/transaction/BeefParty.ts +41 -31
  559. package/src/transaction/BeefTx.ts +36 -26
  560. package/src/transaction/Broadcaster.ts +10 -6
  561. package/src/transaction/ChainTracker.ts +2 -2
  562. package/src/transaction/FeeModel.ts +0 -1
  563. package/src/transaction/MerklePath.ts +124 -59
  564. package/src/transaction/Transaction.ts +188 -187
  565. package/src/transaction/TransactionOutput.ts +0 -1
  566. package/src/transaction/__tests/Beef.test.ts +390 -287
  567. package/src/transaction/__tests/MerklePath.test.ts +59 -26
  568. package/src/transaction/__tests/Transaction.benchmarks.test.ts +231 -201
  569. package/src/transaction/__tests/Transaction.test.ts +758 -482
  570. package/src/transaction/__tests/bigtx.vectors.ts +2 -1
  571. package/src/transaction/__tests/bump.invalid.vectors.ts +24 -6
  572. package/src/transaction/__tests/bump.valid.vectors.ts +6 -2
  573. package/src/transaction/__tests/tx.invalid.vectors.ts +881 -185
  574. package/src/transaction/__tests/tx.valid.vectors.ts +1210 -257
  575. package/src/transaction/broadcasters/ARC.ts +69 -38
  576. package/src/transaction/broadcasters/DefaultBroadcaster.ts +9 -3
  577. package/src/transaction/broadcasters/WhatsOnChainBroadcaster.ts +20 -7
  578. package/src/transaction/broadcasters/__tests/ARC.test.ts +127 -59
  579. package/src/transaction/broadcasters/__tests/WhatsOnChainBroadcaster.test.ts +27 -18
  580. package/src/transaction/chaintrackers/DefaultChainTracker.ts +1 -1
  581. package/src/transaction/chaintrackers/WhatsOnChain.ts +27 -11
  582. package/src/transaction/chaintrackers/__tests/WhatsOnChainChainTracker.test.ts +59 -23
  583. package/src/transaction/fee-models/SatoshisPerKilobyte.ts +9 -5
  584. package/src/transaction/http/DefaultHttpClient.ts +5 -4
  585. package/src/transaction/http/FetchHttpClient.ts +18 -9
  586. package/src/transaction/http/HttpClient.ts +27 -22
  587. package/src/transaction/http/NodejsHttpClient.ts +23 -9
  588. package/src/transaction/http/index.ts +5 -1
  589. package/src/transaction/index.ts +5 -1
  590. package/src/wallet/CachedKeyDeriver.ts +151 -82
  591. package/src/wallet/KeyDeriver.ts +186 -105
  592. package/src/wallet/ProtoWallet.ts +121 -52
  593. package/src/wallet/Wallet.interfaces.ts +167 -156
  594. package/src/wallet/WalletClient.ts +314 -59
  595. package/src/wallet/WalletError.ts +2 -2
  596. package/src/wallet/__tests/CachedKeyDeriver.test.ts +86 -27
  597. package/src/wallet/__tests/KeyDeriver.test.ts +136 -33
  598. package/src/wallet/__tests/ProtoWallet.test.ts +190 -102
  599. package/src/wallet/substrates/HTTPWalletJSON.ts +250 -67
  600. package/src/wallet/substrates/HTTPWalletWire.ts +7 -3
  601. package/src/wallet/substrates/WalletWireCalls.ts +2 -2
  602. package/src/wallet/substrates/WalletWireProcessor.ts +1412 -1277
  603. package/src/wallet/substrates/WalletWireTransceiver.ts +713 -138
  604. package/src/wallet/substrates/XDM.ts +425 -36
  605. package/src/wallet/substrates/__tests/WalletWire.integration.test.ts +488 -225
  606. package/src/wallet/substrates/__tests/XDM.test.ts +232 -234
  607. package/src/wallet/substrates/window.CWI.ts +520 -61
@@ -1,3 +1,4 @@
1
+ // @ts-nocheck
1
2
  import TransactionInput from './TransactionInput.js'
2
3
  import TransactionOutput from './TransactionOutput.js'
3
4
  import UnlockingScript from '../script/UnlockingScript.js'
@@ -12,7 +13,7 @@ import Spend from '../script/Spend.js'
12
13
  import ChainTracker from './ChainTracker.js'
13
14
  import { defaultBroadcaster } from './broadcasters/DefaultBroadcaster.js'
14
15
  import { defaultChainTracker } from './chaintrackers/DefaultChainTracker.js'
15
- import { ATOMIC_BEEF, BEEF_V1 } from './Beef.js'
16
+ import { Beef, BEEF_V1 } from './Beef.js'
16
17
  import P2PKH from '../script/templates/P2PKH.js'
17
18
 
18
19
  /**
@@ -60,10 +61,17 @@ export default class Transaction {
60
61
  private cachedHash?: number[]
61
62
 
62
63
  // Recursive function for adding merkle proofs or input transactions
63
- private static addPathOrInputs (obj: { pathIndex?: number, tx: Transaction }, transactions: Record<string, {
64
- pathIndex?: number
65
- tx: Transaction
66
- }>, BUMPs: MerklePath[]): void {
64
+ private static addPathOrInputs (
65
+ obj: { pathIndex?: number, tx: Transaction },
66
+ transactions: Record<
67
+ string,
68
+ {
69
+ pathIndex?: number
70
+ tx: Transaction
71
+ }
72
+ >,
73
+ BUMPs: MerklePath[]
74
+ ): void {
67
75
  if (typeof obj.pathIndex === 'number') {
68
76
  const path = BUMPs[obj.pathIndex]
69
77
  if (typeof path !== 'object') {
@@ -72,9 +80,14 @@ export default class Transaction {
72
80
  obj.tx.merklePath = path
73
81
  } else {
74
82
  for (const input of obj.tx.inputs) {
83
+ if (input.sourceTXID === undefined) {
84
+ throw new Error('Input sourceTXID is undefined')
85
+ }
75
86
  const sourceObj = transactions[input.sourceTXID]
76
87
  if (typeof sourceObj !== 'object') {
77
- throw new Error(`Reference to unknown TXID in BEEF: ${input.sourceTXID}`)
88
+ throw new Error(
89
+ `Reference to unknown TXID in BEEF: ${input.sourceTXID ?? 'undefined'}`
90
+ )
78
91
  }
79
92
  input.sourceTransaction = sourceObj.tx
80
93
  this.addPathOrInputs(sourceObj, transactions, BUMPs)
@@ -83,138 +96,45 @@ export default class Transaction {
83
96
  }
84
97
 
85
98
  /**
86
- * Creates a new transaction, linked to its inputs and their associated merkle paths, from a BEEF (BRC-62) structure.
99
+ * Creates a new transaction, linked to its inputs and their associated merkle paths, from a BEEF V1, V2 or Atomic.
87
100
  * Optionally, you can provide a specific TXID to retrieve a particular transaction from the BEEF data.
88
101
  * If the TXID is provided but not found in the BEEF data, an error will be thrown.
89
- * If no TXID is provided, the last transaction in the BEEF data is returned.
102
+ * If no TXID is provided, the last transaction in the BEEF data is returned, or the atomic txid.
90
103
  * @param beef A binary representation of transactions in BEEF format.
91
104
  * @param txid Optional TXID of the transaction to retrieve from the BEEF data.
92
105
  * @returns An anchored transaction, linked to its associated inputs populated with merkle paths.
93
106
  */
94
107
  static fromBEEF (beef: number[], txid?: string): Transaction {
95
- const reader = new Reader(beef)
96
- const { transactions, BUMPs } = Transaction.parseBEEFData(reader)
97
-
98
- // The last transaction in the BEEF data can be used if txid is not provided
99
- const txids = Object.keys(transactions)
100
- const lastTXID = txids[txids.length - 1]
101
- const targetTXID = txid || lastTXID
102
-
103
- if (!transactions[targetTXID]) {
104
- throw new Error(`Transaction with TXID ${targetTXID} not found in BEEF data.`)
105
- }
106
-
107
- this.addPathOrInputs(transactions[targetTXID], transactions, BUMPs)
108
-
109
- return transactions[targetTXID].tx
108
+ const { tx } = Transaction.fromAnyBeef(beef, txid)
109
+ return tx
110
110
  }
111
111
 
112
112
  /**
113
113
  * Creates a new transaction from an Atomic BEEF (BRC-95) structure.
114
- * Extracts the subject transaction and ensures that all transactions within the BEEF data
115
- * are part of the dependency graph of the subject transaction.
116
- * Throws errors if the Atomic BEEF data does not strictly adhere to the BRC-95 specification.
114
+ * Extracts the subject transaction and supporting merkle path and source transactions contained in the BEEF data
117
115
  *
118
116
  * @param beef A binary representation of an Atomic BEEF structure.
119
117
  * @returns The subject transaction, linked to its associated inputs populated with merkle paths.
120
118
  */
121
119
  static fromAtomicBEEF (beef: number[]): Transaction {
122
- const reader = new Reader(beef)
123
- // Read the Atomic BEEF prefix
124
- const prefix = reader.readUInt32LE()
125
- if (prefix !== ATOMIC_BEEF) {
126
- throw new Error(`Invalid Atomic BEEF prefix. Expected 0x01010101, received 0x${prefix.toString(16)}.`)
127
- }
128
-
129
- // Read the subject TXID
130
- const subjectTXIDArray = reader.read(32)
131
- const subjectTXID = toHex(subjectTXIDArray)
132
-
133
- // The remaining data is the BEEF data
134
- const beefReader = new Reader(reader.read())
135
- const { transactions, BUMPs } = Transaction.parseBEEFData(beefReader)
136
-
137
- // Ensure that the subject transaction exists
138
- if (!transactions[subjectTXID]) {
139
- throw new Error(`Subject transaction with TXID ${subjectTXID} not found in Atomic BEEF data.`)
140
- }
141
-
142
- // Ensure that all transactions are part of the dependency graph of the subject transaction
143
- const validTxids = new Set<string>()
144
- // All BUMP level 0 hashes are valid.
145
- for (const bump of BUMPs) {
146
- for (const n of bump.path[0]) {
147
- if (n.hash) { validTxids.add(n.hash) }
148
- }
120
+ const { tx, txid, beef: b } = Transaction.fromAnyBeef(beef)
121
+ if (txid !== b.atomicTxid) {
122
+ if (b.atomicTxid) { throw new Error(`Transaction with TXID ${b.atomicTxid} not found in BEEF data.`) } else { throw new Error('beef must conform to BRC-95 and must contain the subject txid.') }
149
123
  }
150
- // To keep track of which transactions were used.
151
- const unusedTxTxids = new Set<string>()
152
- for (const txid of Object.keys(transactions)) unusedTxTxids.add(txid)
153
-
154
- const traverseDependencies = (txid: string) => {
155
- unusedTxTxids.delete(txid)
156
- if (validTxids.has(txid)) {
157
- return
158
- }
159
- validTxids.add(txid)
160
- const tx = transactions[txid].tx
161
- for (const input of tx.inputs) {
162
- const inputTxid = input.sourceTXID
163
- if (!transactions[inputTxid]) {
164
- throw new Error(`Input transaction with TXID ${inputTxid} is missing in Atomic BEEF data.`)
165
- }
166
- traverseDependencies(inputTxid)
167
- }
168
- }
169
-
170
- traverseDependencies(subjectTXID)
171
-
172
- // Check for any unrelated transactions
173
- for (const txid of unusedTxTxids) {
174
- throw new Error(`Unrelated transaction with TXID ${txid} found in Atomic BEEF data.`)
175
- }
176
-
177
- this.addPathOrInputs(transactions[subjectTXID], transactions, BUMPs)
178
-
179
- return transactions[subjectTXID].tx
124
+ return tx
180
125
  }
181
126
 
182
- /**
183
- * Parses BEEF data from a Reader and returns the transactions and BUMPs.
184
- *
185
- * @param reader The Reader positioned at the start of BEEF data.
186
- * @returns An object containing the transactions and BUMPs.
187
- */
188
- private static parseBEEFData (reader: Reader): { transactions: Record<string, { pathIndex?: number, tx: Transaction }>, BUMPs: MerklePath[] } {
189
- // Read the version
190
- const version = reader.readUInt32LE()
191
- if (version !== BEEF_V1) {
192
- throw new Error(`Invalid BEEF version. Expected ${BEEF_V1}, received ${version}.`)
193
- }
194
-
195
- // Read the BUMPs
196
- const numberOfBUMPs = reader.readVarIntNum()
197
- const BUMPs = []
198
- for (let i = 0; i < numberOfBUMPs; i++) {
199
- BUMPs.push(MerklePath.fromReader(reader))
200
- }
201
-
202
- // Read all transactions into an object
203
- // The object has keys of TXIDs and values of objects with transactions and BUMP indexes
204
- const numberOfTransactions = reader.readVarIntNum()
205
- const transactions: Record<string, { pathIndex?: number, tx: Transaction }> = {}
206
- for (let i = 0; i < numberOfTransactions; i++) {
207
- const tx = Transaction.fromReader(reader)
208
- const obj: { pathIndex?: number, tx: Transaction } = { tx }
209
- const txid = tx.id('hex')
210
- const hasBump = Boolean(reader.readUInt8())
211
- if (hasBump) {
212
- obj.pathIndex = reader.readVarIntNum()
213
- }
214
- transactions[txid] = obj
127
+ private static fromAnyBeef (beef: number[], txid?: string): { tx: Transaction, beef: Beef, txid: string } {
128
+ const b = Beef.fromBinary(beef)
129
+ if (b.txs.length < 1) {
130
+ throw new Error('beef must include at least one transaction.')
215
131
  }
216
-
217
- return { transactions, BUMPs }
132
+ const target = txid || b.atomicTxid || b.txs.slice(-1)[0].txid
133
+ const tx = b.findAtomicTransaction(target)
134
+ if (tx == null) {
135
+ if (txid) { throw new Error(`Transaction with TXID ${target} not found in BEEF data.`) } else { throw new Error('beef does not contain transaction for atomic txid.') }
136
+ }
137
+ return { tx, beef: b, txid: target }
218
138
  }
219
139
 
220
140
  /**
@@ -225,7 +145,7 @@ export default class Transaction {
225
145
  static fromEF (ef: number[]): Transaction {
226
146
  const br = new Reader(ef)
227
147
  const version = br.readUInt32LE()
228
- if (toHex(br.read(6)) !== '0000000000ef') throw new Error('Invalid EF marker')
148
+ if (toHex(br.read(6)) !== '0000000000ef') { throw new Error('Invalid EF marker') }
229
149
  const inputsLength = br.readVarIntNum()
230
150
  const inputs: TransactionInput[] = []
231
151
  for (let i = 0; i < inputsLength; i++) {
@@ -239,7 +159,7 @@ export default class Transaction {
239
159
  const lockingScriptLength = br.readVarIntNum()
240
160
  const lockingScriptBin = br.read(lockingScriptLength)
241
161
  const lockingScript = LockingScript.fromBinary(lockingScriptBin)
242
- const sourceTransaction = new Transaction(null, [], [], null)
162
+ const sourceTransaction = new Transaction(undefined, [], [], undefined)
243
163
  sourceTransaction.outputs = Array(sourceOutputIndex + 1).fill(null)
244
164
  sourceTransaction.outputs[sourceOutputIndex] = {
245
165
  satoshis,
@@ -420,11 +340,13 @@ export default class Transaction {
420
340
  typeof input.sourceTXID === 'undefined' &&
421
341
  typeof input.sourceTransaction === 'undefined'
422
342
  ) {
423
- throw new Error('A reference to an an input transaction is required. If the input transaction itself cannot be referenced, its TXID must still be provided.')
343
+ throw new Error(
344
+ 'A reference to an an input transaction is required. If the input transaction itself cannot be referenced, its TXID must still be provided.'
345
+ )
424
346
  }
425
347
  // If the input sequence number hasn't been set, the expectation is that it is final.
426
348
  if (typeof input.sequence === 'undefined') {
427
- input.sequence = 0xFFFFFFFF
349
+ input.sequence = 0xffffffff
428
350
  }
429
351
  this.cachedHash = undefined
430
352
  this.inputs.push(input)
@@ -437,11 +359,15 @@ export default class Transaction {
437
359
  */
438
360
  addOutput (output: TransactionOutput): void {
439
361
  this.cachedHash = undefined
440
- if (!output.change) {
441
- if (typeof output.satoshis === 'undefined') throw new Error('either satoshis must be defined or change must be set to true')
442
- if (output.satoshis < 0) throw new Error('satoshis must be a positive integer or zero')
362
+ if (output.change !== true) {
363
+ if (typeof output.satoshis === 'undefined') {
364
+ throw new Error(
365
+ 'either satoshis must be defined or change must be set to true'
366
+ )
367
+ }
368
+ if (output.satoshis < 0) { throw new Error('satoshis must be a positive integer or zero') }
443
369
  }
444
- if (!output.lockingScript) throw new Error('lockingScript must be defined')
370
+ if (output.lockingScript == null) throw new Error('lockingScript must be defined')
445
371
  this.outputs.push(output)
446
372
  }
447
373
 
@@ -454,7 +380,9 @@ export default class Transaction {
454
380
  */
455
381
  addP2PKHOutput (address: number[] | string, satoshis?: number): void {
456
382
  const lockingScript = new P2PKH().lock(address)
457
- if (typeof satoshis === 'undefined') { return this.addOutput({ lockingScript, change: true }) }
383
+ if (typeof satoshis === 'undefined') {
384
+ return this.addOutput({ lockingScript, change: true })
385
+ }
458
386
  this.addOutput({
459
387
  lockingScript,
460
388
  satoshis
@@ -483,7 +411,10 @@ export default class Transaction {
483
411
  * amongst the change outputs
484
412
  *
485
413
  */
486
- async fee (modelOrFee: FeeModel | number = new SatoshisPerKilobyte(10), changeDistribution: 'equal' | 'random' = 'equal'): Promise<void> {
414
+ async fee (
415
+ modelOrFee: FeeModel | number = new SatoshisPerKilobyte(10),
416
+ changeDistribution: 'equal' | 'random' = 'equal'
417
+ ): Promise<void> {
487
418
  this.cachedHash = undefined
488
419
  if (typeof modelOrFee === 'number') {
489
420
  const sats = modelOrFee
@@ -494,7 +425,7 @@ export default class Transaction {
494
425
  const fee = await modelOrFee.computeFee(this)
495
426
  const change = this.calculateChange(fee)
496
427
  if (change <= 0) {
497
- this.outputs = this.outputs.filter(output => !output.change)
428
+ this.outputs = this.outputs.filter((output) => output.change !== true)
498
429
  return
499
430
  }
500
431
  this.distributeChange(change, changeDistribution)
@@ -504,51 +435,70 @@ export default class Transaction {
504
435
  let change = 0
505
436
  for (const input of this.inputs) {
506
437
  if (typeof input.sourceTransaction !== 'object') {
507
- throw new Error('Source transactions are required for all inputs during fee computation')
438
+ throw new Error(
439
+ 'Source transactions are required for all inputs during fee computation'
440
+ )
508
441
  }
509
- change += input.sourceTransaction.outputs[input.sourceOutputIndex].satoshis
442
+ change +=
443
+ input.sourceTransaction.outputs[input.sourceOutputIndex].satoshis ?? 0
510
444
  }
511
445
  change -= fee
512
446
  for (const out of this.outputs) {
513
- if (!out.change) {
514
- change -= out.satoshis
447
+ if (out.change !== true) {
448
+ if (out.satoshis !== undefined) {
449
+ change -= out.satoshis
450
+ }
515
451
  }
516
452
  }
517
453
  return change
518
454
  }
519
455
 
520
- private distributeChange (change: number, changeDistribution: 'equal' | 'random'): void {
456
+ private distributeChange (
457
+ change: number,
458
+ changeDistribution: 'equal' | 'random'
459
+ ): void {
521
460
  let distributedChange = 0
522
- const changeOutputs = this.outputs.filter(out => out.change)
461
+ const changeOutputs = this.outputs.filter((out) => out.change)
523
462
  if (changeDistribution === 'random') {
524
463
  distributedChange = this.distributeRandomChange(change, changeOutputs)
525
464
  } else if (changeDistribution === 'equal') {
526
465
  distributedChange = this.distributeEqualChange(change, changeOutputs)
527
466
  }
528
467
  if (distributedChange < change) {
529
- this.outputs[this.outputs.length - 1].satoshis += (change - distributedChange)
468
+ const lastOutput = this.outputs[this.outputs.length - 1]
469
+ if (lastOutput.satoshis !== undefined) {
470
+ lastOutput.satoshis += change - distributedChange
471
+ } else {
472
+ lastOutput.satoshis = change - distributedChange
473
+ }
530
474
  }
531
475
  }
532
476
 
533
- private distributeRandomChange (change: number, changeOutputs: TransactionOutput[]): number {
477
+ private distributeRandomChange (
478
+ change: number,
479
+ changeOutputs: TransactionOutput[]
480
+ ): number {
534
481
  let distributedChange = 0
535
482
  let changeToUse = change
536
483
  const benfordNumbers = Array(changeOutputs.length).fill(1)
537
484
  changeToUse -= changeOutputs.length
538
485
  distributedChange += changeOutputs.length
539
486
  for (let i = 0; i < changeOutputs.length - 1; i++) {
540
- const portion = this.benfordNumber(0, changeToUse)
541
- benfordNumbers[i] += portion
487
+ const portion: number = this.benfordNumber(0, changeToUse)
488
+ benfordNumbers[i] = (benfordNumbers[i] as number) + portion
542
489
  distributedChange += portion
543
490
  changeToUse -= portion
544
491
  }
545
492
  for (const output of this.outputs) {
546
- if (output.change) output.satoshis = benfordNumbers.shift()
493
+ if (output.change === true) output.satoshis = benfordNumbers.shift()
547
494
  }
548
495
  return distributedChange
549
496
  }
550
497
 
551
- private distributeEqualChange (change: number, changeOutputs: TransactionOutput[]): number {
498
+ private distributeEqualChange (
499
+ change: number,
500
+ changeOutputs: TransactionOutput[]
501
+ ): number {
552
502
  let distributedChange = 0
553
503
  const perOutput = Math.floor(change / changeOutputs.length)
554
504
  for (const out of changeOutputs) {
@@ -560,7 +510,9 @@ export default class Transaction {
560
510
 
561
511
  private benfordNumber (min: number, max: number): number {
562
512
  const d = Math.floor(Math.random() * 9) + 1
563
- return Math.floor(min + (max - min) * Math.log10(1 + 1 / d) / Math.log10(10))
513
+ return Math.floor(
514
+ min + ((max - min) * Math.log10(1 + 1 / d)) / Math.log10(10)
515
+ )
564
516
  }
565
517
 
566
518
  /**
@@ -572,13 +524,16 @@ export default class Transaction {
572
524
  let totalIn = 0
573
525
  for (const input of this.inputs) {
574
526
  if (typeof input.sourceTransaction !== 'object') {
575
- throw new Error('Source transactions or sourceSatoshis are required for all inputs to calculate fee')
527
+ throw new Error(
528
+ 'Source transactions or sourceSatoshis are required for all inputs to calculate fee'
529
+ )
576
530
  }
577
- totalIn += input.sourceTransaction.outputs[input.sourceOutputIndex].satoshis
531
+ totalIn +=
532
+ input.sourceTransaction.outputs[input.sourceOutputIndex].satoshis ?? 0
578
533
  }
579
534
  let totalOut = 0
580
535
  for (const output of this.outputs) {
581
- totalOut += output.satoshis || 0
536
+ totalOut += output.satoshis ?? 0
582
537
  }
583
538
  return totalIn - totalOut
584
539
  }
@@ -590,20 +545,26 @@ export default class Transaction {
590
545
  this.cachedHash = undefined
591
546
  for (const out of this.outputs) {
592
547
  if (typeof out.satoshis === 'undefined') {
593
- if (out.change) {
594
- throw new Error('There are still change outputs with uncomputed amounts. Use the fee() method to compute the change amounts and transaction fees prior to signing.')
548
+ if (out.change === true) {
549
+ throw new Error(
550
+ 'There are still change outputs with uncomputed amounts. Use the fee() method to compute the change amounts and transaction fees prior to signing.'
551
+ )
595
552
  } else {
596
- throw new Error('One or more transaction outputs is missing an amount. Ensure all output amounts are provided before signing.')
553
+ throw new Error(
554
+ 'One or more transaction outputs is missing an amount. Ensure all output amounts are provided before signing.'
555
+ )
597
556
  }
598
557
  }
599
558
  }
600
- const unlockingScripts = await Promise.all(this.inputs.map(async (x, i): Promise<UnlockingScript | undefined> => {
601
- if (typeof this.inputs[i].unlockingScriptTemplate === 'object') {
602
- return await this.inputs[i].unlockingScriptTemplate.sign(this, i)
603
- } else {
604
- return await Promise.resolve(undefined)
605
- }
606
- }))
559
+ const unlockingScripts = await Promise.all(
560
+ this.inputs.map(async (x, i): Promise<UnlockingScript | undefined> => {
561
+ if (typeof this.inputs[i].unlockingScriptTemplate === 'object') {
562
+ return await this.inputs[i]?.unlockingScriptTemplate?.sign(this, i)
563
+ } else {
564
+ return await Promise.resolve(undefined)
565
+ }
566
+ })
567
+ )
607
568
  for (let i = 0, l = this.inputs.length; i < l; i++) {
608
569
  if (typeof this.inputs[i].unlockingScriptTemplate === 'object') {
609
570
  this.inputs[i].unlockingScript = unlockingScripts[i]
@@ -617,7 +578,9 @@ export default class Transaction {
617
578
  * @param broadcaster The Broadcaster instance wwhere the transaction will be sent
618
579
  * @returns A BroadcastResponse or BroadcastFailure from the Broadcaster
619
580
  */
620
- async broadcast (broadcaster: Broadcaster = defaultBroadcaster()): Promise<BroadcastResponse | BroadcastFailure> {
581
+ async broadcast (
582
+ broadcaster: Broadcaster = defaultBroadcaster()
583
+ ): Promise<BroadcastResponse | BroadcastFailure> {
621
584
  return await broadcaster.broadcast(this)
622
585
  }
623
586
 
@@ -632,19 +595,26 @@ export default class Transaction {
632
595
  writer.writeVarIntNum(this.inputs.length)
633
596
  for (const i of this.inputs) {
634
597
  if (typeof i.sourceTXID === 'undefined') {
635
- writer.write(i.sourceTransaction.hash() as number[])
598
+ if (i.sourceTransaction != null) {
599
+ writer.write(i.sourceTransaction.hash() as number[])
600
+ } else {
601
+ throw new Error('sourceTransaction is undefined')
602
+ }
636
603
  } else {
637
604
  writer.writeReverse(toArray(i.sourceTXID, 'hex'))
638
605
  }
639
606
  writer.writeUInt32LE(i.sourceOutputIndex)
607
+ if (i.unlockingScript == null) {
608
+ throw new Error('unlockingScript is undefined')
609
+ }
640
610
  const scriptBin = i.unlockingScript.toBinary()
641
611
  writer.writeVarIntNum(scriptBin.length)
642
612
  writer.write(scriptBin)
643
- writer.writeUInt32LE(i.sequence)
613
+ writer.writeUInt32LE(i.sequence ?? 0)
644
614
  }
645
615
  writer.writeVarIntNum(this.outputs.length)
646
616
  for (const o of this.outputs) {
647
- writer.writeUInt64LE(o.satoshis)
617
+ writer.writeUInt64LE(o.satoshis ?? 0)
648
618
  const scriptBin = o.lockingScript.toBinary()
649
619
  writer.writeVarIntNum(scriptBin.length)
650
620
  writer.write(scriptBin)
@@ -665,7 +635,9 @@ export default class Transaction {
665
635
  writer.writeVarIntNum(this.inputs.length)
666
636
  for (const i of this.inputs) {
667
637
  if (typeof i.sourceTransaction === 'undefined') {
668
- throw new Error('All inputs must have source transactions when serializing to EF format')
638
+ throw new Error(
639
+ 'All inputs must have source transactions when serializing to EF format'
640
+ )
669
641
  }
670
642
  if (typeof i.sourceTXID === 'undefined') {
671
643
  writer.write(i.sourceTransaction.hash() as number[])
@@ -673,18 +645,26 @@ export default class Transaction {
673
645
  writer.write(toArray(i.sourceTXID, 'hex').reverse() as number[])
674
646
  }
675
647
  writer.writeUInt32LE(i.sourceOutputIndex)
648
+ if (i.unlockingScript == null) {
649
+ throw new Error('unlockingScript is undefined')
650
+ }
676
651
  const scriptBin = i.unlockingScript.toBinary()
677
652
  writer.writeVarIntNum(scriptBin.length)
678
653
  writer.write(scriptBin)
679
- writer.writeUInt32LE(i.sequence)
680
- writer.writeUInt64LE(i.sourceTransaction.outputs[i.sourceOutputIndex].satoshis)
681
- const lockingScriptBin = i.sourceTransaction.outputs[i.sourceOutputIndex].lockingScript.toBinary()
654
+ writer.writeUInt32LE(i.sequence ?? 0)
655
+ writer.writeUInt64LE(
656
+ i.sourceTransaction.outputs[i.sourceOutputIndex].satoshis ?? 0
657
+ )
658
+ const lockingScriptBin =
659
+ i.sourceTransaction.outputs[
660
+ i.sourceOutputIndex
661
+ ].lockingScript.toBinary()
682
662
  writer.writeVarIntNum(lockingScriptBin.length)
683
663
  writer.write(lockingScriptBin)
684
664
  }
685
665
  writer.writeVarIntNum(this.outputs.length)
686
666
  for (const o of this.outputs) {
687
- writer.writeUInt64LE(o.satoshis)
667
+ writer.writeUInt64LE(o.satoshis ?? 0)
688
668
  const scriptBin = o.lockingScript.toBinary()
689
669
  writer.writeVarIntNum(scriptBin.length)
690
670
  writer.write(scriptBin)
@@ -737,7 +717,7 @@ export default class Transaction {
737
717
  */
738
718
  hash (enc?: 'hex'): number[] | string {
739
719
  let hash
740
- if (this.cachedHash) {
720
+ if (this.cachedHash != null) {
741
721
  hash = this.cachedHash
742
722
  } else {
743
723
  hash = hash256(this.toBinary())
@@ -769,7 +749,7 @@ export default class Transaction {
769
749
  * @returns {string | number[]} - The ID of the transaction in the specified format.
770
750
  */
771
751
  id (enc?: 'hex'): number[] | string {
772
- const id = [...this.hash() as number[]]
752
+ const id = [...(this.hash() as number[])]
773
753
  id.reverse()
774
754
  if (enc === 'hex') {
775
755
  return toHex(id)
@@ -795,21 +775,20 @@ export default class Transaction {
795
775
 
796
776
  while (txQueue.length > 0) {
797
777
  const tx = txQueue.shift()
798
- const txid = tx.id('hex')
799
- if (verifiedTxids.has(txid)) {
778
+ const txid = tx?.id('hex') ?? ''
779
+ if (txid != null && txid !== '' && verifiedTxids.has(txid)) {
800
780
  continue
801
781
  }
802
782
 
803
783
  // If the transaction has a valid merkle path, verification is complete.
804
- if (typeof tx.merklePath === 'object') {
784
+ if (typeof tx?.merklePath === 'object') {
805
785
  if (chainTracker === 'scripts only') {
806
- verifiedTxids.add(txid)
786
+ if (txid != null) {
787
+ verifiedTxids.add(txid)
788
+ }
807
789
  continue
808
790
  } else {
809
- const proofValid = await tx.merklePath.verify(
810
- txid,
811
- chainTracker
812
- )
791
+ const proofValid = await tx.merklePath.verify(txid, chainTracker)
813
792
  // If the proof is valid, no need to verify inputs.
814
793
  if (proofValid) {
815
794
  verifiedTxids.add(txid)
@@ -820,28 +799,41 @@ export default class Transaction {
820
799
 
821
800
  // Verify fee if feeModel is provided
822
801
  if (typeof feeModel !== 'undefined') {
802
+ if (tx === undefined) {
803
+ throw new Error('Transaction is undefined')
804
+ }
823
805
  const cpTx = Transaction.fromEF(tx.toEF())
824
806
  delete cpTx.outputs[0].satoshis
825
807
  cpTx.outputs[0].change = true
826
808
  await cpTx.fee(feeModel)
827
809
  if (tx.getFee() < cpTx.getFee()) {
828
- throw new Error(`Verification failed because the transaction ${txid} has an insufficient fee and has not been mined.`)
810
+ throw new Error(
811
+ `Verification failed because the transaction ${txid} has an insufficient fee and has not been mined.`
812
+ )
829
813
  }
830
814
  }
831
815
 
832
816
  // Verify each input transaction and evaluate the spend events.
833
817
  // Also, keep a total of the input amounts for later.
834
818
  let inputTotal = 0
819
+ if (tx === undefined) {
820
+ throw new Error('Transaction is undefined')
821
+ }
835
822
  for (let i = 0; i < tx.inputs.length; i++) {
836
823
  const input = tx.inputs[i]
837
824
  if (typeof input.sourceTransaction !== 'object') {
838
- throw new Error(`Verification failed because the input at index ${i} of transaction ${txid} is missing an associated source transaction. This source transaction is required for transaction verification because there is no merkle proof for the transaction spending a UTXO it contains.`)
825
+ throw new Error(
826
+ `Verification failed because the input at index ${i} of transaction ${txid} is missing an associated source transaction. This source transaction is required for transaction verification because there is no merkle proof for the transaction spending a UTXO it contains.`
827
+ )
839
828
  }
840
829
  if (typeof input.unlockingScript !== 'object') {
841
- throw new Error(`Verification failed because the input at index ${i} of transaction ${txid} is missing an associated unlocking script. This script is required for transaction verification because there is no merkle proof for the transaction spending the UTXO.`)
830
+ throw new Error(
831
+ `Verification failed because the input at index ${i} of transaction ${txid} is missing an associated unlocking script. This script is required for transaction verification because there is no merkle proof for the transaction spending the UTXO.`
832
+ )
842
833
  }
843
- const sourceOutput = input.sourceTransaction.outputs[input.sourceOutputIndex]
844
- inputTotal += sourceOutput.satoshis
834
+ const sourceOutput =
835
+ input.sourceTransaction.outputs[input.sourceOutputIndex]
836
+ inputTotal += sourceOutput.satoshis ?? 0
845
837
 
846
838
  const sourceTxid = input.sourceTransaction.id('hex')
847
839
  if (!verifiedTxids.has(sourceTxid)) {
@@ -857,11 +849,11 @@ export default class Transaction {
857
849
  sourceTXID: input.sourceTXID,
858
850
  sourceOutputIndex: input.sourceOutputIndex,
859
851
  lockingScript: sourceOutput.lockingScript,
860
- sourceSatoshis: sourceOutput.satoshis,
852
+ sourceSatoshis: sourceOutput.satoshis ?? 0,
861
853
  transactionVersion: tx.version,
862
854
  otherInputs,
863
855
  unlockingScript: input.unlockingScript,
864
- inputSequence: input.sequence,
856
+ inputSequence: input.sequence ?? 0,
865
857
  inputIndex: i,
866
858
  outputs: tx.outputs,
867
859
  lockTime: tx.lockTime
@@ -877,7 +869,9 @@ export default class Transaction {
877
869
  let outputTotal = 0
878
870
  for (const out of tx.outputs) {
879
871
  if (typeof out.satoshis !== 'number') {
880
- throw new Error('Every output must have a defined amount during transaction verification.')
872
+ throw new Error(
873
+ 'Every output must have a defined amount during transaction verification.'
874
+ )
881
875
  }
882
876
  outputTotal += out.satoshis
883
877
  }
@@ -914,12 +908,13 @@ export default class Transaction {
914
908
  let added = false
915
909
  // If this proof is identical to another one previously added, we use that first. Otherwise, we try to merge it with proofs from the same block.
916
910
  for (let i = 0; i < BUMPs.length; i++) {
917
- if (BUMPs[i] === tx.merklePath) { // Literally the same
911
+ if (BUMPs[i] === tx.merklePath) {
912
+ // Literally the same
918
913
  obj.pathIndex = i
919
914
  added = true
920
915
  break
921
916
  }
922
- if (BUMPs[i].blockHeight === tx.merklePath.blockHeight) {
917
+ if (tx.merklePath !== null && tx.merklePath !== undefined && BUMPs[i].blockHeight === tx.merklePath.blockHeight) {
923
918
  // Probably the same...
924
919
  const rootA = BUMPs[i].computeRoot()
925
920
  const rootB = tx.merklePath.computeRoot()
@@ -935,17 +930,23 @@ export default class Transaction {
935
930
  // Finally, if the proof is not yet added, add a new path.
936
931
  if (!added) {
937
932
  obj.pathIndex = BUMPs.length
938
- BUMPs.push(tx.merklePath)
933
+ if (tx.merklePath !== null && tx.merklePath !== undefined) {
934
+ BUMPs.push(tx.merklePath)
935
+ }
939
936
  }
940
937
  }
941
- const duplicate = txs.some(x => x.tx.id('hex') === tx.id('hex'))
938
+ const duplicate = txs.some((x) => x.tx.id('hex') === tx.id('hex'))
942
939
  if (!duplicate) {
943
940
  txs.unshift(obj)
944
941
  }
945
942
  if (!hasProof) {
946
943
  for (let i = 0; i < tx.inputs.length; i++) {
947
944
  const input = tx.inputs[i]
948
- if (typeof input.sourceTransaction === 'object') { addPathsAndInputs(input.sourceTransaction) } else if (!allowPartial) { throw new Error('A required source transaction is missing!') }
945
+ if (typeof input.sourceTransaction === 'object') {
946
+ addPathsAndInputs(input.sourceTransaction)
947
+ } else if (allowPartial === false) {
948
+ throw new Error('A required source transaction is missing!')
949
+ }
949
950
  }
950
951
  }
951
952
  }