@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,18 @@
1
+ import { Chain } from '../../../../sdk/types'
2
+ import { ChaintracksFetchApi } from '../Api/ChaintracksFetchApi'
3
+ import { BulkIngestorCDN, BulkIngestorCDNOptions } from './BulkIngestorCDN'
4
+
5
+ export class BulkIngestorCDNBabbage extends BulkIngestorCDN {
6
+ /**
7
+ *
8
+ * @param chain
9
+ * @param rootFolder defaults to './data/bulk_cdn_babbage_headers/'
10
+ * @returns
11
+ */
12
+ static createBulkIngestorCDNBabbageOptions(chain: Chain, fetch: ChaintracksFetchApi): BulkIngestorCDNOptions {
13
+ const options: BulkIngestorCDNOptions = {
14
+ ...BulkIngestorCDN.createBulkIngestorCDNOptions(chain, 'https://cdn.projectbabbage.com/blockheaders/', fetch)
15
+ }
16
+ return options
17
+ }
18
+ }
@@ -0,0 +1,113 @@
1
+ import { Chain } from '../../../../sdk'
2
+ import { BlockHeader } from '../Api/BlockHeaderApi'
3
+ import { BulkIngestorBaseOptions } from '../Api/BulkIngestorApi'
4
+ import { ChaintracksFetchApi } from '../Api/ChaintracksFetchApi'
5
+ import { BulkIngestorBase } from './BulkIngestorBase'
6
+ import { deserializeBlockHeader } from '../util/blockHeaderUtilities'
7
+ import { ChaintracksFetch } from '../util/ChaintracksFetch'
8
+ import { HeightRange, HeightRanges } from '../util/HeightRange'
9
+ import { StopListenerToken } from './WhatsOnChainIngestorWs'
10
+ import { WhatsOnChainServices, WhatsOnChainServicesOptions } from './WhatsOnChainServices'
11
+
12
+ export interface BulkIngestorWhatsOnChainOptions extends BulkIngestorBaseOptions, WhatsOnChainServicesOptions {
13
+ /**
14
+ * Maximum msces of "normal" pause with no new data arriving.
15
+ */
16
+ idleWait: number | undefined
17
+ /**
18
+ * Which chain is being tracked: main, test, or stn.
19
+ */
20
+ chain: Chain
21
+ /**
22
+ * WhatsOnChain.com API Key
23
+ * https://docs.taal.com/introduction/get-an-api-key
24
+ * If unknown or empty, maximum request rate is limited.
25
+ * https://developers.whatsonchain.com/#rate-limits
26
+ */
27
+ apiKey?: string
28
+ /**
29
+ * Request timeout for GETs to https://api.whatsonchain.com/v1/bsv
30
+ */
31
+ timeout: number
32
+ /**
33
+ * User-Agent header value for requests to https://api.whatsonchain.com/v1/bsv
34
+ */
35
+ userAgent: string
36
+ /**
37
+ * Enable WhatsOnChain client cache option.
38
+ */
39
+ enableCache: boolean
40
+ /**
41
+ * How long chainInfo is considered still valid before updating (msecs).
42
+ */
43
+ chainInfoMsecs: number
44
+ /**
45
+ *
46
+ */
47
+ fetch?: ChaintracksFetchApi
48
+ }
49
+
50
+ export class BulkIngestorWhatsOnChainCdn extends BulkIngestorBase {
51
+ /**
52
+ *
53
+ * @param chain
54
+ * @param localCachePath defaults to './data/ingest_whatsonchain_headers'
55
+ * @returns
56
+ */
57
+ static createBulkIngestorWhatsOnChainOptions(chain: Chain): BulkIngestorWhatsOnChainOptions {
58
+ const options: BulkIngestorWhatsOnChainOptions = {
59
+ ...WhatsOnChainServices.createWhatsOnChainServicesOptions(chain),
60
+ ...BulkIngestorBase.createBulkIngestorBaseOptions(chain),
61
+ idleWait: 5000
62
+ }
63
+ return options
64
+ }
65
+
66
+ fetch: ChaintracksFetchApi
67
+ idleWait: number
68
+ woc: WhatsOnChainServices
69
+ stopOldListenersToken: StopListenerToken = { stop: undefined }
70
+
71
+ constructor(options: BulkIngestorWhatsOnChainOptions) {
72
+ super(options)
73
+ this.idleWait = options.idleWait || 5000
74
+ this.woc = new WhatsOnChainServices(options)
75
+ this.fetch = options.fetch || new ChaintracksFetch()
76
+ }
77
+
78
+ override async getPresentHeight(): Promise<number | undefined> {
79
+ const presentHeight = await this.woc.getChainTipHeight()
80
+ this.log(`presentHeight=${presentHeight}`)
81
+ return presentHeight
82
+ }
83
+
84
+ async fetchHeaders(
85
+ before: HeightRanges,
86
+ fetchRange: HeightRange,
87
+ bulkRange: HeightRange,
88
+ priorLiveHeaders: BlockHeader[]
89
+ ): Promise<BlockHeader[]> {
90
+ const oldHeaders: BlockHeader[] = []
91
+
92
+ try {
93
+ const ranges = await this.woc.getHeaderByteFileLinks(fetchRange, this.fetch)
94
+ const headers: BlockHeader[] = []
95
+ for (const range of ranges) {
96
+ for (let height = range.range.minHeight; height <= range.range.maxHeight; height++) {
97
+ if (fetchRange.contains(height)) {
98
+ if (!range.data)
99
+ range.data = await this.fetch.download(this.fetch.pathJoin(range.sourceUrl, range.fileName))
100
+ const h = deserializeBlockHeader(range.data, (height - range.range.minHeight) * 80, height)
101
+ oldHeaders.push(h)
102
+ }
103
+ }
104
+ }
105
+ } catch (e) {
106
+ this.log(`Errors during WhatsOnChain ingestion:\n${e}`)
107
+ }
108
+
109
+ const liveHeaders = await this.storage().addBulkHeaders(oldHeaders, bulkRange, priorLiveHeaders)
110
+
111
+ return liveHeaders
112
+ }
113
+ }
@@ -0,0 +1,81 @@
1
+ import { Chain } from '../../../../sdk'
2
+ import { logger } from '../../../../utility/utilityHelpers'
3
+ import { BlockHeader } from '../Api/BlockHeaderApi'
4
+ import { BulkIngestorBase } from './BulkIngestorBase'
5
+ import { HeightRange, HeightRanges } from '../util/HeightRange'
6
+ import { BulkIngestorWhatsOnChainOptions } from './BulkIngestorWhatsOnChainCdn'
7
+ import { StopListenerToken, WocHeadersBulkListener } from './WhatsOnChainIngestorWs'
8
+ import { EnqueueHandler, ErrorHandler, WhatsOnChainServices } from './WhatsOnChainServices'
9
+
10
+ export class BulkIngestorWhatsOnChainWs extends BulkIngestorBase {
11
+ /**
12
+ *
13
+ * @param chain
14
+ * @param localCachePath defaults to './data/ingest_whatsonchain_headers'
15
+ * @returns
16
+ */
17
+ static createBulkIngestorWhatsOnChainOptions(chain: Chain): BulkIngestorWhatsOnChainOptions {
18
+ const options: BulkIngestorWhatsOnChainOptions = {
19
+ ...WhatsOnChainServices.createWhatsOnChainServicesOptions(chain),
20
+ ...BulkIngestorBase.createBulkIngestorBaseOptions(chain),
21
+ idleWait: 5000
22
+ }
23
+ return options
24
+ }
25
+
26
+ idleWait: number
27
+ woc: WhatsOnChainServices
28
+ stopOldListenersToken: StopListenerToken = { stop: undefined }
29
+
30
+ constructor(options: BulkIngestorWhatsOnChainOptions) {
31
+ super(options)
32
+ this.idleWait = options.idleWait || 5000
33
+ this.woc = new WhatsOnChainServices(options)
34
+ }
35
+
36
+ override async getPresentHeight(): Promise<number | undefined> {
37
+ const presentHeight = await this.woc.getChainTipHeight()
38
+ logger(`presentHeight=${presentHeight}`)
39
+ return presentHeight
40
+ }
41
+
42
+ async fetchHeaders(
43
+ before: HeightRanges,
44
+ fetchRange: HeightRange,
45
+ bulkRange: HeightRange,
46
+ priorLiveHeaders: BlockHeader[]
47
+ ): Promise<BlockHeader[]> {
48
+ const oldHeaders: BlockHeader[] = []
49
+ const errors: { code: number; message: string; count: number }[] = []
50
+ const enqueue: EnqueueHandler = header => {
51
+ oldHeaders.push(header)
52
+ }
53
+ const error: ErrorHandler = (code, message) => {
54
+ errors.push({ code, message, count: errors.length })
55
+ return false
56
+ }
57
+
58
+ const ok = await WocHeadersBulkListener(
59
+ fetchRange.minHeight,
60
+ fetchRange.maxHeight,
61
+ enqueue,
62
+ error,
63
+ this.stopOldListenersToken,
64
+ this.chain,
65
+ this.log,
66
+ this.idleWait
67
+ )
68
+
69
+ let liveHeaders: BlockHeader[] = []
70
+ if (ok) {
71
+ liveHeaders = await this.storage().addBulkHeaders(oldHeaders, bulkRange, priorLiveHeaders)
72
+ }
73
+
74
+ if (errors.length > 0) {
75
+ const errorMessages = errors.map(e => `(${e.code}) ${e.message} (${e.count})`).join('\n')
76
+ logger(`Errors during WhatsOnChain ingestion:\n${errorMessages}`)
77
+ }
78
+
79
+ return liveHeaders
80
+ }
81
+ }
@@ -0,0 +1,86 @@
1
+ /* eslint-disable @typescript-eslint/no-empty-function */
2
+ import { Chain } from '../../../../sdk/types'
3
+ import { LiveIngestorApi } from '../Api/LiveIngestorApi'
4
+ import { ChaintracksStorageApi } from '../Api/ChaintracksStorageApi'
5
+ import { BlockHeader } from '../Api/BlockHeaderApi'
6
+
7
+ export interface LiveIngestorBaseOptions {
8
+ /**
9
+ * The target chain: "main" or "test"
10
+ */
11
+ chain: Chain
12
+ }
13
+
14
+ /**
15
+ *
16
+ */
17
+ export abstract class LiveIngestorBase implements LiveIngestorApi {
18
+ static createLiveIngestorBaseOptions(chain: Chain) {
19
+ const options: LiveIngestorBaseOptions = {
20
+ chain
21
+ }
22
+ return options
23
+ }
24
+
25
+ chain: Chain
26
+ log: (...args: any[]) => void = () => {}
27
+
28
+ constructor(options: LiveIngestorBaseOptions) {
29
+ this.chain = options.chain
30
+ }
31
+
32
+ /**
33
+ * Release resources.
34
+ * Override if required.
35
+ */
36
+ async shutdown(): Promise<void> {}
37
+
38
+ private storageEngine?: ChaintracksStorageApi
39
+
40
+ /**
41
+ * Allocate resources.
42
+ * @param storage coordinating storage engine.
43
+ */
44
+ async setStorage(storage: ChaintracksStorageApi, log: (...args: any[]) => void): Promise<void> {
45
+ this.storageEngine = storage
46
+ this.log = log
47
+ }
48
+
49
+ /**
50
+ *
51
+ * @returns coordinating storage engine.
52
+ */
53
+ storage(): ChaintracksStorageApi {
54
+ if (!this.storageEngine) throw new Error('storageEngine must be set.')
55
+ return this.storageEngine
56
+ }
57
+
58
+ /**
59
+ * Called to retrieve a missing block header,
60
+ * when the previousHash of a new header is unknown.
61
+ *
62
+ * @param hash block hash of missing header
63
+ */
64
+ abstract getHeaderByHash(hash: string): Promise<BlockHeader | undefined>
65
+
66
+ /**
67
+ * Begin retrieving new block headers.
68
+ *
69
+ * New headers are pushed onto the liveHeaders array.
70
+ *
71
+ * Continue waiting for new headers.
72
+ *
73
+ * Return only when either `stopListening` or `shutdown` are called.
74
+ *
75
+ * Be prepared to resume listening after `stopListening` but not
76
+ * after `shutdown`.
77
+ *
78
+ * @param liveHeaders
79
+ */
80
+ abstract startListening(liveHeaders: BlockHeader[]): Promise<void>
81
+
82
+ /**
83
+ * Causes `startListening` to stop listening for new block headers and return.
84
+ */
85
+ abstract stopListening(): void
86
+ }
@@ -0,0 +1,59 @@
1
+ import { BlockHeader, Chain } from '../../../../sdk'
2
+ import { LiveIngestorBase, LiveIngestorBaseOptions } from './LiveIngestorBase'
3
+ import { EnqueueHandler, ErrorHandler, WhatsOnChainServices, WhatsOnChainServicesOptions } from './WhatsOnChainServices'
4
+
5
+ export interface LiveIngestorTeranodeP2POptions extends LiveIngestorBaseOptions {
6
+ /**
7
+ *
8
+ */
9
+ apiKey?: string
10
+ /**
11
+ * User-Agent header value for requests
12
+ */
13
+ userAgent?: string
14
+ }
15
+
16
+ export class LiveIngestorTeranodeP2P extends LiveIngestorBase {
17
+ static createLiveIngestorTeranodeP2POptions(chain: Chain): LiveIngestorTeranodeP2POptions {
18
+ const options: LiveIngestorTeranodeP2POptions = {
19
+ ...LiveIngestorBase.createLiveIngestorBaseOptions(chain)
20
+ }
21
+ return options
22
+ }
23
+
24
+ constructor(options: LiveIngestorTeranodeP2POptions) {
25
+ super(options)
26
+ }
27
+
28
+ async getHeaderByHash(hash: string): Promise<BlockHeader | undefined> {
29
+ return undefined
30
+ }
31
+
32
+ async startListening(liveHeaders: BlockHeader[]): Promise<void> {
33
+ const errors: { code: number; message: string; count: number }[] = []
34
+ const enqueue: EnqueueHandler = header => {
35
+ liveHeaders.push(header)
36
+ }
37
+ const error: ErrorHandler = (code, message) => {
38
+ errors.push({ code, message, count: errors.length })
39
+ return false
40
+ }
41
+
42
+ for (;;) {
43
+ const ok = true // await this.woc.listenForNewBlockHeaders(enqueue, error, this.idleWait)
44
+
45
+ if (!ok || errors.length > 0) {
46
+ console.log(`TeranodeP2P live ingestor ok=${ok} error count=${errors.length}`)
47
+ for (const e of errors) console.log(`TeranodeP2P error code=${e.code} count=${e.count} message=${e.message}`)
48
+ }
49
+
50
+ if (ok) break
51
+
52
+ errors.length = 0
53
+ }
54
+ }
55
+
56
+ stopListening(): void {
57
+ //this.woc?.stopNewListener()
58
+ }
59
+ }
@@ -0,0 +1,104 @@
1
+ import { BlockHeader, Chain } from '../../../../sdk'
2
+ import { wait } from '../../../../utility/utilityHelpers'
3
+ import { LiveIngestorBase, LiveIngestorBaseOptions } from './LiveIngestorBase'
4
+ import {
5
+ WhatsOnChainServices,
6
+ WhatsOnChainServicesOptions,
7
+ WocGetHeadersHeader,
8
+ wocGetHeadersHeaderToBlockHeader
9
+ } from './WhatsOnChainServices'
10
+
11
+ export interface LiveIngestorWhatsOnChainOptions extends LiveIngestorBaseOptions, WhatsOnChainServicesOptions {
12
+ /**
13
+ * Maximum msces of "normal" time with no ping received from connected WoC service.
14
+ */
15
+ idleWait: number | undefined
16
+ /**
17
+ * Which chain is being tracked: main, test, or stn.
18
+ */
19
+ chain: Chain
20
+ /**
21
+ * WhatsOnChain.com API Key
22
+ * https://docs.taal.com/introduction/get-an-api-key
23
+ * If unknown or empty, maximum request rate is limited.
24
+ * https://developers.whatsonchain.com/#rate-limits
25
+ */
26
+ apiKey?: string
27
+ /**
28
+ * Request timeout for GETs to https://api.whatsonchain.com/v1/bsv
29
+ */
30
+ timeout: number
31
+ /**
32
+ * User-Agent header value for requests to https://api.whatsonchain.com/v1/bsv
33
+ */
34
+ userAgent: string
35
+ /**
36
+ * Enable WhatsOnChain client cache option.
37
+ */
38
+ enableCache: boolean
39
+ /**
40
+ * How long chainInfo is considered still valid before updating (msecs).
41
+ */
42
+ chainInfoMsecs: number
43
+ }
44
+
45
+ /**
46
+ * Reports new headers by polling periodically.
47
+ */
48
+ export class LiveIngestorWhatsOnChainPoll extends LiveIngestorBase {
49
+ static createLiveIngestorWhatsOnChainOptions(chain: Chain): LiveIngestorWhatsOnChainOptions {
50
+ const options: LiveIngestorWhatsOnChainOptions = {
51
+ ...WhatsOnChainServices.createWhatsOnChainServicesOptions(chain),
52
+ ...LiveIngestorBase.createLiveIngestorBaseOptions(chain),
53
+ idleWait: 100000
54
+ }
55
+ return options
56
+ }
57
+
58
+ idleWait: number
59
+ woc: WhatsOnChainServices
60
+ done: boolean = false
61
+
62
+ constructor(options: LiveIngestorWhatsOnChainOptions) {
63
+ super(options)
64
+ this.idleWait = options.idleWait || 100000
65
+ this.woc = new WhatsOnChainServices(options)
66
+ }
67
+
68
+ async getHeaderByHash(hash: string): Promise<BlockHeader | undefined> {
69
+ const header = await this.woc.getHeaderByHash(hash)
70
+ return header
71
+ }
72
+
73
+ async startListening(liveHeaders: BlockHeader[]): Promise<void> {
74
+ this.done = false
75
+ let lastHeaders: WocGetHeadersHeader[] = []
76
+
77
+ for (; !this.done; ) {
78
+ const headers = await this.woc.getHeaders()
79
+
80
+ const newHeaders = headers.filter(h => !lastHeaders.some(lh => lh.hash === h.hash))
81
+
82
+ for (const h of newHeaders) {
83
+ const bh = wocGetHeadersHeaderToBlockHeader(h)
84
+ liveHeaders.unshift(bh)
85
+ }
86
+
87
+ lastHeaders = headers
88
+
89
+ for (let sec = 0; sec < 60 && !this.done; sec++) {
90
+ // Only wait a second at a time so we notice `done` sooner...
91
+ await wait(1000)
92
+ }
93
+ }
94
+ this.log(`LiveIngestorWhatsOnChainPoll stopped`)
95
+ }
96
+
97
+ stopListening(): void {
98
+ this.done = true
99
+ }
100
+
101
+ override async shutdown(): Promise<void> {
102
+ this.stopListening()
103
+ }
104
+ }
@@ -0,0 +1,66 @@
1
+ import { BlockHeader, Chain } from '../../../../sdk'
2
+ import { LiveIngestorBase } from './LiveIngestorBase'
3
+ import { LiveIngestorWhatsOnChainOptions } from './LiveIngestorWhatsOnChainPoll'
4
+ import { StopListenerToken, WocHeadersLiveListener } from './WhatsOnChainIngestorWs'
5
+ import { EnqueueHandler, ErrorHandler, WhatsOnChainServices } from './WhatsOnChainServices'
6
+
7
+ export class LiveIngestorWhatsOnChainWs extends LiveIngestorBase {
8
+ static createLiveIngestorWhatsOnChainOptions(chain: Chain): LiveIngestorWhatsOnChainOptions {
9
+ const options: LiveIngestorWhatsOnChainOptions = {
10
+ ...WhatsOnChainServices.createWhatsOnChainServicesOptions(chain),
11
+ ...LiveIngestorBase.createLiveIngestorBaseOptions(chain),
12
+ idleWait: 100000
13
+ }
14
+ return options
15
+ }
16
+
17
+ idleWait: number
18
+ woc: WhatsOnChainServices
19
+ stopNewListenersToken: StopListenerToken = { stop: undefined }
20
+
21
+ constructor(options: LiveIngestorWhatsOnChainOptions) {
22
+ super(options)
23
+ this.idleWait = options.idleWait || 100000
24
+ this.woc = new WhatsOnChainServices(options)
25
+ }
26
+
27
+ async getHeaderByHash(hash: string): Promise<BlockHeader | undefined> {
28
+ const header = await this.woc.getHeaderByHash(hash)
29
+ return header
30
+ }
31
+
32
+ async startListening(liveHeaders: BlockHeader[]): Promise<void> {
33
+ const errors: { code: number; message: string; count: number }[] = []
34
+ const enqueue: EnqueueHandler = header => {
35
+ liveHeaders.push(header)
36
+ }
37
+ const error: ErrorHandler = (code, message) => {
38
+ errors.push({ code, message, count: errors.length })
39
+ return false
40
+ }
41
+
42
+ for (;;) {
43
+ const ok = await WocHeadersLiveListener(
44
+ enqueue,
45
+ error,
46
+ this.stopNewListenersToken,
47
+ this.chain,
48
+ this.log,
49
+ this.idleWait
50
+ )
51
+
52
+ if (!ok || errors.length > 0) {
53
+ this.log(`WhatsOnChain live ingestor ok=${ok} error count=${errors.length}`)
54
+ for (const e of errors) this.log(`WhatsOnChain error code=${e.code} count=${e.count} message=${e.message}`)
55
+ }
56
+
57
+ if (ok) break
58
+
59
+ errors.length = 0
60
+ }
61
+ }
62
+
63
+ stopListening(): void {
64
+ this.stopNewListenersToken.stop?.()
65
+ }
66
+ }