@bsv/sdk 2.0.0-beta.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. package/dist/cjs/mod.js +1 -0
  2. package/dist/cjs/mod.js.map +1 -1
  3. package/dist/cjs/package.json +1 -1
  4. package/dist/cjs/src/auth/Peer.js +149 -74
  5. package/dist/cjs/src/auth/Peer.js.map +1 -1
  6. package/dist/cjs/src/auth/SessionManager.js.map +1 -1
  7. package/dist/cjs/src/auth/certificates/Certificate.js +18 -8
  8. package/dist/cjs/src/auth/certificates/Certificate.js.map +1 -1
  9. package/dist/cjs/src/auth/certificates/MasterCertificate.js +19 -9
  10. package/dist/cjs/src/auth/certificates/MasterCertificate.js.map +1 -1
  11. package/dist/cjs/src/auth/certificates/VerifiableCertificate.js +17 -7
  12. package/dist/cjs/src/auth/certificates/VerifiableCertificate.js.map +1 -1
  13. package/dist/cjs/src/auth/certificates/__tests/CompletedProtoWallet.js.map +1 -1
  14. package/dist/cjs/src/auth/clients/AuthFetch.js +30 -10
  15. package/dist/cjs/src/auth/clients/AuthFetch.js.map +1 -1
  16. package/dist/cjs/src/auth/clients/__tests__/AuthFetch.test.js.map +1 -1
  17. package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js +17 -7
  18. package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js.map +1 -1
  19. package/dist/cjs/src/auth/transports/__tests__/SimplifiedFetchTransport.test.js +17 -7
  20. package/dist/cjs/src/auth/transports/__tests__/SimplifiedFetchTransport.test.js.map +1 -1
  21. package/dist/cjs/src/auth/utils/createNonce.js +18 -9
  22. package/dist/cjs/src/auth/utils/createNonce.js.map +1 -1
  23. package/dist/cjs/src/auth/utils/validateCertificates.js.map +1 -1
  24. package/dist/cjs/src/auth/utils/verifyNonce.js +18 -9
  25. package/dist/cjs/src/auth/utils/verifyNonce.js.map +1 -1
  26. package/dist/cjs/src/compat/BSM.js +17 -7
  27. package/dist/cjs/src/compat/BSM.js.map +1 -1
  28. package/dist/cjs/src/compat/ECIES.js +17 -7
  29. package/dist/cjs/src/compat/ECIES.js.map +1 -1
  30. package/dist/cjs/src/compat/HD.js +17 -7
  31. package/dist/cjs/src/compat/HD.js.map +1 -1
  32. package/dist/cjs/src/compat/Mnemonic.js +17 -7
  33. package/dist/cjs/src/compat/Mnemonic.js.map +1 -1
  34. package/dist/cjs/src/compat/Utxo.js +1 -1
  35. package/dist/cjs/src/compat/Utxo.js.map +1 -1
  36. package/dist/cjs/src/compat/index.js +17 -7
  37. package/dist/cjs/src/compat/index.js.map +1 -1
  38. package/dist/cjs/src/identity/ContactsManager.js +1 -1
  39. package/dist/cjs/src/identity/ContactsManager.js.map +1 -1
  40. package/dist/cjs/src/identity/IdentityClient.js.map +1 -1
  41. package/dist/cjs/src/kvstore/GlobalKVStore.js +20 -10
  42. package/dist/cjs/src/kvstore/GlobalKVStore.js.map +1 -1
  43. package/dist/cjs/src/kvstore/LocalKVStore.js +17 -7
  44. package/dist/cjs/src/kvstore/LocalKVStore.js.map +1 -1
  45. package/dist/cjs/src/kvstore/kvStoreInterpreter.js +17 -7
  46. package/dist/cjs/src/kvstore/kvStoreInterpreter.js.map +1 -1
  47. package/dist/cjs/src/messages/EncryptedMessage.js +19 -0
  48. package/dist/cjs/src/messages/EncryptedMessage.js.map +1 -1
  49. package/dist/cjs/src/messages/SignedMessage.js.map +1 -1
  50. package/dist/cjs/src/messages/index.js +17 -7
  51. package/dist/cjs/src/messages/index.js.map +1 -1
  52. package/dist/cjs/src/overlay-tools/Historian.js.map +1 -1
  53. package/dist/cjs/src/overlay-tools/HostReputationTracker.js.map +1 -1
  54. package/dist/cjs/src/overlay-tools/LookupResolver.js +17 -7
  55. package/dist/cjs/src/overlay-tools/LookupResolver.js.map +1 -1
  56. package/dist/cjs/src/overlay-tools/OverlayAdminTokenTemplate.js.map +1 -1
  57. package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js +17 -7
  58. package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js.map +1 -1
  59. package/dist/cjs/src/overlay-tools/withDoubleSpendRetry.js +1 -2
  60. package/dist/cjs/src/overlay-tools/withDoubleSpendRetry.js.map +1 -1
  61. package/dist/cjs/src/primitives/AESGCM.js +77 -32
  62. package/dist/cjs/src/primitives/AESGCM.js.map +1 -1
  63. package/dist/cjs/src/primitives/BigNumber.js +28 -54
  64. package/dist/cjs/src/primitives/BigNumber.js.map +1 -1
  65. package/dist/cjs/src/primitives/Curve.js.map +1 -1
  66. package/dist/cjs/src/primitives/DRBG.js.map +1 -1
  67. package/dist/cjs/src/primitives/ECDSA.js +58 -24
  68. package/dist/cjs/src/primitives/ECDSA.js.map +1 -1
  69. package/dist/cjs/src/primitives/Hash.js +6 -6
  70. package/dist/cjs/src/primitives/Hash.js.map +1 -1
  71. package/dist/cjs/src/primitives/JacobianPoint.js.map +1 -1
  72. package/dist/cjs/src/primitives/K256.js.map +1 -1
  73. package/dist/cjs/src/primitives/Mersenne.js.map +1 -1
  74. package/dist/cjs/src/primitives/MontgomoryMethod.js.map +1 -1
  75. package/dist/cjs/src/primitives/Point.js +63 -6
  76. package/dist/cjs/src/primitives/Point.js.map +1 -1
  77. package/dist/cjs/src/primitives/Polynomial.js.map +1 -1
  78. package/dist/cjs/src/primitives/PrivateKey.js +46 -9
  79. package/dist/cjs/src/primitives/PrivateKey.js.map +1 -1
  80. package/dist/cjs/src/primitives/PublicKey.js +1 -1
  81. package/dist/cjs/src/primitives/PublicKey.js.map +1 -1
  82. package/dist/cjs/src/primitives/Random.js.map +1 -1
  83. package/dist/cjs/src/primitives/ReaderUint8Array.js +180 -0
  84. package/dist/cjs/src/primitives/ReaderUint8Array.js.map +1 -0
  85. package/dist/cjs/src/primitives/ReductionContext.js +35 -46
  86. package/dist/cjs/src/primitives/ReductionContext.js.map +1 -1
  87. package/dist/cjs/src/primitives/Schnorr.js.map +1 -1
  88. package/dist/cjs/src/primitives/Secp256r1.js.map +1 -1
  89. package/dist/cjs/src/primitives/Signature.js.map +1 -1
  90. package/dist/cjs/src/primitives/SymmetricKey.js.map +1 -1
  91. package/dist/cjs/src/primitives/TransactionSignature.js +132 -17
  92. package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -1
  93. package/dist/cjs/src/primitives/WriterUint8Array.js +173 -0
  94. package/dist/cjs/src/primitives/WriterUint8Array.js.map +1 -0
  95. package/dist/cjs/src/primitives/hex.js +2 -3
  96. package/dist/cjs/src/primitives/hex.js.map +1 -1
  97. package/dist/cjs/src/primitives/index.js +17 -7
  98. package/dist/cjs/src/primitives/index.js.map +1 -1
  99. package/dist/cjs/src/primitives/utils.js +43 -16
  100. package/dist/cjs/src/primitives/utils.js.map +1 -1
  101. package/dist/cjs/src/registry/RegistryClient.js +2 -2
  102. package/dist/cjs/src/registry/RegistryClient.js.map +1 -1
  103. package/dist/cjs/src/remittance/CommsLayer.js +3 -0
  104. package/dist/cjs/src/remittance/CommsLayer.js.map +1 -0
  105. package/dist/cjs/src/remittance/IdentityLayer.js +3 -0
  106. package/dist/cjs/src/remittance/IdentityLayer.js.map +1 -0
  107. package/dist/cjs/src/remittance/RemittanceManager.js +1245 -0
  108. package/dist/cjs/src/remittance/RemittanceManager.js.map +1 -0
  109. package/dist/cjs/src/remittance/RemittanceModule.js +3 -0
  110. package/dist/cjs/src/remittance/RemittanceModule.js.map +1 -0
  111. package/dist/cjs/src/remittance/index.js +23 -0
  112. package/dist/cjs/src/remittance/index.js.map +1 -0
  113. package/dist/cjs/src/remittance/modules/BasicBRC29.js +225 -0
  114. package/dist/cjs/src/remittance/modules/BasicBRC29.js.map +1 -0
  115. package/dist/cjs/src/remittance/modules/index.js +18 -0
  116. package/dist/cjs/src/remittance/modules/index.js.map +1 -0
  117. package/dist/cjs/src/remittance/types.js +22 -0
  118. package/dist/cjs/src/remittance/types.js.map +1 -0
  119. package/dist/cjs/src/script/OP.js +15 -13
  120. package/dist/cjs/src/script/OP.js.map +1 -1
  121. package/dist/cjs/src/script/Script.js +4 -1
  122. package/dist/cjs/src/script/Script.js.map +1 -1
  123. package/dist/cjs/src/script/Spend.js +145 -53
  124. package/dist/cjs/src/script/Spend.js.map +1 -1
  125. package/dist/cjs/src/script/templates/P2PKH.js.map +1 -1
  126. package/dist/cjs/src/script/templates/PushDrop.js +21 -7
  127. package/dist/cjs/src/script/templates/PushDrop.js.map +1 -1
  128. package/dist/cjs/src/script/templates/RPuzzle.js.map +1 -1
  129. package/dist/cjs/src/storage/StorageDownloader.js.map +1 -1
  130. package/dist/cjs/src/storage/StorageUploader.js +17 -7
  131. package/dist/cjs/src/storage/StorageUploader.js.map +1 -1
  132. package/dist/cjs/src/storage/StorageUtils.js.map +1 -1
  133. package/dist/cjs/src/storage/index.js +17 -7
  134. package/dist/cjs/src/storage/index.js.map +1 -1
  135. package/dist/cjs/src/totp/totp.js.map +1 -1
  136. package/dist/cjs/src/transaction/Beef.js +85 -27
  137. package/dist/cjs/src/transaction/Beef.js.map +1 -1
  138. package/dist/cjs/src/transaction/BeefParty.js.map +1 -1
  139. package/dist/cjs/src/transaction/BeefTx.js +32 -14
  140. package/dist/cjs/src/transaction/BeefTx.js.map +1 -1
  141. package/dist/cjs/src/transaction/Broadcaster.js +2 -3
  142. package/dist/cjs/src/transaction/Broadcaster.js.map +1 -1
  143. package/dist/cjs/src/transaction/MerklePath.js +25 -6
  144. package/dist/cjs/src/transaction/MerklePath.js.map +1 -1
  145. package/dist/cjs/src/transaction/Transaction.js +238 -27
  146. package/dist/cjs/src/transaction/Transaction.js.map +1 -1
  147. package/dist/cjs/src/transaction/broadcasters/ARC.js +23 -0
  148. package/dist/cjs/src/transaction/broadcasters/ARC.js.map +1 -1
  149. package/dist/cjs/src/transaction/broadcasters/DefaultBroadcaster.js +1 -2
  150. package/dist/cjs/src/transaction/broadcasters/DefaultBroadcaster.js.map +1 -1
  151. package/dist/cjs/src/transaction/broadcasters/Teranode.js.map +1 -1
  152. package/dist/cjs/src/transaction/broadcasters/WhatsOnChainBroadcaster.js.map +1 -1
  153. package/dist/cjs/src/transaction/chaintrackers/BlockHeadersService.js.map +1 -1
  154. package/dist/cjs/src/transaction/chaintrackers/DefaultChainTracker.js +1 -2
  155. package/dist/cjs/src/transaction/chaintrackers/DefaultChainTracker.js.map +1 -1
  156. package/dist/cjs/src/transaction/chaintrackers/WhatsOnChain.js.map +1 -1
  157. package/dist/cjs/src/transaction/fee-models/LivePolicy.js.map +1 -1
  158. package/dist/cjs/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -1
  159. package/dist/cjs/src/transaction/http/BinaryFetchClient.js +2 -2
  160. package/dist/cjs/src/transaction/http/BinaryFetchClient.js.map +1 -1
  161. package/dist/cjs/src/transaction/http/DefaultHttpClient.js +1 -2
  162. package/dist/cjs/src/transaction/http/DefaultHttpClient.js.map +1 -1
  163. package/dist/cjs/src/transaction/http/NodejsHttpClient.js.map +1 -1
  164. package/dist/cjs/src/wallet/CachedKeyDeriver.js.map +1 -1
  165. package/dist/cjs/src/wallet/KeyDeriver.js.map +1 -1
  166. package/dist/cjs/src/wallet/ProtoWallet.js +1 -1
  167. package/dist/cjs/src/wallet/ProtoWallet.js.map +1 -1
  168. package/dist/cjs/src/wallet/WalletClient.js.map +1 -1
  169. package/dist/cjs/src/wallet/WalletError.js.map +1 -1
  170. package/dist/cjs/src/wallet/index.js +17 -7
  171. package/dist/cjs/src/wallet/index.js.map +1 -1
  172. package/dist/cjs/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
  173. package/dist/cjs/src/wallet/substrates/HTTPWalletWire.js +17 -7
  174. package/dist/cjs/src/wallet/substrates/HTTPWalletWire.js.map +1 -1
  175. package/dist/cjs/src/wallet/substrates/ReactNativeWebView.js +17 -7
  176. package/dist/cjs/src/wallet/substrates/ReactNativeWebView.js.map +1 -1
  177. package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js +17 -7
  178. package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
  179. package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js +17 -7
  180. package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
  181. package/dist/cjs/src/wallet/substrates/XDM.js +17 -7
  182. package/dist/cjs/src/wallet/substrates/XDM.js.map +1 -1
  183. package/dist/cjs/src/wallet/substrates/utils/toOriginHeader.js +1 -2
  184. package/dist/cjs/src/wallet/substrates/utils/toOriginHeader.js.map +1 -1
  185. package/dist/cjs/src/wallet/substrates/window.CWI.js.map +1 -1
  186. package/dist/cjs/src/wallet/validationHelpers.js +51 -41
  187. package/dist/cjs/src/wallet/validationHelpers.js.map +1 -1
  188. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  189. package/dist/esm/mod.js +1 -0
  190. package/dist/esm/mod.js.map +1 -1
  191. package/dist/esm/src/auth/Peer.js +132 -67
  192. package/dist/esm/src/auth/Peer.js.map +1 -1
  193. package/dist/esm/src/auth/SessionManager.js.map +1 -1
  194. package/dist/esm/src/auth/certificates/Certificate.js +1 -1
  195. package/dist/esm/src/auth/certificates/Certificate.js.map +1 -1
  196. package/dist/esm/src/auth/certificates/MasterCertificate.js +2 -2
  197. package/dist/esm/src/auth/certificates/MasterCertificate.js.map +1 -1
  198. package/dist/esm/src/auth/certificates/VerifiableCertificate.js.map +1 -1
  199. package/dist/esm/src/auth/certificates/__tests/CompletedProtoWallet.js.map +1 -1
  200. package/dist/esm/src/auth/clients/AuthFetch.js +13 -3
  201. package/dist/esm/src/auth/clients/AuthFetch.js.map +1 -1
  202. package/dist/esm/src/auth/clients/__tests__/AuthFetch.test.js.map +1 -1
  203. package/dist/esm/src/auth/transports/SimplifiedFetchTransport.js.map +1 -1
  204. package/dist/esm/src/auth/transports/__tests__/SimplifiedFetchTransport.test.js.map +1 -1
  205. package/dist/esm/src/auth/utils/validateCertificates.js.map +1 -1
  206. package/dist/esm/src/compat/BSM.js.map +1 -1
  207. package/dist/esm/src/compat/ECIES.js.map +1 -1
  208. package/dist/esm/src/compat/HD.js.map +1 -1
  209. package/dist/esm/src/compat/Mnemonic.js.map +1 -1
  210. package/dist/esm/src/identity/ContactsManager.js +1 -1
  211. package/dist/esm/src/identity/ContactsManager.js.map +1 -1
  212. package/dist/esm/src/identity/IdentityClient.js.map +1 -1
  213. package/dist/esm/src/kvstore/GlobalKVStore.js +3 -3
  214. package/dist/esm/src/kvstore/GlobalKVStore.js.map +1 -1
  215. package/dist/esm/src/kvstore/LocalKVStore.js.map +1 -1
  216. package/dist/esm/src/kvstore/kvStoreInterpreter.js.map +1 -1
  217. package/dist/esm/src/messages/EncryptedMessage.js +19 -0
  218. package/dist/esm/src/messages/EncryptedMessage.js.map +1 -1
  219. package/dist/esm/src/messages/SignedMessage.js.map +1 -1
  220. package/dist/esm/src/overlay-tools/Historian.js.map +1 -1
  221. package/dist/esm/src/overlay-tools/HostReputationTracker.js.map +1 -1
  222. package/dist/esm/src/overlay-tools/LookupResolver.js.map +1 -1
  223. package/dist/esm/src/overlay-tools/OverlayAdminTokenTemplate.js.map +1 -1
  224. package/dist/esm/src/overlay-tools/SHIPBroadcaster.js.map +1 -1
  225. package/dist/esm/src/overlay-tools/withDoubleSpendRetry.js.map +1 -1
  226. package/dist/esm/src/primitives/AESGCM.js +71 -26
  227. package/dist/esm/src/primitives/AESGCM.js.map +1 -1
  228. package/dist/esm/src/primitives/BigNumber.js +28 -54
  229. package/dist/esm/src/primitives/BigNumber.js.map +1 -1
  230. package/dist/esm/src/primitives/Curve.js.map +1 -1
  231. package/dist/esm/src/primitives/DRBG.js.map +1 -1
  232. package/dist/esm/src/primitives/ECDSA.js +58 -24
  233. package/dist/esm/src/primitives/ECDSA.js.map +1 -1
  234. package/dist/esm/src/primitives/Hash.js.map +1 -1
  235. package/dist/esm/src/primitives/JacobianPoint.js.map +1 -1
  236. package/dist/esm/src/primitives/K256.js.map +1 -1
  237. package/dist/esm/src/primitives/Mersenne.js.map +1 -1
  238. package/dist/esm/src/primitives/MontgomoryMethod.js.map +1 -1
  239. package/dist/esm/src/primitives/Point.js +61 -4
  240. package/dist/esm/src/primitives/Point.js.map +1 -1
  241. package/dist/esm/src/primitives/Polynomial.js.map +1 -1
  242. package/dist/esm/src/primitives/PrivateKey.js +29 -2
  243. package/dist/esm/src/primitives/PrivateKey.js.map +1 -1
  244. package/dist/esm/src/primitives/PublicKey.js +1 -1
  245. package/dist/esm/src/primitives/PublicKey.js.map +1 -1
  246. package/dist/esm/src/primitives/Random.js.map +1 -1
  247. package/dist/esm/src/primitives/ReaderUint8Array.js +176 -0
  248. package/dist/esm/src/primitives/ReaderUint8Array.js.map +1 -0
  249. package/dist/esm/src/primitives/ReductionContext.js +35 -46
  250. package/dist/esm/src/primitives/ReductionContext.js.map +1 -1
  251. package/dist/esm/src/primitives/Schnorr.js.map +1 -1
  252. package/dist/esm/src/primitives/Secp256r1.js.map +1 -1
  253. package/dist/esm/src/primitives/Signature.js.map +1 -1
  254. package/dist/esm/src/primitives/SymmetricKey.js.map +1 -1
  255. package/dist/esm/src/primitives/TransactionSignature.js +115 -10
  256. package/dist/esm/src/primitives/TransactionSignature.js.map +1 -1
  257. package/dist/esm/src/primitives/WriterUint8Array.js +169 -0
  258. package/dist/esm/src/primitives/WriterUint8Array.js.map +1 -0
  259. package/dist/esm/src/primitives/hex.js.map +1 -1
  260. package/dist/esm/src/primitives/utils.js +37 -11
  261. package/dist/esm/src/primitives/utils.js.map +1 -1
  262. package/dist/esm/src/registry/RegistryClient.js.map +1 -1
  263. package/dist/esm/src/remittance/CommsLayer.js +2 -0
  264. package/dist/esm/src/remittance/CommsLayer.js.map +1 -0
  265. package/dist/esm/src/remittance/IdentityLayer.js +2 -0
  266. package/dist/esm/src/remittance/IdentityLayer.js.map +1 -0
  267. package/dist/esm/src/remittance/RemittanceManager.js +1254 -0
  268. package/dist/esm/src/remittance/RemittanceManager.js.map +1 -0
  269. package/dist/esm/src/remittance/RemittanceModule.js +2 -0
  270. package/dist/esm/src/remittance/RemittanceModule.js.map +1 -0
  271. package/dist/esm/src/remittance/index.js +7 -0
  272. package/dist/esm/src/remittance/index.js.map +1 -0
  273. package/dist/esm/src/remittance/modules/BasicBRC29.js +227 -0
  274. package/dist/esm/src/remittance/modules/BasicBRC29.js.map +1 -0
  275. package/dist/esm/src/remittance/modules/index.js +2 -0
  276. package/dist/esm/src/remittance/modules/index.js.map +1 -0
  277. package/dist/esm/src/remittance/types.js +19 -0
  278. package/dist/esm/src/remittance/types.js.map +1 -0
  279. package/dist/esm/src/script/OP.js +15 -13
  280. package/dist/esm/src/script/OP.js.map +1 -1
  281. package/dist/esm/src/script/Script.js +4 -1
  282. package/dist/esm/src/script/Script.js.map +1 -1
  283. package/dist/esm/src/script/Spend.js +129 -46
  284. package/dist/esm/src/script/Spend.js.map +1 -1
  285. package/dist/esm/src/script/templates/P2PKH.js.map +1 -1
  286. package/dist/esm/src/script/templates/PushDrop.js +21 -7
  287. package/dist/esm/src/script/templates/PushDrop.js.map +1 -1
  288. package/dist/esm/src/script/templates/RPuzzle.js.map +1 -1
  289. package/dist/esm/src/storage/StorageDownloader.js.map +1 -1
  290. package/dist/esm/src/storage/StorageUploader.js.map +1 -1
  291. package/dist/esm/src/storage/StorageUtils.js.map +1 -1
  292. package/dist/esm/src/totp/totp.js.map +1 -1
  293. package/dist/esm/src/transaction/Beef.js +86 -28
  294. package/dist/esm/src/transaction/Beef.js.map +1 -1
  295. package/dist/esm/src/transaction/BeefParty.js.map +1 -1
  296. package/dist/esm/src/transaction/BeefTx.js +32 -14
  297. package/dist/esm/src/transaction/BeefTx.js.map +1 -1
  298. package/dist/esm/src/transaction/MerklePath.js +26 -7
  299. package/dist/esm/src/transaction/MerklePath.js.map +1 -1
  300. package/dist/esm/src/transaction/Transaction.js +239 -28
  301. package/dist/esm/src/transaction/Transaction.js.map +1 -1
  302. package/dist/esm/src/transaction/broadcasters/ARC.js +23 -0
  303. package/dist/esm/src/transaction/broadcasters/ARC.js.map +1 -1
  304. package/dist/esm/src/transaction/broadcasters/Teranode.js.map +1 -1
  305. package/dist/esm/src/transaction/broadcasters/WhatsOnChainBroadcaster.js.map +1 -1
  306. package/dist/esm/src/transaction/chaintrackers/BlockHeadersService.js.map +1 -1
  307. package/dist/esm/src/transaction/chaintrackers/WhatsOnChain.js.map +1 -1
  308. package/dist/esm/src/transaction/fee-models/LivePolicy.js.map +1 -1
  309. package/dist/esm/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -1
  310. package/dist/esm/src/transaction/http/BinaryFetchClient.js.map +1 -1
  311. package/dist/esm/src/transaction/http/DefaultHttpClient.js.map +1 -1
  312. package/dist/esm/src/transaction/http/NodejsHttpClient.js.map +1 -1
  313. package/dist/esm/src/wallet/CachedKeyDeriver.js.map +1 -1
  314. package/dist/esm/src/wallet/KeyDeriver.js.map +1 -1
  315. package/dist/esm/src/wallet/ProtoWallet.js +1 -1
  316. package/dist/esm/src/wallet/ProtoWallet.js.map +1 -1
  317. package/dist/esm/src/wallet/WalletClient.js.map +1 -1
  318. package/dist/esm/src/wallet/WalletError.js.map +1 -1
  319. package/dist/esm/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
  320. package/dist/esm/src/wallet/substrates/HTTPWalletWire.js.map +1 -1
  321. package/dist/esm/src/wallet/substrates/ReactNativeWebView.js.map +1 -1
  322. package/dist/esm/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
  323. package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
  324. package/dist/esm/src/wallet/substrates/XDM.js.map +1 -1
  325. package/dist/esm/src/wallet/substrates/utils/toOriginHeader.js.map +1 -1
  326. package/dist/esm/src/wallet/substrates/window.CWI.js.map +1 -1
  327. package/dist/esm/src/wallet/validationHelpers.js +1 -1
  328. package/dist/esm/src/wallet/validationHelpers.js.map +1 -1
  329. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  330. package/dist/types/mod.d.ts +1 -0
  331. package/dist/types/mod.d.ts.map +1 -1
  332. package/dist/types/src/auth/Peer.d.ts +12 -7
  333. package/dist/types/src/auth/Peer.d.ts.map +1 -1
  334. package/dist/types/src/auth/certificates/MasterCertificate.d.ts.map +1 -1
  335. package/dist/types/src/auth/clients/AuthFetch.d.ts.map +1 -1
  336. package/dist/types/src/auth/types.d.ts +2 -0
  337. package/dist/types/src/auth/types.d.ts.map +1 -1
  338. package/dist/types/src/auth/utils/getVerifiableCertificates.d.ts.map +1 -1
  339. package/dist/types/src/auth/utils/validateCertificates.d.ts.map +1 -1
  340. package/dist/types/src/compat/BSM.d.ts +1 -1
  341. package/dist/types/src/compat/BSM.d.ts.map +1 -1
  342. package/dist/types/src/messages/EncryptedMessage.d.ts +19 -0
  343. package/dist/types/src/messages/EncryptedMessage.d.ts.map +1 -1
  344. package/dist/types/src/messages/SignedMessage.d.ts.map +1 -1
  345. package/dist/types/src/primitives/AESGCM.d.ts +18 -0
  346. package/dist/types/src/primitives/AESGCM.d.ts.map +1 -1
  347. package/dist/types/src/primitives/BigNumber.d.ts +8 -0
  348. package/dist/types/src/primitives/BigNumber.d.ts.map +1 -1
  349. package/dist/types/src/primitives/ECDSA.d.ts +24 -0
  350. package/dist/types/src/primitives/ECDSA.d.ts.map +1 -1
  351. package/dist/types/src/primitives/Hash.d.ts +8 -8
  352. package/dist/types/src/primitives/Hash.d.ts.map +1 -1
  353. package/dist/types/src/primitives/Point.d.ts +1 -0
  354. package/dist/types/src/primitives/Point.d.ts.map +1 -1
  355. package/dist/types/src/primitives/PrivateKey.d.ts +27 -0
  356. package/dist/types/src/primitives/PrivateKey.d.ts.map +1 -1
  357. package/dist/types/src/primitives/Random.d.ts.map +1 -1
  358. package/dist/types/src/primitives/ReaderUint8Array.d.ts +32 -0
  359. package/dist/types/src/primitives/ReaderUint8Array.d.ts.map +1 -0
  360. package/dist/types/src/primitives/ReductionContext.d.ts +9 -0
  361. package/dist/types/src/primitives/ReductionContext.d.ts.map +1 -1
  362. package/dist/types/src/primitives/Secp256r1.d.ts.map +1 -1
  363. package/dist/types/src/primitives/TransactionSignature.d.ts +16 -4
  364. package/dist/types/src/primitives/TransactionSignature.d.ts.map +1 -1
  365. package/dist/types/src/primitives/WriterUint8Array.d.ts +54 -0
  366. package/dist/types/src/primitives/WriterUint8Array.d.ts.map +1 -0
  367. package/dist/types/src/primitives/utils.d.ts +19 -6
  368. package/dist/types/src/primitives/utils.d.ts.map +1 -1
  369. package/dist/types/src/remittance/CommsLayer.d.ts +50 -0
  370. package/dist/types/src/remittance/CommsLayer.d.ts.map +1 -0
  371. package/dist/types/src/remittance/IdentityLayer.d.ts +35 -0
  372. package/dist/types/src/remittance/IdentityLayer.d.ts.map +1 -0
  373. package/dist/types/src/remittance/RemittanceManager.d.ts +452 -0
  374. package/dist/types/src/remittance/RemittanceManager.d.ts.map +1 -0
  375. package/dist/types/src/remittance/RemittanceModule.d.ts +106 -0
  376. package/dist/types/src/remittance/RemittanceModule.d.ts.map +1 -0
  377. package/dist/types/src/remittance/index.d.ts +7 -0
  378. package/dist/types/src/remittance/index.d.ts.map +1 -0
  379. package/dist/types/src/remittance/modules/BasicBRC29.d.ts +133 -0
  380. package/dist/types/src/remittance/modules/BasicBRC29.d.ts.map +1 -0
  381. package/dist/types/src/remittance/modules/index.d.ts +2 -0
  382. package/dist/types/src/remittance/modules/index.d.ts.map +1 -0
  383. package/dist/types/src/remittance/types.d.ts +238 -0
  384. package/dist/types/src/remittance/types.d.ts.map +1 -0
  385. package/dist/types/src/script/OP.d.ts +5 -3
  386. package/dist/types/src/script/OP.d.ts.map +1 -1
  387. package/dist/types/src/script/Script.d.ts.map +1 -1
  388. package/dist/types/src/script/Spend.d.ts +7 -0
  389. package/dist/types/src/script/Spend.d.ts.map +1 -1
  390. package/dist/types/src/script/templates/PushDrop.d.ts +3 -4
  391. package/dist/types/src/script/templates/PushDrop.d.ts.map +1 -1
  392. package/dist/types/src/storage/StorageUtils.d.ts.map +1 -1
  393. package/dist/types/src/transaction/Beef.d.ts +26 -9
  394. package/dist/types/src/transaction/Beef.d.ts.map +1 -1
  395. package/dist/types/src/transaction/BeefTx.d.ts +13 -6
  396. package/dist/types/src/transaction/BeefTx.d.ts.map +1 -1
  397. package/dist/types/src/transaction/MerklePath.d.ts +16 -3
  398. package/dist/types/src/transaction/MerklePath.d.ts.map +1 -1
  399. package/dist/types/src/transaction/Transaction.d.ts +58 -7
  400. package/dist/types/src/transaction/Transaction.d.ts.map +1 -1
  401. package/dist/types/src/transaction/broadcasters/ARC.d.ts.map +1 -1
  402. package/dist/types/src/transaction/http/BinaryFetchClient.d.ts +0 -2
  403. package/dist/types/src/transaction/http/BinaryFetchClient.d.ts.map +1 -1
  404. package/dist/types/src/wallet/Wallet.interfaces.d.ts +5 -5
  405. package/dist/types/src/wallet/Wallet.interfaces.d.ts.map +1 -1
  406. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  407. package/dist/umd/bundle.js +13 -13
  408. package/dist/umd/bundle.js.map +1 -1
  409. package/docs/index.md +3 -1
  410. package/docs/reference/auth.md +8 -12
  411. package/docs/reference/primitives.md +260 -55
  412. package/docs/reference/remittance.md +2166 -0
  413. package/docs/reference/script.md +12 -4
  414. package/docs/reference/transaction.md +203 -34
  415. package/docs/reference/wallet.md +6 -5
  416. package/docs/remittance-getting-started.md +138 -0
  417. package/mod.ts +1 -0
  418. package/package.json +11 -1
  419. package/src/auth/Peer.ts +196 -85
  420. package/src/auth/__tests/Peer.test.ts +424 -257
  421. package/src/auth/clients/AuthFetch.ts +18 -3
  422. package/src/auth/types.ts +2 -0
  423. package/src/messages/EncryptedMessage.ts +19 -0
  424. package/src/overlay-tools/__tests/SHIPBroadcaster.test.ts +7 -0
  425. package/src/primitives/AESGCM.ts +75 -34
  426. package/src/primitives/BigNumber.ts +27 -31
  427. package/src/primitives/ECDSA.ts +41 -2
  428. package/src/primitives/PrivateKey.ts +27 -0
  429. package/src/primitives/ReaderUint8Array.ts +196 -0
  430. package/src/primitives/ReductionContext.ts +44 -48
  431. package/src/primitives/TransactionSignature.ts +129 -10
  432. package/src/primitives/WriterUint8Array.ts +195 -0
  433. package/src/primitives/__tests/AESGCM.test.ts +31 -0
  434. package/src/primitives/__tests/ECDSA.test.ts +16 -0
  435. package/src/primitives/__tests/ReaderUint8Array.test.ts +317 -0
  436. package/src/primitives/__tests/WriterUint8Array.test.ts +208 -0
  437. package/src/primitives/utils.ts +31 -4
  438. package/src/remittance/CommsLayer.ts +41 -0
  439. package/src/remittance/IdentityLayer.ts +32 -0
  440. package/src/remittance/RemittanceManager.ts +1672 -0
  441. package/src/remittance/RemittanceModule.ts +92 -0
  442. package/src/remittance/__tests/BasicBRC29.test.ts +188 -0
  443. package/src/remittance/__tests/RemittanceManager.test.ts +493 -0
  444. package/src/remittance/__tests/examples.ts +130 -0
  445. package/src/remittance/index.ts +6 -0
  446. package/src/remittance/modules/BasicBRC29.ts +361 -0
  447. package/src/remittance/modules/index.ts +1 -0
  448. package/src/remittance/types.ts +284 -0
  449. package/src/script/OP.ts +15 -13
  450. package/src/script/Script.ts +3 -1
  451. package/src/script/Spend.ts +128 -52
  452. package/src/script/__tests/Chronicle.test.ts +186 -0
  453. package/src/script/__tests/Spend.test.ts +1 -1
  454. package/src/script/__tests/SpendValildVectors.test.ts +63 -0
  455. package/src/script/__tests/lrshiftnum.test.ts +185 -0
  456. package/src/script/__tests/sighashTestData.ts +1031 -0
  457. package/src/script/__tests/spend.valid.vectors.ts +9 -16
  458. package/src/script/templates/PushDrop.ts +32 -17
  459. package/src/script/templates/__tests/PushDrop.test.ts +28 -0
  460. package/src/storage/__tests/StorageUploader.test.ts +1 -1
  461. package/src/transaction/Beef.ts +103 -40
  462. package/src/transaction/BeefTx.ts +38 -19
  463. package/src/transaction/MerklePath.ts +30 -9
  464. package/src/transaction/Transaction.ts +277 -38
  465. package/src/transaction/__tests/Beef.test.ts +77 -0
  466. package/src/transaction/__tests/Transaction.test.ts +641 -3
  467. package/src/transaction/broadcasters/ARC.ts +34 -7
  468. package/src/transaction/broadcasters/__tests/ARC.test.ts +98 -0
  469. package/src/wallet/Wallet.interfaces.ts +5 -5
  470. package/dist/cjs/src/storage/__test/StorageDownloader.test.js +0 -171
  471. package/dist/cjs/src/storage/__test/StorageDownloader.test.js.map +0 -1
  472. package/dist/cjs/src/storage/__test/StorageUploader.test.js +0 -163
  473. package/dist/cjs/src/storage/__test/StorageUploader.test.js.map +0 -1
  474. package/dist/cjs/src/storage/__test/StorageUtils.test.js +0 -97
  475. package/dist/cjs/src/storage/__test/StorageUtils.test.js.map +0 -1
  476. package/dist/esm/src/storage/__test/StorageDownloader.test.js +0 -166
  477. package/dist/esm/src/storage/__test/StorageDownloader.test.js.map +0 -1
  478. package/dist/esm/src/storage/__test/StorageUploader.test.js +0 -135
  479. package/dist/esm/src/storage/__test/StorageUploader.test.js.map +0 -1
  480. package/dist/esm/src/storage/__test/StorageUtils.test.js +0 -72
  481. package/dist/esm/src/storage/__test/StorageUtils.test.js.map +0 -1
  482. package/dist/types/src/storage/__test/StorageDownloader.test.d.ts +0 -2
  483. package/dist/types/src/storage/__test/StorageDownloader.test.d.ts.map +0 -1
  484. package/dist/types/src/storage/__test/StorageUploader.test.d.ts +0 -2
  485. package/dist/types/src/storage/__test/StorageUploader.test.d.ts.map +0 -1
  486. package/dist/types/src/storage/__test/StorageUtils.test.d.ts +0 -2
  487. package/dist/types/src/storage/__test/StorageUtils.test.d.ts.map +0 -1
