@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,212 @@
1
+ import { BlockHeadersService, Utils } from '@bsv/sdk'
2
+ import { ChaintracksServiceClient, ChaintracksServiceClientOptions } from './chaintracks/ChaintracksServiceClient'
3
+ import { serializeBaseBlockHeader } from './chaintracks/util/blockHeaderUtilities'
4
+ import { HeaderListener, ReorgListener, ChaintracksInfoApi } from './chaintracks/Api/ChaintracksClientApi'
5
+ import { Chain } from '../../sdk/types'
6
+ import { BaseBlockHeader, BlockHeader } from '../../sdk/WalletServices.interfaces'
7
+
8
+ interface BHSHeader {
9
+ hash: string
10
+ version: number
11
+ prevBlockHash: string
12
+ merkleRoot: string
13
+ creationTimestamp: number
14
+ difficultyTarget: number
15
+ nonce: number
16
+ work: string
17
+ }
18
+
19
+ interface BHSHeaderState {
20
+ header: BHSHeader
21
+ state: string
22
+ chainWork: string
23
+ height: number
24
+ }
25
+
26
+ export class BHServiceClient implements ChaintracksServiceClient {
27
+ bhs: BlockHeadersService
28
+ cache: Record<number, string>
29
+ chain: Chain
30
+ serviceUrl: string
31
+ options: ChaintracksServiceClientOptions
32
+ apiKey: string
33
+
34
+ constructor(chain: Chain, url: string, apiKey: string) {
35
+ this.bhs = new BlockHeadersService(url, { apiKey })
36
+ this.cache = {}
37
+ this.chain = chain
38
+ this.serviceUrl = url
39
+ this.options = ChaintracksServiceClient.createChaintracksServiceClientOptions()
40
+ this.apiKey = apiKey
41
+ }
42
+
43
+ async currentHeight(): Promise<number> {
44
+ return await this.bhs.currentHeight()
45
+ }
46
+
47
+ async isValidRootForHeight(root: string, height: number): Promise<boolean> {
48
+ const cachedRoot = this.cache[height]
49
+ if (cachedRoot) {
50
+ return cachedRoot === root
51
+ }
52
+ const isValid = await this.bhs.isValidRootForHeight(root, height)
53
+ this.cache[height] = root
54
+ return isValid
55
+ }
56
+
57
+ async getPresentHeight(): Promise<number> {
58
+ return await this.bhs.currentHeight()
59
+ }
60
+
61
+ async findHeaderForHeight(height: number): Promise<BlockHeader | undefined> {
62
+ const response = await this.getJsonOrUndefined<BHSHeader[]>(`/api/v1/chain/header/byHeight?height=${height}`)
63
+ const header = response?.[0]
64
+ if (!header) return undefined
65
+ const formatted: BlockHeader = {
66
+ version: header.version,
67
+ previousHash: header.prevBlockHash,
68
+ merkleRoot: header.merkleRoot,
69
+ time: header.creationTimestamp,
70
+ bits: header.difficultyTarget,
71
+ nonce: header.nonce,
72
+ height,
73
+ hash: header.hash
74
+ }
75
+ return formatted
76
+ }
77
+
78
+ async findHeaderForBlockHash(hash: string): Promise<BlockHeader | undefined> {
79
+ const response = await this.getJsonOrUndefined<BHSHeaderState>(`/api/v1/chain/header/state/${hash}`)
80
+ if (!response?.header) return undefined
81
+ const formatted: BlockHeader = {
82
+ version: response.header.version,
83
+ previousHash: response.header.prevBlockHash,
84
+ merkleRoot: response.header.merkleRoot,
85
+ time: response.header.creationTimestamp,
86
+ bits: response.header.difficultyTarget,
87
+ nonce: response.header.nonce,
88
+ height: response.height,
89
+ hash: response.header.hash
90
+ }
91
+ return formatted
92
+ }
93
+
94
+ async getHeaders(height: number, count: number): Promise<string> {
95
+ const response = await this.getJsonOrUndefined<BHSHeader[]>(
96
+ `/api/v1/chain/header/byHeight?height=${height}&count=${count}`
97
+ )
98
+ if (!response) return ''
99
+ if (response.length < count) throw new Error('Cannot retrieve enough headers')
100
+ const headers = response.map(response => {
101
+ const header: BaseBlockHeader = {
102
+ version: response.version,
103
+ previousHash: response.prevBlockHash,
104
+ merkleRoot: response.merkleRoot,
105
+ time: response.creationTimestamp,
106
+ bits: response.difficultyTarget,
107
+ nonce: response.nonce
108
+ }
109
+ return serializeBaseBlockHeader(header)
110
+ })
111
+ return headers.reduce((str: string, arr: number[]) => str + Utils.toHex(arr), '')
112
+ }
113
+
114
+ async findChainWorkForBlockHash(hash: string): Promise<string | undefined> {
115
+ throw new Error('Not implemented')
116
+ }
117
+
118
+ async findChainTipHeader(): Promise<BlockHeader> {
119
+ const response = await this.getJson<BHSHeaderState>('/api/v1/chain/tip/longest')
120
+ const formatted: BlockHeader = {
121
+ version: response.header.version,
122
+ previousHash: response.header.prevBlockHash,
123
+ merkleRoot: response.header.merkleRoot,
124
+ time: response.header.creationTimestamp,
125
+ bits: response.header.difficultyTarget,
126
+ nonce: response.header.nonce,
127
+ height: response.height,
128
+ hash: response.header.hash
129
+ }
130
+ return formatted
131
+ }
132
+
133
+ async getJsonOrUndefined<T>(path: string): Promise<T | undefined> {
134
+ let e: Error | undefined = undefined
135
+ for (let retry = 0; retry < 3; retry++) {
136
+ try {
137
+ const r = await fetch(`${this.serviceUrl}${path}`, { headers: { Authorization: `Bearer ${this.apiKey}` } })
138
+ if (r.status !== 200) throw new Error(JSON.stringify(r))
139
+ const v = <T>await r.json()
140
+ if (!v) return undefined
141
+ return v
142
+ } catch (eu: unknown) {
143
+ e = eu as Error
144
+ }
145
+ if (e && e.name !== 'ECONNRESET') break
146
+ }
147
+ if (e) throw e
148
+ }
149
+
150
+ async getJson<T>(path: string): Promise<T> {
151
+ const r = await this.getJsonOrUndefined<T>(path)
152
+ if (r === undefined) throw new Error('Value was undefined. Requested object may not exist.')
153
+ return r
154
+ }
155
+
156
+ /*
157
+ Please note that all methods hereafter are included only to match the interface of ChaintracksServiceClient.
158
+ */
159
+
160
+ async postJsonVoid<T>(path: string, params: T): Promise<void> {
161
+ throw new Error('Not implemented')
162
+ }
163
+
164
+ async addHeader(header: any): Promise<void> {
165
+ throw new Error('Not implemented')
166
+ }
167
+
168
+ async findHeaderForMerkleRoot(merkleRoot: string, height?: number): Promise<undefined> {
169
+ throw new Error('Not implemented')
170
+ }
171
+
172
+ async startListening(): Promise<void> {
173
+ throw new Error('Not implemented')
174
+ }
175
+
176
+ async listening(): Promise<void> {
177
+ throw new Error('Not implemented')
178
+ }
179
+
180
+ async isSynchronized(): Promise<boolean> {
181
+ throw new Error('Not implemented')
182
+ }
183
+
184
+ async getChain(): Promise<Chain> {
185
+ return this.chain
186
+ }
187
+
188
+ async isListening(): Promise<boolean> {
189
+ throw new Error('Not implemented')
190
+ }
191
+
192
+ async getChainTipHeader(): Promise<BlockHeader> {
193
+ throw new Error('Not implemented')
194
+ }
195
+
196
+ async findChainTipHash(): Promise<string> {
197
+ throw new Error('Not implemented')
198
+ }
199
+
200
+ async subscribeHeaders(listener: HeaderListener): Promise<string> {
201
+ throw new Error('Method not implemented.')
202
+ }
203
+ async subscribeReorgs(listener: ReorgListener): Promise<string> {
204
+ throw new Error('Method not implemented.')
205
+ }
206
+ async unsubscribe(subscriptionId: string): Promise<boolean> {
207
+ throw new Error('Method not implemented.')
208
+ }
209
+ async getInfo(): Promise<ChaintracksInfoApi> {
210
+ throw new Error('Method not implemented.')
211
+ }
212
+ }
@@ -0,0 +1,71 @@
1
+ import { ChainTracker } from '@bsv/sdk'
2
+ import { ChaintracksServiceClient } from './chaintracks/ChaintracksServiceClient'
3
+ import { Chain } from '../../sdk/types'
4
+ import { WalletError } from '../../sdk/WalletError'
5
+ import { wait } from '../../utility/utilityHelpers'
6
+ import { WERR_INTERNAL } from '../../sdk/WERR_errors'
7
+ import { BlockHeader } from '../../sdk/WalletServices.interfaces'
8
+ import { ChaintracksClientApi } from './chaintracks/Api/ChaintracksClientApi'
9
+
10
+ export interface ChaintracksChainTrackerOptions {
11
+ maxRetries?: number
12
+ }
13
+
14
+ export class ChaintracksChainTracker implements ChainTracker {
15
+ chaintracks: ChaintracksClientApi
16
+ cache: Record<number, string>
17
+ options: ChaintracksChainTrackerOptions
18
+
19
+ constructor(chain?: Chain, chaintracks?: ChaintracksClientApi, options?: ChaintracksChainTrackerOptions) {
20
+ chain ||= 'main'
21
+ this.chaintracks =
22
+ chaintracks ?? new ChaintracksServiceClient(chain, `https://${chain}net-chaintracks.babbage.systems`)
23
+ this.cache = {}
24
+ this.options = options || {}
25
+ }
26
+
27
+ async currentHeight(): Promise<number> {
28
+ return await this.chaintracks.getPresentHeight()
29
+ }
30
+
31
+ async isValidRootForHeight(root: string, height: number): Promise<boolean> {
32
+ const cachedRoot = this.cache[height]
33
+ if (cachedRoot) {
34
+ return cachedRoot === root
35
+ }
36
+
37
+ let header: BlockHeader | undefined
38
+
39
+ const retries = this.options.maxRetries || 3
40
+
41
+ let error: WalletError | undefined = undefined
42
+
43
+ for (let tryCount = 1; tryCount <= retries; tryCount++) {
44
+ try {
45
+ header = await this.chaintracks.findHeaderForHeight(height)
46
+
47
+ if (!header) {
48
+ return false
49
+ }
50
+
51
+ break
52
+ } catch (eu: unknown) {
53
+ error = WalletError.fromUnknown(eu)
54
+ if (tryCount > retries) {
55
+ throw error
56
+ }
57
+ await wait(1000)
58
+ }
59
+ }
60
+
61
+ if (!header) throw new WERR_INTERNAL('no header should have returned false or thrown an error.')
62
+
63
+ this.cache[height] = header.merkleRoot
64
+
65
+ if (header.merkleRoot !== root) {
66
+ return false
67
+ }
68
+
69
+ return true
70
+ }
71
+ }
@@ -0,0 +1,33 @@
1
+ import { ChaintracksChainTracker } from '../index.all'
2
+ import { sdk } from '../../../index.client'
3
+
4
+ const includeTestChaintracks = false
5
+
6
+ describe('ChaintracksChaintracker tests', () => {
7
+ jest.setTimeout(99999999)
8
+
9
+ test(`0 test`, async () => {
10
+ if (!includeTestChaintracks) return
11
+ await testChaintracksChaintracker('test')
12
+ })
13
+
14
+ test(`1 main`, async () => {
15
+ await testChaintracksChaintracker('main')
16
+ })
17
+ })
18
+
19
+ async function testChaintracksChaintracker(chain: sdk.Chain) {
20
+ const tracker = new ChaintracksChainTracker(chain)
21
+ const height = await tracker.currentHeight()
22
+ expect(height).toBeGreaterThan(877598)
23
+ const okMain = await tracker.isValidRootForHeight(
24
+ '2bf2edb5fa42aa773c6c13bc90e097b4e7de7ca1df2227f433be75ceace339e9',
25
+ 877599
26
+ )
27
+ expect(okMain).toBe(chain === 'main')
28
+ const okTest = await tracker.isValidRootForHeight(
29
+ '5513f13554442588dd9acf395072bf1d2e7d5d360fbc42d3ab1fa2026b17c200',
30
+ 1654265
31
+ )
32
+ expect(okTest).toBe(chain === 'test')
33
+ }
@@ -0,0 +1,29 @@
1
+ import { sdk } from '../../../index.client'
2
+ import { ChaintracksServiceClient } from '../chaintracks/index.client'
3
+
4
+ const includeTestChaintracks = false
5
+
6
+ describe('ChaintracksServiceClient tests', () => {
7
+ jest.setTimeout(99999999)
8
+
9
+ test('0 mainNet findHeaderForHeight', async () => {
10
+ const client = makeClient('main')
11
+ const r = await client.findHeaderForHeight(877595)
12
+ expect(r?.hash).toBe('00000000000000000b010edee7422c59ec9131742e35f3e0d5837d710b961406')
13
+ expect(await client.findHeaderForHeight(999999999)).toBe(undefined)
14
+ })
15
+
16
+ test('1 testNet findHeaderForHeight', async () => {
17
+ if (!includeTestChaintracks) return
18
+ const client = makeClient('test')
19
+ const r = await client.findHeaderForHeight(1651723)
20
+ expect(r?.hash).toBe('0000000049686fe721f70614c89df146e410240f838b8f3ef8e6471c6dfdd153')
21
+ expect(await client.findHeaderForHeight(999999999)).toBe(undefined)
22
+ })
23
+ })
24
+
25
+ function makeClient(chain: sdk.Chain) {
26
+ //const chaintracksUrl = `https://npm-registry.babbage.systems:${chain === 'main' ? 8084 : 8083}`
27
+ const chaintracksUrl = `https://${chain}net-chaintracks.babbage.systems`
28
+ return new ChaintracksServiceClient(chain, chaintracksUrl)
29
+ }
@@ -0,0 +1,72 @@
1
+ import { BaseBlockHeader, BlockHeader } from '../../../../sdk/WalletServices.interfaces'
2
+
3
+ export { BaseBlockHeader, BlockHeader } from '../../../../sdk/WalletServices.interfaces'
4
+
5
+ /**
6
+ * The "live" portion of the block chain is recent history that can conceivably be subject to reorganizations.
7
+ * The additional fields support tracking orphan blocks, chain forks, and chain reorgs.
8
+ */
9
+ export interface LiveBlockHeader extends BlockHeader {
10
+ /**
11
+ * The cummulative chainwork achieved by the addition of this block to the chain.
12
+ * Chainwork only matters in selecting the active chain.
13
+ */
14
+ chainWork: string
15
+ /**
16
+ * True only if this header is currently a chain tip. e.g. There is no header that follows it by previousHash or previousHeaderId.
17
+ */
18
+ isChainTip: boolean
19
+ /**
20
+ * True only if this header is currently on the active chain.
21
+ */
22
+ isActive: boolean
23
+ /**
24
+ * As there may be more than one header with identical height values due to orphan tracking,
25
+ * headers are assigned a unique headerId while part of the "live" portion of the block chain.
26
+ */
27
+ headerId: number
28
+ /**
29
+ * Every header in the "live" portion of the block chain is linked to an ancestor header through
30
+ * both its previousHash and previousHeaderId properties.
31
+ *
32
+ * Due to forks, there may be multiple headers with identical `previousHash` and `previousHeaderId` values.
33
+ * Of these, only one (the header on the active chain) will have `isActive` === true.
34
+ */
35
+ previousHeaderId: number | null
36
+ }
37
+
38
+ //
39
+ // TYPE GUARDS
40
+ //
41
+
42
+ /**
43
+ * Type guard function.
44
+ * @publicbody
45
+ */
46
+ export function isLive(header: BlockHeader | LiveBlockHeader): header is LiveBlockHeader {
47
+ return (header as LiveBlockHeader).headerId !== undefined
48
+ }
49
+
50
+ /**
51
+ * Type guard function.
52
+ * @publicbody
53
+ */
54
+ export function isBaseBlockHeader(header: BaseBlockHeader | BlockHeader | LiveBlockHeader): header is BaseBlockHeader {
55
+ return typeof header.previousHash === 'string'
56
+ }
57
+
58
+ /**
59
+ * Type guard function.
60
+ * @publicbody
61
+ */
62
+ export function isBlockHeader(header: BaseBlockHeader | BlockHeader | LiveBlockHeader): header is LiveBlockHeader {
63
+ return 'height' in header && typeof header.previousHash === 'string'
64
+ }
65
+
66
+ /**
67
+ * Type guard function.
68
+ * @publicbody
69
+ */
70
+ export function isLiveBlockHeader(header: BaseBlockHeader | BlockHeader | LiveBlockHeader): header is LiveBlockHeader {
71
+ return 'chainwork' in header && typeof header.previousHash === 'string'
72
+ }
@@ -0,0 +1,83 @@
1
+ import { Chain } from '../../../../sdk/types'
2
+ import { HeightRange, HeightRanges } from '../util/HeightRange'
3
+ import { BlockHeader } from './BlockHeaderApi'
4
+ import { ChaintracksStorageApi } from './ChaintracksStorageApi'
5
+
6
+ export interface BulkIngestorBaseOptions {
7
+ /**
8
+ * The target chain: "main" or "test"
9
+ */
10
+ chain: Chain
11
+
12
+ /**
13
+ * Required.
14
+ *
15
+ * The name of the JSON resource to request from CDN which describes currently
16
+ * available bulk block header resources.
17
+ */
18
+ jsonResource: string | undefined
19
+ }
20
+
21
+ export interface BulkIngestorApi {
22
+ /**
23
+ * Close and release all resources.
24
+ */
25
+ shutdown(): Promise<void>
26
+
27
+ /**
28
+ * If the bulk ingestor is capable, return the approximate
29
+ * present height of the actual chain being tracked.
30
+ * Otherwise, return undefined.
31
+ *
32
+ * May not assume that setStorage has been called.
33
+ */
34
+ getPresentHeight(): Promise<number | undefined>
35
+
36
+ /**
37
+ * A BulkIngestor fetches and updates storage with bulk headers in bulkRange.
38
+ *
39
+ * If it can, it must also fetch live headers in fetch range that are not in bulkRange and return them as an array.
40
+ *
41
+ * The storage methods `insertBulkFile`, `updateBulkFile`, and `addBulkHeaders` should be used to add bulk headers to storage.
42
+ *
43
+ * @param before bulk and live range of headers before ingesting any new headers.
44
+ * @param fetchRange range of headers still needed, includes both missing bulk and live headers.
45
+ * @param bulkRange range of bulk headers still needed
46
+ * @param priorLiveHeaders any headers accumulated by prior bulk ingestor(s) that are too recent for bulk storage.
47
+ * @returns new live headers: headers in fetchRange but not in bulkRange
48
+ */
49
+ fetchHeaders(
50
+ before: HeightRanges,
51
+ fetchRange: HeightRange,
52
+ bulkRange: HeightRange,
53
+ priorLiveHeaders: BlockHeader[]
54
+ ): Promise<BlockHeader[]>
55
+
56
+ /**
57
+ * A BulkIngestor has two potential goals:
58
+ * 1. To source missing bulk headers and include them in bulk storage.
59
+ * 2. To source missing live headers to be forwarded to live storage.
60
+ *
61
+ * @param presentHeight current height of the active chain tip, may lag the true value.
62
+ * @param before current bulk and live storage height ranges, either may be empty.
63
+ * @param priorLiveHeaders any headers accumulated by prior bulk ingestor(s) that are too recent for bulk storage.
64
+ * @returns updated priorLiveHeaders including any accumulated by this ingestor
65
+ */
66
+ synchronize(presentHeight: number, before: HeightRanges, priorLiveHeaders: BlockHeader[]): Promise<BulkSyncResult>
67
+
68
+ /**
69
+ * Called before first Synchronize with reference to storage.
70
+ * Components requiring asynchronous setup can override base class implementation.
71
+ * @param storage
72
+ */
73
+ setStorage(storage: ChaintracksStorageApi, log: (...args: any[]) => void): Promise<void>
74
+
75
+ storage(): ChaintracksStorageApi
76
+ }
77
+
78
+ export interface BulkSyncResult {
79
+ liveHeaders: BlockHeader[]
80
+ liveRange: HeightRange
81
+ done: boolean
82
+ log: string
83
+ }
@@ -0,0 +1,92 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2
+ import { Chain } from '../../../../sdk/types'
3
+ import { BlockHeader, LiveBlockHeader } from './BlockHeaderApi'
4
+ import { HeightRange } from '../util/HeightRange'
5
+ import { ChaintracksStorageApi } from './ChaintracksStorageApi'
6
+ import { ChaintracksFsApi } from './ChaintracksFsApi'
7
+
8
+ // eslint-disable-next-line @typescript-eslint/no-empty-interface
9
+ export interface BulkStorageBaseOptions {
10
+ /**
11
+ * The target chain: "main" or "test"
12
+ */
13
+ chain: Chain
14
+ fs: ChaintracksFsApi
15
+ }
16
+
17
+ /**
18
+ * Handles block header storage and retrieval older than the "live" portion of the chain.
19
+ * Height is the primary and only indexing field required.
20
+ * Only stores headers on the active chain; no orphans, no forks, no reorgs.
21
+ */
22
+ export interface BulkStorageApi {
23
+ /**
24
+ * Close and release all resources.
25
+ */
26
+ shutdown(): Promise<void>
27
+
28
+ /**
29
+ * @returns the height of the most recent header in bulk storage or -1 if empty.
30
+ */
31
+ getMaxHeight(): Promise<number>
32
+
33
+ /**
34
+ * @returns available bulk block header height range: `(0, getMaxHeight())`
35
+ */
36
+ getHeightRange(): Promise<HeightRange>
37
+
38
+ /**
39
+ * Append new Block Headers to BulkStorage.
40
+ * Requires that these headers directly extend existing headers.
41
+ * maxHeight of existing plus one equals minHeight of `headers`.
42
+ * hash of last existing equals previousHash of first in `headers`.
43
+ * Checks that all `headers` are valid (hash, previousHash)
44
+ *
45
+ * Duplicate headers must be ignored.
46
+ *
47
+ * @param minHeight must match height of first header in buffer
48
+ * @param count times 80 must equal headers.length
49
+ * @param headers encoded as packed array of 80 byte serialized block headers
50
+ */
51
+ appendHeaders(minHeight: number, count: number, headers: Uint8Array): Promise<void>
52
+
53
+ /**
54
+ * Returns block header for a given block height on active chain.
55
+ * @param hash block hash
56
+ */
57
+ findHeaderForHeightOrUndefined(height: number): Promise<BlockHeader | undefined>
58
+
59
+ /**
60
+ * Returns block header for a given block height on active chain.
61
+ * Throws if not found.
62
+ * @param hash block hash
63
+ */
64
+ findHeaderForHeight(height: number): Promise<BlockHeader>
65
+
66
+ /**
67
+ * Adds headers in 80 byte serialized format to a buffer.
68
+ * Only adds active headers.
69
+ * returned array length divided by 80 is the actual number returned.
70
+ *
71
+ * Returns the buffer.
72
+ *
73
+ * @param height of first header
74
+ * @param count of headers
75
+ */
76
+ headersToBuffer(height: number, count: number): Promise<Uint8Array>
77
+
78
+ /**
79
+ * Exports current bulk headers, including all ingests, excluding live headers to static header files.
80
+ * @param rootFolder Where the json and headers files will be written
81
+ * @param jsonFilename The name of the json file.
82
+ * @param maxPerFile The maximum headers per file.
83
+ */
84
+ exportBulkHeaders(rootFolder: string, jsonFilename: string, maxPerFile: number): Promise<void>
85
+
86
+ /**
87
+ * Called before first Synchronize with reference to storage.
88
+ * Components requiring asynchronous setup can override base class implementation.
89
+ * @param storage
90
+ */
91
+ setStorage(storage: ChaintracksStorageApi, log: (...args: any[]) => void): Promise<void>
92
+ }
@@ -0,0 +1,64 @@
1
+ import { Chain } from '../../../../sdk/types'
2
+ import { BulkIngestorApi } from './BulkIngestorApi'
3
+ import { ChaintracksApi } from './ChaintracksClientApi'
4
+ import { LiveIngestorApi } from './LiveIngestorApi'
5
+ import { ChaintracksFsApi } from './ChaintracksFsApi'
6
+ import { ChaintracksStorageApi } from './ChaintracksStorageApi'
7
+
8
+ export interface ChaintracksOptions {
9
+ chain: Chain
10
+ storage?: ChaintracksStorageApi
11
+ bulkIngestors: BulkIngestorApi[]
12
+ liveIngestors: LiveIngestorApi[]
13
+
14
+ /**
15
+ * Maximum number of missing headers to pursue when listening for new headers.
16
+ * Normally, large numbers of missing headers are handled by bulk ingestors.
17
+ */
18
+ addLiveRecursionLimit: number
19
+ /**
20
+ * Optional logging method
21
+ */
22
+ logging?: (...args: any[]) => void
23
+ /**
24
+ * If true, this chaintracks instance will only service read requests for existing data.
25
+ * Shared storage only requires one readonly false instance to manage and update storage.
26
+ */
27
+ readonly: boolean
28
+ }
29
+
30
+ export interface ChaintracksManagementApi extends ChaintracksApi {
31
+ /**
32
+ * close and release all resources
33
+ */
34
+ destroy(): Promise<void>
35
+
36
+ /**
37
+ * Verifies that all headers from the tip back to genesis can be retrieved, in order,
38
+ * by height, and that they obey previousHash constraint.
39
+ *
40
+ * Additional validations may be addeded.
41
+ *
42
+ * This is a slow operation.
43
+ */
44
+ validate(): Promise<boolean>
45
+
46
+ /**
47
+ * Exports current bulk headers, including all ingests, excluding live headers to static header files.
48
+ *
49
+ * Useful for bulk ingestors such as those derived from BulkIngestorCDN.
50
+ *
51
+ * @param toFolder Where the json and headers files will be written
52
+ * @param toFs The ChaintracksFsApi to use for writing files. If not provided, the default file system will be used.
53
+ * @param sourceUrl Optional source URL to include in the exported files. Set if exported files will be transferred to a CDN.
54
+ * @param toHeadersPerFile The maximum headers per file. Default is 100,000 (8MB)
55
+ * @param maxHeight The maximum height to export. Default is the current bulk storage max height.
56
+ */
57
+ exportBulkHeaders(
58
+ toFolder: string,
59
+ toFs: ChaintracksFsApi,
60
+ sourceUrl?: string,
61
+ toHeadersPerFile?: number,
62
+ maxHeight?: number
63
+ ): Promise<void>
64
+ }