@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,304 @@
1
+ import { ChaintracksStorageBaseOptions, InsertHeaderResult } from '../Api/ChaintracksStorageApi'
2
+ import { ChaintracksStorageBase } from '../Storage/ChaintracksStorageBase'
3
+ import { LiveBlockHeader } from '../Api/BlockHeaderApi'
4
+ import { addWork, convertBitsToWork, isMoreWork, serializeBaseBlockHeader } from '../util/blockHeaderUtilities'
5
+ import { HeightRange } from '../util/HeightRange'
6
+ import { BulkFilesReaderStorage } from '../util/BulkFilesReader'
7
+ import { ChaintracksFetch } from '../util/ChaintracksFetch'
8
+ import { Chain } from '../../../../sdk/types'
9
+ import { WERR_INVALID_OPERATION, WERR_INVALID_PARAMETER } from '../../../../sdk/WERR_errors'
10
+ import { BlockHeader } from '../../../../sdk/WalletServices.interfaces'
11
+
12
+ interface ChaintracksNoDbData {
13
+ chain: Chain
14
+ liveHeaders: Map<number, LiveBlockHeader>
15
+ maxHeaderId: number
16
+ tipHeaderId: number
17
+ hashToHeaderId: Map<string, number>
18
+ }
19
+
20
+ export interface ChaintracksStorageNoDbOptions extends ChaintracksStorageBaseOptions {}
21
+
22
+ export class ChaintracksStorageNoDb extends ChaintracksStorageBase {
23
+ static mainData: ChaintracksNoDbData = {
24
+ chain: 'main',
25
+ liveHeaders: new Map<number, LiveBlockHeader>(),
26
+ maxHeaderId: 0,
27
+ tipHeaderId: 0,
28
+ hashToHeaderId: new Map<string, number>()
29
+ }
30
+ static testData: ChaintracksNoDbData = {
31
+ chain: 'test',
32
+ liveHeaders: new Map<number, LiveBlockHeader>(),
33
+ maxHeaderId: 0,
34
+ tipHeaderId: 0,
35
+ hashToHeaderId: new Map<string, number>()
36
+ }
37
+
38
+ constructor(options: ChaintracksStorageNoDbOptions) {
39
+ super(options)
40
+ }
41
+
42
+ override async destroy(): Promise<void> {}
43
+
44
+ async getData(): Promise<ChaintracksNoDbData> {
45
+ if (this.chain === 'main') {
46
+ return ChaintracksStorageNoDb.mainData
47
+ } else if (this.chain === 'test') {
48
+ return ChaintracksStorageNoDb.testData
49
+ } else {
50
+ throw new WERR_INVALID_PARAMETER('chain', `either 'main' or 'test. '${this.chain}' is unsupported.`)
51
+ }
52
+ }
53
+
54
+ override async deleteLiveBlockHeaders(): Promise<void> {
55
+ const data = await this.getData()
56
+ data.liveHeaders.clear()
57
+ data.maxHeaderId = 0
58
+ data.tipHeaderId = 0
59
+ data.hashToHeaderId.clear()
60
+ }
61
+
62
+ override async deleteOlderLiveBlockHeaders(maxHeight: number): Promise<number> {
63
+ const data = await this.getData()
64
+ let deletedCount = 0
65
+
66
+ // Clear previousHeaderId references
67
+ for (const [headerId, header] of data.liveHeaders) {
68
+ if (header.previousHeaderId) {
69
+ const prevHeader = data.liveHeaders.get(header.previousHeaderId)
70
+ if (prevHeader && prevHeader.height <= maxHeight) {
71
+ data.liveHeaders.set(headerId, { ...header, previousHeaderId: null })
72
+ }
73
+ }
74
+ }
75
+
76
+ // Delete headers up to maxHeight
77
+ const headersToDelete = new Set<number>()
78
+ for (const [headerId, header] of data.liveHeaders) {
79
+ if (header.height <= maxHeight) {
80
+ headersToDelete.add(headerId)
81
+ data.hashToHeaderId.delete(header.hash)
82
+ }
83
+ }
84
+ deletedCount = headersToDelete.size
85
+ for (const headerId of headersToDelete) {
86
+ data.liveHeaders.delete(headerId)
87
+ }
88
+
89
+ // Update tipHeaderId if necessary
90
+ if (data.liveHeaders.size > 0) {
91
+ const tip = Array.from(data.liveHeaders.values()).find(h => h.isActive && h.isChainTip)
92
+ data.tipHeaderId = tip ? tip.headerId : 0
93
+ } else {
94
+ data.tipHeaderId = 0
95
+ }
96
+
97
+ return deletedCount
98
+ }
99
+
100
+ override async findChainTipHeader(): Promise<LiveBlockHeader> {
101
+ const data = await this.getData()
102
+ const tip = Array.from(data.liveHeaders.values()).find(h => h.isActive && h.isChainTip)
103
+ if (!tip) throw new Error('Database contains no active chain tip header.')
104
+ return tip
105
+ }
106
+
107
+ override async findChainTipHeaderOrUndefined(): Promise<LiveBlockHeader | undefined> {
108
+ const data = await this.getData()
109
+ return Array.from(data.liveHeaders.values()).find(h => h.isActive && h.isChainTip)
110
+ }
111
+
112
+ override async findLiveHeaderForBlockHash(hash: string): Promise<LiveBlockHeader | null> {
113
+ const data = await this.getData()
114
+ const headerId = data.hashToHeaderId.get(hash)
115
+ return headerId ? data.liveHeaders.get(headerId) || null : null
116
+ }
117
+
118
+ override async findLiveHeaderForHeaderId(headerId: number): Promise<LiveBlockHeader> {
119
+ const data = await this.getData()
120
+ const header = data.liveHeaders.get(headerId)
121
+ if (!header) throw new Error(`HeaderId ${headerId} not found in live header database.`)
122
+ return header
123
+ }
124
+
125
+ override async findLiveHeaderForHeight(height: number): Promise<LiveBlockHeader | null> {
126
+ const data = await this.getData()
127
+ return Array.from(data.liveHeaders.values()).find(h => h.height === height && h.isActive) || null
128
+ }
129
+
130
+ override async findLiveHeaderForMerkleRoot(merkleRoot: string): Promise<LiveBlockHeader | null> {
131
+ const data = await this.getData()
132
+ return Array.from(data.liveHeaders.values()).find(h => h.merkleRoot === merkleRoot) || null
133
+ }
134
+
135
+ override async findLiveHeightRange(): Promise<HeightRange> {
136
+ const data = await this.getData()
137
+ const activeHeaders = Array.from(data.liveHeaders.values()).filter(h => h.isActive)
138
+ if (activeHeaders.length === 0) {
139
+ return HeightRange.empty
140
+ }
141
+ const minHeight = Math.min(...activeHeaders.map(h => h.height))
142
+ const maxHeight = Math.max(...activeHeaders.map(h => h.height))
143
+ return new HeightRange(minHeight, maxHeight)
144
+ }
145
+
146
+ override async findMaxHeaderId(): Promise<number> {
147
+ const data = await this.getData()
148
+ return data.maxHeaderId
149
+ }
150
+
151
+ override async liveHeadersForBulk(count: number): Promise<LiveBlockHeader[]> {
152
+ const data = await this.getData()
153
+ return Array.from(data.liveHeaders.values())
154
+ .filter(h => h.isActive)
155
+ .sort((a, b) => a.height - b.height)
156
+ .slice(0, count)
157
+ }
158
+
159
+ override async getLiveHeaders(range: HeightRange): Promise<LiveBlockHeader[]> {
160
+ if (range.isEmpty) return []
161
+ const data = await this.getData()
162
+ const headers = Array.from(data.liveHeaders.values())
163
+ .filter(h => h.isActive && h.height >= range.minHeight && h.height <= range.maxHeight)
164
+ .sort((a, b) => a.height - b.height)
165
+ return headers
166
+ }
167
+
168
+ override async insertHeader(header: BlockHeader): Promise<InsertHeaderResult> {
169
+ const data = await this.getData()
170
+
171
+ const r: InsertHeaderResult = {
172
+ added: false,
173
+ dupe: false,
174
+ noPrev: false,
175
+ badPrev: false,
176
+ noActiveAncestor: false,
177
+ isActiveTip: false,
178
+ reorgDepth: 0,
179
+ priorTip: undefined,
180
+ noTip: false,
181
+ deactivatedHeaders: []
182
+ }
183
+
184
+ // Check for duplicate
185
+ if (data.hashToHeaderId.has(header.hash)) {
186
+ r.dupe = true
187
+ return r
188
+ }
189
+
190
+ // Find previous header
191
+ let oneBack = Array.from(data.liveHeaders.values()).find(h => h.hash === header.previousHash)
192
+
193
+ if (!oneBack) {
194
+ // Check if this is first live header
195
+ const count = data.liveHeaders.size
196
+ if (count === 0) {
197
+ // If this is the first live header, the last bulk header (if there is one) is the previous header.
198
+ const lbf = await this.bulkManager.getLastFile()
199
+ if (!lbf) throw new WERR_INVALID_OPERATION('bulk headers must exist before first live header can be added')
200
+ if (header.previousHash === lbf.lastHash && header.height === lbf.firstHeight + lbf.count) {
201
+ // Valid first live header. Add it.
202
+ const chainWork = addWork(lbf.lastChainWork, convertBitsToWork(header.bits))
203
+ r.isActiveTip = true
204
+ const newHeader = {
205
+ ...header,
206
+ headerId: ++data.maxHeaderId,
207
+ previousHeaderId: null,
208
+ chainWork,
209
+ isChainTip: r.isActiveTip,
210
+ isActive: r.isActiveTip
211
+ }
212
+ data.liveHeaders.set(newHeader.headerId, newHeader)
213
+ data.hashToHeaderId.set(header.hash, newHeader.headerId)
214
+ data.tipHeaderId = newHeader.headerId
215
+ r.added = true
216
+ return r
217
+ }
218
+ }
219
+ // Failure without a oneBack
220
+ // First live header that does not follow last bulk header or
221
+ // Not the first live header and live headers doesn't include a previousHash header.
222
+ r.noPrev = true
223
+ return r
224
+ }
225
+
226
+ // This header's previousHash matches an existing live header's hash, if height isn't +1, reject it.
227
+ if (oneBack.height + 1 !== header.height) {
228
+ r.badPrev = true
229
+ return r
230
+ }
231
+
232
+ r.priorTip =
233
+ oneBack.isActive && oneBack.isChainTip
234
+ ? oneBack
235
+ : Array.from(data.liveHeaders.values()).find(h => h.isActive && h.isChainTip)
236
+
237
+ if (!r.priorTip) {
238
+ // No active chain tip found. This is a logic error in state of live headers.
239
+ r.noTip = true
240
+ return r
241
+ }
242
+
243
+ // We have an acceptable new live header...and live headers has an active chain tip.
244
+
245
+ const chainWork = addWork(oneBack.chainWork, convertBitsToWork(header.bits))
246
+
247
+ r.isActiveTip = isMoreWork(chainWork, r.priorTip.chainWork)
248
+
249
+ const newHeader = {
250
+ ...header,
251
+ headerId: ++data.maxHeaderId,
252
+ previousHeaderId: oneBack.headerId,
253
+ chainWork,
254
+ isChainTip: r.isActiveTip,
255
+ isActive: r.isActiveTip
256
+ }
257
+
258
+ if (r.isActiveTip) {
259
+ let activeAncestor = oneBack
260
+ while (!activeAncestor.isActive) {
261
+ const previousHeader = data.liveHeaders.get(activeAncestor.previousHeaderId!)
262
+ if (!previousHeader) {
263
+ r.noActiveAncestor = true
264
+ return r
265
+ }
266
+ activeAncestor = previousHeader
267
+ }
268
+
269
+ if (!(oneBack.isActive && oneBack.isChainTip)) {
270
+ r.reorgDepth = Math.min(r.priorTip.height, header.height) - activeAncestor.height
271
+ }
272
+
273
+ if (activeAncestor.headerId !== oneBack.headerId) {
274
+ let headerToDeactivate = Array.from(data.liveHeaders.values()).find(h => h.isChainTip && h.isActive)
275
+ while (headerToDeactivate && headerToDeactivate.headerId !== activeAncestor.headerId) {
276
+ r.deactivatedHeaders.push(headerToDeactivate)
277
+ data.liveHeaders.set(headerToDeactivate.headerId, { ...headerToDeactivate, isActive: false })
278
+ headerToDeactivate = data.liveHeaders.get(headerToDeactivate.previousHeaderId!)
279
+ }
280
+
281
+ let headerToActivate = oneBack
282
+ while (headerToActivate.headerId !== activeAncestor.headerId) {
283
+ data.liveHeaders.set(headerToActivate.headerId, { ...headerToActivate, isActive: true })
284
+ headerToActivate = data.liveHeaders.get(headerToActivate.previousHeaderId!)!
285
+ }
286
+ }
287
+ }
288
+
289
+ if (oneBack.isChainTip) {
290
+ data.liveHeaders.set(oneBack.headerId, { ...oneBack, isChainTip: false })
291
+ }
292
+
293
+ data.liveHeaders.set(newHeader.headerId, newHeader)
294
+ data.hashToHeaderId.set(newHeader.hash, newHeader.headerId)
295
+ r.added = true
296
+
297
+ if (r.added && r.isActiveTip) {
298
+ data.tipHeaderId = newHeader.headerId
299
+ this.pruneLiveBlockHeaders(newHeader.height)
300
+ }
301
+
302
+ return r
303
+ }
304
+ }
@@ -0,0 +1,102 @@
1
+ import 'fake-indexeddb/auto'
2
+ import { ChaintracksFs } from '../../util/ChaintracksFs'
3
+ import { Chain } from '../../../../../sdk'
4
+ import { ChaintracksStorageKnex } from '../ChaintracksStorageKnex'
5
+ import { deserializeBaseBlockHeader, genesisHeader } from '../../util/blockHeaderUtilities'
6
+ import { ChaintracksStorageIdb, ChaintracksStorageIdbOptions } from '../ChaintracksStorageIdb'
7
+ import { ChaintracksStorageBase } from '../ChaintracksStorageBase'
8
+ import { LiveBlockHeader } from '../../Api/BlockHeaderApi'
9
+
10
+ describe('ChaintracksStorageIdb tests', () => {
11
+ jest.setTimeout(99999999)
12
+
13
+ test('0', async () => {
14
+ const options: ChaintracksStorageIdbOptions = ChaintracksStorageBase.createStorageBaseOptions('main')
15
+ const storage = new ChaintracksStorageIdb(options)
16
+ const r = await storage.migrateLatest()
17
+ const db = storage.db!
18
+ expect(db).toBeTruthy()
19
+
20
+ const tip = await storage.findChainTipHeaderOrUndefined()
21
+ expect(tip).toBeUndefined()
22
+
23
+ const ranges = await storage.getAvailableHeightRanges()
24
+
25
+ const lh: LiveBlockHeader = {
26
+ headerId: 0,
27
+ chainWork: '00'.repeat(32),
28
+ isChainTip: false,
29
+ isActive: true,
30
+ previousHeaderId: null,
31
+ height: ranges.bulk.maxHeight + 1,
32
+ hash: '1111',
33
+ version: 0,
34
+ previousHash: '01'.repeat(32),
35
+ merkleRoot: '11'.repeat(32),
36
+ time: 0,
37
+ bits: 0,
38
+ nonce: 0
39
+ }
40
+ await storage.insertLiveHeader(lh)
41
+ lh.previousHeaderId = lh.headerId
42
+ lh.hash = '2222'
43
+ lh.merkleRoot = '22'.repeat(32)
44
+ lh.height++
45
+ await storage.insertLiveHeader(lh)
46
+ lh.previousHeaderId = lh.headerId
47
+ lh.hash = '3333'
48
+ lh.merkleRoot = '33'.repeat(32)
49
+ lh.height++
50
+ await storage.insertLiveHeader(lh)
51
+ lh.previousHeaderId = lh.headerId
52
+ lh.hash = '4444'
53
+ lh.height++
54
+ await storage.insertLiveHeader(lh)
55
+ lh.previousHeaderId = lh.headerId
56
+ lh.hash = '5555'
57
+ lh.height++
58
+ lh.isChainTip = true
59
+ await storage.insertLiveHeader(lh)
60
+
61
+ const h1 = await storage.findLiveHeaderForBlockHash('1111')
62
+ expect(h1!.headerId).toBe(1)
63
+
64
+ const h2 = await storage.findLiveHeaderForMerkleRoot('22'.repeat(32))
65
+ expect(h2!.headerId).toBe(2)
66
+
67
+ const h3 = await storage.findLiveHeaderForHeaderId(3)
68
+ expect(h3!.headerId).toBe(3)
69
+
70
+ const h4 = await storage.findLiveHeaderForHeight(4 + ranges.bulk.maxHeight)
71
+ expect(h4!.headerId).toBe(4)
72
+
73
+ const h5 = await storage.findChainTipHeader()
74
+ expect(h5.headerId).toBe(5)
75
+
76
+ const range = await storage.findLiveHeightRange()
77
+ expect(range).toEqual({ minHeight: 1 + ranges.bulk.maxHeight, maxHeight: 5 + ranges.bulk.maxHeight })
78
+
79
+ const maxId = await storage.findMaxHeaderId()
80
+ expect(maxId).toBe(5)
81
+
82
+ const hfbs = await storage.liveHeadersForBulk(3)
83
+ expect(hfbs.length).toBe(3)
84
+
85
+ const lhs = await storage.getHeaders(0, 10)
86
+ expect(lhs.length).toBe(10)
87
+
88
+ const lhs2 = await storage.getHeaders(0 + ranges.bulk.maxHeight + 1, 10)
89
+ expect(lhs2.length).toBe(5)
90
+
91
+ const lhs3 = await storage.getHeaders(0 + ranges.bulk.maxHeight - 2, 10)
92
+ expect(lhs3.length).toBe(8)
93
+
94
+ const data = await storage.getHeadersUint8Array(0, 10)
95
+ expect(data.length).toBe(10 * 80)
96
+
97
+ const deleteCount = await storage.deleteOlderLiveBlockHeaders(3 + ranges.bulk.maxHeight)
98
+ expect(deleteCount).toBe(3)
99
+
100
+ await storage.deleteLiveBlockHeaders()
101
+ })
102
+ })
@@ -0,0 +1,45 @@
1
+ import { Knex, knex as makeKnex } from 'knex'
2
+ import { ChaintracksFs } from '../../util/ChaintracksFs'
3
+ import { Chain } from '../../../../../sdk'
4
+ import { ChaintracksStorageKnex } from '../ChaintracksStorageKnex'
5
+ import { deserializeBaseBlockHeader, genesisHeader } from '../../util/blockHeaderUtilities'
6
+
7
+ describe('ChaintracksStorageKnex tests', () => {
8
+ jest.setTimeout(99999999)
9
+
10
+ test('0', async () => {
11
+ const chain: Chain = 'main'
12
+ const fs = ChaintracksFs
13
+ const rootFolder = './src/services/chaintracker/chaintracks/__tests/data'
14
+ const localSqlite: Knex.Config = {
15
+ client: 'sqlite3',
16
+ connection: { filename: fs.pathJoin(rootFolder, `${chain}Net_chaintracks.sqlite`) },
17
+ useNullAsDefault: true
18
+ }
19
+
20
+ const knexInstance = makeKnex(localSqlite)
21
+
22
+ const knexOptions = ChaintracksStorageKnex.createStorageKnexOptions(chain)
23
+ knexOptions.knex = knexInstance
24
+ const storage = new ChaintracksStorageKnex(knexOptions)
25
+ await storage.makeAvailable()
26
+
27
+ const bfs = await storage.bulkManager.getBulkFiles()
28
+ // Test assumes synchronization has occurred and bulk files are available.
29
+ if (bfs?.length === 0) return
30
+
31
+ expect(bfs.length).toBeGreaterThan(7)
32
+
33
+ const gh = await storage.getBulkFileData(bfs[0].fileId!, 0, 80)
34
+ const dgh = deserializeBaseBlockHeader(gh!)
35
+ const rgh = genesisHeader(chain)
36
+ expect(dgh.merkleRoot).toEqual(rgh.merkleRoot)
37
+ expect(dgh.bits).toEqual(rgh.bits)
38
+ expect(dgh.nonce).toEqual(rgh.nonce)
39
+
40
+ const header = await storage.findHeaderForHeight(101010)
41
+ expect(header.hash).toEqual('000000000001af33247fff33aae7c31baee4148d5a189e7353bf13bcee618202')
42
+
43
+ await storage.shutdown()
44
+ })
45
+ })
@@ -0,0 +1,77 @@
1
+ import { createDefaultKnexChaintracksOptions } from '../createDefaultKnexChaintracksOptions'
2
+ import { Chaintracks } from '../Chaintracks'
3
+ import { wait } from '../../../../utility/utilityHelpers'
4
+ import { Chain } from '../../../../sdk'
5
+ import { createDefaultNoDbChaintracksOptions } from '../createDefaultNoDbChaintracksOptions'
6
+ import { ChaintracksFs } from '../util/ChaintracksFs'
7
+ import { LocalCdnServer } from './LocalCdnServer'
8
+ import { _tu } from '../../../../../test/utils/TestUtilsWalletStorage'
9
+
10
+ const rootFolder = './src/services/chaintracker/chaintracks/__tests/data'
11
+
12
+ describe('Chaintracks tests', () => {
13
+ jest.setTimeout(99999999)
14
+
15
+ test.skip('0 basic operation mainnet', async () => {
16
+ const o = createDefaultKnexChaintracksOptions('main', rootFolder)
17
+ const c = new Chaintracks(o)
18
+ await c.makeAvailable()
19
+
20
+ let done = false
21
+ for (; !done; ) {
22
+ await wait(10000)
23
+ }
24
+
25
+ await c.destroy()
26
+ })
27
+
28
+ test('1 NoDb mainnet', async () => {
29
+ if (_tu.noEnv('main')) return
30
+ await NoDbBody('main')
31
+ })
32
+
33
+ test('2 NoDb testnet', async () => {
34
+ if (_tu.noEnv('main')) return
35
+ await NoDbBody('test')
36
+ })
37
+
38
+ test.skip('3 NoDb export mainnet', async () => {
39
+ await NoDbBody('main', true)
40
+ })
41
+
42
+ test.skip('4 NoDb export testnet', async () => {
43
+ await NoDbBody('test', true)
44
+ })
45
+
46
+ test.skip('5 run local CDN on port 8300', async () => {
47
+ const fs = ChaintracksFs
48
+ const server = new LocalCdnServer(8300, fs.pathJoin(rootFolder, 'export'))
49
+ await server.start()
50
+ let done = false
51
+ for (; !done; ) {
52
+ await wait(10000)
53
+ }
54
+ await server.stop()
55
+ })
56
+
57
+ async function NoDbBody(chain: Chain, exportHeaders?: boolean) {
58
+ const o = createDefaultNoDbChaintracksOptions(chain)
59
+ const c = new Chaintracks(o)
60
+ await c.makeAvailable()
61
+
62
+ c.subscribeHeaders(header => {
63
+ console.log(`Header received: ${header.height} ${header.hash}`)
64
+ })
65
+
66
+ if (exportHeaders) {
67
+ const rootFolder = './src/services/chaintracker/chaintracks/__tests/data/export'
68
+ await c.exportBulkHeaders(rootFolder, ChaintracksFs, `https://cdn.projectbabbage.com/blockheaders`, 100000)
69
+ }
70
+ //let done = false
71
+ //for (; !done; ) {
72
+ await wait(1000)
73
+ //}
74
+
75
+ await c.destroy()
76
+ }
77
+ })