@bsv/sdk 2.0.16 → 2.1.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 (405) hide show
  1. package/README.md +7 -7
  2. package/dist/cjs/package.json +14 -13
  3. package/dist/cjs/src/auth/Peer.js +8 -13
  4. package/dist/cjs/src/auth/Peer.js.map +1 -1
  5. package/dist/cjs/src/auth/SessionManager.js +4 -7
  6. package/dist/cjs/src/auth/SessionManager.js.map +1 -1
  7. package/dist/cjs/src/auth/certificates/MasterCertificate.js +1 -1
  8. package/dist/cjs/src/auth/certificates/MasterCertificate.js.map +1 -1
  9. package/dist/cjs/src/auth/certificates/__tests/CompletedProtoWallet.js +1 -1
  10. package/dist/cjs/src/auth/certificates/__tests/CompletedProtoWallet.js.map +1 -1
  11. package/dist/cjs/src/auth/clients/AuthFetch.js +32 -32
  12. package/dist/cjs/src/auth/clients/AuthFetch.js.map +1 -1
  13. package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js +4 -4
  14. package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js.map +1 -1
  15. package/dist/cjs/src/compat/ECIES.js +29 -34
  16. package/dist/cjs/src/compat/ECIES.js.map +1 -1
  17. package/dist/cjs/src/compat/HD.js +9 -4
  18. package/dist/cjs/src/compat/HD.js.map +1 -1
  19. package/dist/cjs/src/compat/Mnemonic.js +12 -12
  20. package/dist/cjs/src/compat/Mnemonic.js.map +1 -1
  21. package/dist/cjs/src/identity/ContactsManager.js +172 -232
  22. package/dist/cjs/src/identity/ContactsManager.js.map +1 -1
  23. package/dist/cjs/src/identity/IdentityClient.js +122 -55
  24. package/dist/cjs/src/identity/IdentityClient.js.map +1 -1
  25. package/dist/cjs/src/kvstore/GlobalKVStore.js +30 -31
  26. package/dist/cjs/src/kvstore/GlobalKVStore.js.map +1 -1
  27. package/dist/cjs/src/kvstore/LocalKVStore.js +9 -9
  28. package/dist/cjs/src/kvstore/LocalKVStore.js.map +1 -1
  29. package/dist/cjs/src/kvstore/kvStoreInterpreter.js +2 -2
  30. package/dist/cjs/src/kvstore/kvStoreInterpreter.js.map +1 -1
  31. package/dist/cjs/src/messages/SignedMessage.js +1 -1
  32. package/dist/cjs/src/messages/SignedMessage.js.map +1 -1
  33. package/dist/cjs/src/overlay-tools/Historian.js +1 -1
  34. package/dist/cjs/src/overlay-tools/Historian.js.map +1 -1
  35. package/dist/cjs/src/overlay-tools/LookupResolver.js +139 -46
  36. package/dist/cjs/src/overlay-tools/LookupResolver.js.map +1 -1
  37. package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js +75 -146
  38. package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js.map +1 -1
  39. package/dist/cjs/src/primitives/AESGCM.js +2 -2
  40. package/dist/cjs/src/primitives/AESGCM.js.map +1 -1
  41. package/dist/cjs/src/primitives/BigNumber.js +164 -148
  42. package/dist/cjs/src/primitives/BigNumber.js.map +1 -1
  43. package/dist/cjs/src/primitives/Curve.js +17 -15
  44. package/dist/cjs/src/primitives/Curve.js.map +1 -1
  45. package/dist/cjs/src/primitives/ECDSA.js +12 -7
  46. package/dist/cjs/src/primitives/ECDSA.js.map +1 -1
  47. package/dist/cjs/src/primitives/Hash.js +140 -56
  48. package/dist/cjs/src/primitives/Hash.js.map +1 -1
  49. package/dist/cjs/src/primitives/JacobianPoint.js +8 -8
  50. package/dist/cjs/src/primitives/JacobianPoint.js.map +1 -1
  51. package/dist/cjs/src/primitives/K256.js +3 -3
  52. package/dist/cjs/src/primitives/K256.js.map +1 -1
  53. package/dist/cjs/src/primitives/Point.js +36 -40
  54. package/dist/cjs/src/primitives/Point.js.map +1 -1
  55. package/dist/cjs/src/primitives/PrivateKey.js +4 -4
  56. package/dist/cjs/src/primitives/PrivateKey.js.map +1 -1
  57. package/dist/cjs/src/primitives/PublicKey.js +4 -4
  58. package/dist/cjs/src/primitives/PublicKey.js.map +1 -1
  59. package/dist/cjs/src/primitives/Random.js +10 -14
  60. package/dist/cjs/src/primitives/Random.js.map +1 -1
  61. package/dist/cjs/src/primitives/ReaderUint8Array.js +6 -6
  62. package/dist/cjs/src/primitives/ReaderUint8Array.js.map +1 -1
  63. package/dist/cjs/src/primitives/Schnorr.js +2 -2
  64. package/dist/cjs/src/primitives/Schnorr.js.map +1 -1
  65. package/dist/cjs/src/primitives/Secp256r1.js +2 -1
  66. package/dist/cjs/src/primitives/Secp256r1.js.map +1 -1
  67. package/dist/cjs/src/primitives/Signature.js +8 -8
  68. package/dist/cjs/src/primitives/Signature.js.map +1 -1
  69. package/dist/cjs/src/primitives/TransactionSignature.js +20 -21
  70. package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -1
  71. package/dist/cjs/src/primitives/utils.js +39 -46
  72. package/dist/cjs/src/primitives/utils.js.map +1 -1
  73. package/dist/cjs/src/registry/RegistryClient.js +31 -23
  74. package/dist/cjs/src/registry/RegistryClient.js.map +1 -1
  75. package/dist/cjs/src/remittance/RemittanceManager.js +19 -18
  76. package/dist/cjs/src/remittance/RemittanceManager.js.map +1 -1
  77. package/dist/cjs/src/remittance/modules/BasicBRC29.js.map +1 -1
  78. package/dist/cjs/src/script/Script.js +93 -170
  79. package/dist/cjs/src/script/Script.js.map +1 -1
  80. package/dist/cjs/src/script/ScriptEvaluationError.js +2 -2
  81. package/dist/cjs/src/script/ScriptEvaluationError.js.map +1 -1
  82. package/dist/cjs/src/script/Spend.js +14 -12
  83. package/dist/cjs/src/script/Spend.js.map +1 -1
  84. package/dist/cjs/src/script/templates/PushDrop.js +22 -18
  85. package/dist/cjs/src/script/templates/PushDrop.js.map +1 -1
  86. package/dist/cjs/src/script/templates/RPuzzle.js +2 -4
  87. package/dist/cjs/src/script/templates/RPuzzle.js.map +1 -1
  88. package/dist/cjs/src/storage/StorageDownloader.js +42 -9
  89. package/dist/cjs/src/storage/StorageDownloader.js.map +1 -1
  90. package/dist/cjs/src/totp/totp.js +1 -1
  91. package/dist/cjs/src/totp/totp.js.map +1 -1
  92. package/dist/cjs/src/transaction/Beef.js +239 -192
  93. package/dist/cjs/src/transaction/Beef.js.map +1 -1
  94. package/dist/cjs/src/transaction/BeefConstants.js +19 -0
  95. package/dist/cjs/src/transaction/BeefConstants.js.map +1 -0
  96. package/dist/cjs/src/transaction/BeefTx.js +12 -12
  97. package/dist/cjs/src/transaction/BeefTx.js.map +1 -1
  98. package/dist/cjs/src/transaction/MerklePath.js +4 -4
  99. package/dist/cjs/src/transaction/MerklePath.js.map +1 -1
  100. package/dist/cjs/src/transaction/Transaction.js +49 -52
  101. package/dist/cjs/src/transaction/Transaction.js.map +1 -1
  102. package/dist/cjs/src/transaction/fee-models/SatoshisPerKilobyte.js +1 -1
  103. package/dist/cjs/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -1
  104. package/dist/cjs/src/transaction/http/BinaryFetchClient.js +9 -9
  105. package/dist/cjs/src/transaction/http/BinaryFetchClient.js.map +1 -1
  106. package/dist/cjs/src/transaction/http/DefaultHttpClient.js +9 -9
  107. package/dist/cjs/src/transaction/http/DefaultHttpClient.js.map +1 -1
  108. package/dist/cjs/src/wallet/CachedKeyDeriver.js +1 -1
  109. package/dist/cjs/src/wallet/CachedKeyDeriver.js.map +1 -1
  110. package/dist/cjs/src/wallet/WalletClient.js.map +1 -1
  111. package/dist/cjs/src/wallet/WalletError.js.map +1 -1
  112. package/dist/cjs/src/wallet/substrates/HTTPWalletJSON.js +5 -4
  113. package/dist/cjs/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
  114. package/dist/cjs/src/wallet/substrates/ReactNativeWebView.js +9 -9
  115. package/dist/cjs/src/wallet/substrates/ReactNativeWebView.js.map +1 -1
  116. package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js +92 -92
  117. package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
  118. package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js +387 -711
  119. package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
  120. package/dist/cjs/src/wallet/substrates/XDM.js +4 -4
  121. package/dist/cjs/src/wallet/substrates/XDM.js.map +1 -1
  122. package/dist/cjs/src/wallet/substrates/window.CWI.js +2 -2
  123. package/dist/cjs/src/wallet/substrates/window.CWI.js.map +1 -1
  124. package/dist/cjs/src/wallet/validationHelpers.js +9 -9
  125. package/dist/cjs/src/wallet/validationHelpers.js.map +1 -1
  126. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  127. package/dist/esm/src/auth/Peer.js +25 -13
  128. package/dist/esm/src/auth/Peer.js.map +1 -1
  129. package/dist/esm/src/auth/SessionManager.js +4 -7
  130. package/dist/esm/src/auth/SessionManager.js.map +1 -1
  131. package/dist/esm/src/auth/certificates/MasterCertificate.js +1 -1
  132. package/dist/esm/src/auth/certificates/MasterCertificate.js.map +1 -1
  133. package/dist/esm/src/auth/certificates/__tests/CompletedProtoWallet.js +1 -1
  134. package/dist/esm/src/auth/certificates/__tests/CompletedProtoWallet.js.map +1 -1
  135. package/dist/esm/src/auth/clients/AuthFetch.js +32 -32
  136. package/dist/esm/src/auth/clients/AuthFetch.js.map +1 -1
  137. package/dist/esm/src/auth/transports/SimplifiedFetchTransport.js +4 -4
  138. package/dist/esm/src/auth/transports/SimplifiedFetchTransport.js.map +1 -1
  139. package/dist/esm/src/compat/ECIES.js +29 -34
  140. package/dist/esm/src/compat/ECIES.js.map +1 -1
  141. package/dist/esm/src/compat/HD.js +9 -4
  142. package/dist/esm/src/compat/HD.js.map +1 -1
  143. package/dist/esm/src/compat/Mnemonic.js +12 -12
  144. package/dist/esm/src/compat/Mnemonic.js.map +1 -1
  145. package/dist/esm/src/identity/ContactsManager.js +172 -232
  146. package/dist/esm/src/identity/ContactsManager.js.map +1 -1
  147. package/dist/esm/src/identity/IdentityClient.js +122 -55
  148. package/dist/esm/src/identity/IdentityClient.js.map +1 -1
  149. package/dist/esm/src/kvstore/GlobalKVStore.js +30 -31
  150. package/dist/esm/src/kvstore/GlobalKVStore.js.map +1 -1
  151. package/dist/esm/src/kvstore/LocalKVStore.js +9 -9
  152. package/dist/esm/src/kvstore/LocalKVStore.js.map +1 -1
  153. package/dist/esm/src/kvstore/kvStoreInterpreter.js +2 -2
  154. package/dist/esm/src/kvstore/kvStoreInterpreter.js.map +1 -1
  155. package/dist/esm/src/messages/SignedMessage.js +1 -1
  156. package/dist/esm/src/messages/SignedMessage.js.map +1 -1
  157. package/dist/esm/src/overlay-tools/Historian.js +1 -1
  158. package/dist/esm/src/overlay-tools/Historian.js.map +1 -1
  159. package/dist/esm/src/overlay-tools/LookupResolver.js +139 -46
  160. package/dist/esm/src/overlay-tools/LookupResolver.js.map +1 -1
  161. package/dist/esm/src/overlay-tools/SHIPBroadcaster.js +74 -146
  162. package/dist/esm/src/overlay-tools/SHIPBroadcaster.js.map +1 -1
  163. package/dist/esm/src/primitives/AESGCM.js +2 -2
  164. package/dist/esm/src/primitives/AESGCM.js.map +1 -1
  165. package/dist/esm/src/primitives/BigNumber.js +167 -154
  166. package/dist/esm/src/primitives/BigNumber.js.map +1 -1
  167. package/dist/esm/src/primitives/Curve.js +17 -15
  168. package/dist/esm/src/primitives/Curve.js.map +1 -1
  169. package/dist/esm/src/primitives/ECDSA.js +12 -7
  170. package/dist/esm/src/primitives/ECDSA.js.map +1 -1
  171. package/dist/esm/src/primitives/Hash.js +140 -56
  172. package/dist/esm/src/primitives/Hash.js.map +1 -1
  173. package/dist/esm/src/primitives/JacobianPoint.js +8 -8
  174. package/dist/esm/src/primitives/JacobianPoint.js.map +1 -1
  175. package/dist/esm/src/primitives/K256.js +3 -3
  176. package/dist/esm/src/primitives/K256.js.map +1 -1
  177. package/dist/esm/src/primitives/Point.js +36 -40
  178. package/dist/esm/src/primitives/Point.js.map +1 -1
  179. package/dist/esm/src/primitives/PrivateKey.js +4 -4
  180. package/dist/esm/src/primitives/PrivateKey.js.map +1 -1
  181. package/dist/esm/src/primitives/PublicKey.js +4 -4
  182. package/dist/esm/src/primitives/PublicKey.js.map +1 -1
  183. package/dist/esm/src/primitives/Random.js +10 -14
  184. package/dist/esm/src/primitives/Random.js.map +1 -1
  185. package/dist/esm/src/primitives/ReaderUint8Array.js +6 -6
  186. package/dist/esm/src/primitives/ReaderUint8Array.js.map +1 -1
  187. package/dist/esm/src/primitives/Schnorr.js +1 -1
  188. package/dist/esm/src/primitives/Schnorr.js.map +1 -1
  189. package/dist/esm/src/primitives/Secp256r1.js +2 -1
  190. package/dist/esm/src/primitives/Secp256r1.js.map +1 -1
  191. package/dist/esm/src/primitives/Signature.js +8 -8
  192. package/dist/esm/src/primitives/Signature.js.map +1 -1
  193. package/dist/esm/src/primitives/TransactionSignature.js +20 -21
  194. package/dist/esm/src/primitives/TransactionSignature.js.map +1 -1
  195. package/dist/esm/src/primitives/utils.js +39 -48
  196. package/dist/esm/src/primitives/utils.js.map +1 -1
  197. package/dist/esm/src/registry/RegistryClient.js +31 -23
  198. package/dist/esm/src/registry/RegistryClient.js.map +1 -1
  199. package/dist/esm/src/remittance/RemittanceManager.js +19 -18
  200. package/dist/esm/src/remittance/RemittanceManager.js.map +1 -1
  201. package/dist/esm/src/remittance/modules/BasicBRC29.js.map +1 -1
  202. package/dist/esm/src/script/Script.js +93 -170
  203. package/dist/esm/src/script/Script.js.map +1 -1
  204. package/dist/esm/src/script/ScriptEvaluationError.js +2 -2
  205. package/dist/esm/src/script/ScriptEvaluationError.js.map +1 -1
  206. package/dist/esm/src/script/Spend.js +14 -12
  207. package/dist/esm/src/script/Spend.js.map +1 -1
  208. package/dist/esm/src/script/templates/PushDrop.js +4 -3
  209. package/dist/esm/src/script/templates/PushDrop.js.map +1 -1
  210. package/dist/esm/src/script/templates/RPuzzle.js +2 -4
  211. package/dist/esm/src/script/templates/RPuzzle.js.map +1 -1
  212. package/dist/esm/src/storage/StorageDownloader.js +1 -1
  213. package/dist/esm/src/storage/StorageDownloader.js.map +1 -1
  214. package/dist/esm/src/totp/totp.js +1 -1
  215. package/dist/esm/src/totp/totp.js.map +1 -1
  216. package/dist/esm/src/transaction/Beef.js +229 -186
  217. package/dist/esm/src/transaction/Beef.js.map +1 -1
  218. package/dist/esm/src/transaction/BeefConstants.js +16 -0
  219. package/dist/esm/src/transaction/BeefConstants.js.map +1 -0
  220. package/dist/esm/src/transaction/BeefTx.js +3 -3
  221. package/dist/esm/src/transaction/BeefTx.js.map +1 -1
  222. package/dist/esm/src/transaction/MerklePath.js +4 -4
  223. package/dist/esm/src/transaction/MerklePath.js.map +1 -1
  224. package/dist/esm/src/transaction/Transaction.js +49 -52
  225. package/dist/esm/src/transaction/Transaction.js.map +1 -1
  226. package/dist/esm/src/transaction/fee-models/SatoshisPerKilobyte.js +1 -1
  227. package/dist/esm/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -1
  228. package/dist/esm/src/transaction/http/BinaryFetchClient.js +9 -9
  229. package/dist/esm/src/transaction/http/BinaryFetchClient.js.map +1 -1
  230. package/dist/esm/src/transaction/http/DefaultHttpClient.js +9 -9
  231. package/dist/esm/src/transaction/http/DefaultHttpClient.js.map +1 -1
  232. package/dist/esm/src/wallet/CachedKeyDeriver.js +1 -1
  233. package/dist/esm/src/wallet/CachedKeyDeriver.js.map +1 -1
  234. package/dist/esm/src/wallet/WalletClient.js.map +1 -1
  235. package/dist/esm/src/wallet/WalletError.js.map +1 -1
  236. package/dist/esm/src/wallet/substrates/HTTPWalletJSON.js +5 -4
  237. package/dist/esm/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
  238. package/dist/esm/src/wallet/substrates/ReactNativeWebView.js +9 -9
  239. package/dist/esm/src/wallet/substrates/ReactNativeWebView.js.map +1 -1
  240. package/dist/esm/src/wallet/substrates/WalletWireProcessor.js +92 -92
  241. package/dist/esm/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
  242. package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js +387 -711
  243. package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
  244. package/dist/esm/src/wallet/substrates/XDM.js +4 -4
  245. package/dist/esm/src/wallet/substrates/XDM.js.map +1 -1
  246. package/dist/esm/src/wallet/substrates/window.CWI.js +2 -2
  247. package/dist/esm/src/wallet/substrates/window.CWI.js.map +1 -1
  248. package/dist/esm/src/wallet/validationHelpers.js +9 -9
  249. package/dist/esm/src/wallet/validationHelpers.js.map +1 -1
  250. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  251. package/dist/types/src/auth/Peer.d.ts +13 -0
  252. package/dist/types/src/auth/Peer.d.ts.map +1 -1
  253. package/dist/types/src/auth/SessionManager.d.ts.map +1 -1
  254. package/dist/types/src/auth/clients/AuthFetch.d.ts.map +1 -1
  255. package/dist/types/src/compat/ECIES.d.ts.map +1 -1
  256. package/dist/types/src/compat/HD.d.ts.map +1 -1
  257. package/dist/types/src/identity/ContactsManager.d.ts +18 -0
  258. package/dist/types/src/identity/ContactsManager.d.ts.map +1 -1
  259. package/dist/types/src/identity/IdentityClient.d.ts +47 -8
  260. package/dist/types/src/identity/IdentityClient.d.ts.map +1 -1
  261. package/dist/types/src/kvstore/GlobalKVStore.d.ts.map +1 -1
  262. package/dist/types/src/overlay-tools/LookupResolver.d.ts +59 -1
  263. package/dist/types/src/overlay-tools/LookupResolver.d.ts.map +1 -1
  264. package/dist/types/src/overlay-tools/SHIPBroadcaster.d.ts +18 -3
  265. package/dist/types/src/overlay-tools/SHIPBroadcaster.d.ts.map +1 -1
  266. package/dist/types/src/primitives/BigNumber.d.ts +13 -3
  267. package/dist/types/src/primitives/BigNumber.d.ts.map +1 -1
  268. package/dist/types/src/primitives/Curve.d.ts.map +1 -1
  269. package/dist/types/src/primitives/ECDSA.d.ts.map +1 -1
  270. package/dist/types/src/primitives/Hash.d.ts +3 -3
  271. package/dist/types/src/primitives/Hash.d.ts.map +1 -1
  272. package/dist/types/src/primitives/JacobianPoint.d.ts +3 -1
  273. package/dist/types/src/primitives/JacobianPoint.d.ts.map +1 -1
  274. package/dist/types/src/primitives/Point.d.ts.map +1 -1
  275. package/dist/types/src/primitives/Random.d.ts +2 -2
  276. package/dist/types/src/primitives/Random.d.ts.map +1 -1
  277. package/dist/types/src/primitives/ReaderUint8Array.d.ts.map +1 -1
  278. package/dist/types/src/primitives/Schnorr.d.ts +2 -1
  279. package/dist/types/src/primitives/Schnorr.d.ts.map +1 -1
  280. package/dist/types/src/primitives/Secp256r1.d.ts.map +1 -1
  281. package/dist/types/src/primitives/utils.d.ts +2 -4
  282. package/dist/types/src/primitives/utils.d.ts.map +1 -1
  283. package/dist/types/src/registry/RegistryClient.d.ts.map +1 -1
  284. package/dist/types/src/remittance/RemittanceManager.d.ts.map +1 -1
  285. package/dist/types/src/remittance/modules/BasicBRC29.d.ts.map +1 -1
  286. package/dist/types/src/script/Script.d.ts +15 -8
  287. package/dist/types/src/script/Script.d.ts.map +1 -1
  288. package/dist/types/src/script/Spend.d.ts.map +1 -1
  289. package/dist/types/src/script/templates/PushDrop.d.ts +3 -1
  290. package/dist/types/src/script/templates/PushDrop.d.ts.map +1 -1
  291. package/dist/types/src/script/templates/RPuzzle.d.ts.map +1 -1
  292. package/dist/types/src/transaction/Beef.d.ts +46 -8
  293. package/dist/types/src/transaction/Beef.d.ts.map +1 -1
  294. package/dist/types/src/transaction/BeefConstants.d.ts +15 -0
  295. package/dist/types/src/transaction/BeefConstants.d.ts.map +1 -0
  296. package/dist/types/src/transaction/Transaction.d.ts.map +1 -1
  297. package/dist/types/src/wallet/CachedKeyDeriver.d.ts.map +1 -1
  298. package/dist/types/src/wallet/KeyDeriver.d.ts +1 -1
  299. package/dist/types/src/wallet/KeyDeriver.d.ts.map +1 -1
  300. package/dist/types/src/wallet/Wallet.interfaces.d.ts +2 -2
  301. package/dist/types/src/wallet/Wallet.interfaces.d.ts.map +1 -1
  302. package/dist/types/src/wallet/WalletClient.d.ts +7 -7
  303. package/dist/types/src/wallet/WalletClient.d.ts.map +1 -1
  304. package/dist/types/src/wallet/substrates/HTTPWalletJSON.d.ts +7 -7
  305. package/dist/types/src/wallet/substrates/HTTPWalletJSON.d.ts.map +1 -1
  306. package/dist/types/src/wallet/substrates/WalletWireTransceiver.d.ts +36 -7
  307. package/dist/types/src/wallet/substrates/WalletWireTransceiver.d.ts.map +1 -1
  308. package/dist/types/src/wallet/substrates/window.CWI.d.ts +8 -8
  309. package/dist/types/src/wallet/substrates/window.CWI.d.ts.map +1 -1
  310. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  311. package/dist/umd/bundle.js +3 -3
  312. package/docs/reference/kvstore.md +1 -2
  313. package/docs/reference/primitives.md +0 -1
  314. package/docs/reference/script.md +0 -7
  315. package/docs/reference/transaction.md +2 -2
  316. package/package.json +29 -28
  317. package/src/auth/Peer.ts +26 -13
  318. package/src/auth/SessionManager.ts +4 -7
  319. package/src/auth/certificates/MasterCertificate.ts +1 -1
  320. package/src/auth/certificates/__tests/CompletedProtoWallet.ts +1 -1
  321. package/src/auth/clients/AuthFetch.ts +41 -41
  322. package/src/auth/transports/SimplifiedFetchTransport.ts +4 -4
  323. package/src/compat/ECIES.ts +29 -34
  324. package/src/compat/HD.ts +10 -5
  325. package/src/compat/Mnemonic.ts +11 -11
  326. package/src/compat/__tests/HD.test.ts +19 -0
  327. package/src/identity/ContactsManager.ts +194 -257
  328. package/src/identity/IdentityClient.ts +155 -66
  329. package/src/identity/__tests/IdentityClient.test.ts +25 -1
  330. package/src/kvstore/GlobalKVStore.ts +31 -32
  331. package/src/kvstore/LocalKVStore.ts +8 -8
  332. package/src/kvstore/kvStoreInterpreter.ts +2 -2
  333. package/src/messages/SignedMessage.ts +1 -1
  334. package/src/overlay-tools/Historian.ts +1 -1
  335. package/src/overlay-tools/LookupResolver.ts +182 -45
  336. package/src/overlay-tools/SHIPBroadcaster.ts +92 -168
  337. package/src/primitives/AESGCM.ts +2 -2
  338. package/src/primitives/BigNumber.ts +122 -113
  339. package/src/primitives/Curve.ts +16 -15
  340. package/src/primitives/ECDSA.ts +10 -8
  341. package/src/primitives/Hash.ts +152 -53
  342. package/src/primitives/JacobianPoint.ts +13 -11
  343. package/src/primitives/K256.ts +3 -3
  344. package/src/primitives/Point.ts +35 -38
  345. package/src/primitives/PrivateKey.ts +3 -3
  346. package/src/primitives/PublicKey.ts +3 -3
  347. package/src/primitives/Random.ts +11 -14
  348. package/src/primitives/ReaderUint8Array.ts +7 -7
  349. package/src/primitives/Schnorr.ts +2 -1
  350. package/src/primitives/Secp256r1.ts +2 -1
  351. package/src/primitives/Signature.ts +8 -8
  352. package/src/primitives/TransactionSignature.ts +16 -16
  353. package/src/primitives/utils.ts +37 -47
  354. package/src/registry/RegistryClient.ts +25 -25
  355. package/src/remittance/RemittanceManager.ts +17 -18
  356. package/src/remittance/modules/BasicBRC29.ts +2 -5
  357. package/src/script/Script.ts +114 -170
  358. package/src/script/ScriptEvaluationError.ts +2 -2
  359. package/src/script/Spend.ts +14 -15
  360. package/src/script/templates/PushDrop.ts +5 -3
  361. package/src/script/templates/RPuzzle.ts +2 -4
  362. package/src/storage/StorageDownloader.ts +1 -1
  363. package/src/totp/totp.ts +1 -1
  364. package/src/transaction/Beef.ts +241 -203
  365. package/src/transaction/BeefConstants.ts +16 -0
  366. package/src/transaction/BeefTx.ts +3 -3
  367. package/src/transaction/MerklePath.ts +4 -4
  368. package/src/transaction/Transaction.ts +48 -51
  369. package/src/transaction/fee-models/SatoshisPerKilobyte.ts +1 -1
  370. package/src/transaction/http/BinaryFetchClient.ts +8 -8
  371. package/src/transaction/http/DefaultHttpClient.ts +8 -8
  372. package/src/wallet/CachedKeyDeriver.ts +8 -6
  373. package/src/wallet/KeyDeriver.ts +1 -1
  374. package/src/wallet/Wallet.interfaces.ts +2 -4
  375. package/src/wallet/WalletClient.ts +8 -8
  376. package/src/wallet/WalletError.ts +1 -1
  377. package/src/wallet/__tests/WalletClient.substrate.test.ts +10 -6
  378. package/src/wallet/substrates/HTTPWalletJSON.ts +22 -21
  379. package/src/wallet/substrates/ReactNativeWebView.ts +9 -9
  380. package/src/wallet/substrates/WalletWireProcessor.ts +83 -83
  381. package/src/wallet/substrates/WalletWireTransceiver.ts +528 -938
  382. package/src/wallet/substrates/XDM.ts +4 -4
  383. package/src/wallet/substrates/__tests/HTTPWalletJSON.test.ts +38 -25
  384. package/src/wallet/substrates/__tests/ReactNativeWebView.test.ts +174 -0
  385. package/src/wallet/substrates/__tests/window.CWI.test.ts +256 -0
  386. package/src/wallet/substrates/window.CWI.ts +10 -10
  387. package/src/wallet/validationHelpers.ts +9 -9
  388. package/docs/swagger/dist/LICENSE +0 -21
  389. package/docs/swagger/dist/favicon-16x16.png +0 -0
  390. package/docs/swagger/dist/favicon-32x32.png +0 -0
  391. package/docs/swagger/dist/index.css +0 -16
  392. package/docs/swagger/dist/oauth2-redirect.html +0 -79
  393. package/docs/swagger/dist/swagger-initializer.js +0 -20
  394. package/docs/swagger/dist/swagger-ui-bundle.js +0 -2
  395. package/docs/swagger/dist/swagger-ui-bundle.js.map +0 -1
  396. package/docs/swagger/dist/swagger-ui-es-bundle-core.js +0 -3
  397. package/docs/swagger/dist/swagger-ui-es-bundle-core.js.map +0 -1
  398. package/docs/swagger/dist/swagger-ui-es-bundle.js +0 -2
  399. package/docs/swagger/dist/swagger-ui-es-bundle.js.map +0 -1
  400. package/docs/swagger/dist/swagger-ui-standalone-preset.js +0 -2
  401. package/docs/swagger/dist/swagger-ui-standalone-preset.js.map +0 -1
  402. package/docs/swagger/dist/swagger-ui.css +0 -3
  403. package/docs/swagger/dist/swagger-ui.css.map +0 -1
  404. package/docs/swagger/dist/swagger-ui.js +0 -2
  405. package/docs/swagger/dist/swagger-ui.js.map +0 -1
