@bopen-io/wallet-toolbox 1.7.18

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 (390) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/.env.template +22 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
  4. package/.github/ISSUE_TEMPLATE/discussion.md +24 -0
  5. package/.github/pull_request_template.md +22 -0
  6. package/.github/workflows/push.yaml +145 -0
  7. package/.prettierrc +10 -0
  8. package/CHANGELOG.md +280 -0
  9. package/CONTRIBUTING.md +89 -0
  10. package/README.md +43 -0
  11. package/docs/README.md +85 -0
  12. package/docs/client.md +19627 -0
  13. package/docs/monitor.md +953 -0
  14. package/docs/open-rpc/index.html +46 -0
  15. package/docs/services.md +6377 -0
  16. package/docs/setup.md +1268 -0
  17. package/docs/storage.md +5367 -0
  18. package/docs/wallet.md +19626 -0
  19. package/jest.config.ts +25 -0
  20. package/license.md +28 -0
  21. package/out/tsconfig.all.tsbuildinfo +1 -0
  22. package/package.json +63 -0
  23. package/src/CWIStyleWalletManager.ts +1999 -0
  24. package/src/Setup.ts +579 -0
  25. package/src/SetupClient.ts +322 -0
  26. package/src/SetupWallet.ts +108 -0
  27. package/src/SimpleWalletManager.ts +526 -0
  28. package/src/Wallet.ts +1169 -0
  29. package/src/WalletAuthenticationManager.ts +153 -0
  30. package/src/WalletLogger.ts +213 -0
  31. package/src/WalletPermissionsManager.ts +3660 -0
  32. package/src/WalletSettingsManager.ts +114 -0
  33. package/src/__tests/CWIStyleWalletManager.test.d.ts.map +1 -0
  34. package/src/__tests/CWIStyleWalletManager.test.js.map +1 -0
  35. package/src/__tests/CWIStyleWalletManager.test.ts +675 -0
  36. package/src/__tests/WalletPermissionsManager.callbacks.test.ts +323 -0
  37. package/src/__tests/WalletPermissionsManager.checks.test.ts +844 -0
  38. package/src/__tests/WalletPermissionsManager.encryption.test.ts +412 -0
  39. package/src/__tests/WalletPermissionsManager.fixtures.ts +307 -0
  40. package/src/__tests/WalletPermissionsManager.flows.test.ts +462 -0
  41. package/src/__tests/WalletPermissionsManager.initialization.test.ts +300 -0
  42. package/src/__tests/WalletPermissionsManager.pmodules.test.ts +798 -0
  43. package/src/__tests/WalletPermissionsManager.proxying.test.ts +724 -0
  44. package/src/__tests/WalletPermissionsManager.tokens.test.ts +503 -0
  45. package/src/index.all.ts +27 -0
  46. package/src/index.client.ts +25 -0
  47. package/src/index.mobile.ts +21 -0
  48. package/src/index.ts +1 -0
  49. package/src/monitor/Monitor.ts +412 -0
  50. package/src/monitor/MonitorDaemon.ts +188 -0
  51. package/src/monitor/README.md +3 -0
  52. package/src/monitor/__test/MonitorDaemon.man.test.ts +45 -0
  53. package/src/monitor/tasks/TaskCheckForProofs.ts +243 -0
  54. package/src/monitor/tasks/TaskCheckNoSends.ts +73 -0
  55. package/src/monitor/tasks/TaskClock.ts +33 -0
  56. package/src/monitor/tasks/TaskFailAbandoned.ts +54 -0
  57. package/src/monitor/tasks/TaskMonitorCallHistory.ts +26 -0
  58. package/src/monitor/tasks/TaskNewHeader.ts +93 -0
  59. package/src/monitor/tasks/TaskPurge.ts +68 -0
  60. package/src/monitor/tasks/TaskReorg.ts +89 -0
  61. package/src/monitor/tasks/TaskReviewStatus.ts +48 -0
  62. package/src/monitor/tasks/TaskSendWaiting.ts +122 -0
  63. package/src/monitor/tasks/TaskSyncWhenIdle.ts +26 -0
  64. package/src/monitor/tasks/TaskUnFail.ts +151 -0
  65. package/src/monitor/tasks/WalletMonitorTask.ts +47 -0
  66. package/src/sdk/CertOpsWallet.ts +18 -0
  67. package/src/sdk/PrivilegedKeyManager.ts +372 -0
  68. package/src/sdk/README.md +13 -0
  69. package/src/sdk/WERR_errors.ts +234 -0
  70. package/src/sdk/WalletError.ts +170 -0
  71. package/src/sdk/WalletErrorFromJson.ts +80 -0
  72. package/src/sdk/WalletServices.interfaces.ts +700 -0
  73. package/src/sdk/WalletSigner.interfaces.ts +11 -0
  74. package/src/sdk/WalletStorage.interfaces.ts +606 -0
  75. package/src/sdk/__test/CertificateLifeCycle.test.ts +131 -0
  76. package/src/sdk/__test/PrivilegedKeyManager.test.ts +738 -0
  77. package/src/sdk/__test/WalletError.test.ts +318 -0
  78. package/src/sdk/__test/validationHelpers.test.ts +21 -0
  79. package/src/sdk/index.ts +10 -0
  80. package/src/sdk/types.ts +226 -0
  81. package/src/services/README.md +11 -0
  82. package/src/services/ServiceCollection.ts +248 -0
  83. package/src/services/Services.ts +603 -0
  84. package/src/services/__tests/ARC.man.test.ts +123 -0
  85. package/src/services/__tests/ARC.timeout.man.test.ts +79 -0
  86. package/src/services/__tests/ArcGorillaPool.man.test.ts +108 -0
  87. package/src/services/__tests/arcServices.test.ts +8 -0
  88. package/src/services/__tests/bitrails.test.ts +56 -0
  89. package/src/services/__tests/getMerklePath.test.ts +15 -0
  90. package/src/services/__tests/getRawTx.test.ts +13 -0
  91. package/src/services/__tests/postBeef.test.ts +104 -0
  92. package/src/services/__tests/verifyBeef.test.ts +50 -0
  93. package/src/services/chaintracker/BHServiceClient.ts +212 -0
  94. package/src/services/chaintracker/ChaintracksChainTracker.ts +71 -0
  95. package/src/services/chaintracker/__tests/ChaintracksChainTracker.test.ts +33 -0
  96. package/src/services/chaintracker/__tests/ChaintracksServiceClient.test.ts +29 -0
  97. package/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.ts +72 -0
  98. package/src/services/chaintracker/chaintracks/Api/BulkIngestorApi.ts +83 -0
  99. package/src/services/chaintracker/chaintracks/Api/BulkStorageApi.ts +92 -0
  100. package/src/services/chaintracker/chaintracks/Api/ChaintracksApi.ts +64 -0
  101. package/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.ts +189 -0
  102. package/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.ts +18 -0
  103. package/src/services/chaintracker/chaintracks/Api/ChaintracksFsApi.ts +58 -0
  104. package/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.ts +386 -0
  105. package/src/services/chaintracker/chaintracks/Api/LiveIngestorApi.ts +25 -0
  106. package/src/services/chaintracker/chaintracks/Chaintracks.ts +609 -0
  107. package/src/services/chaintracker/chaintracks/ChaintracksService.ts +199 -0
  108. package/src/services/chaintracker/chaintracks/ChaintracksServiceClient.ts +154 -0
  109. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.ts +176 -0
  110. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.ts +174 -0
  111. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.ts +18 -0
  112. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.ts +113 -0
  113. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.ts +81 -0
  114. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.ts +86 -0
  115. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.ts +59 -0
  116. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.ts +104 -0
  117. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.ts +66 -0
  118. package/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.ts +566 -0
  119. package/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.ts +219 -0
  120. package/src/services/chaintracker/chaintracks/Ingest/__tests/BulkIngestorCDNBabbage.test.ts +54 -0
  121. package/src/services/chaintracker/chaintracks/Ingest/__tests/LiveIngestorWhatsOnChainPoll.test.ts +33 -0
  122. package/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.ts +124 -0
  123. package/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.ts +92 -0
  124. package/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.ts +104 -0
  125. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.ts +382 -0
  126. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.ts +574 -0
  127. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.ts +438 -0
  128. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageMemory.ts +29 -0
  129. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.ts +304 -0
  130. package/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageIdb.test.ts +102 -0
  131. package/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageKnex.test.ts +45 -0
  132. package/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.ts +77 -0
  133. package/src/services/chaintracker/chaintracks/__tests/ChaintracksClientApi.test.ts +192 -0
  134. package/src/services/chaintracker/chaintracks/__tests/LocalCdnServer.ts +75 -0
  135. package/src/services/chaintracker/chaintracks/__tests/createIdbChaintracks.test.ts +62 -0
  136. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNetBlockHeaders.json +1 -0
  137. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_0.headers +0 -0
  138. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_1.headers +0 -0
  139. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_2.headers +0 -0
  140. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_3.headers +0 -0
  141. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNetBlockHeaders.json +1 -0
  142. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_0.headers +0 -0
  143. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_1.headers +0 -0
  144. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_2.headers +0 -0
  145. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_3.headers +0 -0
  146. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNetBlockHeaders.json +1 -0
  147. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_0.headers +0 -0
  148. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_1.headers +0 -0
  149. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_2.headers +0 -0
  150. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_3.headers +0 -0
  151. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNetBlockHeaders.json +1 -0
  152. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_0.headers +0 -0
  153. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_1.headers +0 -0
  154. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_2.headers +0 -0
  155. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_3.headers +0 -0
  156. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_4.headers +0 -0
  157. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNetBlockHeaders.json +1 -0
  158. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_0.headers +0 -0
  159. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_1.headers +0 -0
  160. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_2.headers +0 -0
  161. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_3.headers +0 -0
  162. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_4.headers +0 -0
  163. package/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.ts +92 -0
  164. package/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.ts +111 -0
  165. package/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.ts +91 -0
  166. package/src/services/chaintracker/chaintracks/createIdbChaintracks.ts +60 -0
  167. package/src/services/chaintracker/chaintracks/createKnexChaintracks.ts +65 -0
  168. package/src/services/chaintracker/chaintracks/createNoDbChaintracks.ts +60 -0
  169. package/src/services/chaintracker/chaintracks/index.all.ts +12 -0
  170. package/src/services/chaintracker/chaintracks/index.client.ts +4 -0
  171. package/src/services/chaintracker/chaintracks/index.mobile.ts +37 -0
  172. package/src/services/chaintracker/chaintracks/util/BulkFileDataManager.ts +975 -0
  173. package/src/services/chaintracker/chaintracks/util/BulkFileDataReader.ts +60 -0
  174. package/src/services/chaintracker/chaintracks/util/BulkFilesReader.ts +336 -0
  175. package/src/services/chaintracker/chaintracks/util/BulkHeaderFile.ts +247 -0
  176. package/src/services/chaintracker/chaintracks/util/ChaintracksFetch.ts +69 -0
  177. package/src/services/chaintracker/chaintracks/util/ChaintracksFs.ts +141 -0
  178. package/src/services/chaintracker/chaintracks/util/HeightRange.ts +153 -0
  179. package/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.ts +76 -0
  180. package/src/services/chaintracker/chaintracks/util/__tests/BulkFileDataManager.test.ts +304 -0
  181. package/src/services/chaintracker/chaintracks/util/__tests/ChaintracksFetch.test.ts +60 -0
  182. package/src/services/chaintracker/chaintracks/util/__tests/HeightRange.test.ts +67 -0
  183. package/src/services/chaintracker/chaintracks/util/__tests/SingleWriterMultiReaderLock.test.ts +49 -0
  184. package/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.ts +573 -0
  185. package/src/services/chaintracker/chaintracks/util/dirtyHashes.ts +29 -0
  186. package/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.ts +432 -0
  187. package/src/services/chaintracker/index.all.ts +4 -0
  188. package/src/services/chaintracker/index.client.ts +4 -0
  189. package/src/services/chaintracker/index.mobile.ts +4 -0
  190. package/src/services/createDefaultWalletServicesOptions.ts +77 -0
  191. package/src/services/index.ts +1 -0
  192. package/src/services/processingErrors/arcSuccessError.json +76 -0
  193. package/src/services/providers/ARC.ts +350 -0
  194. package/src/services/providers/Bitails.ts +256 -0
  195. package/src/services/providers/SdkWhatsOnChain.ts +83 -0
  196. package/src/services/providers/WhatsOnChain.ts +883 -0
  197. package/src/services/providers/__tests/WhatsOnChain.test.ts +242 -0
  198. package/src/services/providers/__tests/exchangeRates.test.ts +18 -0
  199. package/src/services/providers/exchangeRates.ts +265 -0
  200. package/src/services/providers/getBeefForTxid.ts +369 -0
  201. package/src/signer/README.md +5 -0
  202. package/src/signer/WalletSigner.ts +17 -0
  203. package/src/signer/methods/acquireDirectCertificate.ts +52 -0
  204. package/src/signer/methods/buildSignableTransaction.ts +183 -0
  205. package/src/signer/methods/completeSignedTransaction.ts +117 -0
  206. package/src/signer/methods/createAction.ts +172 -0
  207. package/src/signer/methods/internalizeAction.ts +106 -0
  208. package/src/signer/methods/proveCertificate.ts +43 -0
  209. package/src/signer/methods/signAction.ts +54 -0
  210. package/src/storage/README.md +14 -0
  211. package/src/storage/StorageIdb.ts +2304 -0
  212. package/src/storage/StorageKnex.ts +1425 -0
  213. package/src/storage/StorageProvider.ts +810 -0
  214. package/src/storage/StorageReader.ts +194 -0
  215. package/src/storage/StorageReaderWriter.ts +432 -0
  216. package/src/storage/StorageSyncReader.ts +34 -0
  217. package/src/storage/WalletStorageManager.ts +943 -0
  218. package/src/storage/__test/StorageIdb.test.ts +43 -0
  219. package/src/storage/__test/WalletStorageManager.test.ts +275 -0
  220. package/src/storage/__test/adminStats.man.test.ts +89 -0
  221. package/src/storage/__test/getBeefForTransaction.test.ts +385 -0
  222. package/src/storage/index.all.ts +11 -0
  223. package/src/storage/index.client.ts +7 -0
  224. package/src/storage/index.mobile.ts +6 -0
  225. package/src/storage/methods/ListActionsSpecOp.ts +70 -0
  226. package/src/storage/methods/ListOutputsSpecOp.ts +129 -0
  227. package/src/storage/methods/__test/GenerateChange/generateChangeSdk.test.ts +1057 -0
  228. package/src/storage/methods/__test/GenerateChange/randomValsUsed1.ts +20 -0
  229. package/src/storage/methods/__test/offsetKey.test.ts +274 -0
  230. package/src/storage/methods/attemptToPostReqsToNetwork.ts +389 -0
  231. package/src/storage/methods/createAction.ts +947 -0
  232. package/src/storage/methods/generateChange.ts +556 -0
  233. package/src/storage/methods/getBeefForTransaction.ts +139 -0
  234. package/src/storage/methods/getSyncChunk.ts +293 -0
  235. package/src/storage/methods/internalizeAction.ts +562 -0
  236. package/src/storage/methods/listActionsIdb.ts +183 -0
  237. package/src/storage/methods/listActionsKnex.ts +226 -0
  238. package/src/storage/methods/listCertificates.ts +73 -0
  239. package/src/storage/methods/listOutputsIdb.ts +203 -0
  240. package/src/storage/methods/listOutputsKnex.ts +263 -0
  241. package/src/storage/methods/offsetKey.ts +89 -0
  242. package/src/storage/methods/processAction.ts +420 -0
  243. package/src/storage/methods/purgeData.ts +251 -0
  244. package/src/storage/methods/purgeDataIdb.ts +10 -0
  245. package/src/storage/methods/reviewStatus.ts +101 -0
  246. package/src/storage/methods/reviewStatusIdb.ts +43 -0
  247. package/src/storage/methods/utils.Buffer.ts +33 -0
  248. package/src/storage/methods/utils.ts +56 -0
  249. package/src/storage/remoting/StorageClient.ts +567 -0
  250. package/src/storage/remoting/StorageMobile.ts +544 -0
  251. package/src/storage/remoting/StorageServer.ts +291 -0
  252. package/src/storage/remoting/__test/StorageClient.test.ts +113 -0
  253. package/src/storage/schema/KnexMigrations.ts +489 -0
  254. package/src/storage/schema/StorageIdbSchema.ts +150 -0
  255. package/src/storage/schema/entities/EntityBase.ts +210 -0
  256. package/src/storage/schema/entities/EntityCertificate.ts +188 -0
  257. package/src/storage/schema/entities/EntityCertificateField.ts +136 -0
  258. package/src/storage/schema/entities/EntityCommission.ts +148 -0
  259. package/src/storage/schema/entities/EntityOutput.ts +290 -0
  260. package/src/storage/schema/entities/EntityOutputBasket.ts +153 -0
  261. package/src/storage/schema/entities/EntityOutputTag.ts +121 -0
  262. package/src/storage/schema/entities/EntityOutputTagMap.ts +123 -0
  263. package/src/storage/schema/entities/EntityProvenTx.ts +319 -0
  264. package/src/storage/schema/entities/EntityProvenTxReq.ts +580 -0
  265. package/src/storage/schema/entities/EntitySyncState.ts +389 -0
  266. package/src/storage/schema/entities/EntityTransaction.ts +306 -0
  267. package/src/storage/schema/entities/EntityTxLabel.ts +121 -0
  268. package/src/storage/schema/entities/EntityTxLabelMap.ts +123 -0
  269. package/src/storage/schema/entities/EntityUser.ts +112 -0
  270. package/src/storage/schema/entities/MergeEntity.ts +73 -0
  271. package/src/storage/schema/entities/__tests/CertificateFieldTests.test.ts +353 -0
  272. package/src/storage/schema/entities/__tests/CertificateTests.test.ts +354 -0
  273. package/src/storage/schema/entities/__tests/CommissionTests.test.ts +371 -0
  274. package/src/storage/schema/entities/__tests/OutputBasketTests.test.ts +278 -0
  275. package/src/storage/schema/entities/__tests/OutputTagMapTests.test.ts +242 -0
  276. package/src/storage/schema/entities/__tests/OutputTagTests.test.ts +288 -0
  277. package/src/storage/schema/entities/__tests/OutputTests.test.ts +464 -0
  278. package/src/storage/schema/entities/__tests/ProvenTxReqTests.test.ts +340 -0
  279. package/src/storage/schema/entities/__tests/ProvenTxTests.test.ts +504 -0
  280. package/src/storage/schema/entities/__tests/SyncStateTests.test.ts +288 -0
  281. package/src/storage/schema/entities/__tests/TransactionTests.test.ts +604 -0
  282. package/src/storage/schema/entities/__tests/TxLabelMapTests.test.ts +361 -0
  283. package/src/storage/schema/entities/__tests/TxLabelTests.test.ts +198 -0
  284. package/src/storage/schema/entities/__tests/stampLogTests.test.ts +90 -0
  285. package/src/storage/schema/entities/__tests/usersTests.test.ts +340 -0
  286. package/src/storage/schema/entities/index.ts +16 -0
  287. package/src/storage/schema/tables/TableCertificate.ts +21 -0
  288. package/src/storage/schema/tables/TableCertificateField.ts +12 -0
  289. package/src/storage/schema/tables/TableCommission.ts +13 -0
  290. package/src/storage/schema/tables/TableMonitorEvent.ts +9 -0
  291. package/src/storage/schema/tables/TableOutput.ts +64 -0
  292. package/src/storage/schema/tables/TableOutputBasket.ts +12 -0
  293. package/src/storage/schema/tables/TableOutputTag.ts +10 -0
  294. package/src/storage/schema/tables/TableOutputTagMap.ts +9 -0
  295. package/src/storage/schema/tables/TableProvenTx.ts +14 -0
  296. package/src/storage/schema/tables/TableProvenTxReq.ts +65 -0
  297. package/src/storage/schema/tables/TableSettings.ts +17 -0
  298. package/src/storage/schema/tables/TableSyncState.ts +18 -0
  299. package/src/storage/schema/tables/TableTransaction.ts +54 -0
  300. package/src/storage/schema/tables/TableTxLabel.ts +10 -0
  301. package/src/storage/schema/tables/TableTxLabelMap.ts +9 -0
  302. package/src/storage/schema/tables/TableUser.ts +16 -0
  303. package/src/storage/schema/tables/index.ts +16 -0
  304. package/src/storage/sync/StorageMySQLDojoReader.ts +696 -0
  305. package/src/storage/sync/index.ts +1 -0
  306. package/src/utility/Format.ts +133 -0
  307. package/src/utility/README.md +3 -0
  308. package/src/utility/ReaderUint8Array.ts +187 -0
  309. package/src/utility/ScriptTemplateBRC29.ts +73 -0
  310. package/src/utility/__tests/utilityHelpers.noBuffer.test.ts +109 -0
  311. package/src/utility/aggregateResults.ts +68 -0
  312. package/src/utility/identityUtils.ts +159 -0
  313. package/src/utility/index.all.ts +7 -0
  314. package/src/utility/index.client.ts +7 -0
  315. package/src/utility/parseTxScriptOffsets.ts +29 -0
  316. package/src/utility/stampLog.ts +69 -0
  317. package/src/utility/tscProofToMerklePath.ts +48 -0
  318. package/src/utility/utilityHelpers.buffer.ts +34 -0
  319. package/src/utility/utilityHelpers.noBuffer.ts +60 -0
  320. package/src/utility/utilityHelpers.ts +275 -0
  321. package/src/wab-client/WABClient.ts +94 -0
  322. package/src/wab-client/__tests/WABClient.man.test.ts +59 -0
  323. package/src/wab-client/auth-method-interactors/AuthMethodInteractor.ts +47 -0
  324. package/src/wab-client/auth-method-interactors/DevConsoleInteractor.ts +73 -0
  325. package/src/wab-client/auth-method-interactors/PersonaIDInteractor.ts +35 -0
  326. package/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.ts +72 -0
  327. package/syncVersions.js +71 -0
  328. package/test/Wallet/StorageClient/storageClient.man.test.ts +75 -0
  329. package/test/Wallet/action/abortAction.test.ts +47 -0
  330. package/test/Wallet/action/createAction.test.ts +299 -0
  331. package/test/Wallet/action/createAction2.test.ts +1273 -0
  332. package/test/Wallet/action/createActionToGenerateBeefs.man.test.ts +293 -0
  333. package/test/Wallet/action/internalizeAction.a.test.ts +286 -0
  334. package/test/Wallet/action/internalizeAction.test.ts +682 -0
  335. package/test/Wallet/action/relinquishOutput.test.ts +37 -0
  336. package/test/Wallet/certificate/acquireCertificate.test.ts +298 -0
  337. package/test/Wallet/certificate/listCertificates.test.ts +346 -0
  338. package/test/Wallet/construct/Wallet.constructor.test.ts +57 -0
  339. package/test/Wallet/get/getHeaderForHeight.test.ts +82 -0
  340. package/test/Wallet/get/getHeight.test.ts +52 -0
  341. package/test/Wallet/get/getKnownTxids.test.ts +86 -0
  342. package/test/Wallet/get/getNetwork.test.ts +27 -0
  343. package/test/Wallet/get/getVersion.test.ts +27 -0
  344. package/test/Wallet/list/listActions.test.ts +279 -0
  345. package/test/Wallet/list/listActions2.test.ts +1381 -0
  346. package/test/Wallet/list/listCertificates.test.ts +118 -0
  347. package/test/Wallet/list/listOutputs.test.ts +447 -0
  348. package/test/Wallet/live/walletLive.man.test.ts +521 -0
  349. package/test/Wallet/local/localWallet.man.test.ts +93 -0
  350. package/test/Wallet/local/localWallet2.man.test.ts +277 -0
  351. package/test/Wallet/signAction/mountaintop.man.test.ts +130 -0
  352. package/test/Wallet/specOps/specOps.man.test.ts +220 -0
  353. package/test/Wallet/support/janitor.man.test.ts +40 -0
  354. package/test/Wallet/support/operations.man.test.ts +407 -0
  355. package/test/Wallet/support/reqErrorReview.2025.05.06.man.test.ts +347 -0
  356. package/test/Wallet/sync/Wallet.sync.test.ts +215 -0
  357. package/test/Wallet/sync/Wallet.updateWalletLegacyTestData.man.test.ts +203 -0
  358. package/test/Wallet/sync/setActive.test.ts +170 -0
  359. package/test/WalletClient/LocalKVStore.man.test.ts +114 -0
  360. package/test/WalletClient/WERR.man.test.ts +35 -0
  361. package/test/bsv-ts-sdk/LocalKVStore.test.ts +102 -0
  362. package/test/checkDB.ts +57 -0
  363. package/test/checkdb +0 -0
  364. package/test/examples/backup.man.test.ts +59 -0
  365. package/test/examples/pushdrop.test.ts +282 -0
  366. package/test/monitor/Monitor.test.ts +620 -0
  367. package/test/services/Services.test.ts +263 -0
  368. package/test/storage/KnexMigrations.test.ts +86 -0
  369. package/test/storage/StorageMySQLDojoReader.man.test.ts +60 -0
  370. package/test/storage/count.test.ts +177 -0
  371. package/test/storage/find.test.ts +195 -0
  372. package/test/storage/findLegacy.test.ts +67 -0
  373. package/test/storage/idb/allocateChange.test.ts +251 -0
  374. package/test/storage/idb/count.test.ts +158 -0
  375. package/test/storage/idb/find.test.ts +177 -0
  376. package/test/storage/idb/idbSpeed.test.ts +36 -0
  377. package/test/storage/idb/insert.test.ts +268 -0
  378. package/test/storage/idb/transactionAbort.test.ts +108 -0
  379. package/test/storage/idb/update.test.ts +999 -0
  380. package/test/storage/insert.test.ts +278 -0
  381. package/test/storage/update.test.ts +1021 -0
  382. package/test/storage/update2.test.ts +897 -0
  383. package/test/utils/TestUtilsWalletStorage.ts +2526 -0
  384. package/test/utils/localWalletMethods.ts +363 -0
  385. package/test/utils/removeFailedFromDatabase.sql +17 -0
  386. package/ts2md.json +44 -0
  387. package/tsconfig.all.json +31 -0
  388. package/tsconfig.client.json +29 -0
  389. package/tsconfig.json +17 -0
  390. package/tsconfig.mobile.json +28 -0
