@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
@@ -0,0 +1,493 @@
1
+ import type { CommsLayer } from '../CommsLayer.js'
2
+ import type { IdentityLayer } from '../IdentityLayer.js'
3
+ import type { RemittanceModule } from '../RemittanceModule.js'
4
+ import type { ComposeInvoiceInput } from '../RemittanceManager.js'
5
+ import type { PeerMessage, RemittanceEnvelope, Termination, ThreadId } from '../types.js'
6
+ import type { WalletInterface, PubKeyHex } from '../../wallet/Wallet.interfaces.js'
7
+ import { RemittanceManager } from '../RemittanceManager.js'
8
+
9
+ type StoredMessage = PeerMessage
10
+
11
+ class MessageBus {
12
+ private messages: StoredMessage[] = []
13
+ private nextId = 1
14
+
15
+ send (sender: PubKeyHex, recipient: PubKeyHex, messageBox: string, body: string): string {
16
+ const messageId = `msg-${this.nextId++}`
17
+ this.messages.push({
18
+ messageId,
19
+ sender,
20
+ recipient,
21
+ messageBox,
22
+ body
23
+ })
24
+ return messageId
25
+ }
26
+
27
+ list (recipient: PubKeyHex, messageBox: string): StoredMessage[] {
28
+ return this.messages.filter((msg) => msg.recipient === recipient && msg.messageBox === messageBox)
29
+ }
30
+
31
+ ack (recipient: PubKeyHex, messageIds: string[]): void {
32
+ this.messages = this.messages.filter(
33
+ (msg) => msg.recipient !== recipient || !messageIds.includes(msg.messageId)
34
+ )
35
+ }
36
+ }
37
+
38
+ class TestComms implements CommsLayer {
39
+ constructor (private readonly owner: PubKeyHex, private readonly bus: MessageBus) {}
40
+
41
+ async sendMessage (args: { recipient: PubKeyHex; messageBox: string; body: string }): Promise<string> {
42
+ return this.bus.send(this.owner, args.recipient, args.messageBox, args.body)
43
+ }
44
+
45
+ async listMessages (args: { messageBox: string }): Promise<PeerMessage[]> {
46
+ return this.bus.list(this.owner, args.messageBox)
47
+ }
48
+
49
+ async acknowledgeMessage (args: { messageIds: string[] }): Promise<void> {
50
+ this.bus.ack(this.owner, args.messageIds)
51
+ }
52
+ }
53
+
54
+ const makeWallet = (identityKey: PubKeyHex): WalletInterface => ({
55
+ getPublicKey: async () => ({ publicKey: identityKey })
56
+ } as unknown as WalletInterface)
57
+
58
+ const makeInvoiceInput = (overrides: Partial<ComposeInvoiceInput> = {}): ComposeInvoiceInput => ({
59
+ lineItems: [],
60
+ total: { value: '1000', unit: { namespace: 'bsv', code: 'sat', decimals: 0 } },
61
+ note: 'Test invoice',
62
+ invoiceNumber: 'INV-1',
63
+ ...overrides
64
+ })
65
+
66
+ const parseEnvelope = (msg: StoredMessage): RemittanceEnvelope => JSON.parse(msg.body) as RemittanceEnvelope
67
+
68
+ const makeIdentityLayer = (): IdentityLayer => ({
69
+ determineCertificatesToRequest: async ({ threadId }) => ({
70
+ kind: 'identityVerificationRequest',
71
+ threadId,
72
+ request: {
73
+ types: { basic: ['name'] },
74
+ certifiers: ['certifier-key']
75
+ }
76
+ }),
77
+ respondToRequest: async ({ threadId }) => ({
78
+ action: 'respond',
79
+ response: {
80
+ kind: 'identityVerificationResponse',
81
+ threadId,
82
+ certificates: [
83
+ {
84
+ type: 'YmFzaWM=',
85
+ certifier: 'certifier-key',
86
+ subject: 'subject-key',
87
+ fields: { name: 'QWxpY2U=' },
88
+ signature: 'deadbeef',
89
+ serialNumber: 'c2VyaWFs',
90
+ revocationOutpoint: 'outpoint',
91
+ keyringForVerifier: { name: 'a2V5' }
92
+ }
93
+ ]
94
+ }
95
+ }),
96
+ assessReceivedCertificateSufficiency: async (_counterparty, _received, threadId) => ({
97
+ kind: 'identityVerificationAcknowledgment',
98
+ threadId
99
+ })
100
+ })
101
+
102
+ const makeThreadIdFactory = (): (() => ThreadId) => {
103
+ let i = 0
104
+ return () => `thread-${++i}` as ThreadId
105
+ }
106
+
107
+ const tick = async (): Promise<void> => await new Promise((resolve) => setTimeout(resolve, 0))
108
+
109
+ const waitForKind = async (
110
+ bus: MessageBus,
111
+ recipient: PubKeyHex,
112
+ kind: RemittanceEnvelope['kind'],
113
+ timeoutMs = 2000
114
+ ): Promise<void> => {
115
+ const start = Date.now()
116
+ while (Date.now() - start < timeoutMs) {
117
+ const found = bus.list(recipient, 'remittance_inbox').some((msg) => parseEnvelope(msg).kind === kind)
118
+ if (found) return
119
+ await tick()
120
+ }
121
+ throw new Error(`Timed out waiting for ${kind}`)
122
+ }
123
+
124
+ describe('RemittanceManager base flows', () => {
125
+ it('processes an invoice, settlement, and receipt end-to-end', async () => {
126
+ const bus = new MessageBus()
127
+ const moduleProcessReceipt = jest.fn()
128
+ const module: RemittanceModule<{ amountSatoshis: number }, { amountSatoshis: number }, { accepted: true }> = {
129
+ id: 'basic-module',
130
+ name: 'Basic Module',
131
+ allowUnsolicitedSettlements: false,
132
+ createOption: async ({ invoice }) => ({ amountSatoshis: Number(invoice.total.value) }),
133
+ buildSettlement: async ({ option }) => ({ action: 'settle', artifact: option }),
134
+ acceptSettlement: async ({ settlement }) => ({ action: 'accept', receiptData: { accepted: true } }),
135
+ processReceipt: moduleProcessReceipt
136
+ }
137
+
138
+ const maker = new RemittanceManager(
139
+ { remittanceModules: [module], options: { receiptProvided: true, autoIssueReceipt: true }, threadIdFactory: makeThreadIdFactory() },
140
+ makeWallet('maker-key'),
141
+ new TestComms('maker-key', bus)
142
+ )
143
+ const taker = new RemittanceManager(
144
+ { remittanceModules: [module], options: { receiptProvided: true }, threadIdFactory: makeThreadIdFactory() },
145
+ makeWallet('taker-key'),
146
+ new TestComms('taker-key', bus)
147
+ )
148
+
149
+ const invoiceHandle = await maker.sendInvoice('taker-key', makeInvoiceInput())
150
+ await taker.syncThreads()
151
+
152
+ const payPromise = taker.pay(invoiceHandle.threadId, module.id)
153
+ await waitForKind(bus, 'maker-key', 'settlement')
154
+ await maker.syncThreads()
155
+ const receipt = await payPromise
156
+
157
+ const receiptKind = receipt != null && 'kind' in receipt ? receipt.kind : undefined
158
+ expect(receiptKind).toBe('receipt')
159
+ expect(taker.getThreadOrThrow(invoiceHandle.threadId).receipt).toBeDefined()
160
+ expect(maker.getThreadOrThrow(invoiceHandle.threadId).receipt).toBeDefined()
161
+ expect(moduleProcessReceipt).toHaveBeenCalled()
162
+ })
163
+
164
+ it('accepts unsolicited settlements when the module allows it', async () => {
165
+ const bus = new MessageBus()
166
+ const module: RemittanceModule<{ note: string }, { note: string }, { ok: true }> = {
167
+ id: 'unsolicited-module',
168
+ name: 'Unsolicited Module',
169
+ allowUnsolicitedSettlements: true,
170
+ buildSettlement: async ({ option }) => ({ action: 'settle', artifact: option }),
171
+ acceptSettlement: async () => ({ action: 'accept', receiptData: { ok: true } })
172
+ }
173
+
174
+ const maker = new RemittanceManager(
175
+ { remittanceModules: [module], options: { receiptProvided: true, autoIssueReceipt: true }, threadIdFactory: makeThreadIdFactory() },
176
+ makeWallet('maker-key'),
177
+ new TestComms('maker-key', bus)
178
+ )
179
+ const taker = new RemittanceManager(
180
+ { remittanceModules: [module], options: { receiptProvided: true }, threadIdFactory: makeThreadIdFactory() },
181
+ makeWallet('taker-key'),
182
+ new TestComms('taker-key', bus)
183
+ )
184
+
185
+ const threadHandle = await taker.sendUnsolicitedSettlement('maker-key', { moduleId: module.id, option: { note: 'hello' } })
186
+ await maker.syncThreads()
187
+ await taker.syncThreads()
188
+
189
+ const makerThread = maker.getThreadOrThrow(threadHandle.threadId)
190
+ expect(makerThread.invoice).toBeUndefined()
191
+ expect(makerThread.settlement).toBeDefined()
192
+ expect(taker.getThreadOrThrow(threadHandle.threadId).settlement).toBeDefined()
193
+ })
194
+
195
+ it('waits for identity verification before invoicing when required', async () => {
196
+ const bus = new MessageBus()
197
+ const identityLayer = makeIdentityLayer()
198
+ const module: RemittanceModule<{}, {}, {}> = {
199
+ id: 'identity-module',
200
+ name: 'Identity Module',
201
+ allowUnsolicitedSettlements: false,
202
+ createOption: async () => ({}),
203
+ buildSettlement: async () => ({ action: 'settle', artifact: {} }),
204
+ acceptSettlement: async () => ({ action: 'accept', receiptData: {} })
205
+ }
206
+
207
+ const maker = new RemittanceManager(
208
+ {
209
+ remittanceModules: [module],
210
+ identityLayer,
211
+ options: {
212
+ identityOptions: { makerRequestIdentity: 'beforeInvoicing', takerRequestIdentity: 'never' },
213
+ identityTimeoutMs: 2000,
214
+ identityPollIntervalMs: 5
215
+ },
216
+ threadIdFactory: makeThreadIdFactory()
217
+ },
218
+ makeWallet('maker-key'),
219
+ new TestComms('maker-key', bus)
220
+ )
221
+ const taker = new RemittanceManager(
222
+ {
223
+ remittanceModules: [module],
224
+ identityLayer,
225
+ options: {
226
+ identityOptions: { makerRequestIdentity: 'beforeInvoicing', takerRequestIdentity: 'never' },
227
+ identityTimeoutMs: 2000,
228
+ identityPollIntervalMs: 5
229
+ },
230
+ threadIdFactory: makeThreadIdFactory()
231
+ },
232
+ makeWallet('taker-key'),
233
+ new TestComms('taker-key', bus)
234
+ )
235
+
236
+ const sendPromise = maker.sendInvoice('taker-key', makeInvoiceInput())
237
+ await tick()
238
+ const preIdentity = bus.list('taker-key', 'remittance_inbox')
239
+ expect(preIdentity).toHaveLength(1)
240
+ expect(parseEnvelope(preIdentity[0]).kind).toBe('identityVerificationRequest')
241
+
242
+ await taker.syncThreads()
243
+ const invoiceHandle = await sendPromise
244
+ const postIdentity = bus.list('taker-key', 'remittance_inbox')
245
+ const kinds = postIdentity.map((msg) => parseEnvelope(msg).kind)
246
+ expect(kinds).toContain('invoice')
247
+ expect(kinds).toContain('identityVerificationAcknowledgment')
248
+
249
+ await taker.syncThreads()
250
+ const takerThread = taker.getThreadOrThrow(invoiceHandle.threadId)
251
+ expect(takerThread.flags.hasIdentified).toBe(true)
252
+ })
253
+
254
+ it('waits for identity verification before settlement when required', async () => {
255
+ const bus = new MessageBus()
256
+ const identityLayer = makeIdentityLayer()
257
+ const module: RemittanceModule<{ amount: number }, { amount: number }, {}> = {
258
+ id: 'settlement-module',
259
+ name: 'Settlement Module',
260
+ allowUnsolicitedSettlements: false,
261
+ createOption: async () => ({ amount: 1 }),
262
+ buildSettlement: async ({ option }) => ({ action: 'settle', artifact: option }),
263
+ acceptSettlement: async () => ({ action: 'accept', receiptData: {} })
264
+ }
265
+
266
+ const maker = new RemittanceManager(
267
+ { remittanceModules: [module], identityLayer, threadIdFactory: makeThreadIdFactory() },
268
+ makeWallet('maker-key'),
269
+ new TestComms('maker-key', bus)
270
+ )
271
+ const taker = new RemittanceManager(
272
+ {
273
+ remittanceModules: [module],
274
+ identityLayer,
275
+ options: {
276
+ identityOptions: { makerRequestIdentity: 'never', takerRequestIdentity: 'beforeSettlement' },
277
+ receiptProvided: false,
278
+ identityTimeoutMs: 2000,
279
+ identityPollIntervalMs: 5
280
+ },
281
+ threadIdFactory: makeThreadIdFactory()
282
+ },
283
+ makeWallet('taker-key'),
284
+ new TestComms('taker-key', bus)
285
+ )
286
+
287
+ const invoiceHandle = await maker.sendInvoice('taker-key', makeInvoiceInput())
288
+ await taker.syncThreads()
289
+
290
+ const payPromise = taker.pay(invoiceHandle.threadId, module.id)
291
+ await tick()
292
+ const preSettlement = bus.list('maker-key', 'remittance_inbox')
293
+ expect(preSettlement).toHaveLength(1)
294
+ expect(parseEnvelope(preSettlement[0]).kind).toBe('identityVerificationRequest')
295
+
296
+ await maker.syncThreads()
297
+ await payPromise
298
+ const postSettlement = bus.list('maker-key', 'remittance_inbox')
299
+ const kinds = postSettlement.map((msg) => parseEnvelope(msg).kind)
300
+ expect(kinds).toContain('settlement')
301
+ })
302
+
303
+ it('sends termination when a module refuses to build a settlement', async () => {
304
+ const bus = new MessageBus()
305
+ const termination: Termination = { code: 'rejected', message: 'No thanks' }
306
+ const module: RemittanceModule<{}, {}, {}> = {
307
+ id: 'terminator',
308
+ name: 'Terminator',
309
+ allowUnsolicitedSettlements: false,
310
+ createOption: async () => ({}),
311
+ buildSettlement: async () => ({ action: 'terminate', termination }),
312
+ acceptSettlement: async () => ({ action: 'accept', receiptData: {} })
313
+ }
314
+
315
+ const maker = new RemittanceManager(
316
+ { remittanceModules: [module], threadIdFactory: makeThreadIdFactory() },
317
+ makeWallet('maker-key'),
318
+ new TestComms('maker-key', bus)
319
+ )
320
+ const taker = new RemittanceManager(
321
+ { remittanceModules: [module], options: { receiptProvided: false }, threadIdFactory: makeThreadIdFactory() },
322
+ makeWallet('taker-key'),
323
+ new TestComms('taker-key', bus)
324
+ )
325
+
326
+ const invoiceHandle = await maker.sendInvoice('taker-key', makeInvoiceInput())
327
+ await taker.syncThreads()
328
+
329
+ const result = await taker.pay(invoiceHandle.threadId, module.id)
330
+ expect(result).toEqual(termination)
331
+
332
+ const messages = bus.list('maker-key', 'remittance_inbox')
333
+ expect(messages).toHaveLength(1)
334
+ expect(parseEnvelope(messages[0]).kind).toBe('termination')
335
+ })
336
+
337
+ it('records state transitions and emits events', async () => {
338
+ const bus = new MessageBus()
339
+ const module: RemittanceModule<{}, {}, {}> = {
340
+ id: 'event-module',
341
+ name: 'Event Module',
342
+ allowUnsolicitedSettlements: false,
343
+ createOption: async () => ({}),
344
+ buildSettlement: async () => ({ action: 'settle', artifact: {} }),
345
+ acceptSettlement: async () => ({ action: 'accept', receiptData: {} })
346
+ }
347
+
348
+ const events: string[] = []
349
+ const maker = new RemittanceManager(
350
+ {
351
+ remittanceModules: [module],
352
+ events: {
353
+ onThreadCreated: () => events.push('threadCreated'),
354
+ onStateChanged: (event) => events.push(`state:${event.next}`),
355
+ onInvoiceSent: () => events.push('invoiceSent')
356
+ },
357
+ threadIdFactory: makeThreadIdFactory()
358
+ },
359
+ makeWallet('maker-key'),
360
+ new TestComms('maker-key', bus)
361
+ )
362
+
363
+ const handle = await maker.sendInvoice('taker-key', makeInvoiceInput())
364
+ const thread = maker.getThreadOrThrow(handle.threadId)
365
+ expect(thread.stateLog.length).toBeGreaterThan(0)
366
+ expect(thread.state).toBe('invoiced')
367
+ expect(events).toContain('threadCreated')
368
+ expect(events).toContain('state:invoiced')
369
+ expect(events).toContain('invoiceSent')
370
+ })
371
+
372
+ it('allows waiting for thread state transitions via handles', async () => {
373
+ const bus = new MessageBus()
374
+ const module: RemittanceModule<{}, {}, {}> = {
375
+ id: 'wait-module',
376
+ name: 'Wait Module',
377
+ allowUnsolicitedSettlements: false,
378
+ createOption: async () => ({}),
379
+ buildSettlement: async () => ({ action: 'settle', artifact: {} }),
380
+ acceptSettlement: async () => ({ action: 'accept', receiptData: {} })
381
+ }
382
+
383
+ const maker = new RemittanceManager(
384
+ { remittanceModules: [module], threadIdFactory: makeThreadIdFactory() },
385
+ makeWallet('maker-key'),
386
+ new TestComms('maker-key', bus)
387
+ )
388
+
389
+ const handle = await maker.sendInvoice('taker-key', makeInvoiceInput())
390
+ const awaited = await handle.waitForState('invoiced', { timeoutMs: 50, pollIntervalMs: 5 })
391
+ expect(awaited.threadId).toBe(handle.threadId)
392
+ })
393
+
394
+ it('marks a thread as errored on invalid state transition', async () => {
395
+ const bus = new MessageBus()
396
+ const module: RemittanceModule<{}, {}, {}> = {
397
+ id: 'error-module',
398
+ name: 'Error Module',
399
+ allowUnsolicitedSettlements: false,
400
+ createOption: async () => ({}),
401
+ buildSettlement: async () => ({ action: 'settle', artifact: {} }),
402
+ acceptSettlement: async () => ({ action: 'accept', receiptData: {} })
403
+ }
404
+
405
+ const maker = new RemittanceManager(
406
+ { remittanceModules: [module], threadIdFactory: makeThreadIdFactory() },
407
+ makeWallet('maker-key'),
408
+ new TestComms('maker-key', bus)
409
+ )
410
+
411
+ const receiptEnv: RemittanceEnvelope = {
412
+ v: 1,
413
+ id: 'env-1' as ThreadId,
414
+ kind: 'receipt',
415
+ threadId: 'thread-1' as ThreadId,
416
+ createdAt: 1,
417
+ payload: {
418
+ kind: 'receipt',
419
+ threadId: 'thread-1',
420
+ moduleId: 'error-module',
421
+ optionId: 'error-module',
422
+ payee: 'maker-key',
423
+ payer: 'taker-key',
424
+ createdAt: 1,
425
+ receiptData: {}
426
+ }
427
+ }
428
+ bus.send('taker-key', 'maker-key', 'remittance_inbox', JSON.stringify(receiptEnv))
429
+ await maker.syncThreads()
430
+
431
+ const thread = maker.getThreadOrThrow('thread-1' as ThreadId)
432
+ expect(thread.state).toBe('errored')
433
+ expect(thread.flags.error).toBe(true)
434
+ })
435
+
436
+ it('processes live messages when CommsLayer supports streaming', async () => {
437
+ const module: RemittanceModule<{}, {}, {}> = {
438
+ id: 'live-module',
439
+ name: 'Live Module',
440
+ allowUnsolicitedSettlements: false,
441
+ createOption: async () => ({}),
442
+ buildSettlement: async () => ({ action: 'settle', artifact: {} }),
443
+ acceptSettlement: async () => ({ action: 'accept', receiptData: {} })
444
+ }
445
+
446
+ const invoiceEnv: RemittanceEnvelope = {
447
+ v: 1,
448
+ id: 'env-live',
449
+ kind: 'invoice',
450
+ threadId: 'thread-live',
451
+ createdAt: 1,
452
+ payload: {
453
+ kind: 'invoice',
454
+ threadId: 'thread-live',
455
+ payee: 'maker-key',
456
+ payer: 'taker-key',
457
+ lineItems: [],
458
+ total: { value: '1000', unit: { namespace: 'bsv', code: 'sat', decimals: 0 } },
459
+ invoiceNumber: 'INV-LIVE',
460
+ createdAt: 1,
461
+ options: {}
462
+ }
463
+ }
464
+
465
+ const acknowledgeMessage = jest.fn(async () => undefined)
466
+ const comms: CommsLayer = {
467
+ sendMessage: async () => 'noop',
468
+ listMessages: async () => [],
469
+ acknowledgeMessage,
470
+ listenForLiveMessages: async ({ onMessage }) => {
471
+ await onMessage({
472
+ messageId: 'live-1',
473
+ sender: 'maker-key',
474
+ recipient: 'taker-key',
475
+ messageBox: 'remittance_inbox',
476
+ body: JSON.stringify(invoiceEnv)
477
+ })
478
+ }
479
+ }
480
+
481
+ const taker = new RemittanceManager(
482
+ { remittanceModules: [module], threadIdFactory: makeThreadIdFactory() },
483
+ makeWallet('taker-key'),
484
+ comms
485
+ )
486
+
487
+ await taker.startListening()
488
+ expect(acknowledgeMessage).toHaveBeenCalledWith({ messageIds: ['live-1'] })
489
+ const thread = taker.getThreadOrThrow('thread-live' as ThreadId)
490
+ expect(thread.invoice).toBeDefined()
491
+ expect(thread.state).toBe('invoiced')
492
+ })
493
+ })
@@ -0,0 +1,130 @@
1
+ import {
2
+ RemittanceEnvelope,
3
+ Invoice,
4
+ IdentityVerificationRequest,
5
+ IdentityVerificationResponse,
6
+ IdentityVerificationAcknowledgment,
7
+ Settlement,
8
+ Receipt,
9
+ SAT_UNIT
10
+ } from '../types.js'
11
+
12
+ /** Example invoice envelope. */
13
+ const exampleInvoice: RemittanceEnvelope<'invoice', Invoice> = {
14
+ v: 1,
15
+ id: '123',
16
+ kind: 'invoice',
17
+ threadId: 'thread-abc',
18
+ createdAt: Date.now(),
19
+ payload: {
20
+ kind: 'invoice',
21
+ threadId: 'thread-abc',
22
+ payee: 'identity-key-1',
23
+ payer: 'identity-key-2',
24
+ lineItems: [
25
+ { description: 'Test item', amount: { value: '100', unit: SAT_UNIT } },
26
+ { description: 'Another item', quantity: '3', amount: { value: '50', unit: SAT_UNIT } }
27
+ ],
28
+ note: 'This is a test invoice',
29
+ total: { value: '150', unit: { namespace: 'bsv', code: 'sat', decimals: 0 } },
30
+ invoiceNumber: 'INV-123',
31
+ options: {
32
+ 'module-1': { someOptionField: 'someValue' },
33
+ 'module-2': { anotherOptionField: 42 }
34
+ },
35
+ createdAt: Date.now(),
36
+ }
37
+ }
38
+
39
+ /** Example identity verification request envelope. */
40
+ const exampleIdentityVerificationRequest: RemittanceEnvelope<'identityVerificationRequest', IdentityVerificationRequest> = {
41
+ v: 1,
42
+ id: 'identity-verification-request-123',
43
+ kind: 'identityVerificationRequest',
44
+ threadId: 'thread-abc',
45
+ createdAt: Date.now(),
46
+ payload: {
47
+ kind: 'identityVerificationRequest',
48
+ threadId: 'thread-abc',
49
+ request: {
50
+ types: { personalId: ['name', 'dob'], businessId: ['duns'] },
51
+ certifiers: ['certifier1', 'certifier2']
52
+ }
53
+ }
54
+ }
55
+
56
+ /** Example identity verification response envelope. */
57
+ const exampleIdentityVerificationResponse: RemittanceEnvelope<'identityVerificationResponse', IdentityVerificationResponse> = {
58
+ v: 1,
59
+ id: 'identity-verification-response-123',
60
+ kind: 'identityVerificationResponse',
61
+ threadId: 'thread-abc',
62
+ createdAt: Date.now(),
63
+ payload: {
64
+ kind: 'identityVerificationResponse',
65
+ threadId: 'thread-abc',
66
+ certificates: [{
67
+ type: 'personalId',
68
+ certifier: 'certifier1',
69
+ subject: 'identity-key-2',
70
+ fields: { name: 'Alice', dob: '1990-01-01' },
71
+ signature: 'signature1',
72
+ serialNumber: 'serial1',
73
+ revocationOutpoint: 'outpoint1',
74
+ keyringForVerifier: {
75
+ name: 'key-for-name'
76
+ }
77
+ }]
78
+ }
79
+ }
80
+
81
+ /** Example identity verification acknowledgment envelope. */
82
+ const exampleIdentityVerificationAcknowledgment: RemittanceEnvelope<'identityVerificationAcknowledgment', IdentityVerificationAcknowledgment> = {
83
+ v: 1,
84
+ id: 'identity-verification-ack-123',
85
+ kind: 'identityVerificationAcknowledgment',
86
+ threadId: 'thread-abc',
87
+ createdAt: Date.now(),
88
+ payload: {
89
+ kind: 'identityVerificationAcknowledgment',
90
+ threadId: 'thread-abc'
91
+ }
92
+ }
93
+
94
+ /** Example settlement envelope. */
95
+ const exampleSettlement: RemittanceEnvelope<'settlement', Settlement> = {
96
+ v: 1,
97
+ id: 'settlement-123',
98
+ kind: 'settlement',
99
+ threadId: 'thread-abc',
100
+ createdAt: Date.now(),
101
+ payload: {
102
+ kind: 'settlement',
103
+ threadId: 'thread-abc',
104
+ moduleId: 'module-1',
105
+ optionId: 'option-1',
106
+ sender: 'identity-key-1',
107
+ createdAt: Date.now(),
108
+ artifact: { txid: 'txid-abc' },
109
+ note: 'Test note'
110
+ }
111
+ }
112
+
113
+ /** Example receipt envelope. */
114
+ const exampleReceipt: RemittanceEnvelope<'receipt', Receipt> = {
115
+ v: 1,
116
+ id: 'receipt-123',
117
+ kind: 'receipt',
118
+ threadId: 'thread-abc',
119
+ createdAt: Date.now(),
120
+ payload: {
121
+ kind: 'receipt',
122
+ threadId: 'thread-abc',
123
+ moduleId: 'module-1',
124
+ optionId: 'option-1',
125
+ payee: 'identity-key-1',
126
+ payer: 'identity-key-2',
127
+ createdAt: Date.now(),
128
+ receiptData: { txid: 'txid-abc' }
129
+ }
130
+ }
@@ -0,0 +1,6 @@
1
+ export * from './CommsLayer.js'
2
+ export * from './IdentityLayer.js'
3
+ export * from './RemittanceManager.js'
4
+ export * from './RemittanceModule.js'
5
+ export * from './modules/index.js'
6
+ export * from './types.js'