@bsv/sdk 2.0.0-beta.0 → 2.0.1

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 (488) 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 +80 -5
  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 +80 -5
  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 +70 -5
  451. package/src/script/Spend.ts +128 -52
  452. package/src/script/__tests/Chronicle.test.ts +186 -0
  453. package/src/script/__tests/Script.test.ts +39 -6
  454. package/src/script/__tests/Spend.test.ts +1 -1
  455. package/src/script/__tests/SpendValildVectors.test.ts +63 -0
  456. package/src/script/__tests/lrshiftnum.test.ts +185 -0
  457. package/src/script/__tests/sighashTestData.ts +1031 -0
  458. package/src/script/__tests/spend.valid.vectors.ts +9 -16
  459. package/src/script/templates/PushDrop.ts +32 -17
  460. package/src/script/templates/__tests/PushDrop.test.ts +28 -0
  461. package/src/storage/__tests/StorageUploader.test.ts +1 -1
  462. package/src/transaction/Beef.ts +103 -40
  463. package/src/transaction/BeefTx.ts +38 -19
  464. package/src/transaction/MerklePath.ts +30 -9
  465. package/src/transaction/Transaction.ts +277 -38
  466. package/src/transaction/__tests/Beef.test.ts +77 -0
  467. package/src/transaction/__tests/Transaction.test.ts +641 -3
  468. package/src/transaction/broadcasters/ARC.ts +34 -7
  469. package/src/transaction/broadcasters/__tests/ARC.test.ts +98 -0
  470. package/src/wallet/Wallet.interfaces.ts +5 -5
  471. package/dist/cjs/src/storage/__test/StorageDownloader.test.js +0 -171
  472. package/dist/cjs/src/storage/__test/StorageDownloader.test.js.map +0 -1
  473. package/dist/cjs/src/storage/__test/StorageUploader.test.js +0 -163
  474. package/dist/cjs/src/storage/__test/StorageUploader.test.js.map +0 -1
  475. package/dist/cjs/src/storage/__test/StorageUtils.test.js +0 -97
  476. package/dist/cjs/src/storage/__test/StorageUtils.test.js.map +0 -1
  477. package/dist/esm/src/storage/__test/StorageDownloader.test.js +0 -166
  478. package/dist/esm/src/storage/__test/StorageDownloader.test.js.map +0 -1
  479. package/dist/esm/src/storage/__test/StorageUploader.test.js +0 -135
  480. package/dist/esm/src/storage/__test/StorageUploader.test.js.map +0 -1
  481. package/dist/esm/src/storage/__test/StorageUtils.test.js +0 -72
  482. package/dist/esm/src/storage/__test/StorageUtils.test.js.map +0 -1
  483. package/dist/types/src/storage/__test/StorageDownloader.test.d.ts +0 -2
  484. package/dist/types/src/storage/__test/StorageDownloader.test.d.ts.map +0 -1
  485. package/dist/types/src/storage/__test/StorageUploader.test.d.ts +0 -2
  486. package/dist/types/src/storage/__test/StorageUploader.test.d.ts.map +0 -1
  487. package/dist/types/src/storage/__test/StorageUtils.test.d.ts +0 -2
  488. package/dist/types/src/storage/__test/StorageUtils.test.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
 
2
2
  import BigNumber from '../../primitives/BigNumber'
3
3
  import TransactionSignature from '../../primitives/TransactionSignature'
4
- import { toHex, toArray, Writer } from '../../primitives/utils'
4
+ import { toHex, toArray, Writer, Reader } from '../../primitives/utils'
5
5
  import Script from '../../script/Script'
6
6
  import UnlockingScript from '../../script/UnlockingScript'
7
7
  import LockingScript from '../../script/LockingScript'
@@ -20,6 +20,9 @@ import invalidTransactions from './tx.invalid.vectors'
20
20
  import validTransactions from './tx.valid.vectors'
21
21
  import bigTX from './bigtx.vectors'
22
22
  import { BroadcastResponse } from '../../transaction/Broadcaster'
23
+ import { WalletInterface, CreateActionArgs, CreateActionResult } from '../../wallet/Wallet.interfaces'
24
+ import ScriptChunk from '../../script/ScriptChunk'
25
+ import OP from '../../script/OP'
23
26
 
