@bsv/wallet-toolbox 1.6.4 → 1.6.5

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 (240) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/docs/client.md +402 -313
  3. package/docs/monitor.md +4 -4
  4. package/docs/services.md +118 -133
  5. package/docs/wallet.md +402 -313
  6. package/mobile/out/src/monitor/Monitor.d.ts +3 -3
  7. package/mobile/out/src/monitor/Monitor.d.ts.map +1 -1
  8. package/mobile/out/src/monitor/Monitor.js.map +1 -1
  9. package/mobile/out/src/sdk/WalletServices.interfaces.d.ts +88 -2
  10. package/mobile/out/src/sdk/WalletServices.interfaces.d.ts.map +1 -1
  11. package/mobile/out/src/services/Services.js +1 -1
  12. package/mobile/out/src/services/Services.js.map +1 -1
  13. package/mobile/out/src/services/chaintracker/ChaintracksChainTracker.d.ts +3 -3
  14. package/mobile/out/src/services/chaintracker/ChaintracksChainTracker.d.ts.map +1 -1
  15. package/mobile/out/src/services/chaintracker/ChaintracksChainTracker.js.map +1 -1
  16. package/mobile/out/src/services/chaintracker/chaintracks/Api/BulkIngestorApi.d.ts +1 -6
  17. package/mobile/out/src/services/chaintracker/chaintracks/Api/BulkIngestorApi.d.ts.map +1 -1
  18. package/mobile/out/src/services/chaintracker/chaintracks/Api/BulkStorageApi.d.ts +1 -1
  19. package/mobile/out/src/services/chaintracker/chaintracks/Api/BulkStorageApi.d.ts.map +1 -1
  20. package/mobile/out/src/services/chaintracker/chaintracks/Api/ChaintracksApi.d.ts +2 -2
  21. package/mobile/out/src/services/chaintracker/chaintracks/Api/ChaintracksApi.d.ts.map +1 -1
  22. package/mobile/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts +33 -16
  23. package/mobile/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts.map +1 -1
  24. package/mobile/out/src/services/chaintracker/chaintracks/Api/LiveIngestorApi.d.ts +1 -1
  25. package/mobile/out/src/services/chaintracker/chaintracks/Api/LiveIngestorApi.d.ts.map +1 -1
  26. package/mobile/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts +1 -1
  27. package/mobile/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts.map +1 -1
  28. package/mobile/out/src/services/chaintracker/chaintracks/Chaintracks.js +15 -11
  29. package/mobile/out/src/services/chaintracker/chaintracks/Chaintracks.js.map +1 -1
  30. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.d.ts +2 -2
  31. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.d.ts.map +1 -1
  32. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.js +4 -4
  33. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.js.map +1 -1
  34. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.js +1 -1
  35. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.js.map +1 -1
  36. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.d.ts.map +1 -1
  37. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.js +2 -3
  38. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.js.map +1 -1
  39. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.d.ts +2 -1
  40. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.d.ts.map +1 -1
  41. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.js +3 -1
  42. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.js.map +1 -1
  43. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.js +1 -1
  44. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.js.map +1 -1
  45. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.d.ts +2 -2
  46. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.d.ts.map +1 -1
  47. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.js +4 -5
  48. package/mobile/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.js.map +1 -1
  49. package/mobile/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.d.ts +2 -1
  50. package/mobile/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.d.ts.map +1 -1
  51. package/mobile/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.js +2 -1
  52. package/mobile/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.js.map +1 -1
  53. package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.d.ts +7 -7
  54. package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.d.ts.map +1 -1
  55. package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.js +42 -5
  56. package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.js.map +1 -1
  57. package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts +3 -7
  58. package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts.map +1 -1
  59. package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js +63 -130
  60. package/mobile/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js.map +1 -1
  61. package/mobile/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts +2 -1
  62. package/mobile/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts.map +1 -1
  63. package/mobile/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js +19 -7
  64. package/mobile/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js.map +1 -1
  65. package/mobile/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.d.ts +1 -1
  66. package/mobile/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.d.ts.map +1 -1
  67. package/mobile/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.js.map +1 -1
  68. package/mobile/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.d.ts +2 -2
  69. package/mobile/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.d.ts.map +1 -1
  70. package/mobile/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.js +2 -2
  71. package/mobile/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.js.map +1 -1
  72. package/mobile/out/src/services/chaintracker/chaintracks/util/HeightRange.d.ts.map +1 -1
  73. package/mobile/out/src/services/chaintracker/chaintracks/util/HeightRange.js +4 -1
  74. package/mobile/out/src/services/chaintracker/chaintracks/util/HeightRange.js.map +1 -1
  75. package/mobile/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.d.ts.map +1 -1
  76. package/mobile/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js +26 -11
  77. package/mobile/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js.map +1 -1
  78. package/mobile/out/src/services/createDefaultWalletServicesOptions.d.ts +2 -1
  79. package/mobile/out/src/services/createDefaultWalletServicesOptions.d.ts.map +1 -1
  80. package/mobile/out/src/services/createDefaultWalletServicesOptions.js +19 -17
  81. package/mobile/out/src/services/createDefaultWalletServicesOptions.js.map +1 -1
  82. package/mobile/package-lock.json +2 -2
  83. package/mobile/package.json +1 -1
  84. package/out/src/monitor/Monitor.d.ts +3 -3
  85. package/out/src/monitor/Monitor.d.ts.map +1 -1
  86. package/out/src/monitor/Monitor.js.map +1 -1
  87. package/out/src/sdk/WalletServices.interfaces.d.ts +88 -2
  88. package/out/src/sdk/WalletServices.interfaces.d.ts.map +1 -1
  89. package/out/src/services/Services.js +1 -1
  90. package/out/src/services/Services.js.map +1 -1
  91. package/out/src/services/chaintracker/ChaintracksChainTracker.d.ts +3 -3
  92. package/out/src/services/chaintracker/ChaintracksChainTracker.d.ts.map +1 -1
  93. package/out/src/services/chaintracker/ChaintracksChainTracker.js.map +1 -1
  94. package/out/src/services/chaintracker/chaintracks/Api/BulkIngestorApi.d.ts +1 -6
  95. package/out/src/services/chaintracker/chaintracks/Api/BulkIngestorApi.d.ts.map +1 -1
  96. package/out/src/services/chaintracker/chaintracks/Api/BulkStorageApi.d.ts +1 -1
  97. package/out/src/services/chaintracker/chaintracks/Api/BulkStorageApi.d.ts.map +1 -1
  98. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksApi.d.ts +2 -2
  99. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksApi.d.ts.map +1 -1
  100. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts +33 -16
  101. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts.map +1 -1
  102. package/out/src/services/chaintracker/chaintracks/Api/LiveIngestorApi.d.ts +1 -1
  103. package/out/src/services/chaintracker/chaintracks/Api/LiveIngestorApi.d.ts.map +1 -1
  104. package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts +1 -1
  105. package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts.map +1 -1
  106. package/out/src/services/chaintracker/chaintracks/Chaintracks.js +15 -11
  107. package/out/src/services/chaintracker/chaintracks/Chaintracks.js.map +1 -1
  108. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.d.ts +2 -2
  109. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.d.ts.map +1 -1
  110. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.js +4 -4
  111. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.js.map +1 -1
  112. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.js +1 -1
  113. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.js.map +1 -1
  114. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.d.ts.map +1 -1
  115. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.js +2 -3
  116. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.js.map +1 -1
  117. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.d.ts.map +1 -1
  118. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.js +1 -1
  119. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.js.map +1 -1
  120. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.d.ts +2 -1
  121. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.d.ts.map +1 -1
  122. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.js +3 -1
  123. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.js.map +1 -1
  124. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.js +1 -1
  125. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.js.map +1 -1
  126. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.d.ts.map +1 -1
  127. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.js +3 -3
  128. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.js.map +1 -1
  129. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.d.ts +2 -2
  130. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.d.ts.map +1 -1
  131. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.js +4 -5
  132. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.js.map +1 -1
  133. package/out/src/services/chaintracker/chaintracks/Ingest/__tests/BulkIngestorCDNBabbage.test.js +1 -1
  134. package/out/src/services/chaintracker/chaintracks/Ingest/__tests/BulkIngestorCDNBabbage.test.js.map +1 -1
  135. package/out/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.js +1 -1
  136. package/out/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.js.map +1 -1
  137. package/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.d.ts +2 -1
  138. package/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.d.ts.map +1 -1
  139. package/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.js +2 -1
  140. package/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.js.map +1 -1
  141. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.d.ts.map +1 -1
  142. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.js +4 -3
  143. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.js.map +1 -1
  144. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.d.ts +7 -7
  145. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.d.ts.map +1 -1
  146. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.js +42 -5
  147. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.js.map +1 -1
  148. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.d.ts +91 -0
  149. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.d.ts.map +1 -0
  150. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js +448 -0
  151. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js.map +1 -0
  152. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.d.ts +3 -29
  153. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.d.ts.map +1 -1
  154. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js +61 -137
  155. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js.map +1 -1
  156. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts +3 -7
  157. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts.map +1 -1
  158. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js +63 -130
  159. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js.map +1 -1
  160. package/out/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageIdb.test.d.ts +2 -0
  161. package/out/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageIdb.test.d.ts.map +1 -0
  162. package/out/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageIdb.test.js +81 -0
  163. package/out/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageIdb.test.js.map +1 -0
  164. package/out/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.js +12 -1
  165. package/out/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.js.map +1 -1
  166. package/out/src/services/chaintracker/chaintracks/__tests/createIdbChaintracks.test.d.ts +2 -0
  167. package/out/src/services/chaintracker/chaintracks/__tests/createIdbChaintracks.test.d.ts.map +1 -0
  168. package/out/src/services/chaintracker/chaintracks/__tests/createIdbChaintracks.test.js +50 -0
  169. package/out/src/services/chaintracker/chaintracks/__tests/createIdbChaintracks.test.js.map +1 -0
  170. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.d.ts +12 -0
  171. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.d.ts.map +1 -0
  172. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js +83 -0
  173. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js.map +1 -0
  174. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts +2 -1
  175. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts.map +1 -1
  176. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js +19 -7
  177. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js.map +1 -1
  178. package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.d.ts +1 -1
  179. package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.d.ts.map +1 -1
  180. package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.js.map +1 -1
  181. package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.d.ts +2 -2
  182. package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.d.ts.map +1 -1
  183. package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.js +2 -2
  184. package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.js.map +1 -1
  185. package/out/src/services/chaintracker/chaintracks/util/HeightRange.d.ts.map +1 -1
  186. package/out/src/services/chaintracker/chaintracks/util/HeightRange.js +4 -1
  187. package/out/src/services/chaintracker/chaintracks/util/HeightRange.js.map +1 -1
  188. package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.d.ts.map +1 -1
  189. package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js +26 -11
  190. package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js.map +1 -1
  191. package/out/src/services/createDefaultWalletServicesOptions.d.ts +2 -1
  192. package/out/src/services/createDefaultWalletServicesOptions.d.ts.map +1 -1
  193. package/out/src/services/createDefaultWalletServicesOptions.js +19 -17
  194. package/out/src/services/createDefaultWalletServicesOptions.js.map +1 -1
  195. package/out/src/services/providers/__tests/exchangeRates.test.d.ts +2 -0
  196. package/out/src/services/providers/__tests/exchangeRates.test.d.ts.map +1 -0
  197. package/out/src/services/providers/__tests/exchangeRates.test.js +19 -0
  198. package/out/src/services/providers/__tests/exchangeRates.test.js.map +1 -0
  199. package/out/test/Wallet/support/operations.man.test.js +1 -1
  200. package/out/test/Wallet/support/operations.man.test.js.map +1 -1
  201. package/out/tsconfig.all.tsbuildinfo +1 -1
  202. package/package.json +1 -1
  203. package/src/monitor/Monitor.ts +3 -3
  204. package/src/sdk/WalletServices.interfaces.ts +88 -1
  205. package/src/services/Services.ts +1 -1
  206. package/src/services/chaintracker/ChaintracksChainTracker.ts +3 -2
  207. package/src/services/chaintracker/chaintracks/Api/BulkIngestorApi.ts +1 -7
  208. package/src/services/chaintracker/chaintracks/Api/BulkStorageApi.ts +1 -1
  209. package/src/services/chaintracker/chaintracks/Api/ChaintracksApi.ts +2 -2
  210. package/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.ts +39 -14
  211. package/src/services/chaintracker/chaintracks/Api/LiveIngestorApi.ts +1 -1
  212. package/src/services/chaintracker/chaintracks/Chaintracks.ts +16 -11
  213. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.ts +4 -5
  214. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.ts +1 -1
  215. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.ts +2 -3
  216. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.ts +1 -0
  217. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.ts +3 -1
  218. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.ts +1 -1
  219. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.ts +10 -3
  220. package/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.ts +6 -4
  221. package/src/services/chaintracker/chaintracks/Ingest/__tests/BulkIngestorCDNBabbage.test.ts +1 -1
  222. package/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.ts +1 -1
  223. package/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.ts +2 -1
  224. package/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.ts +4 -3
  225. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.ts +60 -11
  226. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.ts +557 -0
  227. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.ts +80 -179
  228. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.ts +63 -133
  229. package/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageIdb.test.ts +102 -0
  230. package/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.ts +14 -1
  231. package/src/services/chaintracker/chaintracks/__tests/createIdbChaintracks.test.ts +61 -0
  232. package/src/services/chaintracker/chaintracks/createIdbChaintracks.ts +111 -0
  233. package/src/services/chaintracker/chaintracks/util/BulkFileDataManager.ts +20 -11
  234. package/src/services/chaintracker/chaintracks/util/BulkFilesReader.ts +1 -1
  235. package/src/services/chaintracker/chaintracks/util/BulkHeaderFile.ts +3 -3
  236. package/src/services/chaintracker/chaintracks/util/HeightRange.ts +4 -1
  237. package/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.ts +26 -11
  238. package/src/services/createDefaultWalletServicesOptions.ts +25 -18
  239. package/src/services/providers/__tests/exchangeRates.test.ts +18 -0
  240. package/test/Wallet/support/operations.man.test.ts +1 -1
