@bsv/sdk 2.1.0 → 2.1.2

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 (392) hide show
  1. package/README.md +7 -7
  2. package/dist/cjs/package.json +1 -1
  3. package/dist/cjs/src/auth/Peer.js +8 -13
  4. package/dist/cjs/src/auth/Peer.js.map +1 -1
  5. package/dist/cjs/src/auth/SessionManager.js +4 -7
  6. package/dist/cjs/src/auth/SessionManager.js.map +1 -1
  7. package/dist/cjs/src/auth/certificates/MasterCertificate.js +1 -1
  8. package/dist/cjs/src/auth/certificates/MasterCertificate.js.map +1 -1
  9. package/dist/cjs/src/auth/certificates/__tests/CompletedProtoWallet.js +1 -1
  10. package/dist/cjs/src/auth/certificates/__tests/CompletedProtoWallet.js.map +1 -1
  11. package/dist/cjs/src/auth/clients/AuthFetch.js +32 -32
  12. package/dist/cjs/src/auth/clients/AuthFetch.js.map +1 -1
  13. package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js +4 -4
  14. package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js.map +1 -1
  15. package/dist/cjs/src/compat/ECIES.js +29 -34
  16. package/dist/cjs/src/compat/ECIES.js.map +1 -1
  17. package/dist/cjs/src/compat/HD.js +9 -4
  18. package/dist/cjs/src/compat/HD.js.map +1 -1
  19. package/dist/cjs/src/compat/Mnemonic.js +12 -12
  20. package/dist/cjs/src/compat/Mnemonic.js.map +1 -1
  21. package/dist/cjs/src/identity/ContactsManager.js +212 -234
  22. package/dist/cjs/src/identity/ContactsManager.js.map +1 -1
  23. package/dist/cjs/src/identity/IdentityClient.js +199 -63
  24. package/dist/cjs/src/identity/IdentityClient.js.map +1 -1
  25. package/dist/cjs/src/kvstore/GlobalKVStore.js +30 -31
  26. package/dist/cjs/src/kvstore/GlobalKVStore.js.map +1 -1
  27. package/dist/cjs/src/kvstore/LocalKVStore.js +9 -9
  28. package/dist/cjs/src/kvstore/LocalKVStore.js.map +1 -1
  29. package/dist/cjs/src/kvstore/kvStoreInterpreter.js +2 -2
  30. package/dist/cjs/src/kvstore/kvStoreInterpreter.js.map +1 -1
  31. package/dist/cjs/src/messages/SignedMessage.js +1 -1
  32. package/dist/cjs/src/messages/SignedMessage.js.map +1 -1
  33. package/dist/cjs/src/overlay-tools/Historian.js +1 -1
  34. package/dist/cjs/src/overlay-tools/Historian.js.map +1 -1
  35. package/dist/cjs/src/overlay-tools/LookupResolver.js +213 -93
  36. package/dist/cjs/src/overlay-tools/LookupResolver.js.map +1 -1
  37. package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js +75 -146
  38. package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js.map +1 -1
  39. package/dist/cjs/src/primitives/AESGCM.js +2 -2
  40. package/dist/cjs/src/primitives/AESGCM.js.map +1 -1
  41. package/dist/cjs/src/primitives/BigNumber.js +164 -148
  42. package/dist/cjs/src/primitives/BigNumber.js.map +1 -1
  43. package/dist/cjs/src/primitives/Curve.js +17 -15
  44. package/dist/cjs/src/primitives/Curve.js.map +1 -1
  45. package/dist/cjs/src/primitives/ECDSA.js +12 -7
  46. package/dist/cjs/src/primitives/ECDSA.js.map +1 -1
  47. package/dist/cjs/src/primitives/Hash.js +312 -105
  48. package/dist/cjs/src/primitives/Hash.js.map +1 -1
  49. package/dist/cjs/src/primitives/JacobianPoint.js +8 -8
  50. package/dist/cjs/src/primitives/JacobianPoint.js.map +1 -1
  51. package/dist/cjs/src/primitives/K256.js +3 -3
  52. package/dist/cjs/src/primitives/K256.js.map +1 -1
  53. package/dist/cjs/src/primitives/Point.js +36 -40
  54. package/dist/cjs/src/primitives/Point.js.map +1 -1
  55. package/dist/cjs/src/primitives/PrivateKey.js +4 -4
  56. package/dist/cjs/src/primitives/PrivateKey.js.map +1 -1
  57. package/dist/cjs/src/primitives/PublicKey.js +4 -4
  58. package/dist/cjs/src/primitives/PublicKey.js.map +1 -1
  59. package/dist/cjs/src/primitives/Random.js +10 -14
  60. package/dist/cjs/src/primitives/Random.js.map +1 -1
  61. package/dist/cjs/src/primitives/ReaderUint8Array.js +6 -6
  62. package/dist/cjs/src/primitives/ReaderUint8Array.js.map +1 -1
  63. package/dist/cjs/src/primitives/Schnorr.js +2 -2
  64. package/dist/cjs/src/primitives/Schnorr.js.map +1 -1
  65. package/dist/cjs/src/primitives/Secp256r1.js +2 -1
  66. package/dist/cjs/src/primitives/Secp256r1.js.map +1 -1
  67. package/dist/cjs/src/primitives/Signature.js +8 -8
  68. package/dist/cjs/src/primitives/Signature.js.map +1 -1
  69. package/dist/cjs/src/primitives/SymmetricKey.js +123 -1
  70. package/dist/cjs/src/primitives/SymmetricKey.js.map +1 -1
  71. package/dist/cjs/src/primitives/TransactionSignature.js +20 -21
  72. package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -1
  73. package/dist/cjs/src/primitives/utils.js +39 -46
  74. package/dist/cjs/src/primitives/utils.js.map +1 -1
  75. package/dist/cjs/src/registry/RegistryClient.js +31 -23
  76. package/dist/cjs/src/registry/RegistryClient.js.map +1 -1
  77. package/dist/cjs/src/remittance/RemittanceManager.js +19 -18
  78. package/dist/cjs/src/remittance/RemittanceManager.js.map +1 -1
  79. package/dist/cjs/src/remittance/modules/BasicBRC29.js.map +1 -1
  80. package/dist/cjs/src/script/Script.js +93 -170
  81. package/dist/cjs/src/script/Script.js.map +1 -1
  82. package/dist/cjs/src/script/ScriptEvaluationError.js +2 -2
  83. package/dist/cjs/src/script/ScriptEvaluationError.js.map +1 -1
  84. package/dist/cjs/src/script/Spend.js +14 -12
  85. package/dist/cjs/src/script/Spend.js.map +1 -1
  86. package/dist/cjs/src/script/templates/PushDrop.js +22 -18
  87. package/dist/cjs/src/script/templates/PushDrop.js.map +1 -1
  88. package/dist/cjs/src/script/templates/RPuzzle.js +2 -4
  89. package/dist/cjs/src/script/templates/RPuzzle.js.map +1 -1
  90. package/dist/cjs/src/storage/StorageDownloader.js +42 -9
  91. package/dist/cjs/src/storage/StorageDownloader.js.map +1 -1
  92. package/dist/cjs/src/totp/totp.js +1 -1
  93. package/dist/cjs/src/totp/totp.js.map +1 -1
  94. package/dist/cjs/src/transaction/Beef.js +239 -192
  95. package/dist/cjs/src/transaction/Beef.js.map +1 -1
  96. package/dist/cjs/src/transaction/BeefConstants.js +19 -0
  97. package/dist/cjs/src/transaction/BeefConstants.js.map +1 -0
  98. package/dist/cjs/src/transaction/BeefTx.js +12 -12
  99. package/dist/cjs/src/transaction/BeefTx.js.map +1 -1
  100. package/dist/cjs/src/transaction/MerklePath.js +4 -4
  101. package/dist/cjs/src/transaction/MerklePath.js.map +1 -1
  102. package/dist/cjs/src/transaction/Transaction.js +49 -52
  103. package/dist/cjs/src/transaction/Transaction.js.map +1 -1
  104. package/dist/cjs/src/transaction/fee-models/SatoshisPerKilobyte.js +1 -1
  105. package/dist/cjs/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -1
  106. package/dist/cjs/src/transaction/http/BinaryFetchClient.js +9 -9
  107. package/dist/cjs/src/transaction/http/BinaryFetchClient.js.map +1 -1
  108. package/dist/cjs/src/transaction/http/DefaultHttpClient.js +9 -9
  109. package/dist/cjs/src/transaction/http/DefaultHttpClient.js.map +1 -1
  110. package/dist/cjs/src/wallet/CachedKeyDeriver.js +1 -1
  111. package/dist/cjs/src/wallet/CachedKeyDeriver.js.map +1 -1
  112. package/dist/cjs/src/wallet/WalletClient.js.map +1 -1
  113. package/dist/cjs/src/wallet/WalletError.js.map +1 -1
  114. package/dist/cjs/src/wallet/substrates/HTTPWalletJSON.js +5 -4
  115. package/dist/cjs/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
  116. package/dist/cjs/src/wallet/substrates/ReactNativeWebView.js +9 -9
  117. package/dist/cjs/src/wallet/substrates/ReactNativeWebView.js.map +1 -1
  118. package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js +92 -92
  119. package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
  120. package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js +387 -711
  121. package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
  122. package/dist/cjs/src/wallet/substrates/XDM.js +4 -4
  123. package/dist/cjs/src/wallet/substrates/XDM.js.map +1 -1
  124. package/dist/cjs/src/wallet/substrates/window.CWI.js +2 -2
  125. package/dist/cjs/src/wallet/substrates/window.CWI.js.map +1 -1
  126. package/dist/cjs/src/wallet/validationHelpers.js +9 -9
  127. package/dist/cjs/src/wallet/validationHelpers.js.map +1 -1
  128. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  129. package/dist/esm/src/auth/Peer.js +25 -13
  130. package/dist/esm/src/auth/Peer.js.map +1 -1
  131. package/dist/esm/src/auth/SessionManager.js +4 -7
  132. package/dist/esm/src/auth/SessionManager.js.map +1 -1
  133. package/dist/esm/src/auth/certificates/MasterCertificate.js +1 -1
  134. package/dist/esm/src/auth/certificates/MasterCertificate.js.map +1 -1
  135. package/dist/esm/src/auth/certificates/__tests/CompletedProtoWallet.js +1 -1
  136. package/dist/esm/src/auth/certificates/__tests/CompletedProtoWallet.js.map +1 -1
  137. package/dist/esm/src/auth/clients/AuthFetch.js +32 -32
  138. package/dist/esm/src/auth/clients/AuthFetch.js.map +1 -1
  139. package/dist/esm/src/auth/transports/SimplifiedFetchTransport.js +4 -4
  140. package/dist/esm/src/auth/transports/SimplifiedFetchTransport.js.map +1 -1
  141. package/dist/esm/src/compat/ECIES.js +29 -34
  142. package/dist/esm/src/compat/ECIES.js.map +1 -1
  143. package/dist/esm/src/compat/HD.js +9 -4
  144. package/dist/esm/src/compat/HD.js.map +1 -1
  145. package/dist/esm/src/compat/Mnemonic.js +12 -12
  146. package/dist/esm/src/compat/Mnemonic.js.map +1 -1
  147. package/dist/esm/src/identity/ContactsManager.js +212 -234
  148. package/dist/esm/src/identity/ContactsManager.js.map +1 -1
  149. package/dist/esm/src/identity/IdentityClient.js +199 -63
  150. package/dist/esm/src/identity/IdentityClient.js.map +1 -1
  151. package/dist/esm/src/kvstore/GlobalKVStore.js +30 -31
  152. package/dist/esm/src/kvstore/GlobalKVStore.js.map +1 -1
  153. package/dist/esm/src/kvstore/LocalKVStore.js +9 -9
  154. package/dist/esm/src/kvstore/LocalKVStore.js.map +1 -1
  155. package/dist/esm/src/kvstore/kvStoreInterpreter.js +2 -2
  156. package/dist/esm/src/kvstore/kvStoreInterpreter.js.map +1 -1
  157. package/dist/esm/src/messages/SignedMessage.js +1 -1
  158. package/dist/esm/src/messages/SignedMessage.js.map +1 -1
  159. package/dist/esm/src/overlay-tools/Historian.js +1 -1
  160. package/dist/esm/src/overlay-tools/Historian.js.map +1 -1
  161. package/dist/esm/src/overlay-tools/LookupResolver.js +213 -93
  162. package/dist/esm/src/overlay-tools/LookupResolver.js.map +1 -1
  163. package/dist/esm/src/overlay-tools/SHIPBroadcaster.js +74 -146
  164. package/dist/esm/src/overlay-tools/SHIPBroadcaster.js.map +1 -1
  165. package/dist/esm/src/primitives/AESGCM.js +2 -2
  166. package/dist/esm/src/primitives/AESGCM.js.map +1 -1
  167. package/dist/esm/src/primitives/BigNumber.js +167 -154
  168. package/dist/esm/src/primitives/BigNumber.js.map +1 -1
  169. package/dist/esm/src/primitives/Curve.js +17 -15
  170. package/dist/esm/src/primitives/Curve.js.map +1 -1
  171. package/dist/esm/src/primitives/ECDSA.js +12 -7
  172. package/dist/esm/src/primitives/ECDSA.js.map +1 -1
  173. package/dist/esm/src/primitives/Hash.js +316 -105
  174. package/dist/esm/src/primitives/Hash.js.map +1 -1
  175. package/dist/esm/src/primitives/JacobianPoint.js +8 -8
  176. package/dist/esm/src/primitives/JacobianPoint.js.map +1 -1
  177. package/dist/esm/src/primitives/K256.js +3 -3
  178. package/dist/esm/src/primitives/K256.js.map +1 -1
  179. package/dist/esm/src/primitives/Point.js +36 -40
  180. package/dist/esm/src/primitives/Point.js.map +1 -1
  181. package/dist/esm/src/primitives/PrivateKey.js +4 -4
  182. package/dist/esm/src/primitives/PrivateKey.js.map +1 -1
  183. package/dist/esm/src/primitives/PublicKey.js +4 -4
  184. package/dist/esm/src/primitives/PublicKey.js.map +1 -1
  185. package/dist/esm/src/primitives/Random.js +10 -14
  186. package/dist/esm/src/primitives/Random.js.map +1 -1
  187. package/dist/esm/src/primitives/ReaderUint8Array.js +6 -6
  188. package/dist/esm/src/primitives/ReaderUint8Array.js.map +1 -1
  189. package/dist/esm/src/primitives/Schnorr.js +1 -1
  190. package/dist/esm/src/primitives/Schnorr.js.map +1 -1
  191. package/dist/esm/src/primitives/Secp256r1.js +2 -1
  192. package/dist/esm/src/primitives/Secp256r1.js.map +1 -1
  193. package/dist/esm/src/primitives/Signature.js +8 -8
  194. package/dist/esm/src/primitives/Signature.js.map +1 -1
  195. package/dist/esm/src/primitives/SymmetricKey.js +123 -1
  196. package/dist/esm/src/primitives/SymmetricKey.js.map +1 -1
  197. package/dist/esm/src/primitives/TransactionSignature.js +20 -21
  198. package/dist/esm/src/primitives/TransactionSignature.js.map +1 -1
  199. package/dist/esm/src/primitives/utils.js +39 -48
  200. package/dist/esm/src/primitives/utils.js.map +1 -1
  201. package/dist/esm/src/registry/RegistryClient.js +31 -23
  202. package/dist/esm/src/registry/RegistryClient.js.map +1 -1
  203. package/dist/esm/src/remittance/RemittanceManager.js +19 -18
  204. package/dist/esm/src/remittance/RemittanceManager.js.map +1 -1
  205. package/dist/esm/src/remittance/modules/BasicBRC29.js.map +1 -1
  206. package/dist/esm/src/script/Script.js +93 -170
  207. package/dist/esm/src/script/Script.js.map +1 -1
  208. package/dist/esm/src/script/ScriptEvaluationError.js +2 -2
  209. package/dist/esm/src/script/ScriptEvaluationError.js.map +1 -1
  210. package/dist/esm/src/script/Spend.js +14 -12
  211. package/dist/esm/src/script/Spend.js.map +1 -1
  212. package/dist/esm/src/script/templates/PushDrop.js +4 -3
  213. package/dist/esm/src/script/templates/PushDrop.js.map +1 -1
  214. package/dist/esm/src/script/templates/RPuzzle.js +2 -4
  215. package/dist/esm/src/script/templates/RPuzzle.js.map +1 -1
  216. package/dist/esm/src/storage/StorageDownloader.js +1 -1
  217. package/dist/esm/src/storage/StorageDownloader.js.map +1 -1
  218. package/dist/esm/src/totp/totp.js +1 -1
  219. package/dist/esm/src/totp/totp.js.map +1 -1
  220. package/dist/esm/src/transaction/Beef.js +229 -186
  221. package/dist/esm/src/transaction/Beef.js.map +1 -1
  222. package/dist/esm/src/transaction/BeefConstants.js +16 -0
  223. package/dist/esm/src/transaction/BeefConstants.js.map +1 -0
  224. package/dist/esm/src/transaction/BeefTx.js +3 -3
  225. package/dist/esm/src/transaction/BeefTx.js.map +1 -1
  226. package/dist/esm/src/transaction/MerklePath.js +4 -4
  227. package/dist/esm/src/transaction/MerklePath.js.map +1 -1
  228. package/dist/esm/src/transaction/Transaction.js +49 -52
  229. package/dist/esm/src/transaction/Transaction.js.map +1 -1
  230. package/dist/esm/src/transaction/fee-models/SatoshisPerKilobyte.js +1 -1
  231. package/dist/esm/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -1
  232. package/dist/esm/src/transaction/http/BinaryFetchClient.js +9 -9
  233. package/dist/esm/src/transaction/http/BinaryFetchClient.js.map +1 -1
  234. package/dist/esm/src/transaction/http/DefaultHttpClient.js +9 -9
  235. package/dist/esm/src/transaction/http/DefaultHttpClient.js.map +1 -1
  236. package/dist/esm/src/wallet/CachedKeyDeriver.js +1 -1
  237. package/dist/esm/src/wallet/CachedKeyDeriver.js.map +1 -1
  238. package/dist/esm/src/wallet/WalletClient.js.map +1 -1
  239. package/dist/esm/src/wallet/WalletError.js.map +1 -1
  240. package/dist/esm/src/wallet/substrates/HTTPWalletJSON.js +5 -4
  241. package/dist/esm/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
  242. package/dist/esm/src/wallet/substrates/ReactNativeWebView.js +9 -9
  243. package/dist/esm/src/wallet/substrates/ReactNativeWebView.js.map +1 -1
  244. package/dist/esm/src/wallet/substrates/WalletWireProcessor.js +92 -92
  245. package/dist/esm/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
  246. package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js +387 -711
  247. package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
  248. package/dist/esm/src/wallet/substrates/XDM.js +4 -4
  249. package/dist/esm/src/wallet/substrates/XDM.js.map +1 -1
  250. package/dist/esm/src/wallet/substrates/window.CWI.js +2 -2
  251. package/dist/esm/src/wallet/substrates/window.CWI.js.map +1 -1
  252. package/dist/esm/src/wallet/validationHelpers.js +9 -9
  253. package/dist/esm/src/wallet/validationHelpers.js.map +1 -1
  254. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  255. package/dist/types/src/auth/Peer.d.ts +13 -0
  256. package/dist/types/src/auth/Peer.d.ts.map +1 -1
  257. package/dist/types/src/auth/SessionManager.d.ts.map +1 -1
  258. package/dist/types/src/auth/clients/AuthFetch.d.ts.map +1 -1
  259. package/dist/types/src/compat/ECIES.d.ts.map +1 -1
  260. package/dist/types/src/compat/HD.d.ts.map +1 -1
  261. package/dist/types/src/identity/ContactsManager.d.ts +31 -2
  262. package/dist/types/src/identity/ContactsManager.d.ts.map +1 -1
  263. package/dist/types/src/identity/IdentityClient.d.ts +75 -10
  264. package/dist/types/src/identity/IdentityClient.d.ts.map +1 -1
  265. package/dist/types/src/kvstore/GlobalKVStore.d.ts.map +1 -1
  266. package/dist/types/src/overlay-tools/LookupResolver.d.ts +73 -2
  267. package/dist/types/src/overlay-tools/LookupResolver.d.ts.map +1 -1
  268. package/dist/types/src/overlay-tools/SHIPBroadcaster.d.ts +18 -3
  269. package/dist/types/src/overlay-tools/SHIPBroadcaster.d.ts.map +1 -1
  270. package/dist/types/src/primitives/BigNumber.d.ts +13 -3
  271. package/dist/types/src/primitives/BigNumber.d.ts.map +1 -1
  272. package/dist/types/src/primitives/Curve.d.ts.map +1 -1
  273. package/dist/types/src/primitives/ECDSA.d.ts.map +1 -1
  274. package/dist/types/src/primitives/Hash.d.ts +22 -17
  275. package/dist/types/src/primitives/Hash.d.ts.map +1 -1
  276. package/dist/types/src/primitives/JacobianPoint.d.ts +3 -1
  277. package/dist/types/src/primitives/JacobianPoint.d.ts.map +1 -1
  278. package/dist/types/src/primitives/Point.d.ts.map +1 -1
  279. package/dist/types/src/primitives/Random.d.ts +2 -2
  280. package/dist/types/src/primitives/Random.d.ts.map +1 -1
  281. package/dist/types/src/primitives/ReaderUint8Array.d.ts.map +1 -1
  282. package/dist/types/src/primitives/Schnorr.d.ts +2 -1
  283. package/dist/types/src/primitives/Schnorr.d.ts.map +1 -1
  284. package/dist/types/src/primitives/Secp256r1.d.ts.map +1 -1
  285. package/dist/types/src/primitives/SymmetricKey.d.ts.map +1 -1
  286. package/dist/types/src/primitives/utils.d.ts +2 -4
  287. package/dist/types/src/primitives/utils.d.ts.map +1 -1
  288. package/dist/types/src/registry/RegistryClient.d.ts.map +1 -1
  289. package/dist/types/src/remittance/RemittanceManager.d.ts.map +1 -1
  290. package/dist/types/src/remittance/modules/BasicBRC29.d.ts.map +1 -1
  291. package/dist/types/src/script/Script.d.ts +15 -8
  292. package/dist/types/src/script/Script.d.ts.map +1 -1
  293. package/dist/types/src/script/Spend.d.ts.map +1 -1
  294. package/dist/types/src/script/templates/PushDrop.d.ts +3 -1
  295. package/dist/types/src/script/templates/PushDrop.d.ts.map +1 -1
  296. package/dist/types/src/script/templates/RPuzzle.d.ts.map +1 -1
  297. package/dist/types/src/transaction/Beef.d.ts +46 -8
  298. package/dist/types/src/transaction/Beef.d.ts.map +1 -1
  299. package/dist/types/src/transaction/BeefConstants.d.ts +15 -0
  300. package/dist/types/src/transaction/BeefConstants.d.ts.map +1 -0
  301. package/dist/types/src/transaction/Transaction.d.ts.map +1 -1
  302. package/dist/types/src/wallet/CachedKeyDeriver.d.ts.map +1 -1
  303. package/dist/types/src/wallet/KeyDeriver.d.ts +1 -1
  304. package/dist/types/src/wallet/KeyDeriver.d.ts.map +1 -1
  305. package/dist/types/src/wallet/Wallet.interfaces.d.ts +18 -3
  306. package/dist/types/src/wallet/Wallet.interfaces.d.ts.map +1 -1
  307. package/dist/types/src/wallet/WalletClient.d.ts +8 -8
  308. package/dist/types/src/wallet/WalletClient.d.ts.map +1 -1
  309. package/dist/types/src/wallet/substrates/HTTPWalletJSON.d.ts +7 -7
  310. package/dist/types/src/wallet/substrates/HTTPWalletJSON.d.ts.map +1 -1
  311. package/dist/types/src/wallet/substrates/WalletWireTransceiver.d.ts +36 -7
  312. package/dist/types/src/wallet/substrates/WalletWireTransceiver.d.ts.map +1 -1
  313. package/dist/types/src/wallet/substrates/window.CWI.d.ts +9 -9
  314. package/dist/types/src/wallet/substrates/window.CWI.d.ts.map +1 -1
  315. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  316. package/dist/umd/bundle.js +3 -3
  317. package/package.json +1 -1
  318. package/src/auth/Peer.ts +26 -13
  319. package/src/auth/SessionManager.ts +4 -7
  320. package/src/auth/certificates/MasterCertificate.ts +1 -1
  321. package/src/auth/certificates/__tests/CompletedProtoWallet.ts +1 -1
  322. package/src/auth/clients/AuthFetch.ts +41 -41
  323. package/src/auth/transports/SimplifiedFetchTransport.ts +4 -4
  324. package/src/compat/ECIES.ts +29 -34
  325. package/src/compat/HD.ts +10 -5
  326. package/src/compat/Mnemonic.ts +11 -11
  327. package/src/compat/__tests/HD.test.ts +19 -0
  328. package/src/identity/ContactsManager.ts +236 -258
  329. package/src/identity/IdentityClient.ts +244 -71
  330. package/src/identity/__tests/IdentityClient.additional.test.ts +150 -1
  331. package/src/identity/__tests/IdentityClient.test.ts +27 -3
  332. package/src/kvstore/GlobalKVStore.ts +31 -32
  333. package/src/kvstore/LocalKVStore.ts +8 -8
  334. package/src/kvstore/kvStoreInterpreter.ts +2 -2
  335. package/src/messages/SignedMessage.ts +1 -1
  336. package/src/overlay-tools/Historian.ts +1 -1
  337. package/src/overlay-tools/LookupResolver.ts +264 -90
  338. package/src/overlay-tools/SHIPBroadcaster.ts +92 -168
  339. package/src/primitives/AESGCM.ts +2 -2
  340. package/src/primitives/BigNumber.ts +122 -113
  341. package/src/primitives/Curve.ts +16 -15
  342. package/src/primitives/ECDSA.ts +10 -8
  343. package/src/primitives/Hash.ts +381 -146
  344. package/src/primitives/JacobianPoint.ts +13 -11
  345. package/src/primitives/K256.ts +3 -3
  346. package/src/primitives/Point.ts +35 -38
  347. package/src/primitives/PrivateKey.ts +3 -3
  348. package/src/primitives/PublicKey.ts +3 -3
  349. package/src/primitives/Random.ts +11 -14
  350. package/src/primitives/ReaderUint8Array.ts +7 -7
  351. package/src/primitives/Schnorr.ts +2 -1
  352. package/src/primitives/Secp256r1.ts +2 -1
  353. package/src/primitives/Signature.ts +8 -8
  354. package/src/primitives/SymmetricKey.ts +145 -1
  355. package/src/primitives/TransactionSignature.ts +16 -16
  356. package/src/primitives/__tests/Hash.additional.test.ts +65 -0
  357. package/src/primitives/__tests/Hash.test.ts +6 -1
  358. package/src/primitives/utils.ts +37 -47
  359. package/src/registry/RegistryClient.ts +25 -25
  360. package/src/remittance/RemittanceManager.ts +17 -18
  361. package/src/remittance/modules/BasicBRC29.ts +2 -5
  362. package/src/script/Script.ts +114 -170
  363. package/src/script/ScriptEvaluationError.ts +2 -2
  364. package/src/script/Spend.ts +14 -15
  365. package/src/script/templates/PushDrop.ts +5 -3
  366. package/src/script/templates/RPuzzle.ts +2 -4
  367. package/src/storage/StorageDownloader.ts +1 -1
  368. package/src/totp/totp.ts +1 -1
  369. package/src/transaction/Beef.ts +241 -203
  370. package/src/transaction/BeefConstants.ts +16 -0
  371. package/src/transaction/BeefTx.ts +3 -3
  372. package/src/transaction/MerklePath.ts +4 -4
  373. package/src/transaction/Transaction.ts +48 -51
  374. package/src/transaction/fee-models/SatoshisPerKilobyte.ts +1 -1
  375. package/src/transaction/http/BinaryFetchClient.ts +8 -8
  376. package/src/transaction/http/DefaultHttpClient.ts +8 -8
  377. package/src/wallet/CachedKeyDeriver.ts +8 -6
  378. package/src/wallet/KeyDeriver.ts +1 -1
  379. package/src/wallet/Wallet.interfaces.ts +18 -5
  380. package/src/wallet/WalletClient.ts +9 -9
  381. package/src/wallet/WalletError.ts +1 -1
  382. package/src/wallet/__tests/WalletClient.substrate.test.ts +10 -6
  383. package/src/wallet/substrates/HTTPWalletJSON.ts +22 -21
  384. package/src/wallet/substrates/ReactNativeWebView.ts +9 -9
  385. package/src/wallet/substrates/WalletWireProcessor.ts +83 -83
  386. package/src/wallet/substrates/WalletWireTransceiver.ts +528 -938
  387. package/src/wallet/substrates/XDM.ts +4 -4
  388. package/src/wallet/substrates/__tests/HTTPWalletJSON.test.ts +38 -25
  389. package/src/wallet/substrates/__tests/ReactNativeWebView.test.ts +174 -0
  390. package/src/wallet/substrates/__tests/window.CWI.test.ts +256 -0
  391. package/src/wallet/substrates/window.CWI.ts +11 -11
  392. package/src/wallet/validationHelpers.ts +9 -9