24
27
  const BRC62Hex =
25
28
  '0100beef01fe636d0c0007021400fe507c0c7aa754cef1f7889d5fd395cf1f785dd7de98eed895dbedfe4e5bc70d1502ac4e164f5bc16746bb0868404292ac8318bbac3800e4aad13a014da427adce3e010b00bc4ff395efd11719b277694cface5aa50d085a0bb81f613f70313acd28cf4557010400574b2d9142b8d28b61d88e3b2c3f44d858411356b49a28a4643b6d1a6a092a5201030051a05fc84d531b5d250c23f4f886f6812f9fe3f402d61607f977b4ecd2701c19010000fd781529d58fc2523cf396a7f25440b409857e7e221766c57214b1d38c7b481f01010062f542f45ea3660f86c013ced80534cb5fd4c19d66c56e7e8c5d4bf2d40acc5e010100b121e91836fd7cd5102b654e9f72f3cf6fdbfd0b161c53a9c54b12c841126331020100000001cd4e4cac3c7b56920d1e7655e7e260d31f29d9a388d04910f1bbd72304a79029010000006b483045022100e75279a205a547c445719420aa3138bf14743e3f42618e5f86a19bde14bb95f7022064777d34776b05d816daf1699493fcdf2ef5a5ab1ad710d9c97bfb5b8f7cef3641210263e2dee22b1ddc5e11f6fab8bcd2378bdd19580d640501ea956ec0e786f93e76ffffffff013e660000000000001976a9146bfd5c7fbe21529d45803dbcf0c87dd3c71efbc288ac0000000001000100000001ac4e164f5bc16746bb0868404292ac8318bbac3800e4aad13a014da427adce3e000000006a47304402203a61a2e931612b4bda08d541cfb980885173b8dcf64a3471238ae7abcd368d6402204cbf24f04b9aa2256d8901f0ed97866603d2be8324c2bfb7a37bf8fc90edd5b441210263e2dee22b1ddc5e11f6fab8bcd2378bdd19580d640501ea956ec0e786f93e76ffffffff013c660000000000001976a9146bfd5c7fbe21529d45803dbcf0c87dd3c71efbc288ac0000000000'
@@ -904,6 +907,83 @@ describe('Transaction', () => {
904
907
  })
905
908
  })
906
909
 