@@ -3,7 +3,7 @@ import TransactionInput from './TransactionInput.js'
3
3
  import TransactionOutput from './TransactionOutput.js'
4
4
  import UnlockingScript from '../script/UnlockingScript.js'
5
5
  import LockingScript from '../script/LockingScript.js'
6
- import { Reader, Writer, toHex, toArray } from '../primitives/utils.js'
6
+ import { Reader, Writer, toHex, toArray, ReaderUint8Array, toUint8Array, WriterUint8Array } from '../primitives/utils.js'
7
7
  import { hash256 } from '../primitives/Hash.js'
8
8
  import FeeModel from './FeeModel.js'
9
9
  import LivePolicy from './fee-models/LivePolicy.js'
@@ -16,9 +16,6 @@ import { defaultChainTracker } from './chaintrackers/DefaultChainTracker.js'
16
16
  import { Beef, BEEF_V1 } from './Beef.js'
17
17
  import P2PKH from '../script/templates/P2PKH.js'
18
18
 
19
- const BufferCtor =
20
- typeof globalThis !== 'undefined' ? (globalThis as any).Buffer : undefined
21
-
22
19
  /**
23
20
  * Represents a complete Bitcoin transaction. This class encapsulates all the details
24
21
  * required for creating, signing, and processing a Bitcoin transaction, including
@@ -109,7 +106,7 @@ export default class Transaction {
109
106
  * @param txid Optional TXID of the transaction to retrieve from the BEEF data.
110
107
  * @returns An anchored transaction, linked to its associated inputs populated with merkle paths.
111
108
  */