@@ -0,0 +1,438 @@
1
+ import { Knex } from 'knex'
2
+ import { ChaintracksKnexMigrations } from './ChaintracksKnexMigrations'
3
+ import { InsertHeaderResult, ChaintracksStorageBaseOptions } from '../Api/ChaintracksStorageApi'
4
+ import { ChaintracksStorageBase } from './ChaintracksStorageBase'
5
+ import { LiveBlockHeader } from '../Api/BlockHeaderApi'
6
+ import { BlockHeader } from '../../../../sdk/WalletServices.interfaces'
7
+ import { addWork, convertBitsToWork, isMoreWork } from '../util/blockHeaderUtilities'
8
+ import { verifyOneOrNone } from '../../../../utility/utilityHelpers'
9
+ import { DBType } from '../../../../storage/StorageReader'
10
+ import { BulkHeaderFileInfo } from '../util/BulkHeaderFile'
11
+ import { HeightRange } from '../util/HeightRange'
12
+ import { ChaintracksStorageBulkFileApi } from '../Api/ChaintracksStorageApi'
13
+ import { Chain } from '../../../../sdk/types'
14
+ import { WERR_INVALID_OPERATION, WERR_INVALID_PARAMETER } from '../../../../sdk/WERR_errors'
15
+ import { determineDBType } from '../../../../storage/schema/KnexMigrations'
16
+
17
+ export interface ChaintracksStorageKnexOptions extends ChaintracksStorageBaseOptions {
18
+ /**
19
+ * Required.
20
+ *
21
+ * Knex.js database interface initialized with valid connection configuration.
22
+ */
23
+ knex: Knex | undefined
24
+ }
25
+
26
+ /**
27
+ * Implements the ChaintracksStorageApi using Knex.js for both MySql and Sqlite support.
28
+ * Also see `chaintracksStorageMemory` which leverages Knex support for an in memory database.
29
+ */
30
+ export class ChaintracksStorageKnex extends ChaintracksStorageBase implements ChaintracksStorageBulkFileApi {
31
+ static createStorageKnexOptions(chain: Chain, knex?: Knex): ChaintracksStorageKnexOptions {
32
+ const options: ChaintracksStorageKnexOptions = {
33
+ ...ChaintracksStorageBase.createStorageBaseOptions(chain),
34
+ knex
35
+ }
36
+ return options
37
+ }
38
+
39
+ knex: Knex
40
+ _dbtype?: DBType
41
+ bulkFilesTableName: string = 'bulk_files'
42
+ headerTableName: string = `live_headers`
43
+
44
+ constructor(options: ChaintracksStorageKnexOptions) {
45
+ super(options)
46
+ if (!options.knex) throw new Error('The knex options property is required.')
47
+ this.knex = options.knex
48
+ }
49
+
50
+ get dbtype(): DBType {
51
+ if (!this._dbtype) throw new WERR_INVALID_OPERATION('must call makeAvailable first')
52
+ return this._dbtype
53
+ }
54
+
55
+ override async shutdown(): Promise<void> {
56
+ try {
57
+ await this.knex.destroy()
58
+ } catch {
59
+ /* ignore */
60
+ }
61
+ }
62
+
63
+ override async makeAvailable(): Promise<void> {
64
+ if (this.isAvailable && this.hasMigrated) return
65
+ // Not a base class policy, but we want to ensure migrations are run before getting to business.
66
+ if (!this.hasMigrated) {
67
+ await this.migrateLatest()
68
+ }
69
+ if (!this.isAvailable) {
70
+ this._dbtype = await determineDBType(this.knex)
71
+ await super.makeAvailable()
72
+ // Connect the bulk data file manager to the table provided by this storage class.
73
+ await this.bulkManager.setStorage(this, this.log)
74
+ }
75
+ }
76
+
77
+ override async migrateLatest(): Promise<void> {
78
+ if (this.hasMigrated) return
79
+ await this.knex.migrate.latest({ migrationSource: new ChaintracksKnexMigrations(this.chain) })
80
+ await super.migrateLatest()
81
+ }
82
+
83
+ override async dropAllData(): Promise<void> {
84
+ // Only using migrations to migrate down, don't need valid properties for settings table.
85
+ const config = {
86
+ migrationSource: new ChaintracksKnexMigrations('test')
87
+ }
88
+ const count = Object.keys(config.migrationSource.migrations).length
89
+ for (let i = 0; i < count; i++) {
90
+ try {
91
+ const r = await this.knex.migrate.down(config)
92
+ if (!r) {
93
+ console.error(`Migration returned falsy result await this.knex.migrate.down(config)`)
94
+ break
95
+ }
96
+ } catch (eu: unknown) {
97
+ break
98
+ }
99
+ }
100
+ this.hasMigrated = false
101
+ await super.dropAllData()
102
+ }
103
+
104
+ override async destroy(): Promise<void> {
105
+ await this.knex.destroy()
106
+ }
107
+
108
+ override async findLiveHeightRange(): Promise<HeightRange> {
109
+ return new HeightRange(
110
+ ((await this.knex(this.headerTableName).where({ isActive: true }).min('height as v')).pop()?.v as number) || 0,
111
+ ((await this.knex(this.headerTableName).where({ isActive: true }).max('height as v')).pop()?.v as number) || -1
112
+ )
113
+ }
114
+
115
+ override async findLiveHeaderForHeaderId(headerId: number): Promise<LiveBlockHeader> {
116
+ const [header] = await this.knex<LiveBlockHeader>(this.headerTableName).where({ headerId: headerId })
117
+ if (!header) throw new Error(`HeaderId ${headerId} not found in live header database.`)
118
+ return header
119
+ }
120
+
121
+ override async findChainTipHeader(): Promise<LiveBlockHeader> {
122
+ const [tip] = await this.knex<LiveBlockHeader>(this.headerTableName).where({ isActive: true, isChainTip: true })
123
+ if (!tip) throw new Error('Database contains no active chain tip header.')
124
+ return tip
125
+ }
126
+
127
+ override async findChainTipHeaderOrUndefined(): Promise<LiveBlockHeader | undefined> {
128
+ const [tip] = await this.knex<LiveBlockHeader>(this.headerTableName).where({ isActive: true, isChainTip: true })
129
+ return tip
130
+ }
131
+
132
+ async findLiveHeaderForHeight(height: number): Promise<LiveBlockHeader | null> {
133
+ const [header] = await this.knex<LiveBlockHeader>(this.headerTableName).where({ height: height, isActive: true })
134
+ return header ? header : null
135
+ }
136
+
137
+ async findLiveHeaderForBlockHash(hash: string): Promise<LiveBlockHeader | null> {
138
+ const [header] = await this.knex<LiveBlockHeader>(this.headerTableName).where({ hash: hash })
139
+ const result = header ? header : null
140
+ return result
141
+ }
142
+
143
+ async findLiveHeaderForMerkleRoot(merkleRoot: string): Promise<LiveBlockHeader | null> {
144
+ const [header] = await this.knex<LiveBlockHeader>(this.headerTableName).where({ merkleRoot: merkleRoot })
145
+ return header
146
+ }
147
+
148
+ async deleteBulkFile(fileId: number): Promise<number> {
149
+ const count = await this.knex(this.bulkFilesTableName).where({ fileId: fileId }).del()
150
+ return count
151
+ }
152
+
153
+ async insertBulkFile(file: BulkHeaderFileInfo): Promise<number> {
154
+ if (!file.fileId) delete file.fileId
155
+ const [id] = await this.knex(this.bulkFilesTableName).insert(file)
156
+ file.fileId = id
157
+ return id
158
+ }
159
+ async updateBulkFile(fileId: number, file: BulkHeaderFileInfo): Promise<number> {
160
+ const n = await this.knex(this.bulkFilesTableName).where({ fileId: fileId }).update(file)
161
+ return n
162
+ }
163
+ async getBulkFiles(): Promise<BulkHeaderFileInfo[]> {
164
+ const files = await this.knex<BulkHeaderFileInfo>(this.bulkFilesTableName)
165
+ .select(
166
+ 'fileId',
167
+ 'chain',
168
+ 'fileName',
169
+ 'firstHeight',
170
+ 'count',
171
+ 'prevHash',
172
+ 'lastHash',
173
+ 'fileHash',
174
+ 'prevChainWork',
175
+ 'lastChainWork',
176
+ 'validated',
177
+ 'sourceUrl'
178
+ )
179
+ .orderBy('firstHeight', 'asc')
180
+ return files
181
+ }
182
+
183
+ dbTypeSubstring(source: string, fromOffset: number, forLength?: number) {
184
+ if (this.dbtype === 'MySQL') return `substring(${source} from ${fromOffset} for ${forLength!})`
185
+ return `substr(${source}, ${fromOffset}, ${forLength})`
186
+ }
187
+
188
+ async getBulkFileData(fileId: number, offset?: number, length?: number): Promise<Uint8Array | undefined> {
189
+ await this.makeAvailable()
190
+ if (!Number.isInteger(fileId)) throw new WERR_INVALID_PARAMETER('fileId', 'a valid, integer bulk_files fileId')
191
+ let data: Uint8Array | undefined = undefined
192
+ if (Number.isInteger(offset) && Number.isInteger(length)) {
193
+ let rs: { data: Buffer | null }[] = await this.knex.raw(
194
+ `select ${this.dbTypeSubstring('data', offset! + 1, length)} as data from ${this.bulkFilesTableName} where fileId = '${fileId}'`
195
+ )
196
+ if (this.dbtype === 'MySQL') rs = (rs as unknown as { data: Buffer | null }[][])[0]
197
+ const r = verifyOneOrNone(rs)
198
+ if (r && r.data) {
199
+ data = Uint8Array.from(r.data)
200
+ }
201
+ } else {
202
+ const r = verifyOneOrNone(await this.knex(this.bulkFilesTableName).where({ fileId: fileId }).select('data'))
203
+ if (r.data) data = Uint8Array.from(r.data)
204
+ }
205
+ return data
206
+ }
207
+
208
+ /**
209
+ * @param header Header to attempt to add to live storage.
210
+ * @returns details of conditions found attempting to insert header
211
+ */
212
+ async insertHeader(header: BlockHeader): Promise<InsertHeaderResult> {
213
+ const table = this.headerTableName
214
+
215
+ const r: InsertHeaderResult = {
216
+ added: false,
217
+ dupe: false,
218
+ noPrev: false,
219
+ badPrev: false,
220
+ noActiveAncestor: false,
221
+ isActiveTip: false,
222
+ reorgDepth: 0,
223
+ priorTip: undefined,
224
+ noTip: false,
225
+ deactivatedHeaders: []
226
+ }
227
+
228
+ await this.knex.transaction(async trx => {
229
+ /*
230
+ We ensure the header does not already exist. This needs to be done
231
+ inside the transaction to avoid inserting multiple headers. If an
232
+ identical header is found, there is no need to insert a new header.
233
+ */
234
+ const [dupeCheck] = await trx(table).where({ hash: header.hash }).count()
235
+ if (dupeCheck['count(*)']) {
236
+ r.dupe = true
237
+ return
238
+ }
239
+
240
+ // This is the existing previous header to the one being inserted...
241
+ let [oneBack] = await trx<LiveBlockHeader>(table).where({ hash: header.previousHash })
242
+
243
+ if (!oneBack) {
244
+ // Check if this is first live header...
245
+ const cr = await trx(table).count()
246
+ const count = Number(cr[0]['count(*)'])
247
+ if (count === 0) {
248
+ // If this is the first live header, the last bulk header (if there is one) is the previous header.
249
+ const lbf = await this.bulkManager.getLastFile()
250
+ if (!lbf) throw new WERR_INVALID_OPERATION('bulk headers must exist before first live header can be added')
251
+ if (header.previousHash === lbf.lastHash && header.height === lbf.firstHeight + lbf.count) {
252
+ // Valid first live header. Add it.
253
+ const chainWork = addWork(lbf.lastChainWork, convertBitsToWork(header.bits))
254
+ r.isActiveTip = true
255
+ const newHeader = {
256
+ ...header,
257
+ previousHeaderId: null,
258
+ chainWork,
259
+ isChainTip: r.isActiveTip,
260
+ isActive: r.isActiveTip
261
+ }
262
+ // Success
263
+ await trx<LiveBlockHeader>(table).insert(newHeader)
264
+ r.added = true
265
+ return
266
+ }
267
+ }
268
+ // Failure without a oneBack
269
+ // First live header that does not follow last bulk header or
270
+ // Not the first live header and live headers doesn't include a previousHash header.
271
+ r.noPrev = true
272
+ return
273
+ }
274
+
275
+ // This header's previousHash matches an existing live header's hash, if height isn't +1, reject it.
276
+ if (oneBack.height + 1 != header.height) {
277
+ r.badPrev = true
278
+ return
279
+ }
280
+
281
+ if (oneBack.isActive && oneBack.isChainTip) {
282
+ r.priorTip = oneBack
283
+ } else {
284
+ ;[r.priorTip] = await trx<LiveBlockHeader>(table).where({ isActive: true, isChainTip: true })
285
+ }
286
+
287
+ if (!r.priorTip) {
288
+ // No active chain tip found. This is a logic error in state of live headers.
289
+ r.noTip = true
290
+ return
291
+ }
292
+
293
+ // We have an acceptable new live header...and live headers has an active chain tip.
294
+
295
+ const chainWork = addWork(oneBack.chainWork, convertBitsToWork(header.bits))
296
+
297
+ r.isActiveTip = isMoreWork(chainWork, r.priorTip.chainWork)
298
+
299
+ const newHeader = {
300
+ ...header,
301
+ previousHeaderId: oneBack.headerId,
302
+ chainWork,
303
+ isChainTip: r.isActiveTip,
304
+ isActive: r.isActiveTip
305
+ }
306
+
307
+ if (r.isActiveTip) {
308
+ // Find newHeader's first active ancestor
309
+ let activeAncestor = oneBack
310
+ while (!activeAncestor.isActive) {
311
+ const [previousHeader] = await trx<LiveBlockHeader>(table).where({
312
+ headerId: activeAncestor.previousHeaderId || -1
313
+ })
314
+ if (!previousHeader) {
315
+ // live headers doesn't contain an active ancestor. This is a live header's logic error.
316
+ r.noActiveAncestor = true
317
+ return
318
+ }
319
+ activeAncestor = previousHeader
320
+ }
321
+
322
+ if (!(oneBack.isActive && oneBack.isChainTip))
323
+ // If this is the new active chain tip, and oneBack was not, this is a reorg.
324
+ r.reorgDepth = Math.min(r.priorTip.height, header.height) - activeAncestor.height
325
+
326
+ if (activeAncestor.headerId !== oneBack.headerId) {
327
+ // Deactivate headers from the current active chain tip up to but excluding our activeAncestor:
328
+ let [headerToDeactivate] = await trx<LiveBlockHeader>(table).where({ isChainTip: true, isActive: true })
329
+ while (headerToDeactivate.headerId !== activeAncestor.headerId) {
330
+ // Headers are deactivated until we reach the activeAncestor
331
+ r.deactivatedHeaders.push(headerToDeactivate)
332
+ await trx<LiveBlockHeader>(table)
333
+ .where({ headerId: headerToDeactivate.headerId })
334
+ .update({ isActive: false })
335
+ const [previousHeader] = await trx<LiveBlockHeader>(table).where({
336
+ headerId: headerToDeactivate.previousHeaderId || -1
337
+ })
338
+ headerToDeactivate = previousHeader
339
+ }
340
+
341
+ // The first header to activate is one before the one we are about to insert
342
+ let headerToActivate = oneBack
343
+ while (headerToActivate.headerId !== activeAncestor.headerId) {
344
+ // Headers are activated until we reach the active ancestor
345
+ await trx<LiveBlockHeader>(table).where({ headerId: headerToActivate.headerId }).update({ isActive: true })
346
+ const [previousHeader] = await trx<LiveBlockHeader>(table).where({
347
+ headerId: headerToActivate.previousHeaderId || -1
348
+ })
349
+ headerToActivate = previousHeader
350
+ }
351
+ }
352
+ }
353
+
354
+ if (oneBack.isChainTip) {
355
+ // Deactivate the old chain tip
356
+ await trx<LiveBlockHeader>(table).where({ headerId: oneBack.headerId }).update({ isChainTip: false })
357
+ }
358
+
359
+ await trx<LiveBlockHeader>(table).insert(newHeader)
360
+ r.added = true
361
+ })
362
+
363
+ if (r.added && r.isActiveTip) this.pruneLiveBlockHeaders(header.height)
364
+
365
+ return r
366
+ }
367
+
368
+ async findMaxHeaderId(): Promise<number> {
369
+ return ((await this.knex(this.headerTableName).max('headerId as v')).pop()?.v as number) || -1
370
+ //const [resultrow] = await this.knex(this.headerTableName).max('headerId as maxHeaderId')
371
+ //return resultrow?.maxHeaderId || 0
372
+ }
373
+
374
+ override async deleteLiveBlockHeaders(): Promise<void> {
375
+ const table = this.headerTableName
376
+ await this.knex.transaction(async trx => {
377
+ await trx<LiveBlockHeader>(table).update({ previousHeaderId: null })
378
+ await trx<LiveBlockHeader>(table).del()
379
+ })
380
+ }
381
+
382
+ override async deleteBulkBlockHeaders(): Promise<void> {
383
+ const table = this.bulkFilesTableName
384
+ await this.knex.transaction(async trx => {
385
+ await trx<BulkHeaderFileInfo>(table).del()
386
+ })
387
+ }
388
+
389
+ async deleteOlderLiveBlockHeaders(maxHeight: number): Promise<number> {
390
+ return this.knex.transaction(async trx => {
391
+ try {
392
+ const tableName = this.headerTableName
393
+ await trx(tableName)
394
+ .whereIn('previousHeaderId', function () {
395
+ this.select('headerId').from(tableName).where('height', '<=', maxHeight)
396
+ })
397
+ .update({ previousHeaderId: null })
398
+
399
+ const deletedCount = await trx(tableName).where('height', '<=', maxHeight).del()
400
+
401
+ // Commit transaction
402
+ await trx.commit()
403
+ return deletedCount
404
+ } catch (error) {
405
+ // Rollback on error
406
+ await trx.rollback()
407
+ throw error
408
+ }
409
+ })
410
+ }
411
+
412
+ async getLiveHeaders(range: HeightRange): Promise<LiveBlockHeader[]> {
413
+ const headers = await this.knex<LiveBlockHeader>(this.headerTableName)
414
+ .where({ isActive: true })
415
+ .andWhere('height', '>=', range.minHeight)
416
+ .andWhere('height', '<=', range.maxHeight)
417
+ .orderBy('height')
418
+ return headers
419
+ }
420
+
421
+ concatSerializedHeaders(bufs: number[][]): number[] {
422
+ const r: number[] = [bufs.length * 80]
423
+ for (const bh of bufs) {
424
+ for (const b of bh) {
425
+ r.push(b)
426
+ }
427
+ }
428
+ return r
429
+ }
430
+
431
+ async liveHeadersForBulk(count: number): Promise<LiveBlockHeader[]> {
432
+ const headers = await this.knex<LiveBlockHeader>(this.headerTableName)
433
+ .where({ isActive: true })
434
+ .limit(count)
435
+ .orderBy('height')
436
+ return headers
437
+ }
438
+ }
@@ -0,0 +1,29 @@
1
+ import { Chain } from '../../../../sdk'
2
+ import { ChaintracksStorageKnex, ChaintracksStorageKnexOptions } from './ChaintracksStorageKnex'
3
+ import knex from 'knex'
4
+
5
+ export interface ChaintracksStorageMemoryOptions extends ChaintracksStorageKnexOptions {
6
+ sqliteClient: 'sqlite3' | 'better-sqlite3' | undefined
7
+ }
8
+
9
+ /*
10
+ export class ChaintracksStorageMemory extends ChaintracksStorageKnex {
11
+ static createStorageMemoryOptions(chain: Chain) {
12
+ const options: ChaintracksStorageMemoryOptions = {
13
+ ...ChaintracksStorageKnex.createStorageKnexOptions(chain),
14
+ sqliteClient: 'sqlite3'
15
+ }
16
+ return options
17
+ }
18
+
19
+ constructor(options: ChaintracksStorageMemoryOptions) {
20
+ if (options.knex)
21
+ throw new Error(
22
+ 'knex will be automatically configured from the sqliteClient property setting. Must be undefined.'
23
+ )
24
+ options.knex = knex({ client: options.sqliteClient || 'sqlite3', connection: ':memory:', useNullAsDefault: true })
25
+
26
+ super(options)
27
+ }
28
+ }
29
+ */