910
+ function scriptFromLegacyData(bin: number[]): Script {
911
+ bin = [...bin]
912
+ const chunks: ScriptChunk[] = []
913
+
914
+ let inConditionalBlock: number = 0
915
+
916
+ const br = new Reader(bin)
917
+ while (!br.eof()) {
918
+ const op = br.readUInt8()
919
+
920
+ // if OP_RETURN and not in a conditional block, do not parse the rest of the data,
921
+ // rather just return the last chunk as data without prefixing with data length.
922
+ if (op === OP.OP_RETURN && inConditionalBlock === 0) {
923
+ chunks.push({
924
+ op,
925
+ data: br.read()
926
+ })
927
+ break
928
+ }
929
+
930
+ if (op === OP.OP_IF || op === OP.OP_NOTIF || op === OP.OP_VERIF || op === OP.OP_VERNOTIF) {
931
+ inConditionalBlock++
932
+ } else if (op === OP.OP_ENDIF) {
933
+ inConditionalBlock--
934
+ }
935
+
936
+ let len = 0
937
+ // eslint-disable-next-line @typescript-eslint/no-shadow
938
+ let data: number[] = []
939
+ if (op > 0 && op < OP.OP_PUSHDATA1) {
940
+ len = op
941
+ chunks.push({
942
+ data: br.read(len),
943
+ op
944
+ })
945
+ } else if (op === OP.OP_PUSHDATA1) {
946
+ try {
947
+ len = br.readUInt8()
948
+ data = br.read(len)
949
+ } catch {
950
+ br.read()
951
+ }
952
+ chunks.push({
953
+ data,
954
+ op
955
+ })
956
+ } else if (op === OP.OP_PUSHDATA2) {
957
+ try {
958
+ len = br.readUInt16LE()
959
+ data = br.read(len)
960
+ } catch {
961
+ br.read()
962
+ }
963
+ chunks.push({
964
+ data,
965
+ op
966
+ })
967
+ } else if (op === OP.OP_PUSHDATA4) {
968
+ try {
969
+ len = br.readUInt32LE()
970
+ data = br.read(len)
971
+ } catch {
972
+ br.read()
973
+ }
974
+ chunks.push({
975
+ data,
976
+ op
977
+ })
978
+ } else {
979
+ chunks.push({
980
+ op
981
+ })
982
+ }
983
+ }
984
+ return new Script(chunks)
985
+ }
986
+
907
987
  describe('vectors: sighash and serialization', () => {
908
988
  sighashVectors.forEach((vector, i) => {
909
989
  if (i === 0) {
@@ -912,7 +992,7 @@ describe('Transaction', () => {
912
992
  it(`should pass bitcoin-abc sighash test vector ${i}`, () => {
913
993
  const txbuf = toArray(vector[0], 'hex')
914
994
  const scriptbuf = toArray(vector[1], 'hex')
915
- const subScript = Script.fromBinary(scriptbuf)
995
+ const subScript = scriptFromLegacyData(scriptbuf)
916
996
  const nIn = vector[2] as number
917
997
  const nHashType = vector[3] as number
918
998
  const sighashBuf = toArray(vector[4], 'hex')
@@ -936,7 +1016,8 @@ describe('Transaction', () => {
936
1016
  subscript: subScript,
937
1017
  inputSequence: input.sequence ?? 0xffffffff,
938
1018
  lockTime: tx.lockTime,
939
- scope: nHashType
1019
+ scope: nHashType,
1020
+ ignoreChronicle: true
940
1021
  })
941
1022
  const hash = hash256(preimage)
942
1023
  hash.reverse()
@@ -1379,6 +1460,563 @@ describe('Transaction', () => {
1379
1460
  })
1380
1461
  })
1381
1462
 
1463
+ describe('completeWithWallet', () => {
1464
+ // Mock implementation of WalletInterface for testing
1465
+ class MockWallet implements Partial<WalletInterface> {
1466
+ public lastCreateActionArgs: CreateActionArgs | null = null
1467
+ public lastSignActionArgs: any = null
1468
+ public signActionCalled: boolean = false
1469
+
1470
+ async createAction(args: CreateActionArgs, originator?: string): Promise<CreateActionResult> {
1471
+ // Store the args for verification
1472
+ this.lastCreateActionArgs = args
1473
+
1474
+ // Create a simple transaction from the action args
1475
+ const tx = new Transaction(args.version || 1)
1476
+
1477
+ // Add inputs if provided
1478
+ if (args.inputs) {
1479
+ for (const input of args.inputs) {
1480
+ // Parse outpoint string format "txid.vout"
1481
+ const [txid, voutStr] = input.outpoint.split('.')
1482
+
1483
+ // Check if this is using the signAction flow (has unlockingScriptLength)
1484
+ const hasTemplate = input.unlockingScriptLength != null
1485
+
1486
+ // For signAction flow, we need placeholder scripts to serialize the transaction
1487
+ // These will be replaced by the actual scripts in signAction
1488
+ const unlockingScript = hasTemplate
1489
+ ? Script.fromASM('OP_0') // Placeholder for template inputs
1490
+ : (input.unlockingScript ? Script.fromHex(input.unlockingScript) : Script.fromASM('OP_1'))
1491
+
1492
+ tx.addInput({
1493
+ sourceTXID: txid,
1494
+ sourceOutputIndex: parseInt(voutStr),
1495
+ unlockingScript
1496
+ })
1497
+ }
1498
+ }
1499
+
1500
+ // Add outputs if provided
1501
+ if (args.outputs) {
1502
+ for (const output of args.outputs) {
1503
+ tx.addOutput({
1504
+ satoshis: output.satoshis,
1505
+ lockingScript: Script.fromHex(output.lockingScript)
1506
+ })
1507
+ }
1508
+ }
1509
+
1510
+ // Check if this should return signableTransaction
1511
+ if (args.options?.signAndProcess === false) {
1512
+ return {
1513
+ signableTransaction: {
1514
+ tx: tx.toBEEF(),
1515
+ reference: 'test-reference-123'
1516
+ }
1517
+ }
1518
+ }
1519
+
1520
+ // Return the transaction as Atomic BEEF in CreateActionResult format
1521
+ return {
1522
+ tx: tx.toAtomicBEEF(),
1523
+ txid: tx.id('hex')
1524
+ }
1525
+ }
1526
+
1527
+ async signAction(args: any, originator?: string): Promise<CreateActionResult> {
1528
+ this.signActionCalled = true
1529
+ this.lastSignActionArgs = args
1530
+
1531
+ // Get the reference to find the original transaction
1532
+ // For testing, we'll create a new transaction with the provided unlocking scripts
1533
+ const tx = new Transaction(1)
1534
+
1535
+ // Add inputs with the provided unlocking scripts from spends
1536
+ for (const [index, spend] of Object.entries(args.spends)) {
1537
+ tx.addInput({
1538
+ sourceTXID: '00'.repeat(32),
1539
+ sourceOutputIndex: parseInt(index),
1540
+ unlockingScript: Script.fromHex((spend as any).unlockingScript)
1541
+ })
1542
+ }
1543
+
1544
+ // Return atomic BEEF
1545
+ return {
1546
+ tx: tx.toAtomicBEEF(),
1547
+ txid: tx.id('hex')
1548
+ }
1549
+ }
1550
+ }
1551
+
1552
+ it('should properly complete a transaction using a wallet', async () => {
1553
+ // Create a private key and address for testing
1554
+ const privateKey = new PrivateKey(1)
1555
+ const publicKey = new Curve().g.mul(privateKey)
1556
+ const publicKeyHash = hash160(publicKey.encode(true)) as number[]
1557
+ const p2pkh = new P2PKH()
1558
+
1559
+ // Create a source transaction with a merkle path
1560
+ const sourceTx = new Transaction(
1561
+ 1,
1562
+ [],
1563
+ [{
1564
+ lockingScript: p2pkh.lock(publicKeyHash),
1565
+ satoshis: 10000
1566
+ }],
1567
+ 0
1568
+ )
1569
+
1570
+ // Assign a merkle path to simulate a confirmed transaction
1571
+ const sourceTxID = sourceTx.id('hex')
1572
+ sourceTx.merklePath = new MerklePath(1000, [
1573
+ [
1574
+ { offset: 0, hash: sourceTxID, txid: true },
1575
+ { offset: 1, duplicate: true }
1576
+ ]
1577
+ ])
1578
+
1579
+ // Create another source transaction without merkle path
1580
+ const sourceTx2 = new Transaction(
1581
+ 1,
1582
+ [],
1583
+ [{
1584
+ lockingScript: p2pkh.lock(publicKeyHash),
1585
+ satoshis: 5000
1586
+ }],
1587
+ 0
1588
+ )
1589
+
1590
+ // Create unlocking scripts for the inputs
1591
+ const unlockingScript1 = Script.fromASM('OP_0 OP_0') // Placeholder unlocking script
1592
+ const unlockingScript2 = Script.fromASM('OP_0 OP_0') // Placeholder unlocking script
1593
+
1594
+ // Create the transaction to complete
1595
+ const tx = new Transaction(
1596
+ 1,
1597
+ [
1598
+ {
1599
+ sourceTransaction: sourceTx,
1600
+ sourceOutputIndex: 0,
1601
+ sequence: 0xffffffff,
1602
+ unlockingScript: unlockingScript1
1603
+ },
1604
+ {
1605
+ sourceTransaction: sourceTx2,
1606
+ sourceOutputIndex: 0,
1607
+ sequence: 0xffffffff,
1608
+ unlockingScript: unlockingScript2
1609
+ }
1610
+ ],
1611
+ [{
1612
+ satoshis: 14000,
1613
+ lockingScript: p2pkh.lock(publicKeyHash)
1614
+ }],
1615
+ 0
1616
+ )
1617
+
1618
+ // Add metadata with labels
1619
+ tx.updateMetadata({
1620
+ labels: ['test-label-1', 'test-label-2']
1621
+ })
1622
+
1623
+ // Create a mock wallet
1624
+ const mockWallet = new MockWallet()
1625
+
1626
+ // Complete the transaction with the wallet
1627
+ await tx.completeWithWallet(mockWallet, 'Test transaction completion')
1628
+
1629
+ // Verify that the wallet's createAction was called with correct arguments
1630
+ expect(mockWallet.lastCreateActionArgs).not.toBeNull()
1631
+ expect(mockWallet.lastCreateActionArgs!.description).toBe('Test transaction completion')
1632
+ expect(mockWallet.lastCreateActionArgs!.inputs).toHaveLength(2)
1633
+ expect(mockWallet.lastCreateActionArgs!.outputs).toHaveLength(1)
1634
+ expect(mockWallet.lastCreateActionArgs!.labels).toEqual(['test-label-1', 'test-label-2'])
1635
+
1636
+ // Verify that the transaction structure was updated
1637
+ expect(tx.inputs).toHaveLength(2)
1638
+ expect(tx.outputs).toHaveLength(1)
1639
+
1640
+ // Verify that original metadata labels are preserved
1641
+ expect(tx.metadata).toHaveProperty('labels')
1642
+ expect(tx.metadata.labels).toContain('test-label-1')
1643
+ expect(tx.metadata.labels).toContain('test-label-2')
1644
+ })
1645
+
1646
+ it('should throw an error when inputs do not have source transactions', async () => {
1647
+ // Create a transaction with only TXID references (no source transactions)
1648
+ const tx = new Transaction(
1649
+ 1,
1650
+ [
1651
+ {
1652
+ sourceTXID: '00'.repeat(32),
1653
+ sourceOutputIndex: 0,
1654
+ sequence: 0xffffffff
1655
+ }
1656
+ ],
1657
+ [{
1658
+ satoshis: 5000,
1659
+ lockingScript: Script.fromASM('OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG')
1660
+ }],
1661
+ 0
1662
+ )
1663
+
1664
+ // Create a mock wallet
1665
+ const mockWallet = new MockWallet()
1666
+
1667
+ // Expect completeWithWallet to throw an error
1668
+ await expect(tx.completeWithWallet(mockWallet))
1669
+ .rejects
1670
+ .toThrow('All inputs must have a sourceTransaction when using completeWithWallet')
1671
+ })
1672
+
1673
+ it('should throw an error when inputs do not have unlocking scripts', async () => {
1674
+ // Create a private key and address for testing
1675
+ const privateKey = new PrivateKey(1)
1676
+ const publicKey = new Curve().g.mul(privateKey)
1677
+ const publicKeyHash = hash160(publicKey.encode(true)) as number[]
1678
+ const p2pkh = new P2PKH()
1679
+
1680
+ // Create a source transaction
1681
+ const sourceTx = new Transaction(
1682
+ 1,
1683
+ [],
1684
+ [{
1685
+ lockingScript: p2pkh.lock(publicKeyHash),
1686
+ satoshis: 10000
1687
+ }],
1688
+ 0
1689
+ )
1690
+
1691
+ // Create a transaction with source transaction but no unlocking script
1692
+ const tx = new Transaction(
1693
+ 1,
1694
+ [
1695
+ {
1696
+ sourceTransaction: sourceTx,
1697
+ sourceOutputIndex: 0,
1698
+ sequence: 0xffffffff
1699
+ // Note: no unlockingScript property
1700
+ }
1701
+ ],
1702
+ [{
1703
+ satoshis: 5000,
1704
+ lockingScript: Script.fromASM('OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG')
1705
+ }],
1706
+ 0
1707
+ )
1708
+
1709
+ // Create a mock wallet
1710
+ const mockWallet = new MockWallet()
1711
+
1712
+ // Expect completeWithWallet to throw an error
1713
+ await expect(tx.completeWithWallet(mockWallet))
1714
+ .rejects
1715
+ .toThrow('All inputs must have an unlockingScript when using completeWithWallet')
1716
+ })
1717
+
1718
+ it('should use signAction flow when inputs have unlockingScriptTemplate', async () => {
1719
+ // Create a private key and address for testing
1720
+ const privateKey = new PrivateKey(1)
1721
+ const publicKey = new Curve().g.mul(privateKey)
1722
+ const publicKeyHash = hash160(publicKey.encode(true)) as number[]
1723
+ const p2pkh = new P2PKH()
1724
+
1725
+ // Create a source transaction
1726
+ const sourceTx = new Transaction(
1727
+ 1,
1728
+ [],
1729
+ [{
1730
+ lockingScript: p2pkh.lock(publicKeyHash),
1731
+ satoshis: 10000
1732
+ }],
1733
+ 0
1734
+ )
1735
+
1736
+ // Create a mock unlocking script template
1737
+ const mockTemplate = {
1738
+ sign: async (tx: Transaction, inputIndex: number): Promise<UnlockingScript> => {
1739
+ // Return a simple unlocking script
1740
+ return Script.fromASM('OP_1 OP_2')
1741
+ },
1742
+ estimateLength: async (tx: Transaction, inputIndex: number): Promise<number> => {
1743
+ return 73 // Standard P2PKH unlocking script length estimate
1744
+ }
1745
+ }
1746
+
1747
+ // Create a transaction with a template
1748
+ const tx = new Transaction(
1749
+ 1,
1750
+ [
1751
+ {
1752
+ sourceTransaction: sourceTx,
1753
+ sourceOutputIndex: 0,
1754
+ sequence: 0xffffffff,
1755
+ unlockingScriptTemplate: mockTemplate
1756
+ }
1757
+ ],
1758
+ [{
1759
+ satoshis: 9000,
1760
+ lockingScript: p2pkh.lock(publicKeyHash)
1761
+ }],
1762
+ 0
1763
+ )
1764
+
1765
+ // Create a mock wallet
1766
+ const mockWallet = new MockWallet()
1767
+
1768
+ // Complete the transaction with the wallet
1769
+ await tx.completeWithWallet(mockWallet, 'Test with template')
1770
+
1771
+ // Verify that signAction was called
1772
+ expect(mockWallet.signActionCalled).toBe(true)
1773
+ expect(mockWallet.lastSignActionArgs).not.toBeNull()
1774
+ expect(mockWallet.lastSignActionArgs.reference).toBe('test-reference-123')
1775
+ expect(mockWallet.lastSignActionArgs.spends).toHaveProperty('0')
1776
+ expect(mockWallet.lastSignActionArgs.spends[0].unlockingScript).toBe(Script.fromASM('OP_1 OP_2').toHex())
1777
+
1778
+ // Verify that createAction was called with signAndProcess: false
1779
+ expect(mockWallet.lastCreateActionArgs).not.toBeNull()
1780
+ expect(mockWallet.lastCreateActionArgs!.options?.signAndProcess).toBe(false)
1781
+ expect(mockWallet.lastCreateActionArgs!.inputs).toHaveLength(1)
1782
+ const firstInput = mockWallet.lastCreateActionArgs!.inputs![0]
1783
+ expect(firstInput).toBeDefined()
1784
+ expect(firstInput.unlockingScriptLength).toBe(73)
1785
+ })
1786
+
1787
+ it('should handle mixed inputs with both templates and scripts', async () => {
1788
+ // Create a private key and address for testing
1789
+ const privateKey = new PrivateKey(1)
1790
+ const publicKey = new Curve().g.mul(privateKey)
1791
+ const publicKeyHash = hash160(publicKey.encode(true)) as number[]
1792
+ const p2pkh = new P2PKH()
1793
+
1794
+ // Create source transactions
1795
+ const sourceTx1 = new Transaction(
1796
+ 1,
1797
+ [],
1798
+ [{
1799
+ lockingScript: p2pkh.lock(publicKeyHash),
1800
+ satoshis: 10000
1801
+ }],
1802
+ 0
1803
+ )
1804
+
1805
+ const sourceTx2 = new Transaction(
1806
+ 1,
1807
+ [],
1808
+ [{
1809
+ lockingScript: p2pkh.lock(publicKeyHash),
1810
+ satoshis: 5000
1811
+ }],
1812
+ 0
1813
+ )
1814
+
1815
+ // Create a mock template
1816
+ const mockTemplate = {
1817
+ sign: async (tx: Transaction, inputIndex: number): Promise<UnlockingScript> => {
1818
+ return Script.fromASM('OP_1 OP_2')
1819
+ },
1820
+ estimateLength: async (tx: Transaction, inputIndex: number): Promise<number> => {
1821
+ return 73
1822
+ }
1823
+ }
1824
+
1825
+ // Create a transaction with mixed inputs
1826
+ const tx = new Transaction(
1827
+ 1,
1828
+ [
1829
+ {
1830
+ sourceTransaction: sourceTx1,
1831
+ sourceOutputIndex: 0,
1832
+ sequence: 0xffffffff,
1833
+ unlockingScriptTemplate: mockTemplate // First input uses template
1834
+ },
1835
+ {
1836
+ sourceTransaction: sourceTx2,
1837
+ sourceOutputIndex: 0,
1838
+ sequence: 0xffffffff,
1839
+ unlockingScript: Script.fromASM('OP_3 OP_4') // Second input has script already
1840
+ }
1841
+ ],
1842
+ [{
1843
+ satoshis: 14000,
1844
+ lockingScript: p2pkh.lock(publicKeyHash)
1845
+ }],
1846
+ 0
1847
+ )
1848
+
1849
+ // Create a mock wallet
1850
+ const mockWallet = new MockWallet()
1851
+
1852
+ // Complete the transaction with the wallet
1853
+ await tx.completeWithWallet(mockWallet, 'Test with mixed inputs')
1854
+
1855
+ // Verify that signAction was called (because at least one template exists)
1856
+ expect(mockWallet.signActionCalled).toBe(true)
1857
+
1858
+ // Verify spends includes both inputs
1859
+ expect(mockWallet.lastSignActionArgs.spends).toHaveProperty('0')
1860
+ expect(mockWallet.lastSignActionArgs.spends).toHaveProperty('1')
1861
+
1862
+ // First input should have template-generated script
1863
+ expect(mockWallet.lastSignActionArgs.spends[0].unlockingScript).toBe(Script.fromASM('OP_1 OP_2').toHex())
1864
+
1865
+ // Second input should have pre-existing script
1866
+ expect(mockWallet.lastSignActionArgs.spends[1].unlockingScript).toBe(Script.fromASM('OP_3 OP_4').toHex())
1867
+
1868
+ // Verify createAction args
1869
+ const firstInputArg = mockWallet.lastCreateActionArgs!.inputs![0]
1870
+ const secondInputArg = mockWallet.lastCreateActionArgs!.inputs![1]
1871
+ expect(firstInputArg).toBeDefined()
1872
+ expect(secondInputArg).toBeDefined()
1873
+ expect(firstInputArg.unlockingScriptLength).toBe(73)
1874
+ expect(secondInputArg.unlockingScript).toBe(Script.fromASM('OP_3 OP_4').toHex())
1875
+ })
1876
+
1877
+ it('should throw error when template input has neither script nor template', async () => {
1878
+ const privateKey = new PrivateKey(1)
1879
+ const publicKey = new Curve().g.mul(privateKey)
1880
+ const publicKeyHash = hash160(publicKey.encode(true)) as number[]
1881
+ const p2pkh = new P2PKH()
1882
+
1883
+ const sourceTx1 = new Transaction(
1884
+ 1,
1885
+ [],
1886
+ [{
1887
+ lockingScript: p2pkh.lock(publicKeyHash),
1888
+ satoshis: 10000
1889
+ }],
1890
+ 0
1891
+ )
1892
+
1893
+ const sourceTx2 = new Transaction(
1894
+ 1,
1895
+ [],
1896
+ [{
1897
+ lockingScript: p2pkh.lock(publicKeyHash),
1898
+ satoshis: 5000
1899
+ }],
1900
+ 0
1901
+ )
1902
+
1903
+ // Mock template for first input
1904
+ const mockTemplate = {
1905
+ sign: async (tx: Transaction, inputIndex: number): Promise<UnlockingScript> => {
1906
+ return Script.fromASM('OP_1 OP_2')
1907
+ },
1908
+ estimateLength: async (tx: Transaction, inputIndex: number): Promise<number> => {
1909
+ return 73
1910
+ }
1911
+ }
1912
+
1913
+ // Create transaction where second input has neither script nor template
1914
+ const tx = new Transaction(
1915
+ 1,
1916
+ [
1917
+ {
1918
+ sourceTransaction: sourceTx1,
1919
+ sourceOutputIndex: 0,
1920
+ sequence: 0xffffffff,
1921
+ unlockingScriptTemplate: mockTemplate
1922
+ },
1923
+ {
1924
+ sourceTransaction: sourceTx2,
1925
+ sourceOutputIndex: 0,
1926
+ sequence: 0xffffffff
1927
+ // No unlockingScript or unlockingScriptTemplate
1928
+ }
1929
+ ],
1930
+ [{
1931
+ satoshis: 14000,
1932
+ lockingScript: p2pkh.lock(publicKeyHash)
1933
+ }],
1934
+ 0
1935
+ )
1936
+
1937
+ const mockWallet = new MockWallet()
1938
+
1939
+ // Should throw error about missing script/template on input 1
1940
+ await expect(tx.completeWithWallet(mockWallet))
1941
+ .rejects
1942
+ .toThrow('Input 1 must have either an unlockingScript or unlockingScriptTemplate')
1943
+ })
1944
+
1945
+ it('should pass options to createAction for standard flow', async () => {
1946
+ // Create a simple transaction
1947
+ const sourceTx = new Transaction(1, [], [{ lockingScript: testP2PKHScript, satoshis: 10000 }], 0)
1948
+ const tx = new Transaction(
1949
+ 1,
1950
+ [{
1951
+ sourceTransaction: sourceTx,
1952
+ sourceOutputIndex: 0,
1953
+ sequence: 0xffffffff,
1954
+ unlockingScript: Script.fromASM('OP_0 OP_0')
1955
+ }],
1956
+ [{ satoshis: 9000, lockingScript: testP2PKHScript }],
1957
+ 0
1958
+ )
1959
+
1960
+ const mockWallet = new MockWallet()
1961
+ const options = {
1962
+ noSend: true,
1963
+ acceptDelayedBroadcast: false,
1964
+ returnTXIDOnly: true
1965
+ }
1966
+
1967
+ await tx.completeWithWallet(mockWallet, 'Test with options', undefined, options)
1968
+
1969
+ // Verify options were passed to createAction
1970
+ expect(mockWallet.lastCreateActionArgs?.options).toEqual(options)
1971
+ })
1972
+
1973
+ it('should pass options to both createAction and signAction for template flow', async () => {
1974
+ // Create transaction with template
1975
+ const sourceTx = new Transaction(1, [], [{ lockingScript: testP2PKHScript, satoshis: 10000 }], 0)
1976
+ const tx = new Transaction(
1977
+ 1,
1978
+ [{
1979
+ sourceTransaction: sourceTx,
1980
+ sourceOutputIndex: 0,
1981
+ sequence: 0xffffffff,
1982
+ unlockingScriptTemplate: {
1983
+ sign: async (tx, inputIndex) => Script.fromASM('OP_0 OP_0'),
1984
+ estimateLength: async (tx, inputIndex) => 100
1985
+ }
1986
+ }],
1987
+ [{ satoshis: 9000, lockingScript: testP2PKHScript }],
1988
+ 0
1989
+ )
1990
+
1991
+ const mockWallet = new MockWallet()
1992
+ const options = {
1993
+ noSend: true,
1994
+ acceptDelayedBroadcast: false,
1995
+ returnTXIDOnly: true,
1996
+ trustSelf: 'known' as any,
1997
+ randomizeOutputs: false
1998
+ }
1999
+
2000
+ await tx.completeWithWallet(mockWallet, 'Test template with options', undefined, options)
2001
+
2002
+ // Verify signAndProcess: false was set for createAction (required for template flow)
2003
+ expect(mockWallet.lastCreateActionArgs?.options?.signAndProcess).toBe(false)
2004
+
2005
+ // Verify other options were passed to createAction
2006
+ expect(mockWallet.lastCreateActionArgs?.options?.trustSelf).toBe('known')
2007
+ expect(mockWallet.lastCreateActionArgs?.options?.randomizeOutputs).toBe(false)
2008
+
2009
+ // Verify signAction was called and received the applicable options
2010
+ expect(mockWallet.signActionCalled).toBe(true)
2011
+ expect(mockWallet.lastSignActionArgs?.options).toEqual({
2012
+ acceptDelayedBroadcast: false,
2013
+ returnTXIDOnly: true,
2014
+ noSend: true,
2015
+ sendWith: undefined
2016
+ })
2017
+ })
2018
+ })
2019
+
1382
2020
  describe('preventResourceExhaustionSmall', () => {
1383
2021
  it('should run script evaluation and pass so long as we stay within the limit', async () => {
1384
2022
  const sourceTransaction = new Transaction()