@@ -67,14 +67,14 @@ class Mnemonic {
67
67
  */
68
68
  toBinary() {
69
69
  const bw = new utils_js_1.Writer();
70
- if (this.mnemonic !== '') {
70
+ if (this.mnemonic === '') {
71
+ bw.writeVarIntNum(0);
72
+ }
73
+ else {
71
74
  const buf = (0, utils_js_1.toArray)(this.mnemonic, 'utf8');
72
75
  bw.writeVarIntNum(buf.length);
73
76
  bw.write(buf);
74
77
  }
75
- else {
76
- bw.writeVarIntNum(0);
77
- }
78
78
  if (this.seed.length > 0) {
79
79
  bw.writeVarIntNum(this.seed.length);
80
80
  bw.write(this.seed);
@@ -108,7 +108,7 @@ class Mnemonic {
108
108
  * @throws {Error} If the bit length is not a multiple of 32 or is less than 128.
109
109
  */
110
110
  fromRandom(bits) {
111
- if (bits === undefined || bits === null || isNaN(bits) || bits === 0) {
111
+ if (bits === undefined || bits === null || Number.isNaN(bits) || bits === 0) {
112
112
  bits = 128;
113
113
  }
114
114
  if (bits % 32 !== 0) {
@@ -200,8 +200,8 @@ class Mnemonic {
200
200
  const hash = Hash.sha256(buf);
201
201
  let bin = '';
202
202
  const bits = buf.length * 8;
203
- for (let i = 0; i < buf.length; i++) {
204
- bin = bin + ('00000000' + buf[i].toString(2)).slice(-8);
203
+ for (const byte of buf) {
204
+ bin = bin + ('00000000' + byte.toString(2)).slice(-8);
205
205
  }
206
206
  let hashbits = hash[0].toString(2);
207
207
  hashbits = ('00000000' + hashbits).slice(-8).slice(0, bits / 32);
@@ -215,7 +215,7 @@ class Mnemonic {
215
215
  if (mnemonic !== '') {
216
216
  mnemonic = mnemonic + this.Wordlist.space;
217
217
  }
218
- const wi = parseInt(bin.slice(i * 11, (i + 1) * 11), 2);
218
+ const wi = Number.parseInt(bin.slice(i * 11, (i + 1) * 11), 2);
219
219
  mnemonic = mnemonic + this.Wordlist.value[wi];
220
220
  }
221
221
  this.mnemonic = mnemonic;
@@ -232,8 +232,8 @@ class Mnemonic {
232
232
  // confirm no invalid words
233
233
  const words = mnemonic.split(this.Wordlist.space);
234
234
  let bin = '';
235
- for (let i = 0; i < words.length; i++) {
236
- const ind = this.Wordlist.value.indexOf(words[i]);
235
+ for (const word of words) {
236
+ const ind = this.Wordlist.value.indexOf(word);
237
237
  if (ind < 0) {
238
238
  return false;
239
239
  }
@@ -249,7 +249,7 @@ class Mnemonic {
249
249
  const nonhashBits = bin.slice(0, bin.length - cs);
250
250
  const buf = [];
251
251
  for (let i = 0; i < nonhashBits.length / 8; i++) {
252
- buf.push(parseInt(bin.slice(i * 8, (i + 1) * 8), 2));
252
+ buf.push(Number.parseInt(bin.slice(i * 8, (i + 1) * 8), 2));
253
253
  }
254
254
  const hash = Hash.sha256(buf.slice(0, nonhashBits.length / 8));
255
255
  let expectedHashBits = hash[0].toString(2);
@@ -271,7 +271,7 @@ class Mnemonic {
271
271
  throw new Error('Mnemonic does not pass the check - was the mnemonic typed incorrectly? Are there extra spaces?');
272
272
  }
273
273
  if (typeof passphrase !== 'string') {
274
- throw new Error('passphrase must be a string or undefined');
274
+ throw new TypeError('passphrase must be a string or undefined');
275
275
  }
276
276
  mnemonic = mnemonic.normalize('NFKD');
277
277
  passphrase = passphrase.normalize('NFKD');
@@ -1 +1 @@
1
- {"version":3,"file":"Mnemonic.js","sourceRoot":"","sources":["../../../../src/compat/Mnemonic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Mnemonic.js","sourceRoot":"","sources":["../../../../src/compat/Mnemonic.ts"],"names":[],"mappings":"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"}
@@ -39,53 +39,55 @@ class ContactsManager {
39
39
  * @returns A promise that resolves with an array of contacts
40
40
  */
41
41
  async getContacts(identityKey, forceRefresh = false, limit = 1000) {
42
- // Check in-memory cache first unless forcing refresh
43
42
  if (!forceRefresh) {
44
- const cached = this.cache.getItem(this.CONTACTS_CACHE_KEY);
45
- if (cached != null && cached !== '') {
46
- try {
47
- const cachedContacts = JSON.parse(cached);
48
- return identityKey != null
49
- ? cachedContacts.filter(c => c.identityKey === identityKey)
50
- : cachedContacts;
51
- }
52
- catch (e) {
53
- console.warn('Invalid cached contacts JSON; will reload from chain', e);
54
- }
55
- }
56
- }
57
- const tags = [];
58
- if (identityKey != null) {
59
- // Hash the identity key to use as a tag for quick lookup
60
- const { hmac: hashedIdentityKey } = await this.wallet.createHmac({
61
- protocolID: CONTACT_PROTOCOL_ID,
62
- keyID: identityKey,
63
- counterparty: 'self',
64
- data: index_js_2.Utils.toArray(identityKey, 'utf8')
65
- }, this.originator);
66
- tags.push(`identityKey ${index_js_2.Utils.toHex(hashedIdentityKey)}`);
43
+ const fromCache = this.loadCachedContacts(identityKey);
44
+ if (fromCache !== null)
45
+ return fromCache;
67
46
  }
68
- // Get all contact outputs from the contacts basket
69
- const outputs = await this.wallet.listOutputs({
70
- basket: 'contacts',
71
- include: 'locking scripts',
72
- includeCustomInstructions: true,
73
- tags,
74
- limit
75
- }, this.originator);
47
+ const tags = await this.buildIdentityKeyTags(identityKey);
48
+ const outputs = await this.wallet.listOutputs({ basket: 'contacts', include: 'locking scripts', includeCustomInstructions: true, tags, limit }, this.originator);
76
49
  if (outputs.outputs == null || outputs.outputs.length === 0) {
77
50
  this.cache.setItem(this.CONTACTS_CACHE_KEY, JSON.stringify([]));
78
51
  return [];
79
52
  }
80
- // Pre-process outputs synchronously to extract decode data, then decrypt in parallel
53
+ const contacts = await this.decryptContactOutputs(outputs.outputs);
54
+ this.cache.setItem(this.CONTACTS_CACHE_KEY, JSON.stringify(contacts));
55
+ return identityKey != null ? contacts.filter(c => c.identityKey === identityKey) : contacts;
56
+ }
57
+ /** Returns cached contacts (optionally filtered) or null if cache is missing/invalid. */
58
+ loadCachedContacts(identityKey) {
59
+ const cached = this.cache.getItem(this.CONTACTS_CACHE_KEY);
60
+ if (cached == null || cached === '')
61
+ return null;
62
+ try {
63
+ const cachedContacts = JSON.parse(cached);
64
+ return identityKey != null ? cachedContacts.filter(c => c.identityKey === identityKey) : cachedContacts;
65
+ }
66
+ catch (e) {
67
+ console.warn('Invalid cached contacts JSON; will reload from chain', e);
68
+ return null;
69
+ }
70
+ }
71
+ /** Builds the HMAC-based identity-key tag array; empty array if no identity key is given. */
72
+ async buildIdentityKeyTags(identityKey) {
73
+ if (identityKey == null)
74
+ return [];
75
+ const { hmac: hashedIdentityKey } = await this.wallet.createHmac({
76
+ protocolID: CONTACT_PROTOCOL_ID,
77
+ keyID: identityKey,
78
+ counterparty: 'self',
79
+ data: index_js_2.Utils.toArray(identityKey, 'utf8')
80
+ }, this.originator);
81
+ return [`identityKey ${index_js_2.Utils.toHex(hashedIdentityKey)}`];
82
+ }
83
+ /** Decodes and decrypts all contact outputs in parallel, returning valid Contact objects. */
84
+ async decryptContactOutputs(rawOutputs) {
81
85
  const decryptTasks = [];
82
- for (const output of outputs.outputs) {
86
+ for (const output of rawOutputs) {
83
87
  try {
84
- if (output.lockingScript == null)
88
+ if (output.lockingScript == null || output.customInstructions == null)
85
89
  continue;
86
90
  const decoded = index_js_3.PushDrop.decode(index_js_3.LockingScript.fromHex(output.lockingScript));
87
- if (output.customInstructions == null)
88
- continue;
89
91
  const keyID = JSON.parse(output.customInstructions).keyID;
90
92
  decryptTasks.push({ keyID, ciphertext: decoded.fields[0] });
91
93
  }
@@ -93,20 +95,12 @@ class ContactsManager {
93
95
  console.warn('ContactsManager: Failed to decode contact output:', error);
94
96
  }
95
97
  }
96
- // Decrypt all contacts in parallel each call is a network round-trip over localhost
97
- const decryptResults = await Promise.allSettled(decryptTasks.map(async (task) => await this.wallet.decrypt({
98
- ciphertext: task.ciphertext,
99
- protocolID: CONTACT_PROTOCOL_ID,
100
- keyID: task.keyID,
101
- counterparty: 'self'
102
- }, this.originator)));
98
+ const decryptResults = await Promise.allSettled(decryptTasks.map(async (task) => await this.wallet.decrypt({ ciphertext: task.ciphertext, protocolID: CONTACT_PROTOCOL_ID, keyID: task.keyID, counterparty: 'self' }, this.originator)));
103
99
  const contacts = [];
104
- for (let i = 0; i < decryptResults.length; i++) {
105
- const result = decryptResults[i];
100
+ for (const result of decryptResults) {
106
101
  if (result.status === 'fulfilled') {
107
102
  try {
108
- const contactData = JSON.parse(index_js_2.Utils.toUTF8(result.value.plaintext));
109
- contacts.push(contactData);
103
+ contacts.push(JSON.parse(index_js_2.Utils.toUTF8(result.value.plaintext)));
110
104
  }
111
105
  catch (error) {
112
106
  console.warn('ContactsManager: Failed to parse contact data:', error);
@@ -116,12 +110,7 @@ class ContactsManager {
116
110
  console.warn('ContactsManager: Failed to decrypt contact output:', result.reason);
117
111
  }
118
112
  }
119
- // Cache the loaded contacts
120
- this.cache.setItem(this.CONTACTS_CACHE_KEY, JSON.stringify(contacts));
121
- const filteredContacts = identityKey != null
122
- ? contacts.filter(c => c.identityKey === identityKey)
123
- : contacts;
124
- return filteredContacts;
113
+ return contacts;
125
114
  }
126
115
  /**
127
116
  * Save or update a Metanet contact
@@ -129,136 +118,110 @@ class ContactsManager {
129
118
  * @param metadata Optional metadata to store with the contact (ex. notes, aliases, etc)
130
119
  */
131
120
  async saveContact(contact, metadata) {
132
- // Get current contacts from cache or blockchain
133
121
  const cached = this.cache.getItem(this.CONTACTS_CACHE_KEY);
134
- let contacts;
135
- if (cached != null && cached !== '') {
136
- contacts = JSON.parse(cached);
137
- }
138
- else {
139
- // If cache is empty, get current data from blockchain
140
- contacts = await this.getContacts();
141
- }
122
+ const contacts = (cached != null && cached !== '') ? JSON.parse(cached) : await this.getContacts();
123
+ const contactToStore = { ...contact, metadata };
142
124
  const existingIndex = contacts.findIndex(c => c.identityKey === contact.identityKey);
143
- const contactToStore = {
144
- ...contact,
145
- metadata
146
- };
147
- if (existingIndex >= 0) {
125
+ if (existingIndex >= 0)
148
126
  contacts[existingIndex] = contactToStore;
127
+ else
128
+ contacts.push(contactToStore);
129
+ const hashedIdentityKey = await this.hashIdentityKey(contact.identityKey);
130
+ const outputs = await this.wallet.listOutputs({
131
+ basket: 'contacts', include: 'entire transactions', includeCustomInstructions: true,
132
+ tags: [`identityKey ${index_js_2.Utils.toHex(hashedIdentityKey)}`], limit: 100
133
+ }, this.originator);
134
+ const { existingOutput, keyID } = await this.findExistingOutput(outputs, contact.identityKey);
135
+ const lockingScript = await this.encryptAndLock(contactToStore, keyID);
136
+ if (existingOutput != null) {
137
+ await this.updateContactOutput(outputs, existingOutput, lockingScript, keyID, hashedIdentityKey, contact);
149
138
  }
150
139
  else {
151
- contacts.push(contactToStore);
140
+ await this.createContactOutput(lockingScript, keyID, hashedIdentityKey, contact);
152
141
  }
153
- const { hmac: hashedIdentityKey } = await this.wallet.createHmac({
154
- protocolID: CONTACT_PROTOCOL_ID,
155
- keyID: contact.identityKey,
156
- counterparty: 'self',
157
- data: index_js_2.Utils.toArray(contact.identityKey, 'utf8')
158
- }, this.originator);
159
- // Check if this contact already exists (to update it)
160
- const outputs = await this.wallet.listOutputs({
161
- basket: 'contacts',
162
- include: 'entire transactions',
163
- includeCustomInstructions: true,
164
- tags: [`identityKey ${index_js_2.Utils.toHex(hashedIdentityKey)}`],
165
- limit: 100 // Should only be one contact!
142
+ this.cache.setItem(this.CONTACTS_CACHE_KEY, JSON.stringify(contacts));
143
+ }
144
+ /** Computes the HMAC-based hash of an identity key for tag indexing. */
145
+ async hashIdentityKey(identityKey) {
146
+ const { hmac } = await this.wallet.createHmac({
147
+ protocolID: CONTACT_PROTOCOL_ID, keyID: identityKey, counterparty: 'self',
148
+ data: index_js_2.Utils.toArray(identityKey, 'utf8')
166
149
  }, this.originator);
150
+ return hmac;
151
+ }
152
+ /** Scans existing outputs to find the one matching the given identity key; returns output + keyID. */
153
+ async findExistingOutput(outputs, identityKey) {
167
154
  let existingOutput = null;
168
155
  let keyID = index_js_2.Utils.toBase64((0, index_js_2.Random)(32));
169
- if (outputs.outputs != null) {
170
- // Find output by trying to decrypt and checking identityKey in payload
171
- for (const output of outputs.outputs) {
172
- try {
173
- const [txid, outputIndex] = output.outpoint.split('.');
174
- const tx = index_js_4.Transaction.fromBEEF(outputs.BEEF, txid);
175
- const decoded = index_js_3.PushDrop.decode(tx.outputs[Number(outputIndex)].lockingScript);
176
- if (output.customInstructions == null)
177
- continue;
178
- keyID = JSON.parse(output.customInstructions).keyID;
179
- const { plaintext } = await this.wallet.decrypt({
180
- ciphertext: decoded.fields[0],
181
- protocolID: CONTACT_PROTOCOL_ID,
182
- keyID,
183
- counterparty: 'self'
184
- }, this.originator);
185
- const storedContact = JSON.parse(index_js_2.Utils.toUTF8(plaintext));
186
- if (storedContact.identityKey === contact.identityKey) {
187
- // Found the right output
188
- existingOutput = output;
189
- break;
190
- }
191
- }
192
- catch (e) {
193
- // Skip malformed or undecryptable outputs
156
+ if (outputs.outputs == null)
157
+ return { existingOutput, keyID };
158
+ for (const output of outputs.outputs) {
159
+ try {
160
+ const [txid, outputIndex] = output.outpoint.split('.');
161
+ const tx = index_js_4.Transaction.fromBEEF(outputs.BEEF, txid);
162
+ const decoded = index_js_3.PushDrop.decode(tx.outputs[Number(outputIndex)].lockingScript);
163
+ if (output.customInstructions == null)
164
+ continue;
165
+ keyID = JSON.parse(output.customInstructions).keyID;
166
+ const { plaintext } = await this.wallet.decrypt({ ciphertext: decoded.fields[0], protocolID: CONTACT_PROTOCOL_ID, keyID, counterparty: 'self' }, this.originator);
167
+ const storedContact = JSON.parse(index_js_2.Utils.toUTF8(plaintext));
168
+ if (storedContact.identityKey === identityKey) {
169
+ existingOutput = output;
170
+ break;
194
171
  }
195
172
  }
173
+ catch (_malformedOrUndecryptableOutput) { /* skip */ }
196
174
  }
197
- // Encrypt the contact data directly
198
- const contactWithMetadata = {
199
- ...contact,
200
- metadata
201
- };
175
+ return { existingOutput, keyID };
176
+ }
177
+ /** Encrypts a contact and produces its PushDrop locking script. */
178
+ async encryptAndLock(contactData, keyID) {
202
179
  const { ciphertext } = await this.wallet.encrypt({
203
- plaintext: index_js_2.Utils.toArray(JSON.stringify(contactWithMetadata), 'utf8'),
204
- protocolID: CONTACT_PROTOCOL_ID,
205
- keyID,
206
- counterparty: 'self'
180
+ plaintext: index_js_2.Utils.toArray(JSON.stringify(contactData), 'utf8'),
181
+ protocolID: CONTACT_PROTOCOL_ID, keyID, counterparty: 'self'
207
182
  }, this.originator);
208
- // Create locking script for the new contact token
209
- const lockingScript = await new index_js_3.PushDrop(this.wallet, this.originator).lock([ciphertext], CONTACT_PROTOCOL_ID, keyID, 'self');
210
- if (existingOutput != null) {
211
- // Update existing contact by spending its output
212
- const [txid, outputIndex] = String(existingOutput.outpoint).split('.');
213
- const prevOutpoint = `${txid}.${outputIndex}`;
214
- const pushdrop = new index_js_3.PushDrop(this.wallet, this.originator);
215
- const { signableTransaction } = await this.wallet.createAction({
216
- description: 'Update Contact',
217
- inputBEEF: outputs.BEEF,
218
- inputs: [{
219
- outpoint: prevOutpoint,
220
- unlockingScriptLength: 74,
221
- inputDescription: 'Spend previous contact output'
222
- }],
223
- outputs: [{
224
- basket: 'contacts',
225
- satoshis: 1,
226
- lockingScript: lockingScript.toHex(),
227
- outputDescription: `Updated Contact: ${contact.name ?? contact.identityKey.slice(0, 10)}`,
228
- tags: [`identityKey ${index_js_2.Utils.toHex(hashedIdentityKey)}`],
229
- customInstructions: JSON.stringify({ keyID })
230
- }],
231
- options: { acceptDelayedBroadcast: false, randomizeOutputs: false } // TODO: Support custom config as needed.
232
- }, this.originator);
233
- if (signableTransaction == null)
234
- throw new Error('Unable to update contact');
235
- const unlocker = pushdrop.unlock(CONTACT_PROTOCOL_ID, keyID, 'self');
236
- const unlockingScript = await unlocker.sign(index_js_4.Transaction.fromBEEF(signableTransaction.tx), 0);
237
- const { tx } = await this.wallet.signAction({
238
- reference: signableTransaction.reference,
239
- spends: { 0: { unlockingScript: unlockingScript.toHex() } }
240
- }, this.originator);
241
- if (tx == null)
242
- throw new Error('Failed to update contact output');
243
- }
244
- else {
245
- // Create new contact output
246
- const { tx } = await this.wallet.createAction({
247
- description: 'Add Contact',
248
- outputs: [{
249
- basket: 'contacts',
250
- satoshis: 1,
251
- lockingScript: lockingScript.toHex(),
252
- outputDescription: `Contact: ${contact.name ?? contact.identityKey.slice(0, 10)}`,
253
- tags: [`identityKey ${index_js_2.Utils.toHex(hashedIdentityKey)}`],
254
- customInstructions: JSON.stringify({ keyID })
255
- }],
256
- options: { acceptDelayedBroadcast: false, randomizeOutputs: false } // TODO: Support custom config as needed.
257
- }, this.originator);
258
- if (tx == null)
259
- throw new Error('Failed to create contact output');
260
- }
261
- this.cache.setItem(this.CONTACTS_CACHE_KEY, JSON.stringify(contacts));
183
+ return await new index_js_3.PushDrop(this.wallet, this.originator).lock([ciphertext], CONTACT_PROTOCOL_ID, keyID, 'self');
184
+ }
185
+ /** Spends an existing contact output and creates a replacement with updated data. */
186
+ async updateContactOutput(outputs, existingOutput, lockingScript, keyID, hashedIdentityKey, contact) {
187
+ const [txid, outputIndex] = String(existingOutput.outpoint).split('.');
188
+ const prevOutpoint = `${txid}.${outputIndex}`;
189
+ const pushdrop = new index_js_3.PushDrop(this.wallet, this.originator);
190
+ const { signableTransaction } = await this.wallet.createAction({
191
+ description: 'Update Contact',
192
+ inputBEEF: outputs.BEEF,
193
+ inputs: [{ outpoint: prevOutpoint, unlockingScriptLength: 74, inputDescription: 'Spend previous contact output' }],
194
+ outputs: [{
195
+ basket: 'contacts', satoshis: 1, lockingScript: lockingScript.toHex(),
196
+ outputDescription: `Updated Contact: ${contact.name ?? contact.identityKey.slice(0, 10)}`,
197
+ tags: [`identityKey ${index_js_2.Utils.toHex(hashedIdentityKey)}`], customInstructions: JSON.stringify({ keyID })
198
+ }],
199
+ options: { acceptDelayedBroadcast: false, randomizeOutputs: false }
200
+ }, this.originator);
201
+ if (signableTransaction == null)
202
+ throw new Error('Unable to update contact');
203
+ const unlockingScript = await pushdrop.unlock(CONTACT_PROTOCOL_ID, keyID, 'self')
204
+ .sign(index_js_4.Transaction.fromBEEF(signableTransaction.tx), 0);
205
+ const { tx } = await this.wallet.signAction({
206
+ reference: signableTransaction.reference,
207
+ spends: { 0: { unlockingScript: unlockingScript.toHex() } }
208
+ }, this.originator);
209
+ if (tx == null)
210
+ throw new Error('Failed to update contact output');
211
+ }
212
+ /** Creates a new on-chain contact output. */
213
+ async createContactOutput(lockingScript, keyID, hashedIdentityKey, contact) {
214
+ const { tx } = await this.wallet.createAction({
215
+ description: 'Add Contact',
216
+ outputs: [{
217
+ basket: 'contacts', satoshis: 1, lockingScript: lockingScript.toHex(),
218
+ outputDescription: `Contact: ${contact.name ?? contact.identityKey.slice(0, 10)}`,
219
+ tags: [`identityKey ${index_js_2.Utils.toHex(hashedIdentityKey)}`], customInstructions: JSON.stringify({ keyID })
220
+ }],
221
+ options: { acceptDelayedBroadcast: false, randomizeOutputs: false }
222
+ }, this.originator);
223
+ if (tx == null)
224
+ throw new Error('Failed to create contact output');
262
225
  }
263
226
  /**
264
227
  * Remove a contact from the contacts basket
@@ -270,81 +233,58 @@ class ContactsManager {
270
233
  if (cached != null && cached !== '') {
271
234
  try {
272
235
  const contacts = JSON.parse(cached);
273
- const filteredContacts = contacts.filter(c => c.identityKey !== identityKey);
274
- this.cache.setItem(this.CONTACTS_CACHE_KEY, JSON.stringify(filteredContacts));
236
+ this.cache.setItem(this.CONTACTS_CACHE_KEY, JSON.stringify(contacts.filter(c => c.identityKey !== identityKey)));
275
237
  }
276
238
  catch (e) {
277
239
  console.warn('Failed to update cache after contact removal:', e);
278
240
  }
279
241
  }
280
- // Hash the identity key to use as a tag for quick lookup
281
- const tags = [];
282
- const { hmac: hashedIdentityKey } = await this.wallet.createHmac({
283
- protocolID: CONTACT_PROTOCOL_ID,
284
- keyID: identityKey,
285
- counterparty: 'self',
286
- data: index_js_2.Utils.toArray(identityKey, 'utf8')
287
- }, this.originator);
288
- tags.push(`identityKey ${index_js_2.Utils.toHex(hashedIdentityKey)}`);
289
- // Find and spend the contact's output
290
- const outputs = await this.wallet.listOutputs({
291
- basket: 'contacts',
292
- include: 'entire transactions',
293
- includeCustomInstructions: true,
294
- tags,
295
- limit: 100 // Should only be one contact!
296
- }, this.originator);
242
+ const tags = await this.buildIdentityKeyTags(identityKey);
243
+ const outputs = await this.wallet.listOutputs({ basket: 'contacts', include: 'entire transactions', includeCustomInstructions: true, tags, limit: 100 }, this.originator);
297
244
  if (outputs.outputs == null)
298
245
  return;
299
- // Find the output for this specific contact by decrypting and checking identityKey
300
246
  for (const output of outputs.outputs) {
301
247
  try {
302
- const [txid, outputIndex] = String(output.outpoint).split('.');
303
- const tx = index_js_4.Transaction.fromBEEF(outputs.BEEF, txid);
304
- const decoded = index_js_3.PushDrop.decode(tx.outputs[Number(outputIndex)].lockingScript);
305
- if (output.customInstructions == null)
306
- continue;
307
- const keyID = JSON.parse(output.customInstructions).keyID;
308
- const { plaintext } = await this.wallet.decrypt({
309
- ciphertext: decoded.fields[0],
310
- protocolID: CONTACT_PROTOCOL_ID,
311
- keyID,
312
- counterparty: 'self'
313
- }, this.originator);
314
- const storedContact = JSON.parse(index_js_2.Utils.toUTF8(plaintext));
315
- if (storedContact.identityKey === identityKey) {
316
- // Found the contact's output, spend it without creating a new one
317
- const prevOutpoint = `${txid}.${outputIndex}`;
318
- const pushdrop = new index_js_3.PushDrop(this.wallet, this.originator);
319
- const { signableTransaction } = await this.wallet.createAction({
320
- description: 'Delete Contact',
321
- inputBEEF: outputs.BEEF,
322
- inputs: [{
323
- outpoint: prevOutpoint,
324
- unlockingScriptLength: 74,
325
- inputDescription: 'Spend contact output to delete'
326
- }],
327
- outputs: [], // No outputs = deletion
328
- options: { acceptDelayedBroadcast: false, randomizeOutputs: false } // TODO: Support custom config as needed.
329
- }, this.originator);
330
- if (signableTransaction == null)
331
- throw new Error('Unable to delete contact');
332
- const unlocker = pushdrop.unlock(CONTACT_PROTOCOL_ID, keyID, 'self');
333
- const unlockingScript = await unlocker.sign(index_js_4.Transaction.fromBEEF(signableTransaction.tx), 0);
334
- const { tx: deleteTx } = await this.wallet.signAction({
335
- reference: signableTransaction.reference,
336
- spends: { 0: { unlockingScript: unlockingScript.toHex() } }
337
- }, this.originator);
338
- if (deleteTx == null)
339
- throw new Error('Failed to delete contact output');
248
+ const spent = await this.trySpendContactOutput(output, outputs, identityKey);
249
+ if (spent)
340
250
  return;
341
- }
342
- }
343
- catch (e) {
344
- // Skip malformed or undecryptable outputs
345
251
  }
252
+ catch (_malformedOrUndecryptableOutput) { /* skip */ }
346
253
  }
347
254
  }
255
+ /** Attempts to decrypt and spend a single output if it matches the given identity key. Returns true if spent. */
256
+ async trySpendContactOutput(output, outputs, identityKey) {
257
+ const [txid, outputIndex] = String(output.outpoint).split('.');
258
+ const tx = index_js_4.Transaction.fromBEEF(outputs.BEEF, txid);
259
+ const decoded = index_js_3.PushDrop.decode(tx.outputs[Number(outputIndex)].lockingScript);
260
+ if (output.customInstructions == null)
261
+ return false;
262
+ const keyID = JSON.parse(output.customInstructions).keyID;
263
+ const { plaintext } = await this.wallet.decrypt({ ciphertext: decoded.fields[0], protocolID: CONTACT_PROTOCOL_ID, keyID, counterparty: 'self' }, this.originator);
264
+ const storedContact = JSON.parse(index_js_2.Utils.toUTF8(plaintext));
265
+ if (storedContact.identityKey !== identityKey)
266
+ return false;
267
+ const prevOutpoint = `${txid}.${outputIndex}`;
268
+ const pushdrop = new index_js_3.PushDrop(this.wallet, this.originator);
269
+ const { signableTransaction } = await this.wallet.createAction({
270
+ description: 'Delete Contact',
271
+ inputBEEF: outputs.BEEF,
272
+ inputs: [{ outpoint: prevOutpoint, unlockingScriptLength: 74, inputDescription: 'Spend contact output to delete' }],
273
+ outputs: [],
274
+ options: { acceptDelayedBroadcast: false, randomizeOutputs: false }
275
+ }, this.originator);
276
+ if (signableTransaction == null)
277
+ throw new Error('Unable to delete contact');
278
+ const unlockingScript = await pushdrop.unlock(CONTACT_PROTOCOL_ID, keyID, 'self')
279
+ .sign(index_js_4.Transaction.fromBEEF(signableTransaction.tx), 0);
280
+ const { tx: deleteTx } = await this.wallet.signAction({
281
+ reference: signableTransaction.reference,
282
+ spends: { 0: { unlockingScript: unlockingScript.toHex() } }
283
+ }, this.originator);
284
+ if (deleteTx == null)
285
+ throw new Error('Failed to delete contact output');
286
+ return true;
287
+ }
348
288
  }
349
289
  exports.ContactsManager = ContactsManager;
350
290
  //# sourceMappingURL=ContactsManager.js.map