@bsv/sdk 1.6.9 → 1.6.11

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 (654) hide show
  1. package/README.md +9 -4
  2. package/dist/cjs/package.json +4 -2
  3. package/dist/cjs/src/wallet/substrates/HTTPWalletJSON.js +5 -1
  4. package/dist/cjs/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
  5. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  6. package/dist/esm/src/wallet/substrates/HTTPWalletJSON.js +5 -1
  7. package/dist/esm/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
  8. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  9. package/dist/types/src/wallet/substrates/HTTPWalletJSON.d.ts.map +1 -1
  10. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  11. package/dist/umd/bundle.js +1 -1
  12. package/docs/concepts/beef.md +84 -0
  13. package/docs/concepts/chain-tracking.md +122 -0
  14. package/docs/concepts/decentralized-identity.md +184 -0
  15. package/docs/concepts/fees.md +217 -0
  16. package/docs/concepts/identity-certificates.md +255 -0
  17. package/docs/concepts/index.md +62 -0
  18. package/docs/concepts/key-management.md +176 -0
  19. package/docs/concepts/script-templates.md +163 -0
  20. package/docs/concepts/sdk-philosophy.md +72 -0
  21. package/docs/concepts/signatures.md +179 -0
  22. package/docs/concepts/spv-verification.md +106 -0
  23. package/docs/concepts/transaction-encoding.md +148 -0
  24. package/docs/concepts/transaction-structure.md +63 -0
  25. package/docs/concepts/trust-model.md +123 -0
  26. package/docs/concepts/verification.md +219 -0
  27. package/docs/concepts/wallet-integration.md +95 -0
  28. package/docs/guides/direct-transaction-creation.md +137 -0
  29. package/docs/guides/http-client-configuration.md +414 -0
  30. package/docs/guides/index.md +30 -0
  31. package/docs/guides/transaction-signing-methods.md +268 -0
  32. package/docs/index.md +74 -0
  33. package/docs/reference/arc-config.md +698 -0
  34. package/docs/reference/brc-100.md +33 -0
  35. package/docs/reference/configuration.md +829 -0
  36. package/docs/reference/debugging.md +700 -0
  37. package/docs/reference/errors.md +547 -0
  38. package/docs/reference/index.md +98 -0
  39. package/docs/reference/network-config.md +914 -0
  40. package/docs/reference/op-codes.md +306 -0
  41. package/docs/reference/transaction-signatures.md +94 -0
  42. package/docs/requirements.txt +3 -0
  43. package/docs/tutorials/advanced-transaction.md +575 -0
  44. package/docs/tutorials/aes-encryption.md +947 -0
  45. package/docs/tutorials/authfetch-tutorial.md +957 -0
  46. package/docs/tutorials/ecdh-key-exchange.md +547 -0
  47. package/docs/tutorials/elliptic-curve-fundamentals.md +603 -0
  48. package/docs/tutorials/error-handling.md +1215 -0
  49. package/docs/tutorials/first-transaction-low-level.md +204 -0
  50. package/docs/tutorials/first-transaction.md +278 -0
  51. package/docs/tutorials/hashes-and-hmacs.md +814 -0
  52. package/docs/tutorials/identity-management.md +702 -0
  53. package/docs/tutorials/index.md +182 -0
  54. package/docs/tutorials/key-management.md +536 -0
  55. package/docs/tutorials/protowallet-development.md +716 -0
  56. package/docs/tutorials/script-construction.md +690 -0
  57. package/docs/tutorials/spv-merkle-proofs.md +682 -0
  58. package/docs/tutorials/testnet-transactions-low-level.md +352 -0
  59. package/docs/tutorials/transaction-broadcasting.md +535 -0
  60. package/docs/tutorials/transaction-types.md +419 -0
  61. package/docs/tutorials/type-42.md +582 -0
  62. package/docs/tutorials/uhrp-storage.md +579 -0
  63. package/package.json +4 -2
  64. package/src/wallet/substrates/HTTPWalletJSON.ts +6 -1
  65. package/dist/cjs/src/auth/__tests/Peer.test.js +0 -446
  66. package/dist/cjs/src/auth/__tests/Peer.test.js.map +0 -1
  67. package/dist/cjs/src/auth/__tests/SessionManager.test.js +0 -69
  68. package/dist/cjs/src/auth/__tests/SessionManager.test.js.map +0 -1
  69. package/dist/cjs/src/auth/certificates/__tests/Certificate.test.js +0 -182
  70. package/dist/cjs/src/auth/certificates/__tests/Certificate.test.js.map +0 -1
  71. package/dist/cjs/src/auth/certificates/__tests/MasterCertificate.test.js +0 -184
  72. package/dist/cjs/src/auth/certificates/__tests/MasterCertificate.test.js.map +0 -1
  73. package/dist/cjs/src/auth/certificates/__tests/VerifiableCertificate.test.js +0 -75
  74. package/dist/cjs/src/auth/certificates/__tests/VerifiableCertificate.test.js.map +0 -1
  75. package/dist/cjs/src/auth/utils/__tests/cryptononce.test.js +0 -101
  76. package/dist/cjs/src/auth/utils/__tests/cryptononce.test.js.map +0 -1
  77. package/dist/cjs/src/auth/utils/__tests/getVerifiableCertificates.test.js +0 -106
  78. package/dist/cjs/src/auth/utils/__tests/getVerifiableCertificates.test.js.map +0 -1
  79. package/dist/cjs/src/auth/utils/__tests/validateCertificates.test.js +0 -111
  80. package/dist/cjs/src/auth/utils/__tests/validateCertificates.test.js.map +0 -1
  81. package/dist/cjs/src/auth/utils/certificateHelpers.js +0 -51
  82. package/dist/cjs/src/auth/utils/certificateHelpers.js.map +0 -1
  83. package/dist/cjs/src/compat/__tests/BSM.test.js +0 -69
  84. package/dist/cjs/src/compat/__tests/BSM.test.js.map +0 -1
  85. package/dist/cjs/src/compat/__tests/ECIES.test.js +0 -115
  86. package/dist/cjs/src/compat/__tests/ECIES.test.js.map +0 -1
  87. package/dist/cjs/src/compat/__tests/HD.test.js +0 -336
  88. package/dist/cjs/src/compat/__tests/HD.test.js.map +0 -1
  89. package/dist/cjs/src/compat/__tests/Mnemonic.test.js +0 -150
  90. package/dist/cjs/src/compat/__tests/Mnemonic.test.js.map +0 -1
  91. package/dist/cjs/src/compat/__tests/Mnemonic.vectors.js +0 -175
  92. package/dist/cjs/src/compat/__tests/Mnemonic.vectors.js.map +0 -1
  93. package/dist/cjs/src/messages/__tests/EncryptedMessage.test.js +0 -57
  94. package/dist/cjs/src/messages/__tests/EncryptedMessage.test.js.map +0 -1
  95. package/dist/cjs/src/messages/__tests/SignedMessage.test.js +0 -52
  96. package/dist/cjs/src/messages/__tests/SignedMessage.test.js.map +0 -1
  97. package/dist/cjs/src/overlay-tools/__tests/LookupResolver.test.js +0 -1471
  98. package/dist/cjs/src/overlay-tools/__tests/LookupResolver.test.js.map +0 -1
  99. package/dist/cjs/src/overlay-tools/__tests/OverlayAdminTokenTemplate.test.js +0 -78
  100. package/dist/cjs/src/overlay-tools/__tests/OverlayAdminTokenTemplate.test.js.map +0 -1
  101. package/dist/cjs/src/overlay-tools/__tests/SHIPBroadcaster.test.js +0 -933
  102. package/dist/cjs/src/overlay-tools/__tests/SHIPBroadcaster.test.js.map +0 -1
  103. package/dist/cjs/src/primitives/__tests/AESGCM.test.js +0 -248
  104. package/dist/cjs/src/primitives/__tests/AESGCM.test.js.map +0 -1
  105. package/dist/cjs/src/primitives/__tests/BRC42.private.vectors.js +0 -36
  106. package/dist/cjs/src/primitives/__tests/BRC42.private.vectors.js.map +0 -1
  107. package/dist/cjs/src/primitives/__tests/BRC42.public.vectors.js +0 -36
  108. package/dist/cjs/src/primitives/__tests/BRC42.public.vectors.js.map +0 -1
  109. package/dist/cjs/src/primitives/__tests/BigNumber.arithmatic.test.js +0 -501
  110. package/dist/cjs/src/primitives/__tests/BigNumber.arithmatic.test.js.map +0 -1
  111. package/dist/cjs/src/primitives/__tests/BigNumber.binary.test.js +0 -185
  112. package/dist/cjs/src/primitives/__tests/BigNumber.binary.test.js.map +0 -1
  113. package/dist/cjs/src/primitives/__tests/BigNumber.constructor.test.js +0 -149
  114. package/dist/cjs/src/primitives/__tests/BigNumber.constructor.test.js.map +0 -1
  115. package/dist/cjs/src/primitives/__tests/BigNumber.dhGroup.test.js +0 -23
  116. package/dist/cjs/src/primitives/__tests/BigNumber.dhGroup.test.js.map +0 -1
  117. package/dist/cjs/src/primitives/__tests/BigNumber.fixtures.js +0 -268
  118. package/dist/cjs/src/primitives/__tests/BigNumber.fixtures.js.map +0 -1
  119. package/dist/cjs/src/primitives/__tests/BigNumber.serializers.test.js +0 -147
  120. package/dist/cjs/src/primitives/__tests/BigNumber.serializers.test.js.map +0 -1
  121. package/dist/cjs/src/primitives/__tests/BigNumber.utils.test.js +0 -322
  122. package/dist/cjs/src/primitives/__tests/BigNumber.utils.test.js.map +0 -1
  123. package/dist/cjs/src/primitives/__tests/Curve.unit.test.js +0 -145
  124. package/dist/cjs/src/primitives/__tests/Curve.unit.test.js.map +0 -1
  125. package/dist/cjs/src/primitives/__tests/DRBG.test.js +0 -22
  126. package/dist/cjs/src/primitives/__tests/DRBG.test.js.map +0 -1
  127. package/dist/cjs/src/primitives/__tests/DRBG.vectors.js +0 -170
  128. package/dist/cjs/src/primitives/__tests/DRBG.vectors.js.map +0 -1
  129. package/dist/cjs/src/primitives/__tests/ECDH.test.js +0 -34
  130. package/dist/cjs/src/primitives/__tests/ECDH.test.js.map +0 -1
  131. package/dist/cjs/src/primitives/__tests/ECDSA.test.js +0 -89
  132. package/dist/cjs/src/primitives/__tests/ECDSA.test.js.map +0 -1
  133. package/dist/cjs/src/primitives/__tests/HMAC.test.js +0 -60
  134. package/dist/cjs/src/primitives/__tests/HMAC.test.js.map +0 -1
  135. package/dist/cjs/src/primitives/__tests/Hash.test.js +0 -159
  136. package/dist/cjs/src/primitives/__tests/Hash.test.js.map +0 -1
  137. package/dist/cjs/src/primitives/__tests/PBKDF2.vectors.js +0 -122
  138. package/dist/cjs/src/primitives/__tests/PBKDF2.vectors.js.map +0 -1
  139. package/dist/cjs/src/primitives/__tests/PrivateKey.split.test.js +0 -105
  140. package/dist/cjs/src/primitives/__tests/PrivateKey.split.test.js.map +0 -1
  141. package/dist/cjs/src/primitives/__tests/PrivateKey.test.js +0 -90
  142. package/dist/cjs/src/primitives/__tests/PrivateKey.test.js.map +0 -1
  143. package/dist/cjs/src/primitives/__tests/PublicKey.test.js +0 -83
  144. package/dist/cjs/src/primitives/__tests/PublicKey.test.js.map +0 -1
  145. package/dist/cjs/src/primitives/__tests/Random.test.js +0 -19
  146. package/dist/cjs/src/primitives/__tests/Random.test.js.map +0 -1
  147. package/dist/cjs/src/primitives/__tests/Reader.test.js +0 -282
  148. package/dist/cjs/src/primitives/__tests/Reader.test.js.map +0 -1
  149. package/dist/cjs/src/primitives/__tests/ReductionContext.test.js +0 -224
  150. package/dist/cjs/src/primitives/__tests/ReductionContext.test.js.map +0 -1
  151. package/dist/cjs/src/primitives/__tests/Schnorr.test.js +0 -213
  152. package/dist/cjs/src/primitives/__tests/Schnorr.test.js.map +0 -1
  153. package/dist/cjs/src/primitives/__tests/SymmetricKey.test.js +0 -51
  154. package/dist/cjs/src/primitives/__tests/SymmetricKey.test.js.map +0 -1
  155. package/dist/cjs/src/primitives/__tests/SymmetricKey.vectors.js +0 -43
  156. package/dist/cjs/src/primitives/__tests/SymmetricKey.vectors.js.map +0 -1
  157. package/dist/cjs/src/primitives/__tests/Writer.test.js +0 -176
  158. package/dist/cjs/src/primitives/__tests/Writer.test.js.map +0 -1
  159. package/dist/cjs/src/primitives/__tests/bug-31.test.js +0 -32
  160. package/dist/cjs/src/primitives/__tests/bug-31.test.js.map +0 -1
  161. package/dist/cjs/src/primitives/__tests/sighash.vectors.js +0 -3506
  162. package/dist/cjs/src/primitives/__tests/sighash.vectors.js.map +0 -1
  163. package/dist/cjs/src/primitives/__tests/utils.test.js +0 -110
  164. package/dist/cjs/src/primitives/__tests/utils.test.js.map +0 -1
  165. package/dist/cjs/src/script/__tests/Script.test.js +0 -347
  166. package/dist/cjs/src/script/__tests/Script.test.js.map +0 -1
  167. package/dist/cjs/src/script/__tests/Spend.test.js +0 -282
  168. package/dist/cjs/src/script/__tests/Spend.test.js.map +0 -1
  169. package/dist/cjs/src/script/__tests/SpendComplex.test.js +0 -52
  170. package/dist/cjs/src/script/__tests/SpendComplex.test.js.map +0 -1
  171. package/dist/cjs/src/script/__tests/script.invalid.vectors.js +0 -2370
  172. package/dist/cjs/src/script/__tests/script.invalid.vectors.js.map +0 -1
  173. package/dist/cjs/src/script/__tests/script.valid.vectors.js +0 -1181
  174. package/dist/cjs/src/script/__tests/script.valid.vectors.js.map +0 -1
  175. package/dist/cjs/src/script/__tests/spend.valid.vectors.js +0 -2298
  176. package/dist/cjs/src/script/__tests/spend.valid.vectors.js.map +0 -1
  177. package/dist/cjs/src/script/templates/__tests/PushDrop.test.js +0 -161
  178. package/dist/cjs/src/script/templates/__tests/PushDrop.test.js.map +0 -1
  179. package/dist/cjs/src/totp/__tests/totp.test.js +0 -67
  180. package/dist/cjs/src/totp/__tests/totp.test.js.map +0 -1
  181. package/dist/cjs/src/transaction/__tests/Beef.test.js +0 -393
  182. package/dist/cjs/src/transaction/__tests/Beef.test.js.map +0 -1
  183. package/dist/cjs/src/transaction/__tests/MerklePath.test.js +0 -209
  184. package/dist/cjs/src/transaction/__tests/MerklePath.test.js.map +0 -1
  185. package/dist/cjs/src/transaction/__tests/Transaction.benchmarks.test.js +0 -219
  186. package/dist/cjs/src/transaction/__tests/Transaction.benchmarks.test.js.map +0 -1
  187. package/dist/cjs/src/transaction/__tests/Transaction.test.js +0 -1073
  188. package/dist/cjs/src/transaction/__tests/Transaction.test.js.map +0 -1
  189. package/dist/cjs/src/transaction/__tests/bigtx.vectors.js +0 -7
  190. package/dist/cjs/src/transaction/__tests/bigtx.vectors.js.map +0 -1
  191. package/dist/cjs/src/transaction/__tests/bump.invalid.vectors.js +0 -11
  192. package/dist/cjs/src/transaction/__tests/bump.invalid.vectors.js.map +0 -1
  193. package/dist/cjs/src/transaction/__tests/bump.valid.vectors.js +0 -7
  194. package/dist/cjs/src/transaction/__tests/bump.valid.vectors.js.map +0 -1
  195. package/dist/cjs/src/transaction/__tests/tx.invalid.vectors.js +0 -230
  196. package/dist/cjs/src/transaction/__tests/tx.invalid.vectors.js.map +0 -1
  197. package/dist/cjs/src/transaction/__tests/tx.valid.vectors.js +0 -296
  198. package/dist/cjs/src/transaction/__tests/tx.valid.vectors.js.map +0 -1
  199. package/dist/cjs/src/transaction/broadcasters/__tests/ARC.test.js +0 -246
  200. package/dist/cjs/src/transaction/broadcasters/__tests/ARC.test.js.map +0 -1
  201. package/dist/cjs/src/transaction/broadcasters/__tests/WhatsOnChainBroadcaster.test.js +0 -148
  202. package/dist/cjs/src/transaction/broadcasters/__tests/WhatsOnChainBroadcaster.test.js.map +0 -1
  203. package/dist/cjs/src/transaction/chaintrackers/__tests/WhatsOnChainChainTracker.test.js +0 -155
  204. package/dist/cjs/src/transaction/chaintrackers/__tests/WhatsOnChainChainTracker.test.js.map +0 -1
  205. package/dist/cjs/src/wallet/ScriptTemplateSABPPP.js +0 -39
  206. package/dist/cjs/src/wallet/ScriptTemplateSABPPP.js.map +0 -1
  207. package/dist/cjs/src/wallet/WalletSigner.js +0 -260
  208. package/dist/cjs/src/wallet/WalletSigner.js.map +0 -1
  209. package/dist/cjs/src/wallet/__tests/CachedKeyDeriver.test.js +0 -269
  210. package/dist/cjs/src/wallet/__tests/CachedKeyDeriver.test.js.map +0 -1
  211. package/dist/cjs/src/wallet/__tests/KeyDeriver.test.js +0 -114
  212. package/dist/cjs/src/wallet/__tests/KeyDeriver.test.js.map +0 -1
  213. package/dist/cjs/src/wallet/__tests/ProtoWallet.test.js +0 -475
  214. package/dist/cjs/src/wallet/__tests/ProtoWallet.test.js.map +0 -1
  215. package/dist/cjs/src/wallet/createActionSdk.js +0 -230
  216. package/dist/cjs/src/wallet/createActionSdk.js.map +0 -1
  217. package/dist/cjs/src/wallet/sdk/CachedKeyDeriver.js +0 -174
  218. package/dist/cjs/src/wallet/sdk/CachedKeyDeriver.js.map +0 -1
  219. package/dist/cjs/src/wallet/sdk/CertOps.js +0 -181
  220. package/dist/cjs/src/wallet/sdk/CertOps.js.map +0 -1
  221. package/dist/cjs/src/wallet/sdk/Certificate.js +0 -162
  222. package/dist/cjs/src/wallet/sdk/Certificate.js.map +0 -1
  223. package/dist/cjs/src/wallet/sdk/KeyDeriver.js +0 -176
  224. package/dist/cjs/src/wallet/sdk/KeyDeriver.js.map +0 -1
  225. package/dist/cjs/src/wallet/sdk/ProtoWallet.js +0 -75
  226. package/dist/cjs/src/wallet/sdk/ProtoWallet.js.map +0 -1
  227. package/dist/cjs/src/wallet/sdk/StorageSyncReader.js +0 -3
  228. package/dist/cjs/src/wallet/sdk/StorageSyncReader.js.map +0 -1
  229. package/dist/cjs/src/wallet/sdk/WERR_errors.js +0 -107
  230. package/dist/cjs/src/wallet/sdk/WERR_errors.js.map +0 -1
  231. package/dist/cjs/src/wallet/sdk/Wallet.interfaces.js +0 -3
  232. package/dist/cjs/src/wallet/sdk/Wallet.interfaces.js.map +0 -1
  233. package/dist/cjs/src/wallet/sdk/WalletCrypto.js +0 -171
  234. package/dist/cjs/src/wallet/sdk/WalletCrypto.js.map +0 -1
  235. package/dist/cjs/src/wallet/sdk/WalletError.js +0 -103
  236. package/dist/cjs/src/wallet/sdk/WalletError.js.map +0 -1
  237. package/dist/cjs/src/wallet/sdk/WalletServices.interfaces.js +0 -3
  238. package/dist/cjs/src/wallet/sdk/WalletServices.interfaces.js.map +0 -1
  239. package/dist/cjs/src/wallet/sdk/WalletSigner.interfaces.js +0 -3
  240. package/dist/cjs/src/wallet/sdk/WalletSigner.interfaces.js.map +0 -1
  241. package/dist/cjs/src/wallet/sdk/WalletStorage.interfaces.js +0 -3
  242. package/dist/cjs/src/wallet/sdk/WalletStorage.interfaces.js.map +0 -1
  243. package/dist/cjs/src/wallet/sdk/index.js +0 -31
  244. package/dist/cjs/src/wallet/sdk/index.js.map +0 -1
  245. package/dist/cjs/src/wallet/sdk/types.js +0 -11
  246. package/dist/cjs/src/wallet/sdk/types.js.map +0 -1
  247. package/dist/cjs/src/wallet/sdk/validationHelpers.js +0 -601
  248. package/dist/cjs/src/wallet/sdk/validationHelpers.js.map +0 -1
  249. package/dist/cjs/src/wallet/substrates/__tests/WalletWire.integration.test.js +0 -1962
  250. package/dist/cjs/src/wallet/substrates/__tests/WalletWire.integration.test.js.map +0 -1
  251. package/dist/cjs/src/wallet/substrates/__tests/XDM.test.js +0 -579
  252. package/dist/cjs/src/wallet/substrates/__tests/XDM.test.js.map +0 -1
  253. package/dist/cjs/src/wallet/utilityHelpers.js +0 -305
  254. package/dist/cjs/src/wallet/utilityHelpers.js.map +0 -1
  255. package/dist/cjs/src/wallet/validationHelpers.js +0 -601
  256. package/dist/cjs/src/wallet/validationHelpers.js.map +0 -1
  257. package/dist/esm/src/auth/__tests/Peer.test.js +0 -448
  258. package/dist/esm/src/auth/__tests/Peer.test.js.map +0 -1
  259. package/dist/esm/src/auth/__tests/SessionManager.test.js +0 -69
  260. package/dist/esm/src/auth/__tests/SessionManager.test.js.map +0 -1
  261. package/dist/esm/src/auth/certificates/__tests/Certificate.test.js +0 -182
  262. package/dist/esm/src/auth/certificates/__tests/Certificate.test.js.map +0 -1
  263. package/dist/esm/src/auth/certificates/__tests/MasterCertificate.test.js +0 -184
  264. package/dist/esm/src/auth/certificates/__tests/MasterCertificate.test.js.map +0 -1
  265. package/dist/esm/src/auth/certificates/__tests/VerifiableCertificate.test.js +0 -75
  266. package/dist/esm/src/auth/certificates/__tests/VerifiableCertificate.test.js.map +0 -1
  267. package/dist/esm/src/auth/utils/__tests/cryptononce.test.js +0 -101
  268. package/dist/esm/src/auth/utils/__tests/cryptononce.test.js.map +0 -1
  269. package/dist/esm/src/auth/utils/__tests/getVerifiableCertificates.test.js +0 -106
  270. package/dist/esm/src/auth/utils/__tests/getVerifiableCertificates.test.js.map +0 -1
  271. package/dist/esm/src/auth/utils/__tests/validateCertificates.test.js +0 -111
  272. package/dist/esm/src/auth/utils/__tests/validateCertificates.test.js.map +0 -1
  273. package/dist/esm/src/auth/utils/certificateHelpers.js +0 -47
  274. package/dist/esm/src/auth/utils/certificateHelpers.js.map +0 -1
  275. package/dist/esm/src/compat/__tests/BSM.test.js +0 -69
  276. package/dist/esm/src/compat/__tests/BSM.test.js.map +0 -1
  277. package/dist/esm/src/compat/__tests/ECIES.test.js +0 -115
  278. package/dist/esm/src/compat/__tests/ECIES.test.js.map +0 -1
  279. package/dist/esm/src/compat/__tests/HD.test.js +0 -336
  280. package/dist/esm/src/compat/__tests/HD.test.js.map +0 -1
  281. package/dist/esm/src/compat/__tests/Mnemonic.test.js +0 -150
  282. package/dist/esm/src/compat/__tests/Mnemonic.test.js.map +0 -1
  283. package/dist/esm/src/compat/__tests/Mnemonic.vectors.js +0 -175
  284. package/dist/esm/src/compat/__tests/Mnemonic.vectors.js.map +0 -1
  285. package/dist/esm/src/messages/__tests/EncryptedMessage.test.js +0 -57
  286. package/dist/esm/src/messages/__tests/EncryptedMessage.test.js.map +0 -1
  287. package/dist/esm/src/messages/__tests/SignedMessage.test.js +0 -52
  288. package/dist/esm/src/messages/__tests/SignedMessage.test.js.map +0 -1
  289. package/dist/esm/src/overlay-tools/__tests/LookupResolver.test.js +0 -1471
  290. package/dist/esm/src/overlay-tools/__tests/LookupResolver.test.js.map +0 -1
  291. package/dist/esm/src/overlay-tools/__tests/OverlayAdminTokenTemplate.test.js +0 -78
  292. package/dist/esm/src/overlay-tools/__tests/OverlayAdminTokenTemplate.test.js.map +0 -1
  293. package/dist/esm/src/overlay-tools/__tests/SHIPBroadcaster.test.js +0 -933
  294. package/dist/esm/src/overlay-tools/__tests/SHIPBroadcaster.test.js.map +0 -1
  295. package/dist/esm/src/primitives/__tests/AESGCM.test.js +0 -248
  296. package/dist/esm/src/primitives/__tests/AESGCM.test.js.map +0 -1
  297. package/dist/esm/src/primitives/__tests/BRC42.private.vectors.js +0 -36
  298. package/dist/esm/src/primitives/__tests/BRC42.private.vectors.js.map +0 -1
  299. package/dist/esm/src/primitives/__tests/BRC42.public.vectors.js +0 -36
  300. package/dist/esm/src/primitives/__tests/BRC42.public.vectors.js.map +0 -1
  301. package/dist/esm/src/primitives/__tests/BigNumber.arithmatic.test.js +0 -501
  302. package/dist/esm/src/primitives/__tests/BigNumber.arithmatic.test.js.map +0 -1
  303. package/dist/esm/src/primitives/__tests/BigNumber.binary.test.js +0 -185
  304. package/dist/esm/src/primitives/__tests/BigNumber.binary.test.js.map +0 -1
  305. package/dist/esm/src/primitives/__tests/BigNumber.constructor.test.js +0 -149
  306. package/dist/esm/src/primitives/__tests/BigNumber.constructor.test.js.map +0 -1
  307. package/dist/esm/src/primitives/__tests/BigNumber.dhGroup.test.js +0 -23
  308. package/dist/esm/src/primitives/__tests/BigNumber.dhGroup.test.js.map +0 -1
  309. package/dist/esm/src/primitives/__tests/BigNumber.fixtures.js +0 -268
  310. package/dist/esm/src/primitives/__tests/BigNumber.fixtures.js.map +0 -1
  311. package/dist/esm/src/primitives/__tests/BigNumber.serializers.test.js +0 -147
  312. package/dist/esm/src/primitives/__tests/BigNumber.serializers.test.js.map +0 -1
  313. package/dist/esm/src/primitives/__tests/BigNumber.utils.test.js +0 -322
  314. package/dist/esm/src/primitives/__tests/BigNumber.utils.test.js.map +0 -1
  315. package/dist/esm/src/primitives/__tests/Curve.unit.test.js +0 -145
  316. package/dist/esm/src/primitives/__tests/Curve.unit.test.js.map +0 -1
  317. package/dist/esm/src/primitives/__tests/DRBG.test.js +0 -22
  318. package/dist/esm/src/primitives/__tests/DRBG.test.js.map +0 -1
  319. package/dist/esm/src/primitives/__tests/DRBG.vectors.js +0 -170
  320. package/dist/esm/src/primitives/__tests/DRBG.vectors.js.map +0 -1
  321. package/dist/esm/src/primitives/__tests/ECDH.test.js +0 -34
  322. package/dist/esm/src/primitives/__tests/ECDH.test.js.map +0 -1
  323. package/dist/esm/src/primitives/__tests/ECDSA.test.js +0 -89
  324. package/dist/esm/src/primitives/__tests/ECDSA.test.js.map +0 -1
  325. package/dist/esm/src/primitives/__tests/HMAC.test.js +0 -60
  326. package/dist/esm/src/primitives/__tests/HMAC.test.js.map +0 -1
  327. package/dist/esm/src/primitives/__tests/Hash.test.js +0 -159
  328. package/dist/esm/src/primitives/__tests/Hash.test.js.map +0 -1
  329. package/dist/esm/src/primitives/__tests/PBKDF2.vectors.js +0 -122
  330. package/dist/esm/src/primitives/__tests/PBKDF2.vectors.js.map +0 -1
  331. package/dist/esm/src/primitives/__tests/PrivateKey.split.test.js +0 -105
  332. package/dist/esm/src/primitives/__tests/PrivateKey.split.test.js.map +0 -1
  333. package/dist/esm/src/primitives/__tests/PrivateKey.test.js +0 -90
  334. package/dist/esm/src/primitives/__tests/PrivateKey.test.js.map +0 -1
  335. package/dist/esm/src/primitives/__tests/PublicKey.test.js +0 -83
  336. package/dist/esm/src/primitives/__tests/PublicKey.test.js.map +0 -1
  337. package/dist/esm/src/primitives/__tests/Random.test.js +0 -19
  338. package/dist/esm/src/primitives/__tests/Random.test.js.map +0 -1
  339. package/dist/esm/src/primitives/__tests/Reader.test.js +0 -282
  340. package/dist/esm/src/primitives/__tests/Reader.test.js.map +0 -1
  341. package/dist/esm/src/primitives/__tests/ReductionContext.test.js +0 -223
  342. package/dist/esm/src/primitives/__tests/ReductionContext.test.js.map +0 -1
  343. package/dist/esm/src/primitives/__tests/Schnorr.test.js +0 -213
  344. package/dist/esm/src/primitives/__tests/Schnorr.test.js.map +0 -1
  345. package/dist/esm/src/primitives/__tests/SymmetricKey.test.js +0 -51
  346. package/dist/esm/src/primitives/__tests/SymmetricKey.test.js.map +0 -1
  347. package/dist/esm/src/primitives/__tests/SymmetricKey.vectors.js +0 -43
  348. package/dist/esm/src/primitives/__tests/SymmetricKey.vectors.js.map +0 -1
  349. package/dist/esm/src/primitives/__tests/Writer.test.js +0 -176
  350. package/dist/esm/src/primitives/__tests/Writer.test.js.map +0 -1
  351. package/dist/esm/src/primitives/__tests/bug-31.test.js +0 -32
  352. package/dist/esm/src/primitives/__tests/bug-31.test.js.map +0 -1
  353. package/dist/esm/src/primitives/__tests/sighash.vectors.js +0 -3506
  354. package/dist/esm/src/primitives/__tests/sighash.vectors.js.map +0 -1
  355. package/dist/esm/src/primitives/__tests/utils.test.js +0 -110
  356. package/dist/esm/src/primitives/__tests/utils.test.js.map +0 -1
  357. package/dist/esm/src/script/__tests/Script.test.js +0 -347
  358. package/dist/esm/src/script/__tests/Script.test.js.map +0 -1
  359. package/dist/esm/src/script/__tests/Spend.test.js +0 -282
  360. package/dist/esm/src/script/__tests/Spend.test.js.map +0 -1
  361. package/dist/esm/src/script/__tests/SpendComplex.test.js +0 -51
  362. package/dist/esm/src/script/__tests/SpendComplex.test.js.map +0 -1
  363. package/dist/esm/src/script/__tests/script.invalid.vectors.js +0 -2370
  364. package/dist/esm/src/script/__tests/script.invalid.vectors.js.map +0 -1
  365. package/dist/esm/src/script/__tests/script.valid.vectors.js +0 -1181
  366. package/dist/esm/src/script/__tests/script.valid.vectors.js.map +0 -1
  367. package/dist/esm/src/script/__tests/spend.valid.vectors.js +0 -2298
  368. package/dist/esm/src/script/__tests/spend.valid.vectors.js.map +0 -1
  369. package/dist/esm/src/script/templates/__tests/PushDrop.test.js +0 -161
  370. package/dist/esm/src/script/templates/__tests/PushDrop.test.js.map +0 -1
  371. package/dist/esm/src/totp/__tests/totp.test.js +0 -67
  372. package/dist/esm/src/totp/__tests/totp.test.js.map +0 -1
  373. package/dist/esm/src/transaction/__tests/Beef.test.js +0 -393
  374. package/dist/esm/src/transaction/__tests/Beef.test.js.map +0 -1
  375. package/dist/esm/src/transaction/__tests/MerklePath.test.js +0 -209
  376. package/dist/esm/src/transaction/__tests/MerklePath.test.js.map +0 -1
  377. package/dist/esm/src/transaction/__tests/Transaction.benchmarks.test.js +0 -219
  378. package/dist/esm/src/transaction/__tests/Transaction.benchmarks.test.js.map +0 -1
  379. package/dist/esm/src/transaction/__tests/Transaction.test.js +0 -1072
  380. package/dist/esm/src/transaction/__tests/Transaction.test.js.map +0 -1
  381. package/dist/esm/src/transaction/__tests/bigtx.vectors.js +0 -7
  382. package/dist/esm/src/transaction/__tests/bigtx.vectors.js.map +0 -1
  383. package/dist/esm/src/transaction/__tests/bump.invalid.vectors.js +0 -11
  384. package/dist/esm/src/transaction/__tests/bump.invalid.vectors.js.map +0 -1
  385. package/dist/esm/src/transaction/__tests/bump.valid.vectors.js +0 -7
  386. package/dist/esm/src/transaction/__tests/bump.valid.vectors.js.map +0 -1
  387. package/dist/esm/src/transaction/__tests/tx.invalid.vectors.js +0 -230
  388. package/dist/esm/src/transaction/__tests/tx.invalid.vectors.js.map +0 -1
  389. package/dist/esm/src/transaction/__tests/tx.valid.vectors.js +0 -296
  390. package/dist/esm/src/transaction/__tests/tx.valid.vectors.js.map +0 -1
  391. package/dist/esm/src/transaction/broadcasters/__tests/ARC.test.js +0 -246
  392. package/dist/esm/src/transaction/broadcasters/__tests/ARC.test.js.map +0 -1
  393. package/dist/esm/src/transaction/broadcasters/__tests/WhatsOnChainBroadcaster.test.js +0 -148
  394. package/dist/esm/src/transaction/broadcasters/__tests/WhatsOnChainBroadcaster.test.js.map +0 -1
  395. package/dist/esm/src/transaction/chaintrackers/__tests/WhatsOnChainChainTracker.test.js +0 -155
  396. package/dist/esm/src/transaction/chaintrackers/__tests/WhatsOnChainChainTracker.test.js.map +0 -1
  397. package/dist/esm/src/wallet/ScriptTemplateSABPPP.js +0 -37
  398. package/dist/esm/src/wallet/ScriptTemplateSABPPP.js.map +0 -1
  399. package/dist/esm/src/wallet/WalletSigner.js +0 -263
  400. package/dist/esm/src/wallet/WalletSigner.js.map +0 -1
  401. package/dist/esm/src/wallet/__tests/CachedKeyDeriver.test.js +0 -269
  402. package/dist/esm/src/wallet/__tests/CachedKeyDeriver.test.js.map +0 -1
  403. package/dist/esm/src/wallet/__tests/KeyDeriver.test.js +0 -113
  404. package/dist/esm/src/wallet/__tests/KeyDeriver.test.js.map +0 -1
  405. package/dist/esm/src/wallet/__tests/ProtoWallet.test.js +0 -475
  406. package/dist/esm/src/wallet/__tests/ProtoWallet.test.js.map +0 -1
  407. package/dist/esm/src/wallet/createActionSdk.js +0 -223
  408. package/dist/esm/src/wallet/createActionSdk.js.map +0 -1
  409. package/dist/esm/src/wallet/sdk/CachedKeyDeriver.js +0 -174
  410. package/dist/esm/src/wallet/sdk/CachedKeyDeriver.js.map +0 -1
  411. package/dist/esm/src/wallet/sdk/CertOps.js +0 -181
  412. package/dist/esm/src/wallet/sdk/CertOps.js.map +0 -1
  413. package/dist/esm/src/wallet/sdk/Certificate.js +0 -186
  414. package/dist/esm/src/wallet/sdk/Certificate.js.map +0 -1
  415. package/dist/esm/src/wallet/sdk/KeyDeriver.js +0 -174
  416. package/dist/esm/src/wallet/sdk/KeyDeriver.js.map +0 -1
  417. package/dist/esm/src/wallet/sdk/ProtoWallet.js +0 -71
  418. package/dist/esm/src/wallet/sdk/ProtoWallet.js.map +0 -1
  419. package/dist/esm/src/wallet/sdk/StorageSyncReader.js +0 -2
  420. package/dist/esm/src/wallet/sdk/StorageSyncReader.js.map +0 -1
  421. package/dist/esm/src/wallet/sdk/WERR_errors.js +0 -99
  422. package/dist/esm/src/wallet/sdk/WERR_errors.js.map +0 -1
  423. package/dist/esm/src/wallet/sdk/Wallet.interfaces.js +0 -2
  424. package/dist/esm/src/wallet/sdk/Wallet.interfaces.js.map +0 -1
  425. package/dist/esm/src/wallet/sdk/WalletCrypto.js +0 -168
  426. package/dist/esm/src/wallet/sdk/WalletCrypto.js.map +0 -1
  427. package/dist/esm/src/wallet/sdk/WalletError.js +0 -100
  428. package/dist/esm/src/wallet/sdk/WalletError.js.map +0 -1
  429. package/dist/esm/src/wallet/sdk/WalletServices.interfaces.js +0 -2
  430. package/dist/esm/src/wallet/sdk/WalletServices.interfaces.js.map +0 -1
  431. package/dist/esm/src/wallet/sdk/WalletSigner.interfaces.js +0 -2
  432. package/dist/esm/src/wallet/sdk/WalletSigner.interfaces.js.map +0 -1
  433. package/dist/esm/src/wallet/sdk/WalletStorage.interfaces.js +0 -2
  434. package/dist/esm/src/wallet/sdk/WalletStorage.interfaces.js.map +0 -1
  435. package/dist/esm/src/wallet/sdk/index.js +0 -15
  436. package/dist/esm/src/wallet/sdk/index.js.map +0 -1
  437. package/dist/esm/src/wallet/sdk/types.js +0 -8
  438. package/dist/esm/src/wallet/sdk/types.js.map +0 -1
  439. package/dist/esm/src/wallet/sdk/validationHelpers.js +0 -566
  440. package/dist/esm/src/wallet/sdk/validationHelpers.js.map +0 -1
  441. package/dist/esm/src/wallet/substrates/__tests/WalletWire.integration.test.js +0 -1962
  442. package/dist/esm/src/wallet/substrates/__tests/WalletWire.integration.test.js.map +0 -1
  443. package/dist/esm/src/wallet/substrates/__tests/XDM.test.js +0 -579
  444. package/dist/esm/src/wallet/substrates/__tests/XDM.test.js.map +0 -1
  445. package/dist/esm/src/wallet/utilityHelpers.js +0 -275
  446. package/dist/esm/src/wallet/utilityHelpers.js.map +0 -1
  447. package/dist/esm/src/wallet/validationHelpers.js +0 -566
  448. package/dist/esm/src/wallet/validationHelpers.js.map +0 -1
  449. package/dist/types/src/auth/__tests/Peer.test.d.ts +0 -2
  450. package/dist/types/src/auth/__tests/Peer.test.d.ts.map +0 -1
  451. package/dist/types/src/auth/__tests/SessionManager.test.d.ts +0 -2
  452. package/dist/types/src/auth/__tests/SessionManager.test.d.ts.map +0 -1
  453. package/dist/types/src/auth/certificates/__tests/Certificate.test.d.ts +0 -2
  454. package/dist/types/src/auth/certificates/__tests/Certificate.test.d.ts.map +0 -1
  455. package/dist/types/src/auth/certificates/__tests/MasterCertificate.test.d.ts +0 -2
  456. package/dist/types/src/auth/certificates/__tests/MasterCertificate.test.d.ts.map +0 -1
  457. package/dist/types/src/auth/certificates/__tests/VerifiableCertificate.test.d.ts +0 -2
  458. package/dist/types/src/auth/certificates/__tests/VerifiableCertificate.test.d.ts.map +0 -1
  459. package/dist/types/src/auth/utils/__tests/cryptononce.test.d.ts +0 -2
  460. package/dist/types/src/auth/utils/__tests/cryptononce.test.d.ts.map +0 -1
  461. package/dist/types/src/auth/utils/__tests/getVerifiableCertificates.test.d.ts +0 -2
  462. package/dist/types/src/auth/utils/__tests/getVerifiableCertificates.test.d.ts.map +0 -1
  463. package/dist/types/src/auth/utils/__tests/validateCertificates.test.d.ts +0 -2
  464. package/dist/types/src/auth/utils/__tests/validateCertificates.test.d.ts.map +0 -1
  465. package/dist/types/src/auth/utils/certificateHelpers.d.ts +0 -26
  466. package/dist/types/src/auth/utils/certificateHelpers.d.ts.map +0 -1
  467. package/dist/types/src/compat/__tests/BSM.test.d.ts +0 -2
  468. package/dist/types/src/compat/__tests/BSM.test.d.ts.map +0 -1
  469. package/dist/types/src/compat/__tests/ECIES.test.d.ts +0 -2
  470. package/dist/types/src/compat/__tests/ECIES.test.d.ts.map +0 -1
  471. package/dist/types/src/compat/__tests/HD.test.d.ts +0 -2
  472. package/dist/types/src/compat/__tests/HD.test.d.ts.map +0 -1
  473. package/dist/types/src/compat/__tests/Mnemonic.test.d.ts +0 -2
  474. package/dist/types/src/compat/__tests/Mnemonic.test.d.ts.map +0 -1
  475. package/dist/types/src/compat/__tests/Mnemonic.vectors.d.ts +0 -11
  476. package/dist/types/src/compat/__tests/Mnemonic.vectors.d.ts.map +0 -1
  477. package/dist/types/src/messages/__tests/EncryptedMessage.test.d.ts +0 -2
  478. package/dist/types/src/messages/__tests/EncryptedMessage.test.d.ts.map +0 -1
  479. package/dist/types/src/messages/__tests/SignedMessage.test.d.ts +0 -2
  480. package/dist/types/src/messages/__tests/SignedMessage.test.d.ts.map +0 -1
  481. package/dist/types/src/overlay-tools/__tests/LookupResolver.test.d.ts +0 -2
  482. package/dist/types/src/overlay-tools/__tests/LookupResolver.test.d.ts.map +0 -1
  483. package/dist/types/src/overlay-tools/__tests/OverlayAdminTokenTemplate.test.d.ts +0 -2
  484. package/dist/types/src/overlay-tools/__tests/OverlayAdminTokenTemplate.test.d.ts.map +0 -1
  485. package/dist/types/src/overlay-tools/__tests/SHIPBroadcaster.test.d.ts +0 -2
  486. package/dist/types/src/overlay-tools/__tests/SHIPBroadcaster.test.d.ts.map +0 -1
  487. package/dist/types/src/primitives/__tests/AESGCM.test.d.ts +0 -2
  488. package/dist/types/src/primitives/__tests/AESGCM.test.d.ts.map +0 -1
  489. package/dist/types/src/primitives/__tests/BRC42.private.vectors.d.ts +0 -8
  490. package/dist/types/src/primitives/__tests/BRC42.private.vectors.d.ts.map +0 -1
  491. package/dist/types/src/primitives/__tests/BRC42.public.vectors.d.ts +0 -8
  492. package/dist/types/src/primitives/__tests/BRC42.public.vectors.d.ts.map +0 -1
  493. package/dist/types/src/primitives/__tests/BigNumber.arithmatic.test.d.ts +0 -2
  494. package/dist/types/src/primitives/__tests/BigNumber.arithmatic.test.d.ts.map +0 -1
  495. package/dist/types/src/primitives/__tests/BigNumber.binary.test.d.ts +0 -2
  496. package/dist/types/src/primitives/__tests/BigNumber.binary.test.d.ts.map +0 -1
  497. package/dist/types/src/primitives/__tests/BigNumber.constructor.test.d.ts +0 -2
  498. package/dist/types/src/primitives/__tests/BigNumber.constructor.test.d.ts.map +0 -1
  499. package/dist/types/src/primitives/__tests/BigNumber.dhGroup.test.d.ts +0 -2
  500. package/dist/types/src/primitives/__tests/BigNumber.dhGroup.test.d.ts.map +0 -1
  501. package/dist/types/src/primitives/__tests/BigNumber.fixtures.d.ts +0 -15
  502. package/dist/types/src/primitives/__tests/BigNumber.fixtures.d.ts.map +0 -1
  503. package/dist/types/src/primitives/__tests/BigNumber.serializers.test.d.ts +0 -2
  504. package/dist/types/src/primitives/__tests/BigNumber.serializers.test.d.ts.map +0 -1
  505. package/dist/types/src/primitives/__tests/BigNumber.utils.test.d.ts +0 -2
  506. package/dist/types/src/primitives/__tests/BigNumber.utils.test.d.ts.map +0 -1
  507. package/dist/types/src/primitives/__tests/Curve.unit.test.d.ts +0 -2
  508. package/dist/types/src/primitives/__tests/Curve.unit.test.d.ts.map +0 -1
  509. package/dist/types/src/primitives/__tests/DRBG.test.d.ts +0 -2
  510. package/dist/types/src/primitives/__tests/DRBG.test.d.ts.map +0 -1
  511. package/dist/types/src/primitives/__tests/DRBG.vectors.d.ts +0 -10
  512. package/dist/types/src/primitives/__tests/DRBG.vectors.d.ts.map +0 -1
  513. package/dist/types/src/primitives/__tests/ECDH.test.d.ts +0 -2
  514. package/dist/types/src/primitives/__tests/ECDH.test.d.ts.map +0 -1
  515. package/dist/types/src/primitives/__tests/ECDSA.test.d.ts +0 -2
  516. package/dist/types/src/primitives/__tests/ECDSA.test.d.ts.map +0 -1
  517. package/dist/types/src/primitives/__tests/HMAC.test.d.ts +0 -2
  518. package/dist/types/src/primitives/__tests/HMAC.test.d.ts.map +0 -1
  519. package/dist/types/src/primitives/__tests/Hash.test.d.ts +0 -2
  520. package/dist/types/src/primitives/__tests/Hash.test.d.ts.map +0 -1
  521. package/dist/types/src/primitives/__tests/PBKDF2.vectors.d.ts +0 -68
  522. package/dist/types/src/primitives/__tests/PBKDF2.vectors.d.ts.map +0 -1
  523. package/dist/types/src/primitives/__tests/PrivateKey.split.test.d.ts +0 -2
  524. package/dist/types/src/primitives/__tests/PrivateKey.split.test.d.ts.map +0 -1
  525. package/dist/types/src/primitives/__tests/PrivateKey.test.d.ts +0 -2
  526. package/dist/types/src/primitives/__tests/PrivateKey.test.d.ts.map +0 -1
  527. package/dist/types/src/primitives/__tests/PublicKey.test.d.ts +0 -2
  528. package/dist/types/src/primitives/__tests/PublicKey.test.d.ts.map +0 -1
  529. package/dist/types/src/primitives/__tests/Random.test.d.ts +0 -2
  530. package/dist/types/src/primitives/__tests/Random.test.d.ts.map +0 -1
  531. package/dist/types/src/primitives/__tests/Reader.test.d.ts +0 -2
  532. package/dist/types/src/primitives/__tests/Reader.test.d.ts.map +0 -1
  533. package/dist/types/src/primitives/__tests/ReductionContext.test.d.ts +0 -2
  534. package/dist/types/src/primitives/__tests/ReductionContext.test.d.ts.map +0 -1
  535. package/dist/types/src/primitives/__tests/Schnorr.test.d.ts +0 -2
  536. package/dist/types/src/primitives/__tests/Schnorr.test.d.ts.map +0 -1
  537. package/dist/types/src/primitives/__tests/SymmetricKey.test.d.ts +0 -2
  538. package/dist/types/src/primitives/__tests/SymmetricKey.test.d.ts.map +0 -1
  539. package/dist/types/src/primitives/__tests/SymmetricKey.vectors.d.ts +0 -20
  540. package/dist/types/src/primitives/__tests/SymmetricKey.vectors.d.ts.map +0 -1
  541. package/dist/types/src/primitives/__tests/Writer.test.d.ts +0 -2
  542. package/dist/types/src/primitives/__tests/Writer.test.d.ts.map +0 -1
  543. package/dist/types/src/primitives/__tests/bug-31.test.d.ts +0 -2
  544. package/dist/types/src/primitives/__tests/bug-31.test.d.ts.map +0 -1
  545. package/dist/types/src/primitives/__tests/sighash.vectors.d.ts +0 -3
  546. package/dist/types/src/primitives/__tests/sighash.vectors.d.ts.map +0 -1
  547. package/dist/types/src/primitives/__tests/utils.test.d.ts +0 -2
  548. package/dist/types/src/primitives/__tests/utils.test.d.ts.map +0 -1
  549. package/dist/types/src/script/__tests/Script.test.d.ts +0 -2
  550. package/dist/types/src/script/__tests/Script.test.d.ts.map +0 -1
  551. package/dist/types/src/script/__tests/Spend.test.d.ts +0 -2
  552. package/dist/types/src/script/__tests/Spend.test.d.ts.map +0 -1
  553. package/dist/types/src/script/__tests/SpendComplex.test.d.ts +0 -2
  554. package/dist/types/src/script/__tests/SpendComplex.test.d.ts.map +0 -1
  555. package/dist/types/src/script/__tests/script.invalid.vectors.d.ts +0 -3
  556. package/dist/types/src/script/__tests/script.invalid.vectors.d.ts.map +0 -1
  557. package/dist/types/src/script/__tests/script.valid.vectors.d.ts +0 -3
  558. package/dist/types/src/script/__tests/script.valid.vectors.d.ts.map +0 -1
  559. package/dist/types/src/script/__tests/spend.valid.vectors.d.ts +0 -3
  560. package/dist/types/src/script/__tests/spend.valid.vectors.d.ts.map +0 -1
  561. package/dist/types/src/script/templates/__tests/PushDrop.test.d.ts +0 -2
  562. package/dist/types/src/script/templates/__tests/PushDrop.test.d.ts.map +0 -1
  563. package/dist/types/src/totp/__tests/totp.test.d.ts +0 -2
  564. package/dist/types/src/totp/__tests/totp.test.d.ts.map +0 -1
  565. package/dist/types/src/transaction/__tests/Beef.test.d.ts +0 -2
  566. package/dist/types/src/transaction/__tests/Beef.test.d.ts.map +0 -1
  567. package/dist/types/src/transaction/__tests/MerklePath.test.d.ts +0 -2
  568. package/dist/types/src/transaction/__tests/MerklePath.test.d.ts.map +0 -1
  569. package/dist/types/src/transaction/__tests/Transaction.benchmarks.test.d.ts +0 -2
  570. package/dist/types/src/transaction/__tests/Transaction.benchmarks.test.d.ts.map +0 -1
  571. package/dist/types/src/transaction/__tests/Transaction.test.d.ts +0 -2
  572. package/dist/types/src/transaction/__tests/Transaction.test.d.ts.map +0 -1
  573. package/dist/types/src/transaction/__tests/bigtx.vectors.d.ts +0 -6
  574. package/dist/types/src/transaction/__tests/bigtx.vectors.d.ts.map +0 -1
  575. package/dist/types/src/transaction/__tests/bump.invalid.vectors.d.ts +0 -6
  576. package/dist/types/src/transaction/__tests/bump.invalid.vectors.d.ts.map +0 -1
  577. package/dist/types/src/transaction/__tests/bump.valid.vectors.d.ts +0 -5
  578. package/dist/types/src/transaction/__tests/bump.valid.vectors.d.ts.map +0 -1
  579. package/dist/types/src/transaction/__tests/tx.invalid.vectors.d.ts +0 -3
  580. package/dist/types/src/transaction/__tests/tx.invalid.vectors.d.ts.map +0 -1
  581. package/dist/types/src/transaction/__tests/tx.valid.vectors.d.ts +0 -3
  582. package/dist/types/src/transaction/__tests/tx.valid.vectors.d.ts.map +0 -1
  583. package/dist/types/src/transaction/broadcasters/__tests/ARC.test.d.ts +0 -2
  584. package/dist/types/src/transaction/broadcasters/__tests/ARC.test.d.ts.map +0 -1
  585. package/dist/types/src/transaction/broadcasters/__tests/WhatsOnChainBroadcaster.test.d.ts +0 -2
  586. package/dist/types/src/transaction/broadcasters/__tests/WhatsOnChainBroadcaster.test.d.ts.map +0 -1
  587. package/dist/types/src/transaction/chaintrackers/__tests/WhatsOnChainChainTracker.test.d.ts +0 -2
  588. package/dist/types/src/transaction/chaintrackers/__tests/WhatsOnChainChainTracker.test.d.ts.map +0 -1
  589. package/dist/types/src/wallet/ScriptTemplateSABPPP.d.ts +0 -25
  590. package/dist/types/src/wallet/ScriptTemplateSABPPP.d.ts.map +0 -1
  591. package/dist/types/src/wallet/WalletSigner.d.ts +0 -110
  592. package/dist/types/src/wallet/WalletSigner.d.ts.map +0 -1
  593. package/dist/types/src/wallet/__tests/CachedKeyDeriver.test.d.ts +0 -2
  594. package/dist/types/src/wallet/__tests/CachedKeyDeriver.test.d.ts.map +0 -1
  595. package/dist/types/src/wallet/__tests/KeyDeriver.test.d.ts +0 -2
  596. package/dist/types/src/wallet/__tests/KeyDeriver.test.d.ts.map +0 -1
  597. package/dist/types/src/wallet/__tests/ProtoWallet.test.d.ts +0 -2
  598. package/dist/types/src/wallet/__tests/ProtoWallet.test.d.ts.map +0 -1
  599. package/dist/types/src/wallet/createActionSdk.d.ts +0 -8
  600. package/dist/types/src/wallet/createActionSdk.d.ts.map +0 -1
  601. package/dist/types/src/wallet/sdk/CachedKeyDeriver.d.ts +0 -94
  602. package/dist/types/src/wallet/sdk/CachedKeyDeriver.d.ts.map +0 -1
  603. package/dist/types/src/wallet/sdk/CertOps.d.ts +0 -63
  604. package/dist/types/src/wallet/sdk/CertOps.d.ts.map +0 -1
  605. package/dist/types/src/wallet/sdk/Certificate.d.ts +0 -77
  606. package/dist/types/src/wallet/sdk/Certificate.d.ts.map +0 -1
  607. package/dist/types/src/wallet/sdk/KeyDeriver.d.ts +0 -128
  608. package/dist/types/src/wallet/sdk/KeyDeriver.d.ts.map +0 -1
  609. package/dist/types/src/wallet/sdk/ProtoWallet.d.ts +0 -30
  610. package/dist/types/src/wallet/sdk/ProtoWallet.d.ts.map +0 -1
  611. package/dist/types/src/wallet/sdk/StorageSyncReader.d.ts +0 -102
  612. package/dist/types/src/wallet/sdk/StorageSyncReader.d.ts.map +0 -1
  613. package/dist/types/src/wallet/sdk/WERR_errors.d.ts +0 -84
  614. package/dist/types/src/wallet/sdk/WERR_errors.d.ts.map +0 -1
  615. package/dist/types/src/wallet/sdk/Wallet.interfaces.d.ts +0 -1036
  616. package/dist/types/src/wallet/sdk/Wallet.interfaces.d.ts.map +0 -1
  617. package/dist/types/src/wallet/sdk/WalletCrypto.d.ts +0 -31
  618. package/dist/types/src/wallet/sdk/WalletCrypto.d.ts.map +0 -1
  619. package/dist/types/src/wallet/sdk/WalletError.d.ts +0 -46
  620. package/dist/types/src/wallet/sdk/WalletError.d.ts.map +0 -1
  621. package/dist/types/src/wallet/sdk/WalletServices.interfaces.d.ts +0 -293
  622. package/dist/types/src/wallet/sdk/WalletServices.interfaces.d.ts.map +0 -1
  623. package/dist/types/src/wallet/sdk/WalletSigner.interfaces.d.ts +0 -48
  624. package/dist/types/src/wallet/sdk/WalletSigner.interfaces.d.ts.map +0 -1
  625. package/dist/types/src/wallet/sdk/WalletStorage.interfaces.d.ts +0 -296
  626. package/dist/types/src/wallet/sdk/WalletStorage.interfaces.d.ts.map +0 -1
  627. package/dist/types/src/wallet/sdk/index.d.ts +0 -15
  628. package/dist/types/src/wallet/sdk/index.d.ts.map +0 -1
  629. package/dist/types/src/wallet/sdk/types.d.ts +0 -56
  630. package/dist/types/src/wallet/sdk/types.d.ts.map +0 -1
  631. package/dist/types/src/wallet/sdk/validationHelpers.d.ts +0 -301
  632. package/dist/types/src/wallet/sdk/validationHelpers.d.ts.map +0 -1
  633. package/dist/types/src/wallet/substrates/__tests/WalletWire.integration.test.d.ts +0 -2
  634. package/dist/types/src/wallet/substrates/__tests/WalletWire.integration.test.d.ts.map +0 -1
  635. package/dist/types/src/wallet/substrates/__tests/XDM.test.d.ts +0 -5
  636. package/dist/types/src/wallet/substrates/__tests/XDM.test.d.ts.map +0 -1
  637. package/dist/types/src/wallet/utilityHelpers.d.ts +0 -142
  638. package/dist/types/src/wallet/utilityHelpers.d.ts.map +0 -1
  639. package/dist/types/src/wallet/validationHelpers.d.ts +0 -301
  640. package/dist/types/src/wallet/validationHelpers.d.ts.map +0 -1
  641. package/docs/README.md +0 -21
  642. /package/docs/{auth.md → reference/auth.md} +0 -0
  643. /package/docs/{compat.md → reference/compat.md} +0 -0
  644. /package/docs/{identity.md → reference/identity.md} +0 -0
  645. /package/docs/{kvstore.md → reference/kvstore.md} +0 -0
  646. /package/docs/{messages.md → reference/messages.md} +0 -0
  647. /package/docs/{overlay-tools.md → reference/overlay-tools.md} +0 -0
  648. /package/docs/{primitives.md → reference/primitives.md} +0 -0
  649. /package/docs/{registry.md → reference/registry.md} +0 -0
  650. /package/docs/{script.md → reference/script.md} +0 -0
  651. /package/docs/{storage.md → reference/storage.md} +0 -0
  652. /package/docs/{totp.md → reference/totp.md} +0 -0
  653. /package/docs/{transaction.md → reference/transaction.md} +0 -0
  654. /package/docs/{wallet.md → reference/wallet.md} +0 -0