@@ -65,7 +65,7 @@ function generateHOTP(secret, counter, options) {
65
65
  const hmac = calcHMAC(secret, timePad, options.algorithm);
66
66
  const signature = hmac.digest();
67
67
  // RFC 4226 https://datatracker.ietf.org/doc/html/rfc4226#section-5.4
68
- const offset = signature[signature.length - 1] & 0x0f; // offset is the last byte in the hmac
68
+ const offset = (signature.at(-1) ?? 0) & 0x0f; // offset is the last byte in the hmac
69
69
  const fourBytesRange = signature.slice(offset, offset + 4); // starting from offset, get 4 bytes
70
70
  const mask = 0x7fffffff; // 32-bit number with a leading 0 followed by 31 ones [0111 (...) 1111]
71
71
  const masked = new BigNumber(fourBytesRange).toNumber() & mask;
@@ -1 +1 @@
1
- {"version":3,"file":"totp.js","sourceRoot":"","sources":["../../../../src/totp/totp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"totp.js","sourceRoot":"","sources":["../../../../src/totp/totp.ts"],"names":[],"mappings":"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"}
@@ -2,15 +2,8 @@ import MerklePath from './MerklePath.js';
2
2
  import BeefTx from './BeefTx.js';
3
3
  import { toHex, toArray, verifyNotNull, ReaderUint8Array, WriterUint8Array, toUint8Array } from '../primitives/utils.js';
4
4
  import { hash256 } from '../primitives/Hash.js';
5
- export const BEEF_V1 = 4022206465; // 0100BEEF in LE order
6
- export const BEEF_V2 = 4022206466; // 0200BEEF in LE order
7
- export const ATOMIC_BEEF = 0x01010101; // 01010101
8
- export var TX_DATA_FORMAT;
9
- (function (TX_DATA_FORMAT) {
10
- TX_DATA_FORMAT[TX_DATA_FORMAT["RAWTX"] = 0] = "RAWTX";
11
- TX_DATA_FORMAT[TX_DATA_FORMAT["RAWTX_AND_BUMP_INDEX"] = 1] = "RAWTX_AND_BUMP_INDEX";
12
- TX_DATA_FORMAT[TX_DATA_FORMAT["TXID_ONLY"] = 2] = "TXID_ONLY";
13
- })(TX_DATA_FORMAT || (TX_DATA_FORMAT = {}));
5
+ import { BEEF_V1, BEEF_V2, ATOMIC_BEEF } from './BeefConstants.js';
6
+ export { BEEF_V1, BEEF_V2, ATOMIC_BEEF, TX_DATA_FORMAT } from './BeefConstants.js';
14
7
  /*
15
8
  * BEEF standard: BRC-62: Background Evaluation Extended Format (BEEF) Transactions
16
9
  * https://github.com/bsv-blockchain/BRCs/blob/master/transactions/0062.md
@@ -88,7 +81,9 @@ export class Beef {
88
81
  }
89
82
  ensureSerializableState() {
90
83
  for (const tx of this.txs) {
91
- void tx.txid;
84
+ // Access txid to ensure it is computed before serialization
85
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
86
+ tx.txid;
92
87
  }
93
88
  }
94
89
  ensureSortedForSerialization() {
@@ -115,7 +110,7 @@ export class Beef {
115
110
  throw new Error(`${txid} does not exist in this Beef`);
116
111
  }
117
112
  // If the transaction is not the last one, clone and modify
118
- const beef = (this.txs[this.txs.length - 1] === tx) ? this : this.clone();
113
+ const beef = (this.txs.at(-1) === tx) ? this : this.clone();
119
114
  if (beef !== this) {
120
115
  const i = this.txs.findIndex((t) => t.txid === txid);
121
116
  beef.txs.splice(i + 1);
@@ -175,8 +170,7 @@ export class Beef {
175
170
  * @returns `MerklePath` with level zero hash equal to txid or undefined.
176
171
  */
177
172
  findBump(txid) {
178
- return this.bumps.find((b) => b.path[0].some((leaf) => leaf.hash === txid) // ✅ Ensure boolean return with `.some()`
179
- );
173
+ return this.bumps.find((b) => b.path[0].some((leaf) => leaf.hash === txid));
180
174
  }
181
175
  /**
182
176
  * Finds a Transaction in this `Beef`
@@ -213,33 +207,39 @@ export class Beef {
213
207
  const beefTx = this.findTxid(txid);
214
208
  if ((beefTx == null) || (beefTx.tx == null))
215
209
  return undefined; // Ensure beefTx.tx exists before using it
216
- const addInputProof = (beef, tx) => {
217
- const mp = beef.findBump(tx.id('hex'));
218
- if (mp != null) {
219
- tx.merklePath = mp;
210
+ this.addInputProof(beefTx.tx);
211
+ return beefTx.tx;
212
+ }
213
+ /** Recursively attach merkle paths and source transactions to all inputs. */
214
+ addInputProof(tx) {
215
+ const mp = this.findBump(tx.id('hex'));
216
+ if (mp != null) {
217
+ tx.merklePath = mp;
218
+ return;
219
+ }
220
+ for (const i of tx.inputs) {
221
+ this.resolveInputSource(i);
222
+ if (i.sourceTransaction != null) {
223
+ this.attachMerklePathOrRecurse(i.sourceTransaction);
220
224
  }
221
- else {
222
- for (const i of tx.inputs) {
223
- if (i.sourceTransaction == null) {
224
- const itx = beef.findTxid(verifyNotNull(i.sourceTXID, 'sourceTXID must be valid'));
225
- if (itx != null) {
226
- i.sourceTransaction = itx.tx;
227
- }
228
- }
229
- if (i.sourceTransaction != null) {
230
- const mp = beef.findBump(i.sourceTransaction.id('hex'));
231
- if (mp != null) {
232
- i.sourceTransaction.merklePath = mp;
233
- }
234
- else {
235
- addInputProof(beef, i.sourceTransaction);
236
- }
237
- }
238
- }
225
+ }
226
+ }
227
+ resolveInputSource(i) {
228
+ if (i.sourceTransaction == null) {
229
+ const itx = this.findTxid(verifyNotNull(i.sourceTXID, 'sourceTXID must be valid'));
230
+ if (itx != null) {
231
+ i.sourceTransaction = itx.tx;
239
232
  }
240
- };
241
- addInputProof(this, beefTx.tx); // Safe because we checked that beefTx.tx exists
242
- return beefTx.tx;
233
+ }
234
+ }
235
+ attachMerklePathOrRecurse(sourceTx) {
236
+ const mp = this.findBump(sourceTx.id('hex'));
237
+ if (mp != null) {
238
+ sourceTx.merklePath = mp;
239
+ }
240
+ else {
241
+ this.addInputProof(sourceTx);
242
+ }
243
243
  }
244
244
  /**
245
245
  * Merge a MerklePath that is assumed to be fully valid.
@@ -248,46 +248,44 @@ export class Beef {
248
248
  */
249
249
  mergeBump(bump) {
250
250
  this.markMutated(false);
251
- let bumpIndex;
252
- // 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.
251
+ const bumpIndex = this.findOrInsertBump(bump);
252
+ // Review if any transactions are proven by this bump
253
+ const b = this.bumps[bumpIndex];
254
+ for (const tx of this.txs) {
255
+ if (tx.bumpIndex == null) {
256
+ this.tryMarkTxProvenByBump(tx, b, bumpIndex);
257
+ }
258
+ }
259
+ return bumpIndex;
260
+ }
261
+ /**
262
+ * Find an existing compatible bump or insert a new one; return its index.
263
+ */
264
+ findOrInsertBump(bump) {
253
265
  for (let i = 0; i < this.bumps.length; i++) {
254
266
  const b = this.bumps[i];
255
- if (b === bump) {
256
- // Literally the same
267
+ if (b === bump)
268
+ return i;
269
+ if (b.blockHeight !== bump.blockHeight)
270
+ continue;
271
+ if (b.computeRoot() === bump.computeRoot()) {
272
+ b.combine(bump);
257
273
  return i;
258
274
  }
259
- if (b.blockHeight === bump.blockHeight) {
260
- // Probably the same...
261
- const rootA = b.computeRoot();
262
- const rootB = bump.computeRoot();
263
- if (rootA === rootB) {
264
- // Definitely the same... combine them to save space
265
- b.combine(bump);
266
- bumpIndex = i;
267
- break;
268
- }
269
- }
270
- }
271
- // if the proof is not yet added, add a new path.
272
- if (bumpIndex === undefined) {
273
- bumpIndex = this.bumps.length;
274
- this.bumps.push(bump);
275
275
  }
276
- // Review if any transactions are proven by this bump
277
- const b = this.bumps[bumpIndex];
278
- for (const tx of this.txs) {
279
- const txid = tx.txid;
280
- if (tx.bumpIndex == null) { // ✅ Explicitly check for null or undefined
281
- for (const n of b.path[0]) {
282
- if (n.hash === txid) {
283
- tx.bumpIndex = bumpIndex;
284
- n.txid = true;
285
- break;
286
- }
287
- }
276
+ this.bumps.push(bump);
277
+ return this.bumps.length - 1;
278
+ }
279
+ /** If bump's level-0 path contains tx's txid, record the bumpIndex on tx. */
280
+ tryMarkTxProvenByBump(tx, b, bumpIndex) {
281
+ const txid = tx.txid;
282
+ for (const n of b.path[0]) {
283
+ if (n.hash === txid) {
284
+ tx.bumpIndex = bumpIndex;
285
+ n.txid = true;
286
+ break;
288
287
  }
289
288
  }
290
- return bumpIndex;
291
289
  }
292
290
  /**
293
291
  * Merge a serialized transaction.
@@ -462,54 +460,74 @@ export class Beef {
462
460
  }
463
461
  // valid txids: only txids if allowed, bump txids, then txids with input's in txids
464
462
  const txids = {};
463
+ if (!this.collectTxidOnlyTxids(txids, allowTxidOnly))
464
+ return r;
465
+ if (!this.collectBumpTxids(txids, r))
466
+ return r;
467
+ if (!this.verifyBumpIndexLeaves())
468
+ return r;
469
+ if (!this.verifyInputDependencies(txids))
470
+ return r;
471
+ r.valid = true;
472
+ return r;
473
+ }
474
+ /** Add txidOnly transaction txids; return false if not allowed. */
475
+ collectTxidOnlyTxids(txids, allowTxidOnly) {
465
476
  for (const tx of this.txs) {
466
- if (tx.isTxidOnly) {
467
- if (allowTxidOnly !== true)
468
- return r; // ✅ Explicit check for `true`
469
- txids[tx.txid] = true;
470
- }
471
- }
472
- const confirmComputedRoot = (b, txid) => {
473
- const root = b.computeRoot(txid);
474
- if (r.roots[b.blockHeight] === undefined || r.roots[b.blockHeight] === '') {
475
- // accept the root as valid for this block and reuse for subsequent txids
476
- r.roots[b.blockHeight] = root;
477
- }
478
- if (r.roots[b.blockHeight] !== root) {
477
+ if (!tx.isTxidOnly)
478
+ continue;
479
+ if (allowTxidOnly !== true)
479
480
  return false;
480
- }
481
- return true;
482
- };
481
+ txids[tx.txid] = true;
482
+ }
483
+ return true;
484
+ }
485
+ /**
486
+ * Record txids proven by bumps; validate all bump roots agree per block height.
487
+ * Returns false if any root conflict is detected.
488
+ */
489
+ collectBumpTxids(txids, r) {
483
490
  for (const b of this.bumps) {
484
491
  for (const n of b.path[0]) {
485
- if (n.txid === true && typeof n.hash === 'string' && n.hash.length > 0) {
486
- txids[n.hash] = true;
487
- // All txid hashes in all bumps must agree on computed merkle path roots
488
- if (!confirmComputedRoot(b, n.hash)) {
489
- return r;
490
- }
491
- }
492
+ if (n.txid !== true || typeof n.hash !== 'string' || n.hash.length === 0)
493
+ continue;
494
+ txids[n.hash] = true;
495
+ if (!this.confirmComputedRoot(b, n.hash, r))
496
+ return false;
492
497
  }
493
498
  }
494
- // All txs with a bumpIndex have matching txid leaf at level zero of BUMP.
499
+ return true;
500
+ }
501
+ /** Verify that every tx with a bumpIndex has a matching txid leaf in its bump. */
502
+ verifyBumpIndexLeaves() {
495
503
  for (const t of this.txs) {
496
- if (t.bumpIndex !== undefined) {
497
- const leaf = this.bumps[t.bumpIndex].path[0].find(l => l.hash === t.txid);
498
- if (leaf == null) {
499
- return r;
500
- }
501
- }
504
+ if (t.bumpIndex === undefined)
505
+ continue;
506
+ const leaf = this.bumps[t.bumpIndex].path[0].find(l => l.hash === t.txid);
507
+ if (leaf == null)
508
+ return false;
502
509
  }
510
+ return true;
511
+ }
512
+ /** Verify all input txids appear before the spending tx in sorted order. */
513
+ verifyInputDependencies(txids) {
503
514
  for (const t of this.txs) {
504
- // all input txids must be included before they are referenced
505
515
  for (const i of t.inputTxids) {
506
516
  if (!txids[i])
507
- return r;
517
+ return false;
508
518
  }
509
519
  txids[t.txid] = true;
510
520
  }
511
- r.valid = true;
512
- return r;
521
+ return true;
522
+ }
523
+ /** Confirm the computed merkle root for txid in bump matches previously accepted root for that height. */
524
+ confirmComputedRoot(b, txid, r) {
525
+ const root = b.computeRoot(txid);
526
+ if (r.roots[b.blockHeight] === undefined || r.roots[b.blockHeight] === '') {
527
+ // accept the root as valid for this block and reuse for subsequent txids
528
+ r.roots[b.blockHeight] = root;
529
+ }
530
+ return r.roots[b.blockHeight] === root;
513
531
  }
514
532
  /**
515
533
  * Serializes this data to `writer`
@@ -670,11 +688,37 @@ export class Beef {
670
688
  const validTxids = {};
671
689
  // Hashtable of all transaction txids to transaction
672
690
  const txidToTx = {};
673
- // queue of unsorted transactions ...
674
- let queue = [];
675
691
  // sorted transactions: hasProof to with longest dependency chain
676
692
  const result = [];
677
693
  const txidOnly = [];
694
+ // Partition into proven, txidOnly, and remaining queue
695
+ let queue = this.partitionTxs(txidToTx, validTxids, result, txidOnly);
696
+ // Separate queue entries that have missing inputs
697
+ const { txsMissingInputs, missingInputs, remaining } = this.separateMissingInputs(queue, txidToTx);
698
+ queue = remaining;
699
+ // Topological sort of remaining queue
700
+ const txsNotValid = this.topoSort(queue, validTxids, result);
701
+ // New order of txs is unsortable (missing inputs or depends on missing inputs), txidOnly, sorted (so newest sorted is last)
702
+ this.txs = txsMissingInputs
703
+ .concat(txsNotValid)
704
+ .concat(txidOnly)
705
+ .concat(result);
706
+ this.needsSort = false;
707
+ this.invalidateSerializationCaches();
708
+ return {
709
+ missingInputs: Object.keys(missingInputs),
710
+ notValid: txsNotValid.map((tx) => tx.txid),
711
+ valid: Object.keys(validTxids),
712
+ withMissingInputs: txsMissingInputs.map((tx) => tx.txid),
713
+ txidOnly: txidOnly.map((tx) => tx.txid)
714
+ };
715
+ }
716
+ /**
717
+ * Partition txs into proven (result), txidOnly, and a queue of the rest.
718
+ * Populates txidToTx and validTxids as side-effects.
719
+ */
720
+ partitionTxs(txidToTx, validTxids, result, txidOnly) {
721
+ const queue = [];
678
722
  for (const tx of this.txs) {
679
723
  txidToTx[tx.txid] = tx;
680
724
  tx.isValid = tx.hasProof;
@@ -690,21 +734,19 @@ export class Beef {
690
734
  queue.push(tx);
691
735
  }
692
736
  }
693
- // Hashtable of unknown input txids used to fund transactions without their own proof.
737
+ return queue;
738
+ }
739
+ /**
740
+ * Separate queue entries that have at least one input txid not present in txidToTx.
741
+ */
742
+ separateMissingInputs(candidates, txidToTx) {
694
743
  const missingInputs = {};
695
- // transactions with one or more missing inputs
696
744
  const txsMissingInputs = [];
697
- const possiblyMissingInputs = queue;
698
- queue = [];
699
- // all tx are isValid false, hasProof false.
700
- // if isTxidOnly then has inputTxids
701
- for (const tx of possiblyMissingInputs) {
745
+ const remaining = [];
746
+ for (const tx of candidates) {
702
747
  let hasMissingInput = false;
703
- // For all the unproven transactions,
704
- // link their inputs that exist in this beef,
705
- // make a note of missing inputs.
706
748
  for (const inputTxid of tx.inputTxids) {
707
- if (txidToTx[inputTxid] === undefined) { // Explicitly check for undefined
749
+ if (txidToTx[inputTxid] === undefined) {
708
750
  missingInputs[inputTxid] = true;
709
751
  hasMissingInput = true;
710
752
  }
@@ -713,15 +755,18 @@ export class Beef {
713
755
  txsMissingInputs.push(tx);
714
756
  }
715
757
  else {
716
- queue.push(tx);
758
+ remaining.push(tx);
717
759
  }
718
760
  }
719
- // As long as we have unsorted transactions...
761
+ return { txsMissingInputs, missingInputs, remaining };
762
+ }
763
+ /**
764
+ * Topologically sort queue into result; return anything that cannot be sorted.
765
+ */
766
+ topoSort(queue, validTxids, result) {
720
767
  while (queue.length > 0) {
721
768
  const oldQueue = queue;
722
769
  queue = [];
723
- // all tx are isValid false, hasProof false.
724
- // if isTxidOnly then has inputTxids
725
770
  for (const tx of oldQueue) {
726
771
  if (tx.inputTxids.every((txid) => validTxids[txid])) {
727
772
  validTxids[tx.txid] = true;
@@ -731,26 +776,10 @@ export class Beef {
731
776
  queue.push(tx);
732
777
  }
733
778
  }
734
- if (oldQueue.length === queue.length) {
779
+ if (oldQueue.length === queue.length)
735
780
  break;
736
- }
737
781
  }
738
- // transactions that don't have proofs and don't chain to proofs
739
- const txsNotValid = queue;
740
- // New order of txs is unsortable (missing inputs or depends on missing inputs), txidOnly, sorted (so newest sorted is last)
741
- this.txs = txsMissingInputs
742
- .concat(txsNotValid)
743
- .concat(txidOnly)
744
- .concat(result);
745
- this.needsSort = false;
746
- this.invalidateSerializationCaches();
747
- return {
748
- missingInputs: Object.keys(missingInputs),
749
- notValid: txsNotValid.map((tx) => tx.txid),
750
- valid: Object.keys(validTxids),
751
- withMissingInputs: txsMissingInputs.map((tx) => tx.txid),
752
- txidOnly: txidOnly.map((tx) => tx.txid)
753
- };
782
+ return queue;
754
783
  }
755
784
  /**
756
785
  * @returns a shallow copy of this beef
@@ -771,6 +800,14 @@ export class Beef {
771
800
  * @param knownTxids
772
801
  */
773
802
  trimKnownTxids(knownTxids) {
803
+ let mutated = this.removeKnownTxidOnlyTxs(knownTxids);
804
+ mutated = this.reindexBumps() || mutated;
805
+ if (mutated) {
806
+ this.markMutated(true);
807
+ }
808
+ }
809
+ /** Remove txidOnly entries that appear in knownTxids; return true if any were removed. */
810
+ removeKnownTxidOnlyTxs(knownTxids) {
774
811
  let mutated = false;
775
812
  for (let i = 0; i < this.txs.length;) {
776
813
  const tx = this.txs[i];
@@ -783,41 +820,43 @@ export class Beef {
783
820
  i++;
784
821
  }
785
822
  }
786
- // Trim unreferenced bumps after removing known txids
823
+ return mutated;
824
+ }
825
+ /**
826
+ * Remove bumps that are no longer referenced by any tx and update bumpIndex references.
827
+ * Returns true if any bumps were removed.
828
+ */
829
+ reindexBumps() {
787
830
  const referencedBumpIndices = new Set();
788
831
  for (const tx of this.txs) {
789
832
  if (tx.bumpIndex !== undefined) {
790
833
  referencedBumpIndices.add(tx.bumpIndex);
791
834
  }
792
835
  }
793
- // Check if there are any unreferenced bumps to remove
794
- if (referencedBumpIndices.size < this.bumps.length) {
795
- // Build mapping of old indices to new indices after removal
796
- const indexMap = new Map();
797
- let newIndex = 0;
798
- for (let i = 0; i < this.bumps.length; i++) {
799
- if (referencedBumpIndices.has(i)) {
800
- indexMap.set(i, newIndex);
801
- newIndex++;
802
- }
803
- }
804
- // Remove unreferenced bumps
805
- this.bumps = this.bumps.filter((_, i) => referencedBumpIndices.has(i));
806
- // Update all transaction bumpIndex references
807
- for (const tx of this.txs) {
808
- if (tx.bumpIndex !== undefined) {
809
- const newIndex = indexMap.get(tx.bumpIndex);
810
- if (newIndex === undefined) {
811
- throw new Error(`Internal error: bumpIndex ${tx.bumpIndex} not found in indexMap`);
812
- }
813
- tx.bumpIndex = newIndex;
814
- }
836
+ if (referencedBumpIndices.size >= this.bumps.length)
837
+ return false;
838
+ // Build mapping of old indices to new indices after removal
839
+ const indexMap = new Map();
840
+ let newIndex = 0;
841
+ for (let i = 0; i < this.bumps.length; i++) {
842
+ if (referencedBumpIndices.has(i)) {
843
+ indexMap.set(i, newIndex);
844
+ newIndex++;
815
845
  }
816
- mutated = true;
817
846
  }
818
- if (mutated) {
819
- this.markMutated(true);
847
+ // Remove unreferenced bumps
848
+ this.bumps = this.bumps.filter((_, i) => referencedBumpIndices.has(i));
849
+ // Update all transaction bumpIndex references
850
+ for (const tx of this.txs) {
851
+ if (tx.bumpIndex === undefined)
852
+ continue;
853
+ const mapped = indexMap.get(tx.bumpIndex);
854
+ if (mapped === undefined) {
855
+ throw new Error(`Internal error: bumpIndex ${tx.bumpIndex} not found in indexMap`);
856
+ }
857
+ tx.bumpIndex = mapped;
820
858
  }
859
+ return true;
821
860
  }
822
861
  /**
823
862
  * @returns array of transaction txids that either have a proof or whose inputs chain back to a proven transaction.
@@ -836,7 +875,7 @@ export class Beef {
836
875
  for (const b of this.bumps) {
837
876
  i++;
838
877
  log += ` BUMP ${i}\n block: ${b.blockHeight}\n txids: [\n${b.path[0]
839
- .filter((n) => n.txid === true) // ✅ Explicitly check if txid is `true`
878
+ .filter((n) => n.txid === true)
840
879
  .map((n) => ` '${n.hash ?? ''}'`)
841
880
  .join(',\n')}\n ]\n`;
842
881
  }
@@ -851,7 +890,7 @@ export class Beef {
851
890
  log += ' txidOnly\n';
852
891
  }
853
892
  else {
854
- log += ` rawTx length=${t.rawTx?.length ?? 0}\n`; // ✅ Fix applied here
893
+ log += ` rawTx length=${t.rawTx?.length ?? 0}\n`;
855
894
  }
856
895
  if (t.inputTxids.length > 0) {
857
896
  log += ` inputs: [\n${t.inputTxids
@@ -866,25 +905,29 @@ export class Beef {
866
905
  * leaves that can be computed from row zero.
867
906
  */
868
907
  addComputedLeaves() {
869
- const hash = (m) => toHex(hash256(toArray(m, 'hex').reverse()).reverse());
870
- for (const bump of this.bumps) { // ✅ Use `this` instead of `beef`
908
+ for (const bump of this.bumps) {
871
909
  for (let row = 1; row < bump.path.length; row++) {
872
- for (const leafL of bump.path[row - 1]) {
873
- if (typeof leafL.hash === 'string' && (leafL.offset & 1) === 0) {
874
- const leafR = bump.path[row - 1].find((l) => l.offset === leafL.offset + 1);
875
- const offsetOnRow = leafL.offset >> 1;
876
- if (leafR !== undefined &&
877
- typeof leafR.hash === 'string' &&
878
- bump.path[row].every((l) => l.offset !== offsetOnRow)) {
879
- // Computable leaf is missing... add it.
880
- bump.path[row].push({
881
- offset: offsetOnRow,
882
- // String concatenation puts the right leaf on the left of the left leaf hash
883
- hash: hash(leafR.hash + leafL.hash)
884
- });
885
- }
886
- }
887
- }
910
+ this.addComputedLeavesForRow(bump, row);
911
+ }
912
+ }
913
+ }
914
+ /** Add any missing computable leaf at `row` derived from two known leaves at `row - 1`. */
915
+ addComputedLeavesForRow(bump, row) {
916
+ const hashPair = (m) => toHex(hash256(toArray(m, 'hex').reverse()).reverse());
917
+ for (const leafL of bump.path[row - 1]) {
918
+ if (typeof leafL.hash !== 'string' || (leafL.offset & 1) !== 0)
919
+ continue;
920
+ const leafR = bump.path[row - 1].find((l) => l.offset === leafL.offset + 1);
921
+ if (leafR === undefined || typeof leafR.hash !== 'string')
922
+ continue;
923
+ const offsetOnRow = leafL.offset >> 1;
924
+ if (bump.path[row].every((l) => l.offset !== offsetOnRow)) {
925
+ // Computable leaf is missing... add it.
926
+ bump.path[row].push({
927
+ offset: offsetOnRow,
928
+ // String concatenation puts the right leaf on the left of the left leaf hash
929
+ hash: hashPair(leafR.hash + leafL.hash)
930
+ });
888
931
  }
889
932
  }
890
933
  }