@@ -0,0 +1,557 @@
1
+ import {
2
+ ChaintracksStorageBaseOptions,
3
+ ChaintracksStorageBulkFileApi,
4
+ InsertHeaderResult
5
+ } from '../Api/ChaintracksStorageApi'
6
+ import { ChaintracksStorageBase } from './ChaintracksStorageBase'
7
+ import { LiveBlockHeader } from '../Api/BlockHeaderApi'
8
+ import { addWork, convertBitsToWork, isMoreWork, serializeBaseBlockHeader } from '../util/blockHeaderUtilities'
9
+ import { HeightRange } from '../util/HeightRange'
10
+ import { BulkFilesReaderStorage } from '../util/BulkFilesReader'
11
+ import { ChaintracksFetch } from '../util/ChaintracksFetch'
12
+ import { Chain } from '../../../../sdk/types'
13
+ import { WERR_INVALID_OPERATION, WERR_INVALID_PARAMETER } from '../../../../sdk/WERR_errors'
14
+ import { BlockHeader } from '../../../../sdk/WalletServices.interfaces'
15
+ import { IDBPDatabase, IDBPObjectStore, IDBPTransaction, openDB } from 'idb'
16
+ import { BulkHeaderFileInfo } from '../util/BulkHeaderFile'
17
+
18
+ interface ChaintracksIdbData {
19
+ chain: Chain
20
+ liveHeaders: Map<number, LiveBlockHeader>
21
+ maxHeaderId: number
22
+ tipHeaderId: number
23
+ hashToHeaderId: Map<string, number>
24
+ }
25
+
26
+ export interface ChaintracksStorageIdbOptions extends ChaintracksStorageBaseOptions {}
27
+
28
+ export class ChaintracksStorageIdb extends ChaintracksStorageBase implements ChaintracksStorageBulkFileApi {
29
+ dbName: string
30
+
31
+ db?: IDBPDatabase<ChaintracksStorageIdbSchema>
32
+
33
+ whenLastAccess?: Date
34
+
35
+ allStores: string[] = ['live_headers', 'bulk_headers']
36
+
37
+ constructor(options: ChaintracksStorageIdbOptions) {
38
+ super(options)
39
+ this.dbName = `chaintracks-${this.chain}net`
40
+ }
41
+
42
+ override async migrateLatest(): Promise<void> {
43
+ if (this.db) return
44
+ this.db = await this.initDB()
45
+ }
46
+
47
+ override async destroy(): Promise<void> {}
48
+
49
+ override async deleteLiveBlockHeaders(): Promise<void> {
50
+ await this.makeAvailable()
51
+ await this.db?.clear('live_headers')
52
+ }
53
+
54
+ /**
55
+ * Delete live headers with height less or equal to `maxHeight`
56
+ *
57
+ * Set existing headers with previousHeaderId value set to the headerId value of
58
+ * a header which is to be deleted to null.
59
+ *
60
+ * @param maxHeight delete all records with less or equal `height`
61
+ * @returns number of deleted records
62
+ */
63
+ override async deleteOlderLiveBlockHeaders(maxHeight: number): Promise<number> {
64
+ await this.makeAvailable()
65
+
66
+ const trx = this.toDbTrxReadWrite(['live_headers'])
67
+ const store = trx.objectStore('live_headers')
68
+ const heightIndex = store.index('height')
69
+ const previousHeaderIdIndex = store.index('previousHeaderId')
70
+
71
+ // Get all headers with height <= maxHeight
72
+ const range = IDBKeyRange.upperBound(maxHeight)
73
+ const headersToDelete: LiveBlockHeader[] = await heightIndex.getAll(range)
74
+ const headerIdsToDelete = new Set(headersToDelete.map(header => header.headerId))
75
+ const deletedCount = headersToDelete.length
76
+
77
+ for (const id of headerIdsToDelete) {
78
+ const headerToUpdate = await previousHeaderIdIndex.get(id)
79
+ await store.put({ ...headerToUpdate, previousHeaderId: null })
80
+ }
81
+
82
+ // Delete the headers
83
+ for (const id of headerIdsToDelete) {
84
+ await store.delete(id)
85
+ }
86
+
87
+ await trx.done
88
+ return deletedCount
89
+ }
90
+
91
+ /**
92
+ * @returns the active chain tip header
93
+ * @throws an error if there is no tip.
94
+ */
95
+ override async findChainTipHeader(): Promise<LiveBlockHeader> {
96
+ const header = await this.findChainTipHeaderOrUndefined()
97
+ if (!header) throw new Error('Database contains no active chain tip header.')
98
+ return header
99
+ }
100
+
101
+ /**
102
+ *
103
+ * @returns the active chain tip header
104
+ * @throws an error if there is no tip.
105
+ */
106
+ override async findChainTipHeaderOrUndefined(): Promise<LiveBlockHeader | undefined> {
107
+ await this.makeAvailable()
108
+ const trx = this.toDbTrxReadOnly(['live_headers'])
109
+ const store = trx.objectStore('live_headers')
110
+ const activeTipIndex = store.index('activeTip')
111
+ let header = await activeTipIndex.get([1, 1])
112
+ header = this.repairStoredLiveHeader(header)
113
+ await trx.done
114
+ return header
115
+ }
116
+
117
+ override async findLiveHeaderForBlockHash(hash: string): Promise<LiveBlockHeader | null> {
118
+ await this.makeAvailable()
119
+ const trx = this.toDbTrxReadOnly(['live_headers'])
120
+ const store = trx.objectStore('live_headers')
121
+ const hashIndex = store.index('hash')
122
+ let header = await hashIndex.get(hash)
123
+ header = this.repairStoredLiveHeader(header)
124
+ await trx.done
125
+ return header
126
+ }
127
+
128
+ override async findLiveHeaderForHeaderId(headerId: number): Promise<LiveBlockHeader> {
129
+ await this.makeAvailable()
130
+ const trx = this.toDbTrxReadOnly(['live_headers'])
131
+ const store = trx.objectStore('live_headers')
132
+ let header = await store.get(headerId)
133
+ header = this.repairStoredLiveHeader(header)
134
+ await trx.done
135
+ return header
136
+ }
137
+
138
+ override async findLiveHeaderForHeight(height: number): Promise<LiveBlockHeader | null> {
139
+ await this.makeAvailable()
140
+ const trx = this.toDbTrxReadOnly(['live_headers'])
141
+ const store = trx.objectStore('live_headers')
142
+ const heightIndex = store.index('height')
143
+ let header = await heightIndex.get(height)
144
+ header = this.repairStoredLiveHeader(header)
145
+ await trx.done
146
+ return header || null
147
+ }
148
+
149
+ override async findLiveHeaderForMerkleRoot(merkleRoot: string): Promise<LiveBlockHeader | null> {
150
+ await this.makeAvailable()
151
+ const trx = this.toDbTrxReadOnly(['live_headers'])
152
+ const store = trx.objectStore('live_headers')
153
+ const merkleRootIndex = store.index('merkleRoot')
154
+ let header = await merkleRootIndex.get(merkleRoot)
155
+ header = this.repairStoredLiveHeader(header)
156
+ await trx.done
157
+ return header || null
158
+ }
159
+
160
+ override async findLiveHeightRange(): Promise<HeightRange> {
161
+ await this.makeAvailable()
162
+ const trx = this.toDbTrxReadOnly(['live_headers'])
163
+ const store = trx.objectStore('live_headers')
164
+ const heightIndex = store.index('height')
165
+
166
+ const minCursor = await heightIndex.openCursor(null, 'next')
167
+ const minValue = minCursor ? minCursor.value.height : null
168
+
169
+ const maxCursor = await heightIndex.openCursor(null, 'prev')
170
+ const maxValue = maxCursor ? maxCursor.value.height : null
171
+
172
+ const range = minValue === null || maxValue === null ? HeightRange.empty : new HeightRange(minValue, maxValue)
173
+
174
+ await trx.done
175
+ return range
176
+ }
177
+
178
+ override async findMaxHeaderId(): Promise<number> {
179
+ await this.makeAvailable()
180
+ const trx = this.toDbTrxReadOnly(['live_headers'])
181
+ const store = trx.objectStore('live_headers')
182
+
183
+ const maxCursor = await store.openKeyCursor(null, 'prev')
184
+ const maxValue: number = maxCursor ? Number(maxCursor.key) : 0
185
+ await trx.done
186
+ return maxValue
187
+ }
188
+
189
+ override async liveHeadersForBulk(count: number): Promise<LiveBlockHeader[]> {
190
+ await this.makeAvailable()
191
+
192
+ const trx = this.toDbTrxReadWrite(['live_headers'])
193
+ const store = trx.objectStore('live_headers')
194
+ const heightIndex = store.index('height')
195
+
196
+ let cursor = await heightIndex.openCursor(null, 'next')
197
+ const headers: LiveBlockHeader[] = []
198
+
199
+ while (cursor && count > 0) {
200
+ const header = this.repairStoredLiveHeader(cursor.value)
201
+ if (header && header.isActive) {
202
+ count--
203
+ headers.push(header)
204
+ }
205
+ cursor = await cursor.continue()
206
+ }
207
+
208
+ await trx.done
209
+ return headers
210
+ }
211
+
212
+ override async getLiveHeaders(range: HeightRange): Promise<LiveBlockHeader[]> {
213
+ if (range.isEmpty) return []
214
+ await this.makeAvailable()
215
+
216
+ const trx = this.toDbTrxReadWrite(['live_headers'])
217
+ const store = trx.objectStore('live_headers')
218
+ const heightIndex = store.index('height')
219
+
220
+ let cursor = await heightIndex.openCursor(null, 'next')
221
+ const headers: LiveBlockHeader[] = []
222
+
223
+ while (cursor) {
224
+ const header = this.repairStoredLiveHeader(cursor.value)
225
+ if (header && range.contains(header.height)) {
226
+ headers.push(header)
227
+ }
228
+ cursor = await cursor.continue()
229
+ }
230
+
231
+ await trx.done
232
+ return headers
233
+ }
234
+
235
+ override async insertHeader(header: BlockHeader): Promise<InsertHeaderResult> {
236
+ await this.makeAvailable()
237
+
238
+ const trx = this.toDbTrxReadWrite(['live_headers'])
239
+ const store = trx.objectStore('live_headers')
240
+ const hashIndex = store.index('hash')
241
+ const activeTipIndex = store.index('activeTip')
242
+
243
+ const r: InsertHeaderResult = {
244
+ added: false,
245
+ dupe: false,
246
+ noPrev: false,
247
+ badPrev: false,
248
+ noActiveAncestor: false,
249
+ isActiveTip: false,
250
+ reorgDepth: 0,
251
+ priorTip: undefined,
252
+ noTip: false
253
+ }
254
+
255
+ // Check for duplicate
256
+ if (await hashIndex.get(header.hash)) {
257
+ r.dupe = true
258
+ await trx.done
259
+ return r
260
+ }
261
+
262
+ //let all = await store.getAll()
263
+ //console.log(`idb store length: ${all.length} last: ${all[all.length - 1]?.height}`)
264
+ //let allHash = await hashIndex.getAll()
265
+
266
+ // Find previous header
267
+ let oneBack: LiveBlockHeader | undefined = this.repairStoredLiveHeader(await hashIndex.get(header.previousHash))
268
+
269
+ if (!oneBack) {
270
+ // Check if this is first live header
271
+ const count = await store.count()
272
+ if (count === 0) {
273
+ // If this is the first live header, the last bulk header (if there is one) is the previous header.
274
+ const lbf = await this.bulkManager.getLastFile()
275
+ if (!lbf) throw new WERR_INVALID_OPERATION('bulk headers must exist before first live header can be added')
276
+ if (header.previousHash === lbf.lastHash && header.height === lbf.firstHeight + lbf.count) {
277
+ // Valid first live header. Add it.
278
+ const chainWork = addWork(lbf.lastChainWork, convertBitsToWork(header.bits))
279
+ r.isActiveTip = true
280
+ const newHeader: LiveBlockHeader = {
281
+ ...header,
282
+ headerId: 0,
283
+ previousHeaderId: null,
284
+ chainWork,
285
+ isChainTip: r.isActiveTip,
286
+ isActive: r.isActiveTip
287
+ }
288
+ const h = this.prepareStoredLiveHeader(newHeader, true)
289
+ newHeader.headerId = Number(await store.add(h))
290
+ r.added = true
291
+ await trx.done
292
+ return r
293
+ }
294
+ }
295
+ // Failure without a oneBack
296
+ // First live header that does not follow last bulk header or
297
+ // Not the first live header and live headers doesn't include a previousHash header.
298
+ r.noPrev = true
299
+ await trx.done
300
+ return r
301
+ }
302
+
303
+ if (oneBack.isActive && oneBack.isChainTip) {
304
+ r.priorTip = oneBack
305
+ } else {
306
+ r.priorTip = this.repairStoredLiveHeader(await activeTipIndex.get([1, 1]))
307
+ }
308
+
309
+ if (!r.priorTip) {
310
+ // No active chain tip found. This is a logic error in state of live headers.
311
+ r.noTip = true
312
+ await trx.done
313
+ return r
314
+ }
315
+
316
+ // We have an acceptable new live header...and live headers has an active chain tip.
317
+
318
+ const chainWork = addWork(oneBack.chainWork, convertBitsToWork(header.bits))
319
+
320
+ r.isActiveTip = isMoreWork(chainWork, r.priorTip.chainWork)
321
+
322
+ const newHeader: LiveBlockHeader = {
323
+ ...header,
324
+ headerId: 0,
325
+ previousHeaderId: oneBack.headerId,
326
+ chainWork,
327
+ isChainTip: r.isActiveTip,
328
+ isActive: r.isActiveTip
329
+ }
330
+
331
+ if (r.isActiveTip) {
332
+ let activeAncestor = oneBack
333
+ while (!activeAncestor.isActive) {
334
+ const previousHeader = this.repairStoredLiveHeader(await store.get(activeAncestor.previousHeaderId!))
335
+ if (!previousHeader) {
336
+ r.noActiveAncestor = true
337
+ await trx.done
338
+ return r
339
+ }
340
+ activeAncestor = previousHeader
341
+ }
342
+
343
+ if (!(oneBack.isActive && oneBack.isChainTip)) {
344
+ r.reorgDepth = Math.min(r.priorTip.height, header.height) - activeAncestor.height
345
+ }
346
+
347
+ if (activeAncestor.headerId !== oneBack.headerId) {
348
+ let headerToDeactivate = this.repairStoredLiveHeader(await activeTipIndex.get([1, 1]))!
349
+ while (headerToDeactivate && headerToDeactivate.headerId !== activeAncestor.headerId) {
350
+ await store.put(this.prepareStoredLiveHeader({ ...headerToDeactivate, isActive: false }))
351
+ headerToDeactivate = this.repairStoredLiveHeader(await store.get(headerToDeactivate.previousHeaderId!))!
352
+ }
353
+
354
+ let headerToActivate = oneBack
355
+ while (headerToActivate.headerId !== activeAncestor.headerId) {
356
+ await store.put(this.prepareStoredLiveHeader({ ...headerToActivate, isActive: true }))
357
+ headerToActivate = this.repairStoredLiveHeader(await store.get(headerToActivate.previousHeaderId!))!
358
+ }
359
+ }
360
+ }
361
+
362
+ if (oneBack.isChainTip) {
363
+ await store.put(this.prepareStoredLiveHeader({ ...oneBack, isChainTip: false }))
364
+ }
365
+
366
+ await store.put(this.prepareStoredLiveHeader(newHeader, true))
367
+ r.added = true
368
+
369
+ //all = await store.getAll()
370
+ //console.log(`idb store length: ${all.length} last: ${all[all.length - 1]?.height}`)
371
+
372
+ if (r.added && r.isActiveTip) {
373
+ //this.pruneLiveBlockHeaders(newHeader.height)
374
+ }
375
+
376
+ await trx.done
377
+ return r
378
+ }
379
+
380
+ async deleteBulkFile(fileId: number): Promise<number> {
381
+ await this.makeAvailable()
382
+
383
+ const trx = this.toDbTrxReadWrite(['bulk_headers'])
384
+ const store = trx.objectStore('bulk_headers')
385
+ await store.delete(fileId)
386
+ await trx.done
387
+ // return number of records affected
388
+ return 1
389
+ }
390
+
391
+ async insertBulkFile(file: BulkHeaderFileInfo): Promise<number> {
392
+ await this.makeAvailable()
393
+
394
+ const trx = this.toDbTrxReadWrite(['bulk_headers'])
395
+ const store = trx.objectStore('bulk_headers')
396
+ const fileObj: object = { ...file }
397
+ delete fileObj['fileId']
398
+ file.fileId = Number(await store.put(fileObj))
399
+ await trx.done
400
+ return file.fileId
401
+ }
402
+
403
+ async updateBulkFile(fileId: number, file: BulkHeaderFileInfo): Promise<number> {
404
+ await this.makeAvailable()
405
+
406
+ const trx = this.toDbTrxReadWrite(['bulk_headers'])
407
+ const store = trx.objectStore('bulk_headers')
408
+ file.fileId = fileId
409
+ await store.put(file)
410
+ await trx.done
411
+ // return number of records affected
412
+ return 1
413
+ }
414
+
415
+ async getBulkFiles(): Promise<BulkHeaderFileInfo[]> {
416
+ await this.makeAvailable()
417
+
418
+ const trx = this.toDbTrxReadWrite(['bulk_headers'])
419
+ const store = trx.objectStore('bulk_headers')
420
+
421
+ const files: BulkHeaderFileInfo[] = await store.getAll()
422
+ files.sort((a, b) => a.firstHeight - b.firstHeight)
423
+ for (const file of files) file.data = undefined
424
+ return files
425
+ }
426
+
427
+ async getBulkFileData(fileId: number, offset?: number, length?: number): Promise<Uint8Array | undefined> {
428
+ if (!Number.isInteger(fileId)) throw new WERR_INVALID_PARAMETER('fileId', 'a valid, integer bulk_files fileId')
429
+ await this.makeAvailable()
430
+
431
+ const trx = this.toDbTrxReadWrite(['bulk_headers'])
432
+ const store = trx.objectStore('bulk_headers')
433
+
434
+ const info: BulkHeaderFileInfo | undefined = await store.get(fileId)
435
+ if (!info) throw new WERR_INVALID_PARAMETER(`fileId`, `an existing record. ${fileId} not found`)
436
+
437
+ let data: Uint8Array | undefined = undefined
438
+
439
+ if (!info.data) return undefined
440
+
441
+ if (offset !== undefined && length !== undefined && Number.isInteger(offset) && Number.isInteger(length)) {
442
+ data = info.data.slice(offset, offset + length)
443
+ } else {
444
+ data = info.data
445
+ }
446
+ await trx.done
447
+ return data
448
+ }
449
+
450
+ /**
451
+ * IndexedDB does not do indices of boolean properties.
452
+ * So true is stored as a 1, and false is stored as no property value (delete v['property'])
453
+ *
454
+ * This function restores these property values to true and false.
455
+ *
456
+ * @param header
457
+ * @returns copy of header with updated properties
458
+ */
459
+ private repairStoredLiveHeader(header?: LiveBlockHeader): LiveBlockHeader | undefined {
460
+ if (!header) return undefined
461
+ const h: LiveBlockHeader = {
462
+ ...header,
463
+ isActive: !!header['isActive'],
464
+ isChainTip: !!header['isChainTip']
465
+ }
466
+ return h
467
+ }
468
+
469
+ private prepareStoredLiveHeader(header: LiveBlockHeader, forInsert?: boolean): object {
470
+ const h: object = { ...header }
471
+ if (forInsert) delete h['headerId']
472
+
473
+ if (header.isActive) h['isActive'] = 1
474
+ else delete h['isActive']
475
+ if (header.isChainTip) h['isChainTip'] = 1
476
+ else delete h['isChainTip']
477
+
478
+ return h
479
+ }
480
+
481
+ async insertLiveHeader(header: LiveBlockHeader): Promise<LiveBlockHeader> {
482
+ const trx = this.toDbTrxReadWrite(['live_headers'])
483
+ const store = trx.objectStore('live_headers')
484
+
485
+ const h = this.prepareStoredLiveHeader(header, true)
486
+
487
+ header.headerId = Number(await store.add(h))
488
+
489
+ await trx.done
490
+
491
+ return header
492
+ }
493
+
494
+ async initDB(): Promise<IDBPDatabase<ChaintracksStorageIdbSchema>> {
495
+ const db = await openDB<ChaintracksStorageIdbSchema>(this.dbName, 1, {
496
+ upgrade(db, oldVersion, newVersion, transaction) {
497
+ if (!db.objectStoreNames.contains('live_headers')) {
498
+ const liveHeadersStore = db.createObjectStore('live_headers', {
499
+ keyPath: 'headerId',
500
+ autoIncrement: true
501
+ })
502
+ liveHeadersStore.createIndex('hash', 'hash', { unique: true })
503
+ liveHeadersStore.createIndex('height', 'height', { unique: false })
504
+ liveHeadersStore.createIndex('previousHeaderId', 'previousHeaderId', { unique: false })
505
+ liveHeadersStore.createIndex('merkleRoot', 'merkleRoot', { unique: false })
506
+ liveHeadersStore.createIndex('activeTip', ['isActive', 'isChainTip'], { unique: false })
507
+ }
508
+
509
+ if (!db.objectStoreNames.contains('bulk_headers')) {
510
+ const bulkHeadersStore = db.createObjectStore('proven_tx_reqs', {
511
+ keyPath: 'fileId',
512
+ autoIncrement: true
513
+ })
514
+ }
515
+ }
516
+ })
517
+ return db
518
+ }
519
+
520
+ toDbTrxReadOnly(stores: string[]): IDBPTransaction<ChaintracksStorageIdbSchema, string[], 'readonly'> {
521
+ if (!this.db) throw new Error('not initialized')
522
+ const db = this.db
523
+ const trx = db.transaction(stores || this.allStores, 'readonly')
524
+ this.whenLastAccess = new Date()
525
+ return trx
526
+ }
527
+
528
+ toDbTrxReadWrite(stores: string[]): IDBPTransaction<ChaintracksStorageIdbSchema, string[], 'readwrite'> {
529
+ if (!this.db) throw new Error('not initialized')
530
+ const db = this.db
531
+ const trx = db.transaction(stores || this.allStores, 'readwrite')
532
+ this.whenLastAccess = new Date()
533
+ return trx
534
+ }
535
+ }
536
+
537
+ export interface ChaintracksStorageIdbSchema {
538
+ liveHeaders: {
539
+ key: number
540
+ value: LiveBlockHeader
541
+ indexes: {
542
+ hash: string
543
+ previousHash: string
544
+ previousHeaderId: number | null
545
+ isActive: boolean
546
+ activeTip: [boolean, boolean]
547
+ height: number
548
+ }
549
+ }
550
+ bulkHeaders: {
551
+ key: number
552
+ value: BulkHeaderFileInfo
553
+ indexes: {
554
+ firstHeight: number
555
+ }
556
+ }
557
+ }