@@ -0,0 +1,1215 @@
1
+ # Error Handling and Edge Cases
2
+
3
+ This tutorial covers robust error handling patterns and edge case management when working with the BSV TypeScript SDK. You'll learn to build resilient applications that gracefully handle network failures, wallet issues, validation errors, and other common scenarios.
4
+
5
+ ## Prerequisites
6
+
7
+ - Basic familiarity with the BSV TypeScript SDK
8
+ - Understanding of WalletClient usage
9
+ - Knowledge of async/await and Promise handling
10
+ - Basic TypeScript/JavaScript error handling concepts
11
+
12
+ ## Learning Goals
13
+
14
+ By the end of this tutorial, you will:
15
+
16
+ - Understand common error types in the BSV ecosystem
17
+ - Implement robust retry mechanisms and recovery strategies
18
+ - Handle wallet-specific errors and edge cases
19
+ - Build production-ready error handling patterns
20
+ - Debug and troubleshoot common SDK issues
21
+ - Create user-friendly error reporting systems
22
+
23
+ ## Error Types and Categories
24
+
25
+ ### WalletErrorObject Interface
26
+
27
+ The SDK uses a standardized error interface for wallet operations:
28
+
29
+ ```typescript
30
+ import { WalletClient, WalletErrorObject } from '@bsv/sdk'
31
+
32
+ function isWalletError(error: any): error is WalletErrorObject {
33
+ return error && typeof error === 'object' && error.isError === true
34
+ }
35
+
36
+ async function handleWalletOperation() {
37
+ try {
38
+ const wallet = new WalletClient('auto', 'localhost')
39
+ const result = await wallet.createAction({
40
+ description: 'Test transaction',
41
+ outputs: [{
42
+ satoshis: 100,
43
+ lockingScript: '006a0474657374', // "test"
44
+ outputDescription: 'Test output'
45
+ }]
46
+ })
47
+
48
+ console.log('Transaction successful:', result.txid)
49
+
50
+ } catch (error) {
51
+ if (isWalletError(error)) {
52
+ console.error('Wallet error occurred:', error.message)
53
+ // Handle wallet-specific error
54
+ } else {
55
+ console.error('General error:', error)
56
+ // Handle other types of errors
57
+ }
58
+ }
59
+ }
60
+ ```
61
+
62
+ ### Common Error Categories
63
+
64
+ ```typescript
65
+ enum ErrorCategory {
66
+ NETWORK = 'network',
67
+ WALLET = 'wallet',
68
+ VALIDATION = 'validation',
69
+ AUTHENTICATION = 'authentication',
70
+ INSUFFICIENT_FUNDS = 'insufficient_funds',
71
+ SCRIPT = 'script',
72
+ CRYPTOGRAPHIC = 'cryptographic'
73
+ }
74
+
75
+ interface CategorizedError {
76
+ category: ErrorCategory
77
+ message: string
78
+ originalError: Error
79
+ retryable: boolean
80
+ suggestedAction?: string
81
+ }
82
+
83
+ function categorizeError(error: Error): CategorizedError {
84
+ const message = error.message.toLowerCase()
85
+
86
+ if (message.includes('insufficient funds')) {
87
+ return {
88
+ category: ErrorCategory.INSUFFICIENT_FUNDS,
89
+ message: error.message,
90
+ originalError: error,
91
+ retryable: true,
92
+ suggestedAction: 'Check wallet balance and available UTXOs'
93
+ }
94
+ }
95
+
96
+ if (message.includes('rpc error') || message.includes('no header should have returned false')) {
97
+ return {
98
+ category: ErrorCategory.NETWORK,
99
+ message: error.message,
100
+ originalError: error,
101
+ retryable: true,
102
+ suggestedAction: 'Wait for wallet synchronization or restart wallet'
103
+ }
104
+ }
105
+
106
+ if (message.includes('not authenticated') || message.includes('authentication')) {
107
+ return {
108
+ category: ErrorCategory.AUTHENTICATION,
109
+ message: error.message,
110
+ originalError: error,
111
+ retryable: true,
112
+ suggestedAction: 'Re-authenticate with wallet'
113
+ }
114
+ }
115
+
116
+ if (message.includes('script') || message.includes('validation')) {
117
+ return {
118
+ category: ErrorCategory.VALIDATION,
119
+ message: error.message,
120
+ originalError: error,
121
+ retryable: false,
122
+ suggestedAction: 'Check transaction inputs and script validity'
123
+ }
124
+ }
125
+
126
+ return {
127
+ category: ErrorCategory.NETWORK,
128
+ message: error.message,
129
+ originalError: error,
130
+ retryable: false
131
+ }
132
+ }
133
+ ```
134
+
135
+ ## Retry Mechanisms and Recovery Strategies
136
+
137
+ ### Exponential Backoff Implementation
138
+
139
+ ```typescript
140
+ interface RetryOptions {
141
+ maxAttempts: number
142
+ baseDelay: number
143
+ maxDelay: number
144
+ backoffMultiplier: number
145
+ retryableErrors: string[]
146
+ }
147
+
148
+ class RetryManager {
149
+ private defaultOptions: RetryOptions = {
150
+ maxAttempts: 3,
151
+ baseDelay: 1000,
152
+ maxDelay: 30000,
153
+ backoffMultiplier: 2,
154
+ retryableErrors: [
155
+ 'insufficient funds',
156
+ 'rpc error',
157
+ 'no header should have returned false',
158
+ 'network error',
159
+ 'timeout'
160
+ ]
161
+ }
162
+
163
+ async executeWithRetry<T>(
164
+ operation: () => Promise<T>,
165
+ options: Partial<RetryOptions> = {}
166
+ ): Promise<T> {
167
+ const config = { ...this.defaultOptions, ...options }
168
+ let lastError: Error
169
+
170
+ for (let attempt = 1; attempt <= config.maxAttempts; attempt++) {
171
+ try {
172
+ console.log(`Attempt ${attempt}/${config.maxAttempts}`)
173
+ return await operation()
174
+
175
+ } catch (error: any) {
176
+ lastError = error
177
+ const categorized = categorizeError(error)
178
+
179
+ console.log(`Attempt ${attempt} failed:`, categorized.message)
180
+
181
+ if (!categorized.retryable || attempt === config.maxAttempts) {
182
+ break
183
+ }
184
+
185
+ const isRetryableError = config.retryableErrors.some(
186
+ retryableError => error.message.toLowerCase().includes(retryableError)
187
+ )
188
+
189
+ if (!isRetryableError) {
190
+ console.log('Error is not retryable, stopping attempts')
191
+ break
192
+ }
193
+
194
+ // Calculate delay with exponential backoff
195
+ const delay = Math.min(
196
+ config.baseDelay * Math.pow(config.backoffMultiplier, attempt - 1),
197
+ config.maxDelay
198
+ )
199
+
200
+ console.log(`Waiting ${delay}ms before retry...`)
201
+ await new Promise(resolve => setTimeout(resolve, delay))
202
+ }
203
+ }
204
+
205
+ throw new Error(`Operation failed after ${config.maxAttempts} attempts: ${lastError.message}`)
206
+ }
207
+ }
208
+
209
+ // Example usage
210
+ const retryManager = new RetryManager()
211
+
212
+ async function robustTransactionCreation() {
213
+ const wallet = new WalletClient('auto', 'localhost')
214
+
215
+ const result = await retryManager.executeWithRetry(async () => {
216
+ return await wallet.createAction({
217
+ description: 'Robust transaction with retry logic',
218
+ outputs: [{
219
+ satoshis: 100,
220
+ lockingScript: '006a0e526f6275737420746573742074786e', // "Robust test txn"
221
+ outputDescription: 'Retry demo output'
222
+ }]
223
+ })
224
+ }, {
225
+ maxAttempts: 5,
226
+ baseDelay: 2000
227
+ })
228
+
229
+ console.log('Transaction successful:', result.txid)
230
+ }
231
+
232
+ // Example usage
233
+ const walletManager = new WalletManager()
234
+
235
+ async function demonstrateWalletErrorHandling() {
236
+ try {
237
+ const result = await walletManager.safeCreateAction({
238
+ description: 'Wallet error handling demo',
239
+ outputs: [{
240
+ satoshis: 100,
241
+ lockingScript: '006a0f57616c6c657420657272206465616c', // "Wallet err deal"
242
+ outputDescription: 'Error handling demo'
243
+ }]
244
+ })
245
+
246
+ console.log('Transaction created successfully:', result.txid)
247
+
248
+ } catch (error) {
249
+ console.error('Final error after all recovery attempts:', error.message)
250
+ }
251
+ }
252
+
253
+ ## Network and Chain Tracker Error Handling
254
+
255
+ ### HTTP Client Error Management
256
+
257
+ ```typescript
258
+ import { ChainTracker } from '@bsv/sdk'
259
+
260
+ class RobustChainTracker {
261
+ private tracker: ChainTracker
262
+ private retryManager: RetryManager
263
+
264
+ constructor(baseURL: string = 'https://api.whatsonchain.com/v1/bsv/main') {
265
+ this.tracker = new ChainTracker(baseURL)
266
+ this.retryManager = new RetryManager()
267
+ }
268
+
269
+ async safeIsValidRootForHeight(root: string, height: number): Promise<boolean> {
270
+ return this.retryManager.executeWithRetry(async () => {
271
+ try {
272
+ return await this.tracker.isValidRootForHeight(root, height)
273
+
274
+ } catch (error: any) {
275
+ if (error.message.includes('404')) {
276
+ throw new Error(`Block height ${height} not found on chain`)
277
+ }
278
+
279
+ if (error.message.includes('429')) {
280
+ console.log('Rate limited, waiting longer...')
281
+ await new Promise(resolve => setTimeout(resolve, 5000))
282
+ throw error // Will be retried
283
+ }
284
+
285
+ if (error.message.includes('timeout') || error.message.includes('ECONNRESET')) {
286
+ console.log('Network timeout, retrying...')
287
+ throw error // Will be retried
288
+ }
289
+
290
+ // For other HTTP errors, don't retry
291
+ throw new Error(`Chain tracker error: ${error.message}`)
292
+ }
293
+ }, {
294
+ maxAttempts: 5,
295
+ baseDelay: 2000,
296
+ retryableErrors: ['timeout', 'econnreset', '429', 'network error']
297
+ })
298
+ }
299
+ }
300
+
301
+ // Example with fallback chain trackers
302
+ class FallbackChainTracker {
303
+ private trackers: RobustChainTracker[]
304
+ private currentTrackerIndex: number = 0
305
+
306
+ constructor() {
307
+ this.trackers = [
308
+ new RobustChainTracker('https://api.whatsonchain.com/v1/bsv/main'),
309
+ new RobustChainTracker('https://api.taal.com/api/v1/bsv/main'),
310
+ // Add more fallback endpoints as needed
311
+ ]
312
+ }
313
+
314
+ async isValidRootForHeight(root: string, height: number): Promise<boolean> {
315
+ for (let i = 0; i < this.trackers.length; i++) {
316
+ const trackerIndex = (this.currentTrackerIndex + i) % this.trackers.length
317
+ const tracker = this.trackers[trackerIndex]
318
+
319
+ try {
320
+ console.log(`Trying chain tracker ${trackerIndex + 1}/${this.trackers.length}`)
321
+ const result = await tracker.safeIsValidRootForHeight(root, height)
322
+
323
+ // Success - update current tracker for next time
324
+ this.currentTrackerIndex = trackerIndex
325
+ return result
326
+
327
+ } catch (error: any) {
328
+ console.log(`Chain tracker ${trackerIndex + 1} failed:`, error.message)
329
+
330
+ if (i === this.trackers.length - 1) {
331
+ throw new Error(`All chain trackers failed. Last error: ${error.message}`)
332
+ }
333
+ }
334
+ }
335
+
336
+ throw new Error('No chain trackers available')
337
+ }
338
+ }
339
+ ```
340
+
341
+ ### Practical Retry Implementation
342
+
343
+ Here's a practical example that handles common wallet errors with specific recovery strategies:
344
+
345
+ ```typescript
346
+ import { WalletClient } from '@bsv/sdk'
347
+
348
+ async function robustTransactionCreation() {
349
+ try {
350
+ const wallet = new WalletClient('auto', 'localhost')
351
+
352
+ const { authenticated } = await wallet.isAuthenticated()
353
+ if (!authenticated) {
354
+ await wallet.waitForAuthentication()
355
+ }
356
+
357
+ // Implement retry logic for common wallet issues
358
+ async function createActionWithRetry(args: any, maxRetries = 3) {
359
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
360
+ try {
361
+ console.log(`Transaction attempt ${attempt}/${maxRetries}`)
362
+
363
+ const result = await wallet.createAction(args)
364
+ console.log('Transaction successful!')
365
+ return result
366
+
367
+ } catch (error: any) {
368
+ console.log(`Attempt ${attempt} failed:`, error.message)
369
+
370
+ if (error.message?.includes('Insufficient funds')) {
371
+ console.log('Checking available UTXOs...')
372
+
373
+ const { outputs } = await wallet.listOutputs({
374
+ basket: 'tutorial',
375
+ limit: 20
376
+ })
377
+
378
+ const spendableValue = outputs
379
+ .filter(o => o.spendable)
380
+ .reduce((sum, o) => sum + o.satoshis, 0)
381
+
382
+ console.log(`Total spendable: ${spendableValue} satoshis`)
383
+
384
+ if (spendableValue < 500) {
385
+ throw new Error('Insufficient confirmed funds available')
386
+ }
387
+
388
+ // Try with a smaller amount
389
+ if (args.outputs && args.outputs[0]) {
390
+ args.outputs[0].satoshis = Math.min(100, spendableValue - 50)
391
+ console.log(`Retrying with reduced amount: ${args.outputs[0].satoshis} satoshis`)
392
+ }
393
+
394
+ } else if (error.message?.includes('no header should have returned false')) {
395
+ console.log('Wallet synchronization issue detected')
396
+ console.log('Waiting for wallet to sync...')
397
+ await new Promise(resolve => setTimeout(resolve, 5000))
398
+
399
+ } else if (error.message?.includes('RPC Error')) {
400
+ console.log('RPC communication error, retrying...')
401
+ await new Promise(resolve => setTimeout(resolve, 2000))
402
+
403
+ } else {
404
+ // For other errors, don't retry
405
+ throw error
406
+ }
407
+
408
+ if (attempt === maxRetries) {
409
+ throw new Error(`Transaction failed after ${maxRetries} attempts: ${error.message}`)
410
+ }
411
+ }
412
+ }
413
+ }
414
+
415
+ // Use the robust transaction creation
416
+ const result = await createActionWithRetry({
417
+ description: 'Robust transaction with error handling',
418
+ outputs: [
419
+ {
420
+ satoshis: 100,
421
+ lockingScript: '006a0e526f6275737420746573742074786e', // "Robust test txn"
422
+ outputDescription: 'Error handling demo'
423
+ }
424
+ ]
425
+ })
426
+
427
+ if (result && result.txid) {
428
+ console.log(`Robust transaction created: ${result.txid}`)
429
+ } else {
430
+ console.log('Transaction completed but no TXID returned')
431
+ }
432
+
433
+ } catch (error: unknown) {
434
+ console.error('Final error:', error)
435
+ }
436
+ }
437
+
438
+ robustTransactionCreation().catch(console.error)
439
+ ```
440
+
441
+ This example demonstrates:
442
+ - **Specific error pattern matching** for different error types
443
+ - **Dynamic amount adjustment** for insufficient funds
444
+ - **Wallet synchronization handling** with appropriate delays
445
+ - **RPC error recovery** with retry logic
446
+ - **Graceful degradation** when all retries are exhausted
447
+
448
+ ## SPV Verification Error Handling
449
+
450
+ ```typescript
451
+ import { Transaction, MerklePath } from '@bsv/sdk'
452
+
453
+ class SPVVerificationManager {
454
+ private chainTracker: FallbackChainTracker
455
+
456
+ constructor() {
457
+ this.chainTracker = new FallbackChainTracker()
458
+ }
459
+
460
+ async verifyTransactionSPV(
461
+ transaction: Transaction,
462
+ merklePath?: MerklePath,
463
+ chainTracker?: ChainTracker
464
+ ): Promise<{ verified: boolean; error?: string }> {
465
+ try {
466
+ // Use provided chain tracker or fallback
467
+ const tracker = chainTracker || this.chainTracker
468
+
469
+ const isValid = await transaction.verify(tracker, merklePath)
470
+
471
+ return { verified: isValid }
472
+
473
+ } catch (error: any) {
474
+ const errorMessage = error.message.toLowerCase()
475
+
476
+ if (errorMessage.includes('missing source transaction')) {
477
+ return {
478
+ verified: false,
479
+ error: 'BEEF structure incomplete - missing input transactions'
480
+ }
481
+ }
482
+
483
+ if (errorMessage.includes('merkle root')) {
484
+ return {
485
+ verified: false,
486
+ error: 'Merkle proof verification failed - invalid proof or root mismatch'
487
+ }
488
+ }
489
+
490
+ if (errorMessage.includes('script')) {
491
+ return {
492
+ verified: false,
493
+ error: 'Script validation failed - invalid unlocking script'
494
+ }
495
+ }
496
+
497
+ if (errorMessage.includes('chain tracker')) {
498
+ return {
499
+ verified: false,
500
+ error: 'Chain tracker unavailable - cannot verify block headers'
501
+ }
502
+ }
503
+
504
+ return {
505
+ verified: false,
506
+ error: `SPV verification failed: ${error.message}`
507
+ }
508
+ }
509
+ }
510
+
511
+ async batchVerifyTransactions(
512
+ transactions: Transaction[],
513
+ merkleProofs?: MerklePath[]
514
+ ): Promise<Array<{ txid: string; verified: boolean; error?: string }>> {
515
+ const results = []
516
+
517
+ for (let i = 0; i < transactions.length; i++) {
518
+ const tx = transactions[i]
519
+ const proof = merkleProofs?.[i]
520
+ const txid = Buffer.from(tx.id()).toString('hex')
521
+
522
+ try {
523
+ console.log(`Verifying transaction ${i + 1}/${transactions.length}: ${txid}`)
524
+
525
+ const result = await this.verifyTransactionSPV(tx, proof)
526
+ results.push({ txid, ...result })
527
+
528
+ // Add small delay to avoid overwhelming the chain tracker
529
+ if (i < transactions.length - 1) {
530
+ await new Promise(resolve => setTimeout(resolve, 100))
531
+ }
532
+
533
+ } catch (error: any) {
534
+ results.push({
535
+ txid,
536
+ verified: false,
537
+ error: `Batch verification error: ${error.message}`
538
+ })
539
+ }
540
+ }
541
+
542
+ return results
543
+ }
544
+ }
545
+ ```
546
+
547
+ ## Cryptographic Operation Error Handling
548
+
549
+ ### Key Validation and Recovery
550
+
551
+ ```typescript
552
+ import { PrivateKey, PublicKey, SymmetricKey } from '@bsv/sdk'
553
+
554
+ class CryptographicErrorHandler {
555
+
556
+ static validatePrivateKey(key: PrivateKey): { valid: boolean; error?: string } {
557
+ try {
558
+ // Test key operations
559
+ const publicKey = key.toPublicKey()
560
+ const wif = key.toWif()
561
+
562
+ // Verify the key can sign and verify
563
+ const testMessage = 'validation test'
564
+ const signature = key.sign(Buffer.from(testMessage, 'utf8'))
565
+ const isValid = publicKey.verify(Buffer.from(testMessage, 'utf8'), signature)
566
+
567
+ if (!isValid) {
568
+ return { valid: false, error: 'Key failed signature verification test' }
569
+ }
570
+
571
+ return { valid: true }
572
+
573
+ } catch (error: any) {
574
+ return { valid: false, error: `Key validation failed: ${error.message}` }
575
+ }
576
+ }
577
+
578
+ static validatePublicKey(key: PublicKey): { valid: boolean; error?: string } {
579
+ try {
580
+ // Test key operations
581
+ const point = key.point
582
+ const der = key.toDER()
583
+
584
+ // Verify point is on curve
585
+ if (!point.isOnCurve()) {
586
+ return { valid: false, error: 'Public key point is not on the secp256k1 curve' }
587
+ }
588
+
589
+ return { valid: true }
590
+
591
+ } catch (error: any) {
592
+ return { valid: false, error: `Public key validation failed: ${error.message}` }
593
+ }
594
+ }
595
+
596
+ static safeECDHKeyExchange(
597
+ privateKey: PrivateKey,
598
+ publicKey: PublicKey
599
+ ): { success: boolean; sharedSecret?: number[]; error?: string } {
600
+ try {
601
+ // Validate inputs first
602
+ const privateValidation = this.validatePrivateKey(privateKey)
603
+ if (!privateValidation.valid) {
604
+ return { success: false, error: `Invalid private key: ${privateValidation.error}` }
605
+ }
606
+
607
+ const publicValidation = this.validatePublicKey(publicKey)
608
+ if (!publicValidation.valid) {
609
+ return { success: false, error: `Invalid public key: ${publicValidation.error}` }
610
+ }
611
+
612
+ // Perform ECDH
613
+ const sharedSecret = privateKey.deriveSharedSecret(publicKey)
614
+
615
+ // Validate the result
616
+ if (!sharedSecret || sharedSecret.length !== 32) {
617
+ return { success: false, error: 'ECDH produced invalid shared secret' }
618
+ }
619
+
620
+ return { success: true, sharedSecret }
621
+
622
+ } catch (error: any) {
623
+ return { success: false, error: `ECDH key exchange failed: ${error.message}` }
624
+ }
625
+ }
626
+
627
+ static safeSymmetricEncryption(
628
+ data: string,
629
+ key?: SymmetricKey
630
+ ): { success: boolean; encrypted?: number[]; key?: SymmetricKey; error?: string } {
631
+ try {
632
+ const encryptionKey = key || SymmetricKey.fromRandom()
633
+
634
+ if (!data || data.length === 0) {
635
+ return { success: false, error: 'Data cannot be empty' }
636
+ }
637
+
638
+ const encrypted = encryptionKey.encrypt(data) as number[]
639
+
640
+ if (!encrypted || encrypted.length === 0) {
641
+ return { success: false, error: 'Encryption produced empty result' }
642
+ }
643
+
644
+ // Verify we can decrypt
645
+ const decrypted = encryptionKey.decrypt(encrypted, 'utf8') as string
646
+ if (decrypted !== data) {
647
+ return { success: false, error: 'Encryption verification failed - decrypt mismatch' }
648
+ }
649
+
650
+ return { success: true, encrypted, key: encryptionKey }
651
+
652
+ } catch (error: any) {
653
+ return { success: false, error: `Symmetric encryption failed: ${error.message}` }
654
+ }
655
+ }
656
+ }
657
+
658
+ // Example usage with comprehensive error handling
659
+ async function demonstrateCryptographicErrorHandling() {
660
+ console.log('=== Cryptographic Error Handling Demo ===')
661
+
662
+ try {
663
+ // Test private key validation
664
+ const privateKey = PrivateKey.fromRandom()
665
+ const validation = CryptographicErrorHandler.validatePrivateKey(privateKey)
666
+
667
+ if (!validation.valid) {
668
+ console.error('Private key validation failed:', validation.error)
669
+ return
670
+ }
671
+
672
+ console.log('Private key validation: PASSED')
673
+
674
+ // Test ECDH with error handling
675
+ const otherPrivateKey = PrivateKey.fromRandom()
676
+ const otherPublicKey = otherPrivateKey.toPublicKey()
677
+
678
+ const ecdhResult = CryptographicErrorHandler.safeECDHKeyExchange(privateKey, otherPublicKey)
679
+
680
+ if (!ecdhResult.success) {
681
+ console.error('ECDH failed:', ecdhResult.error)
682
+ return
683
+ }
684
+
685
+ console.log('ECDH key exchange: PASSED')
686
+
687
+ // Test symmetric encryption with error handling
688
+ const testData = 'Sensitive data for encryption testing'
689
+ const encryptionResult = CryptographicErrorHandler.safeSymmetricEncryption(testData)
690
+
691
+ if (!encryptionResult.success) {
692
+ console.error('Symmetric encryption failed:', encryptionResult.error)
693
+ return
694
+ }
695
+
696
+ console.log('Symmetric encryption: PASSED')
697
+ console.log('All cryptographic operations completed successfully')
698
+
699
+ } catch (error) {
700
+ console.error('Unexpected error in cryptographic demo:', error)
701
+ }
702
+ }
703
+ ```
704
+
705
+ ## Production Error Monitoring
706
+
707
+ ### Comprehensive Error Logging
708
+
709
+ ```typescript
710
+ interface ErrorLogEntry {
711
+ timestamp: Date
712
+ category: ErrorCategory
713
+ operation: string
714
+ message: string
715
+ stack?: string
716
+ context?: any
717
+ retryCount?: number
718
+ resolved?: boolean
719
+ }
720
+
721
+ class ErrorLogger {
722
+ private logs: ErrorLogEntry[] = []
723
+ private maxLogs: number = 1000
724
+
725
+ log(
726
+ category: ErrorCategory,
727
+ operation: string,
728
+ error: Error,
729
+ context?: any,
730
+ retryCount?: number
731
+ ): void {
732
+ const entry: ErrorLogEntry = {
733
+ timestamp: new Date(),
734
+ category,
735
+ operation,
736
+ message: error.message,
737
+ stack: error.stack,
738
+ context,
739
+ retryCount,
740
+ resolved: false
741
+ }
742
+
743
+ this.logs.push(entry)
744
+
745
+ // Keep only recent logs
746
+ if (this.logs.length > this.maxLogs) {
747
+ this.logs = this.logs.slice(-this.maxLogs)
748
+ }
749
+
750
+ // Console output for development
751
+ console.error(`[${category.toUpperCase()}] ${operation}: ${error.message}`)
752
+
753
+ if (context) {
754
+ console.error('Context:', context)
755
+ }
756
+ }
757
+
758
+ markResolved(operation: string, timestamp: Date): void {
759
+ const entry = this.logs.find(
760
+ log => log.operation === operation &&
761
+ Math.abs(log.timestamp.getTime() - timestamp.getTime()) < 1000
762
+ )
763
+
764
+ if (entry) {
765
+ entry.resolved = true
766
+ }
767
+ }
768
+
769
+ getErrorSummary(): { [key in ErrorCategory]: number } {
770
+ const summary = {} as { [key in ErrorCategory]: number }
771
+
772
+ for (const category of Object.values(ErrorCategory)) {
773
+ summary[category] = this.logs.filter(
774
+ log => log.category === category && !log.resolved
775
+ ).length
776
+ }
777
+
778
+ return summary
779
+ }
780
+
781
+ getRecentErrors(minutes: number = 60): ErrorLogEntry[] {
782
+ const cutoff = new Date(Date.now() - minutes * 60 * 1000)
783
+ return this.logs.filter(log => log.timestamp > cutoff)
784
+ }
785
+
786
+ exportLogs(): string {
787
+ return JSON.stringify(this.logs, null, 2)
788
+ }
789
+ }
790
+
791
+ // Global error logger instance
792
+ const errorLogger = new ErrorLogger()
793
+ ```
794
+
795
+ ### User-Friendly Error Messages
796
+
797
+ ```typescript
798
+ class UserErrorHandler {
799
+ private errorLogger: ErrorLogger
800
+
801
+ constructor() {
802
+ this.errorLogger = errorLogger
803
+ }
804
+
805
+ getUserFriendlyMessage(error: Error, operation: string): string {
806
+ const categorized = categorizeError(error)
807
+ this.errorLogger.log(categorized.category, operation, error)
808
+
809
+ switch (categorized.category) {
810
+ case ErrorCategory.INSUFFICIENT_FUNDS:
811
+ return 'Insufficient funds available. Please check your wallet balance and try again with a smaller amount.'
812
+
813
+ case ErrorCategory.AUTHENTICATION:
814
+ return 'Wallet authentication required. Please unlock your wallet and try again.'
815
+
816
+ case ErrorCategory.NETWORK:
817
+ if (error.message.includes('no header should have returned false')) {
818
+ return 'Wallet is synchronizing with the network. Please wait a moment and try again.'
819
+ }
820
+ return 'Network connection issue. Please check your internet connection and try again.'
821
+
822
+ case ErrorCategory.VALIDATION:
823
+ return 'Transaction validation failed. Please check your transaction details and try again.'
824
+
825
+ case ErrorCategory.SCRIPT:
826
+ return 'Transaction script error. Please verify your transaction parameters.'
827
+
828
+ case ErrorCategory.CRYPTOGRAPHIC:
829
+ return 'Cryptographic operation failed. Please try again or contact support if the issue persists.'
830
+
831
+ default:
832
+ return 'An unexpected error occurred. Please try again or contact support if the issue persists.'
833
+ }
834
+ }
835
+
836
+ async handleOperationWithUserFeedback<T>(
837
+ operation: () => Promise<T>,
838
+ operationName: string,
839
+ onProgress?: (message: string) => void,
840
+ onError?: (userMessage: string, technicalError: Error) => void
841
+ ): Promise<T> {
842
+ const retryManager = new RetryManager()
843
+
844
+ try {
845
+ return await retryManager.executeWithRetry(async () => {
846
+ if (onProgress) {
847
+ onProgress(`Executing ${operationName}...`)
848
+ }
849
+
850
+ return await operation()
851
+
852
+ }, {
853
+ maxAttempts: 3,
854
+ baseDelay: 2000
855
+ })
856
+
857
+ } catch (error: any) {
858
+ const userMessage = this.getUserFriendlyMessage(error, operationName)
859
+
860
+ if (onError) {
861
+ onError(userMessage, error)
862
+ }
863
+
864
+ throw new Error(userMessage)
865
+ }
866
+ }
867
+ }
868
+
869
+ // Example usage in a user interface
870
+ async function demonstrateUserErrorHandling() {
871
+ const userErrorHandler = new UserErrorHandler()
872
+ const wallet = new WalletClient('auto', 'localhost')
873
+
874
+ try {
875
+ await userErrorHandler.handleOperationWithUserFeedback(
876
+ async () => {
877
+ return await wallet.createAction({
878
+ description: 'User-friendly error handling demo',
879
+ outputs: [{
880
+ satoshis: 100,
881
+ lockingScript: '006a0f5573657220667269656e646c79', // "User friendly"
882
+ outputDescription: 'User error demo'
883
+ }]
884
+ })
885
+ },
886
+ 'Create Transaction',
887
+ (message) => console.log('Progress:', message),
888
+ (userMessage, technicalError) => {
889
+ console.log('User Message:', userMessage)
890
+ console.log('Technical Details:', technicalError.message)
891
+ }
892
+ )
893
+
894
+ console.log('Transaction completed successfully!')
895
+
896
+ } catch (error) {
897
+ console.log('Operation failed with user-friendly error:', error.message)
898
+ }
899
+ }
900
+ ```
901
+
902
+ ## Testing Error Scenarios
903
+
904
+ ### Error Simulation for Testing
905
+
906
+ ```typescript
907
+ class ErrorSimulator {
908
+ private shouldSimulateError: boolean = false
909
+ private errorType: ErrorCategory = ErrorCategory.NETWORK
910
+ private errorMessage: string = 'Simulated error'
911
+
912
+ enableErrorSimulation(type: ErrorCategory, message: string): void {
913
+ this.shouldSimulateError = true
914
+ this.errorType = type
915
+ this.errorMessage = message
916
+ }
917
+
918
+ disableErrorSimulation(): void {
919
+ this.shouldSimulateError = false
920
+ }
921
+
922
+ checkAndThrowSimulatedError(operation: string): void {
923
+ if (this.shouldSimulateError) {
924
+ console.log(`Simulating ${this.errorType} error for operation: ${operation}`)
925
+ throw new Error(this.errorMessage)
926
+ }
927
+ }
928
+
929
+ async simulateNetworkDelay(minMs: number = 100, maxMs: number = 1000): Promise<void> {
930
+ const delay = Math.random() * (maxMs - minMs) + minMs
931
+ await new Promise(resolve => setTimeout(resolve, delay))
932
+ }
933
+ }
934
+
935
+ // Test suite for error handling
936
+ class ErrorHandlingTestSuite {
937
+ private simulator: ErrorSimulator
938
+ private userErrorHandler: UserErrorHandler
939
+
940
+ constructor() {
941
+ this.simulator = new ErrorSimulator()
942
+ this.userErrorHandler = new UserErrorHandler()
943
+ }
944
+
945
+ async testInsufficientFundsHandling(): Promise<boolean> {
946
+ console.log('Testing insufficient funds error handling...')
947
+
948
+ this.simulator.enableErrorSimulation(
949
+ ErrorCategory.INSUFFICIENT_FUNDS,
950
+ 'Insufficient funds: 101 more satoshis are needed'
951
+ )
952
+
953
+ try {
954
+ await this.userErrorHandler.handleOperationWithUserFeedback(
955
+ async () => {
956
+ this.simulator.checkAndThrowSimulatedError('createAction')
957
+ return { txid: 'simulated-success' }
958
+ },
959
+ 'Test Transaction'
960
+ )
961
+
962
+ return false // Should have thrown
963
+
964
+ } catch (error: any) {
965
+ const isCorrectMessage = error.message.includes('Insufficient funds available')
966
+ console.log('Insufficient funds test:', isCorrectMessage ? 'PASSED' : 'FAILED')
967
+ return isCorrectMessage
968
+
969
+ } finally {
970
+ this.simulator.disableErrorSimulation()
971
+ }
972
+ }
973
+
974
+ async testNetworkErrorHandling(): Promise<boolean> {
975
+ console.log('Testing network error handling...')
976
+
977
+ this.simulator.enableErrorSimulation(
978
+ ErrorCategory.NETWORK,
979
+ 'RPC Error: no header should have returned false'
980
+ )
981
+
982
+ try {
983
+ await this.userErrorHandler.handleOperationWithUserFeedback(
984
+ async () => {
985
+ this.simulator.checkAndThrowSimulatedError('createAction')
986
+ return { txid: 'simulated-success' }
987
+ },
988
+ 'Test Transaction'
989
+ )
990
+
991
+ return false // Should have thrown
992
+
993
+ } catch (error: any) {
994
+ const isCorrectMessage = error.message.includes('synchronizing with the network')
995
+ console.log('Network error test:', isCorrectMessage ? 'PASSED' : 'FAILED')
996
+ return isCorrectMessage
997
+
998
+ } finally {
999
+ this.simulator.disableErrorSimulation()
1000
+ }
1001
+ }
1002
+
1003
+ async runAllTests(): Promise<void> {
1004
+ console.log('=== Error Handling Test Suite ===')
1005
+
1006
+ const tests = [
1007
+ this.testInsufficientFundsHandling(),
1008
+ this.testNetworkErrorHandling()
1009
+ ]
1010
+
1011
+ const results = await Promise.all(tests)
1012
+ const passedTests = results.filter(result => result).length
1013
+
1014
+ console.log(`\nTest Results: ${passedTests}/${results.length} tests passed`)
1015
+
1016
+ if (passedTests === results.length) {
1017
+ console.log('All error handling tests PASSED! ✅')
1018
+ } else {
1019
+ console.log('Some error handling tests FAILED! ❌')
1020
+ }
1021
+ }
1022
+ }
1023
+ ```
1024
+
1025
+ ## Best Practices Summary
1026
+
1027
+ ### Production-Ready Error Handling Checklist
1028
+
1029
+ ```typescript
1030
+ // Production error handling implementation example
1031
+ class ProductionWalletService {
1032
+ private wallet: WalletClient
1033
+ private retryManager: RetryManager
1034
+ private errorLogger: ErrorLogger
1035
+ private userErrorHandler: UserErrorHandler
1036
+
1037
+ constructor() {
1038
+ this.wallet = new WalletClient('auto', 'localhost')
1039
+ this.retryManager = new RetryManager()
1040
+ this.errorLogger = new ErrorLogger()
1041
+ this.userErrorHandler = new UserErrorHandler()
1042
+ }
1043
+
1044
+ async createTransaction(
1045
+ description: string,
1046
+ outputs: any[],
1047
+ options?: any
1048
+ ): Promise<{ success: boolean; txid?: string; userMessage?: string }> {
1049
+ const operation = 'createTransaction'
1050
+
1051
+ try {
1052
+ const result = await this.userErrorHandler.handleOperationWithUserFeedback(
1053
+ async () => {
1054
+ return await this.retryManager.executeWithRetry(async () => {
1055
+ // Ensure authentication
1056
+ const { authenticated } = await this.wallet.isAuthenticated()
1057
+ if (!authenticated) {
1058
+ await this.wallet.waitForAuthentication()
1059
+ }
1060
+
1061
+ // Create transaction
1062
+ return await this.wallet.createAction({
1063
+ description,
1064
+ outputs,
1065
+ ...options
1066
+ })
1067
+ })
1068
+ },
1069
+ operation
1070
+ )
1071
+
1072
+ return {
1073
+ success: true,
1074
+ txid: result.txid
1075
+ }
1076
+
1077
+ } catch (error: any) {
1078
+ const userMessage = this.userErrorHandler.getUserFriendlyMessage(error, operation)
1079
+
1080
+ return {
1081
+ success: false,
1082
+ userMessage
1083
+ }
1084
+ }
1085
+ }
1086
+
1087
+ getHealthStatus(): {
1088
+ status: 'healthy' | 'degraded' | 'unhealthy'
1089
+ errors: { [key in ErrorCategory]: number }
1090
+ uptime: number
1091
+ } {
1092
+ const errors = this.errorLogger.getErrorSummary()
1093
+ const totalErrors = Object.values(errors).reduce((sum, count) => sum + count, 0)
1094
+
1095
+ let status: 'healthy' | 'degraded' | 'unhealthy'
1096
+
1097
+ if (totalErrors === 0) {
1098
+ status = 'healthy'
1099
+ } else if (totalErrors < 5) {
1100
+ status = 'degraded'
1101
+ } else {
1102
+ status = 'unhealthy'
1103
+ }
1104
+
1105
+ return {
1106
+ status,
1107
+ errors,
1108
+ uptime: process.uptime()
1109
+ }
1110
+ }
1111
+ }
1112
+ ```
1113
+
1114
+ ## Troubleshooting Common Issues
1115
+
1116
+ ### Quick Diagnostic Guide
1117
+
1118
+ ```typescript
1119
+ async function diagnoseCommonIssues(): Promise<void> {
1120
+ console.log('=== BSV SDK Diagnostic Tool ===')
1121
+
1122
+ const wallet = new WalletClient('auto', 'localhost')
1123
+
1124
+ // Test 1: Wallet Connection
1125
+ try {
1126
+ console.log('1. Testing wallet connection...')
1127
+ const { authenticated } = await wallet.isAuthenticated()
1128
+ console.log(` Wallet authenticated: ${authenticated}`)
1129
+
1130
+ if (!authenticated) {
1131
+ console.log(' ⚠️ Wallet not authenticated - this may cause transaction failures')
1132
+ } else {
1133
+ console.log(' ✅ Wallet connection OK')
1134
+ }
1135
+ } catch (error) {
1136
+ console.log(` ❌ Wallet connection failed: ${error.message}`)
1137
+ }
1138
+
1139
+ // Test 2: UTXO Availability
1140
+ try {
1141
+ console.log('2. Checking UTXO availability...')
1142
+ const { outputs, totalValue } = await wallet.listOutputs({ limit: 10 })
1143
+ const spendable = outputs.filter(o => o.spendable)
1144
+
1145
+ console.log(` Total outputs: ${outputs.length}`)
1146
+ console.log(` Spendable outputs: ${spendable.length}`)
1147
+ console.log(` Total value: ${totalValue} satoshis`)
1148
+
1149
+ if (spendable.length === 0) {
1150
+ console.log(' ⚠️ No spendable UTXOs available')
1151
+ } else if (totalValue < 1000) {
1152
+ console.log(' ⚠️ Low balance - may cause insufficient funds errors')
1153
+ } else {
1154
+ console.log(' ✅ UTXO availability OK')
1155
+ }
1156
+ } catch (error) {
1157
+ console.log(` ❌ UTXO check failed: ${error.message}`)
1158
+ }
1159
+
1160
+ // Test 3: Simple Transaction
1161
+ try {
1162
+ console.log('3. Testing simple transaction creation...')
1163
+ const result = await wallet.createAction({
1164
+ description: 'Diagnostic test transaction',
1165
+ outputs: [{
1166
+ satoshis: 100,
1167
+ lockingScript: '006a0a4469616720746573742074786e', // "Diag test txn"
1168
+ outputDescription: 'Diagnostic test'
1169
+ }]
1170
+ })
1171
+
1172
+ console.log(` ✅ Transaction created successfully: ${result.txid}`)
1173
+
1174
+ } catch (error: any) {
1175
+ console.log(` ❌ Transaction creation failed: ${error.message}`)
1176
+
1177
+ if (error.message.includes('Insufficient funds')) {
1178
+ console.log(' 💡 Try reducing the transaction amount or funding your wallet')
1179
+ } else if (error.message.includes('no header should have returned false')) {
1180
+ console.log(' 💡 Try restarting your wallet or waiting for synchronization')
1181
+ } else if (error.message.includes('not authenticated')) {
1182
+ console.log(' 💡 Ensure your wallet is unlocked and authenticated')
1183
+ }
1184
+ }
1185
+
1186
+ console.log('\n=== Diagnostic Complete ===')
1187
+ }
1188
+ ```
1189
+
1190
+ ## Conclusion
1191
+
1192
+ You've now mastered comprehensive error handling for the BSV TypeScript SDK. You can:
1193
+
1194
+ - Categorize and handle different types of errors appropriately
1195
+ - Implement robust retry mechanisms with exponential backoff
1196
+ - Handle wallet-specific errors and authentication issues
1197
+ - Manage network failures and chain tracker problems
1198
+ - Validate cryptographic operations and handle edge cases
1199
+ - Build production-ready error monitoring and logging systems
1200
+ - Create user-friendly error messages and recovery strategies
1201
+ - Test error scenarios systematically
1202
+
1203
+ These patterns enable you to build resilient Bitcoin applications that gracefully handle failures and provide excellent user experiences even when things go wrong.
1204
+
1205
+ ## Next Steps
1206
+
1207
+ - Review the [Large Transactions Guide](../guides/large-transactions.md) for efficiency patterns
1208
+ - Check out [Security Best Practices](../guides/security-best-practices.md) for comprehensive security
1209
+ - Explore specific error handling in other tutorials for your use case
1210
+
1211
+ ## Additional Resources
1212
+
1213
+ - [WalletClient API Reference](../reference/wallet.md)
1214
+ - [BSV Blockchain Documentation](https://docs.bsvblockchain.org/)
1215
+ - [Error Handling Best Practices](https://docs.bsvblockchain.org/error-handling)