112
- static fromBEEF (beef: number[], txid?: string): Transaction {
109
+ static fromBEEF (beef: number[] | Uint8Array, txid?: string): Transaction {
113
110
  const { tx } = Transaction.fromAnyBeef(beef, txid)
114
111
  return tx
115
112
  }
@@ -121,7 +118,7 @@ export default class Transaction {
121
118
  * @param beef A binary representation of an Atomic BEEF structure.
122
119
  * @returns The subject transaction, linked to its associated inputs populated with merkle paths.
123
120
  */
124
- static fromAtomicBEEF (beef: number[]): Transaction {
121
+ static fromAtomicBEEF (beef: number[] | Uint8Array): Transaction {
125
122
  const { tx, txid, beef: b } = Transaction.fromAnyBeef(beef)
126
123
  if (txid !== b.atomicTxid) {
127
124
  if (b.atomicTxid != null) {
@@ -133,7 +130,7 @@ export default class Transaction {
133
130
  return tx
134
131
  }
135
132
 
136
- private static fromAnyBeef (beef: number[], txid?: string): { tx: Transaction, beef: Beef, txid: string } {
133
+ private static fromAnyBeef (beef: number[] | Uint8Array, txid?: string): { tx: Transaction, beef: Beef, txid: string } {
137
134
  const b = Beef.fromBinary(beef)
138
135
  if (b.txs.length < 1) {
139
136
  throw new Error('beef must include at least one transaction.')
@@ -155,8 +152,8 @@ export default class Transaction {
155
152
  * @param ef A binary representation of a transaction in EF format.
156
153
  * @returns An extended transaction, linked to its associated inputs by locking script and satoshis amounts only.
157
154
  */
158
- static fromEF (ef: number[]): Transaction {
159
- const br = new Reader(ef)
155
+ static fromEF (ef: number[] | Uint8Array): Transaction {
156
+ const br = ReaderUint8Array.makeReader(ef)
160
157
  const version = br.readUInt32LE()
161
158
  if (toHex(br.read(6)) !== '0000000000ef') { throw new Error('Invalid EF marker') }
162
159
  const inputsLength = br.readVarIntNum()
@@ -217,11 +214,11 @@ export default class Transaction {
217
214
  * outputs: { vout: number, offset: number, length: number }[]
218
215
  * }
219
216
  */
220
- static parseScriptOffsets (bin: number[]): {
217
+ static parseScriptOffsets (bin: number[] | Uint8Array): {
221
218
  inputs: Array<{ vin: number, offset: number, length: number }>
222
219
  outputs: Array<{ vout: number, offset: number, length: number }>
223
220
  } {
224
- const br = new Reader(bin)
221
+ const br = ReaderUint8Array.makeReader(bin)
225
222
  const inputs: Array<{ vin: number, offset: number, length: number }> = []
226
223
  const outputs: Array<{ vout: number, offset: number, length: number }> = []
227
224
 
@@ -243,7 +240,7 @@ export default class Transaction {
243
240
  return { inputs, outputs }
244
241
  }
245
242
 
246
- static fromReader (br: Reader): Transaction {
243
+ static fromReader (br: Reader | ReaderUint8Array): Transaction {
247
244
  const version = br.readUInt32LE()
248
245
  const inputsLength = br.readVarIntNum()
249
246
  const inputs: TransactionInput[] = []
@@ -284,10 +281,10 @@ export default class Transaction {
284
281
  * @param {number[]} bin - The binary array representation of the transaction.
285
282
  * @returns {Transaction} - A new Transaction instance.
286
283
  */
287
- static fromBinary (bin: number[]): Transaction {
284
+ static fromBinary (bin: number[] | Uint8Array): Transaction {
288
285
  const copy = bin.slice()
289
286
  const rawBytes = Uint8Array.from(copy)
290
- const br = new Reader(copy)
287
+ const br = new ReaderUint8Array(rawBytes)
291
288
  const tx = Transaction.fromReader(br)
292
289
  tx.rawBytesCache = rawBytes
293
290
  return tx
@@ -301,15 +298,11 @@ export default class Transaction {
301
298
  * @returns {Transaction} - A new Transaction instance.
302
299
  */
303
300
  static fromHex (hex: string): Transaction {
304
- const bin = toArray(hex, 'hex')
305
- const rawBytes = Uint8Array.from(bin)
306
- const br = new Reader(bin)
301
+ const rawBytes = toUint8Array(hex, 'hex')
302
+ const br = new ReaderUint8Array(rawBytes)
307
303
  const tx = Transaction.fromReader(br)
308
304
  tx.rawBytesCache = rawBytes
309
- tx.hexCache =
310
- BufferCtor != null
311
- ? BufferCtor.from(rawBytes).toString('hex')
312
- : toHex(bin)
305
+ tx.hexCache = toHex(rawBytes)
313
306
  return tx
314
307
  }
315
308
 
@@ -321,7 +314,7 @@ export default class Transaction {
321
314
  * @returns {Transaction} - A new Transaction instance.
322
315
  */
323
316
  static fromHexEF (hex: string): Transaction {
324
- return Transaction.fromEF(toArray(hex, 'hex'))
317
+ return Transaction.fromEF(toUint8Array(hex, 'hex'))
325
318
  }
326
319
 
327
320
  /**
@@ -616,7 +609,7 @@ export default class Transaction {
616
609
  return await broadcaster.broadcast(this)
617
610
  }
618
611
 
619
- private writeTransactionBody (writer: Writer): void {
612
+ private writeTransactionBody (writer: Writer | WriterUint8Array): void {
620
613
  writer.writeUInt32LE(this.version)
621
614
  writer.writeVarIntNum(this.inputs.length)
622
615
  for (const i of this.inputs) {
@@ -649,7 +642,7 @@ export default class Transaction {
649
642
  }
650
643
 
651
644
  private buildSerializedBytes (): Uint8Array {
652
- const writer = new Writer()
645
+ const writer = new WriterUint8Array()
653
646
  this.writeTransactionBody(writer)
654
647
  return writer.toUint8Array()
655
648
  }
@@ -674,13 +667,7 @@ export default class Transaction {
674
667
  return this.getSerializedBytes()
675
668
  }
676
669
 
677
- /**
678
- * Converts the transaction to a BRC-30 EF format.
679
- *
680
- * @returns {number[]} - The BRC-30 EF representation of the transaction.
681
- */
682
- toEF (): number[] {
683
- const writer = new Writer()
670
+ private writeEF (writer: Writer | WriterUint8Array): void {
684
671
  writer.writeUInt32LE(this.version)
685
672
  writer.write([0, 0, 0, 0, 0, 0xef])
686
673
  writer.writeVarIntNum(this.inputs.length)
@@ -721,16 +708,37 @@ export default class Transaction {
721
708
  writer.write(scriptBin)
722
709
  }
723
710
  writer.writeUInt32LE(this.lockTime)
711
+ }
712
+
713
+ /**
714
+ * Converts the transaction to a BRC-30 EF format.
715
+ *
716
+ * @returns {number[]} - The BRC-30 EF representation of the transaction.
717
+ */
718
+ toEF (): number[] {
719
+ const writer = new Writer()
720
+ this.writeEF(writer)
724
721
  return writer.toArray()
725
722
  }
726
723
 
724
+ /**
725
+ * Converts the transaction to a BRC-30 EF format.
726
+ *
727
+ * @returns {Uint8Array} - The BRC-30 EF representation of the transaction.
728
+ */
729
+ toEFUint8Array (): Uint8Array {
730
+ const writer = new WriterUint8Array()
731
+ this.writeEF(writer)
732
+ return writer.toUint8Array()
733
+ }
734
+
727
735
  /**
728
736
  * Converts the transaction to a hexadecimal string EF.
729
737
  *
730
738
  * @returns {string} - The hexadecimal string representation of the transaction EF.
731
739
  */
732
740
  toHexEF (): string {
733
- return toHex(this.toEF())
741
+ return toHex(this.toEFUint8Array())
734
742
  }
735
743
 
736
744
  /**
@@ -743,10 +751,7 @@ export default class Transaction {
743
751
  return this.hexCache
744
752
  }
745
753
  const bytes = this.getSerializedBytes()
746
- const hex =
747
- BufferCtor != null
748
- ? BufferCtor.from(bytes).toString('hex')
749
- : toHex(Array.from(bytes))
754
+ const hex = toHex(bytes)
750
755
  this.hexCache = hex
751
756
  return hex
752
757
  }
@@ -951,13 +956,13 @@ export default class Transaction {
951
956
  /**
952
957
  * Serializes this transaction, together with its inputs and the respective merkle proofs, into the BEEF (BRC-62) format. This enables efficient verification of its compliance with the rules of SPV.
953
958
  *
959
+ * @param writer The writer to serialize to
954
960
  * @param allowPartial If true, error will not be thrown if there are any missing sourceTransactions.
955
961
  *
956
962
  * @returns The serialized BEEF structure
957
963
  * @throws Error if there are any missing sourceTransactions unless `allowPartial` is true.
958
964
  */
959
- toBEEF (allowPartial?: boolean): number[] {
960
- const writer = new Writer()
965
+ writeSerializedBEEF (writer: Writer | WriterUint8Array, allowPartial?: boolean): void {
961
966
  writer.writeUInt32LE(BEEF_V1)
962
967
  const BUMPs: MerklePath[] = []
963
968
  const bumpIndexByInstance = new Map<MerklePath, number>()
@@ -1035,6 +1040,34 @@ export default class Transaction {
1035
1040
  return writer.toArray()
1036
1041
  }
1037
1042
 
1043
+ /**
1044
+ * Serializes this transaction, together with its inputs and the respective merkle proofs, into the BEEF (BRC-62) format. This enables efficient verification of its compliance with the rules of SPV.
1045
+ *
1046
+ * @param allowPartial If true, error will not be thrown if there are any missing sourceTransactions.
1047
+ *
1048
+ * @returns {number[]} The serialized BEEF structure
1049
+ * @throws Error if there are any missing sourceTransactions unless `allowPartial` is true.
1050
+ */
1051
+ toBEEF (allowPartial?: boolean): number[] {
1052
+ const writer = new Writer()
1053
+ this.writeSerializedBEEF(writer, allowPartial)
1054
+ return writer.toArray()
1055
+ }
1056
+
1057
+ /**
1058
+ * Serializes this transaction, together with its inputs and the respective merkle proofs, into the BEEF (BRC-62) format. This enables efficient verification of its compliance with the rules of SPV.
1059
+ *
1060
+ * @param allowPartial If true, error will not be thrown if there are any missing sourceTransactions.
1061
+ *
1062
+ * @returns {number[]} The serialized BEEF structure
1063
+ * @throws Error if there are any missing sourceTransactions unless `allowPartial` is true.
1064
+ */
1065
+ toBEEFUint8Array (allowPartial?: boolean): Uint8Array {
1066
+ const writer = new WriterUint8Array()
1067
+ this.writeSerializedBEEF(writer, allowPartial)
1068
+ return writer.toArray()
1069
+ }
1070
+
1038
1071
  /**
1039
1072
  * Serializes this transaction and its inputs into the Atomic BEEF (BRC-95) format.
1040
1073
  * The Atomic BEEF format starts with a 4-byte prefix `0x01010101`, followed by the TXID of the subject transaction,
@@ -1052,4 +1085,210 @@ export default class Transaction {
1052
1085
  const beefData = this.toBEEF(allowPartial)
1053
1086
  return prefix.concat(txHash, beefData)
1054
1087
  }
1088
+
1089
+ /**
1090
+ * Serializes this transaction and its inputs into the Atomic BEEF (BRC-95) format.
1091
+ * The Atomic BEEF format starts with a 4-byte prefix `0x01010101`, followed by the TXID of the subject transaction,
1092
+ * and then the BEEF data containing only the subject transaction and its dependencies.
1093
+ * This format ensures that the BEEF structure is atomic and contains no unrelated transactions.
1094
+ *
1095
+ * @param allowPartial If true, error will not be thrown if there are any missing sourceTransactions.
1096
+ *
1097
+ * @returns {number[]} - The serialized Atomic BEEF structure.
1098
+ * @throws Error if there are any missing sourceTransactions unless `allowPartial` is true.
1099
+ */
1100
+ toAtomicBEEFUint8Array (allowPartial?: boolean): Uint8Array {
1101
+ const writer = new WriterUint8Array()
1102
+ const prefix = [1, 1, 1, 1]
1103
+ writer.write(prefix)
1104
+ const txHash = this.hash() as number[]
1105
+ writer.write(txHash)
1106
+ this.writeSerializedBEEF(writer, allowPartial)
1107
+ return writer.toUint8Array()
1108
+ }
1109
+
1110
+ /**
1111
+ * Completes the transaction using a wallet interface, which will handle
1112
+ * signing and transaction finalization. This method converts the current
1113
+ * transaction into a format that can be processed by the wallet, and then
1114
+ * updates this transaction object with the result from the wallet.
1115
+ *
1116
+ * @param {WalletInterface} wallet - The BRC-100 compliant wallet to use for completing the transaction
1117
+ * @param {string} [actionDescription] - Optional description for the action
1118
+ * @param {string} [originator] - Optional originator domain name
1119
+ * @param {CreateActionOptions} [options] - Optional settings for transaction creation (e.g., acceptDelayedBroadcast, trustSelf, noSend, etc.)
1120
+ * @returns {Promise<void>}
1121
+ */
1122
+ async completeWithWallet (wallet: WalletInterface, actionDescription?: DescriptionString5to50Bytes, originator?: string, options?: CreateActionOptions): Promise<void> {
1123
+ const inputCount = this.inputs.length
1124
+ const outputCount = this.outputs.length
1125
+ const description = actionDescription ?? `Transaction with ${inputCount} input(s) and ${outputCount} output(s)`
1126
+
1127
+ const actionArgs: CreateActionArgs = {
1128
+ description,
1129
+ inputs: [] as any[],
1130
+ outputs: [] as any[],
1131
+ lockTime: this.lockTime,
1132
+ version: this.version
1133
+ }
1134
+
1135
+ // Check if any input has an unlocking script template
1136
+ const hasTemplates = this.inputs.some(input => input.unlockingScriptTemplate != null)
1137
+
1138
+ // Process inputs - collect all source transactions and convert them to BEEF
1139
+ const beefData = new Beef()
1140
+ for (let i = 0; i < this.inputs.length; i++) {
1141
+ const input = this.inputs[i]
1142
+
1143
+ if (input.sourceTransaction == null) {
1144
+ throw new Error('All inputs must have a sourceTransaction when using completeWithWallet')
1145
+ }
1146
+
1147
+ // Merge source transaction into BEEF
1148
+ const sourceBEEF = input.sourceTransaction.toBEEF()
1149
+ beefData.mergeBeef(sourceBEEF)
1150
+
1151
+ const sourceTXID = input.sourceTransaction.id('hex')
1152
+
1153
+ const inputArg: any = {
1154
+ outpoint: `${sourceTXID}.${input.sourceOutputIndex}`,
1155
+ inputDescription: 'Input from source transaction',
1156
+ sequenceNumber: input.sequence
1157
+ }
1158
+
1159
+ // Handle inputs with templates vs scripts
1160
+ if (hasTemplates) {
1161
+ // When using signAction flow, need to provide length for templates
1162
+ if (input.unlockingScriptTemplate != null) {
1163
+ const estimatedLength = await input.unlockingScriptTemplate.estimateLength(this, i)
1164
+ inputArg.unlockingScriptLength = estimatedLength
1165
+ } else if (input.unlockingScript != null) {
1166
+ // Still provide the script if it exists
1167
+ inputArg.unlockingScript = input.unlockingScript.toHex()
1168
+ } else {
1169
+ throw new Error(`Input ${i} must have either an unlockingScript or unlockingScriptTemplate`)
1170
+ }
1171
+ } else {
1172
+ // Original flow: all inputs must have unlocking scripts
1173
+ if (input.unlockingScript == null) {
1174
+ throw new Error('All inputs must have an unlockingScript when using completeWithWallet')
1175
+ }
1176
+ inputArg.unlockingScript = input.unlockingScript.toHex()
1177
+ }
1178
+
1179
+ actionArgs.inputs.push(inputArg)
1180
+ }
1181
+
1182
+ // Add inputBEEF if there are inputs
1183
+ if (this.inputs.length > 0) {
1184
+ actionArgs.inputBEEF = beefData.toBinary()
1185
+ }
1186
+
1187
+ // Process outputs
1188
+ for (const output of this.outputs) {
1189
+ actionArgs.outputs.push({
1190
+ satoshis: output.satoshis,
1191
+ lockingScript: output.lockingScript.toHex(),
1192
+ outputDescription: 'Output from source transaction'
1193
+ })
1194
+ }
1195
+
1196
+ // Add any labels from metadata if they exist
1197
+ if (this.metadata?.labels != null && Array.isArray(this.metadata.labels)) {
1198
+ actionArgs.labels = this.metadata.labels
1199
+ }
1200
+
1201
+ let atomicBEEF: number[]
1202
+
1203
+ // Use signAction flow for templates
1204
+ if (hasTemplates) {
1205
+ // Merge user options with required signAndProcess: false for template flow
1206
+ actionArgs.options = {
1207
+ ...options,
1208
+ signAndProcess: false
1209
+ }
1210
+
1211
+ const { signableTransaction } = await wallet.createAction(actionArgs, originator)
1212
+
1213
+ if (signableTransaction == null) {
1214
+ throw new Error('Wallet createAction did not return signableTransaction')
1215
+ }
1216
+
1217
+ // Parse the signable transaction BEEF to get the unsigned transaction
1218
+ const partialTx = Transaction.fromBEEF(signableTransaction.tx)
1219
+
1220
+ // Sign inputs with templates and collect all unlocking scripts
1221
+ const spends: Record<number, { unlockingScript: string }> = {}
1222
+
1223
+ for (let i = 0; i < this.inputs.length; i++) {
1224
+ const input = this.inputs[i]
1225
+
1226
+ if (input.unlockingScriptTemplate != null) {
1227
+ // Use the template to sign this input
1228
+ const unlockingScript = await input.unlockingScriptTemplate.sign(partialTx, i)
1229
+ spends[i] = {
1230
+ unlockingScript: unlockingScript.toHex()
1231
+ }
1232
+ } else if (input.unlockingScript != null) {
1233
+ // Include pre-existing unlocking scripts
1234
+ spends[i] = {
1235
+ unlockingScript: input.unlockingScript.toHex()
1236
+ }
1237
+ }
1238
+ }
1239
+
1240
+ // Extract options that apply to signAction (subset of CreateActionOptions)
1241
+ const signActionOptions: SignActionOptions | undefined = options != null
1242
+ ? {
1243
+ acceptDelayedBroadcast: options.acceptDelayedBroadcast,
1244
+ returnTXIDOnly: options.returnTXIDOnly,
1245
+ noSend: options.noSend,
1246
+ sendWith: options.sendWith
1247
+ }
1248
+ : undefined
1249
+
1250
+ // Call signAction with the generated unlocking scripts
1251
+ const signResult = await wallet.signAction({
1252
+ reference: signableTransaction.reference,
1253
+ spends,
1254
+ options: signActionOptions
1255
+ }, originator)
1256
+
1257
+ if (signResult.tx == null) {
1258
+ throw new Error('Wallet signAction did not return transaction data')
1259
+ }
1260
+
1261
+ atomicBEEF = signResult.tx
1262
+ } else {
1263
+ // Pass through user options for standard flow
1264
+ if (options != null) {
1265
+ actionArgs.options = options
1266
+ }
1267
+
1268
+ const { tx } = await wallet.createAction(actionArgs, originator)
1269
+
1270
+ if (tx == null) {
1271
+ throw new Error('Wallet createAction did not return transaction data')
1272
+ }
1273
+
1274
+ atomicBEEF = tx
1275
+ }
1276
+
1277
+ // Create a new transaction from the atomic BEEF
1278
+ const newTransaction = Transaction.fromAtomicBEEF(atomicBEEF)
1279
+
1280
+ // Update this transaction's properties with the new transaction's properties
1281
+ this.version = newTransaction.version
1282
+ this.inputs = newTransaction.inputs
1283
+ this.outputs = newTransaction.outputs
1284
+ this.lockTime = newTransaction.lockTime
1285
+ this.merklePath = newTransaction.merklePath
1286
+ this.cachedHash = newTransaction.cachedHash
1287
+
1288
+ // Preserve metadata from the original transaction but update with any new metadata
1289
+ this.metadata = {
1290
+ ...this.metadata,
1291
+ ...newTransaction.metadata
1292
+ }
1293
+ }
1055
1294
  }
@@ -324,6 +324,81 @@ describe('Beef tests', () => {
324
324
  }
325
325
  })
326
326
 
327
+ test('6b_trimKnownTxids_removes_unreferenced_bumps', async () => {
328
+ // Create a beef with multiple transactions and bumps
329
+ const beef = Beef.fromString(beefs[0])
330
+
331
+ // Verify initial state
332
+ const initialBumpCount = beef.bumps.length
333
+ const initialTxCount = beef.txs.length
334
+ expect(initialBumpCount).toBe(1)
335
+ expect(initialTxCount).toBe(1)
336
+
337
+ // Add some txid-only transactions that don't have bumps
338
+ beef.mergeTxidOnly('txid1')
339
+ beef.mergeTxidOnly('txid2')
340
+ beef.mergeTxidOnly('txid3')
341
+
342
+ expect(beef.txs.length).toBe(4)
343
+ expect(beef.bumps.length).toBe(1)
344
+
345
+ // Get the txid of the transaction with a bump
346
+ const txWithBump = beef.txs.find(tx => tx.bumpIndex !== undefined)
347
+ expect(txWithBump).toBeTruthy()
348
+
349
+ // Trim all txid-only transactions
350
+ beef.trimKnownTxids(['txid1', 'txid2', 'txid3'])
351
+
352
+ // Verify txids were removed
353
+ expect(beef.txs.length).toBe(1)
354
+ expect(beef.bumps.length).toBe(1) // Bump should still be there because it's referenced
355
+
356
+ // Now test removing the transaction that has the bump
357
+ // First, make it txidOnly
358
+ const originalTxid = txWithBump!.txid
359
+ beef.makeTxidOnly(originalTxid)
360
+
361
+ // Now trim it
362
+ beef.trimKnownTxids([originalTxid])
363
+
364
+ // The bump should be removed since no transactions reference it anymore
365
+ expect(beef.txs.length).toBe(0)
366
+ expect(beef.bumps.length).toBe(0)
367
+ })
368
+
369
+ test('6c_trimKnownTxids_updates_bump_indices', async () => {
370
+ // Use existing beef with bumps
371
+ const beef = Beef.fromString(beefs[0])
372
+
373
+ const initialBumpCount = beef.bumps.length
374
+ const initialTxCount = beef.txs.length
375
+
376
+ // Find transaction with bump
377
+ const txWithBump = beef.txs.find(tx => tx.bumpIndex !== undefined)
378
+ expect(txWithBump).toBeTruthy()
379
+ const originalBumpIndex = txWithBump!.bumpIndex
380
+
381
+ // Add some txid-only transactions
382
+ beef.mergeTxidOnly('known1')
383
+ beef.mergeTxidOnly('known2')
384
+
385
+ expect(beef.txs.length).toBe(initialTxCount + 2)
386
+ expect(beef.bumps.length).toBe(initialBumpCount)
387
+
388
+ // Trim the known txids
389
+ beef.trimKnownTxids(['known1', 'known2'])
390
+
391
+ // Verify bump count didn't change (all bumps are still referenced)
392
+ expect(beef.bumps.length).toBe(initialBumpCount)
393
+
394
+ // Verify transaction count decreased
395
+ expect(beef.txs.length).toBe(initialTxCount)
396
+
397
+ // Verify bumpIndex is still correct
398
+ const txAfterTrim = beef.txs.find(tx => tx.txid === txWithBump!.txid)
399
+ expect(txAfterTrim?.bumpIndex).toBe(originalBumpIndex)
400
+ })
401
+
327
402
  test('7_AtomicBeef', async () => {
328
403
  {
329
404
  const beef = Beef.fromString(beefs[0])
@@ -391,6 +466,8 @@ describe('Beef tests', () => {
391
466
  const t2 = Transaction.fromAtomicBEEF(atomic)
392
467
  const beef2 = t2.toAtomicBEEF()
393
468
  expect(atomic).toEqual(beef2)
469
+ const atomic2 = beef.toUint8ArrayAtomic(tx.id('hex'))
470
+ expect(atomic).toEqual(Array.from(atomic2))
394
471
  })
395
472
  test('9_sortTxs', async () => {
396
473
  {