@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,412 @@
1
+ import { wait } from '../utility/utilityHelpers'
2
+
3
+ import { WalletMonitorTask } from './tasks/WalletMonitorTask'
4
+ import { WalletStorageManager } from '../storage/WalletStorageManager'
5
+
6
+ import { TaskPurge, TaskPurgeParams } from './tasks/TaskPurge'
7
+ import { TaskReviewStatus } from './tasks/TaskReviewStatus'
8
+ import { TaskSyncWhenIdle } from './tasks/TaskSyncWhenIdle'
9
+ import { TaskFailAbandoned } from './tasks/TaskFailAbandoned'
10
+ import { TaskCheckForProofs } from './tasks/TaskCheckForProofs'
11
+ import { TaskClock } from './tasks/TaskClock'
12
+ import { TaskNewHeader } from './tasks/TaskNewHeader'
13
+ import { TaskMonitorCallHistory } from './tasks/TaskMonitorCallHistory'
14
+ import { TaskReorg } from './tasks/TaskReorg'
15
+
16
+ import { TaskSendWaiting } from './tasks/TaskSendWaiting'
17
+ import { TaskCheckNoSends } from './tasks/TaskCheckNoSends'
18
+ import { TaskUnFail } from './tasks/TaskUnFail'
19
+ import { Chain, ProvenTransactionStatus } from '../sdk/types'
20
+ import { ReviewActionResult } from '../sdk/WalletStorage.interfaces'
21
+ import { WERR_BAD_REQUEST, WERR_INVALID_PARAMETER } from '../sdk/WERR_errors'
22
+ import { WalletError } from '../sdk/WalletError'
23
+ import { BlockHeader } from '../sdk/WalletServices.interfaces'
24
+ import { Services } from '../services/Services'
25
+ import { ChaintracksClientApi, ReorgListener } from '../services/chaintracker/chaintracks/Api/ChaintracksClientApi'
26
+ import { Chaintracks } from '../services/chaintracker/chaintracks/Chaintracks'
27
+
28
+ export type MonitorStorage = WalletStorageManager
29
+
30
+ export interface MonitorOptions {
31
+ chain: Chain
32
+
33
+ services: Services
34
+
35
+ storage: MonitorStorage
36
+
37
+ chaintracks: ChaintracksClientApi
38
+
39
+ chaintracksWithEvents?: Chaintracks
40
+
41
+ /**
42
+ * How many msecs to wait after each getMerkleProof service request.
43
+ */
44
+ msecsWaitPerMerkleProofServiceReq: number
45
+
46
+ taskRunWaitMsecs: number
47
+
48
+ abandonedMsecs: number
49
+
50
+ unprovenAttemptsLimitTest: number
51
+
52
+ unprovenAttemptsLimitMain: number
53
+
54
+ /**
55
+ * These are hooks for a wallet-toolbox client to get transaction updates.
56
+ */
57
+ onTransactionBroadcasted?: (broadcastResult: ReviewActionResult) => Promise<void>
58
+ onTransactionProven?: (txStatus: ProvenTransactionStatus) => Promise<void>
59
+ }
60
+
61
+ /**
62
+ * Background task to make sure transactions are processed, transaction proofs are received and propagated,
63
+ * and potentially that reorgs update proofs that were already received.
64
+ */
65
+ export class Monitor {
66
+ static createDefaultWalletMonitorOptions(
67
+ chain: Chain,
68
+ storage: MonitorStorage,
69
+ services?: Services,
70
+ chaintracks?: Chaintracks
71
+ ): MonitorOptions {
72
+ services ||= new Services(chain)
73
+ if (!services.options.chaintracks) throw new WERR_INVALID_PARAMETER('services.options.chaintracks', 'valid')
74
+ const o: MonitorOptions = {
75
+ chain,
76
+ services,
77
+ storage,
78
+ msecsWaitPerMerkleProofServiceReq: 500,
79
+ taskRunWaitMsecs: 5000,
80
+ abandonedMsecs: 1000 * 60 * 5,
81
+ unprovenAttemptsLimitTest: 10,
82
+ unprovenAttemptsLimitMain: 144,
83
+ chaintracks: services.options.chaintracks,
84
+ chaintracksWithEvents: chaintracks
85
+ }
86
+ return o
87
+ }
88
+
89
+ options: MonitorOptions
90
+ services: Services
91
+ chain: Chain
92
+ storage: MonitorStorage
93
+ chaintracks: ChaintracksClientApi
94
+ chaintracksWithEvents?: Chaintracks
95
+ reorgSubscriptionPromise?: Promise<string>
96
+ headersSubscriptionPromise?: Promise<string>
97
+ onTransactionBroadcasted?: (broadcastResult: ReviewActionResult) => Promise<void>
98
+ onTransactionProven?: (txStatus: ProvenTransactionStatus) => Promise<void>
99
+
100
+ constructor(options: MonitorOptions) {
101
+ this.options = { ...options }
102
+ this.services = options.services
103
+ this.chain = this.services.chain
104
+ this.storage = options.storage
105
+ this.chaintracks = options.chaintracks
106
+ this.chaintracksWithEvents = options.chaintracksWithEvents
107
+ this.onTransactionProven = options.onTransactionProven
108
+ this.onTransactionBroadcasted = options.onTransactionBroadcasted
109
+
110
+ if (this.chaintracksWithEvents) {
111
+ const c = this.chaintracksWithEvents
112
+ this.reorgSubscriptionPromise = c.subscribeReorgs(this.processReorg.bind(this))
113
+ this.headersSubscriptionPromise = c.subscribeHeaders(this.processHeader.bind(this))
114
+ }
115
+ }
116
+
117
+ async destroy(): Promise<void> {
118
+ if (this.chaintracksWithEvents) {
119
+ const c = this.chaintracksWithEvents
120
+ if (this.reorgSubscriptionPromise) await c.unsubscribe(await this.reorgSubscriptionPromise)
121
+ if (this.headersSubscriptionPromise) await c.unsubscribe(await this.headersSubscriptionPromise)
122
+ }
123
+ }
124
+
125
+ static readonly oneSecond = 1000
126
+ static readonly oneMinute = 60 * Monitor.oneSecond
127
+ static readonly oneHour = 60 * Monitor.oneMinute
128
+ static readonly oneDay = 24 * Monitor.oneHour
129
+ static readonly oneWeek = 7 * Monitor.oneDay
130
+
131
+ /**
132
+ * _tasks are typically run by the scheduler but may also be run by runTask.
133
+ */
134
+ _tasks: WalletMonitorTask[] = []
135
+ /**
136
+ * _otherTasks can be run by runTask but not by scheduler.
137
+ */
138
+ _otherTasks: WalletMonitorTask[] = []
139
+ _tasksRunning = false
140
+
141
+ defaultPurgeParams: TaskPurgeParams = {
142
+ purgeSpent: false,
143
+ purgeCompleted: false,
144
+ purgeFailed: true,
145
+ purgeSpentAge: 2 * Monitor.oneWeek,
146
+ purgeCompletedAge: 2 * Monitor.oneWeek,
147
+ purgeFailedAge: 5 * Monitor.oneDay
148
+ }
149
+
150
+ addAllTasksToOther(): void {
151
+ this._otherTasks.push(new TaskClock(this))
152
+ this._otherTasks.push(new TaskNewHeader(this))
153
+ this._otherTasks.push(new TaskMonitorCallHistory(this))
154
+ this._otherTasks.push(new TaskPurge(this, this.defaultPurgeParams))
155
+ this._otherTasks.push(new TaskReviewStatus(this))
156
+ this._otherTasks.push(new TaskSendWaiting(this))
157
+ this._otherTasks.push(new TaskCheckForProofs(this))
158
+ this._otherTasks.push(new TaskCheckNoSends(this))
159
+ this._otherTasks.push(new TaskUnFail(this))
160
+
161
+ this._otherTasks.push(new TaskReorg(this))
162
+
163
+ this._otherTasks.push(new TaskFailAbandoned(this))
164
+
165
+ this._otherTasks.push(new TaskSyncWhenIdle(this))
166
+ }
167
+ /**
168
+ * Default tasks with settings appropriate for a single user storage
169
+ * possibly with sync'ing enabled
170
+ */
171
+ addDefaultTasks(): void {
172
+ this._tasks.push(new TaskClock(this))
173
+ this._tasks.push(new TaskNewHeader(this))
174
+ this._tasks.push(new TaskMonitorCallHistory(this))
175
+ this._tasks.push(new TaskSendWaiting(this, 8 * Monitor.oneSecond, 7 * Monitor.oneSecond)) // Check every 8 seconds but must be 7 seconds old
176
+ this._tasks.push(new TaskCheckForProofs(this, 2 * Monitor.oneHour)) // Every two hours if no block found
177
+ this._tasks.push(new TaskCheckNoSends(this))
178
+ this._tasks.push(new TaskFailAbandoned(this, 8 * Monitor.oneMinute))
179
+ this._tasks.push(new TaskUnFail(this))
180
+ //this._tasks.push(new TaskPurge(this, this.defaultPurgeParams, 6 * Monitor.oneHour))
181
+ this._tasks.push(new TaskReviewStatus(this))
182
+ this._tasks.push(new TaskReorg(this))
183
+ }
184
+
185
+ /**
186
+ * Tasks appropriate for multi-user storage
187
+ * without sync'ing enabled.
188
+ */
189
+ addMultiUserTasks(): void {
190
+ this._tasks.push(new TaskClock(this))
191
+ this._tasks.push(new TaskNewHeader(this))
192
+ this._tasks.push(new TaskMonitorCallHistory(this))
193
+ this._tasks.push(new TaskSendWaiting(this, 8 * Monitor.oneSecond, 7 * Monitor.oneSecond)) // Check every 8 seconds but must be 7 seconds old
194
+ this._tasks.push(new TaskCheckForProofs(this, 2 * Monitor.oneHour)) // Every two hours if no block found
195
+ this._tasks.push(new TaskCheckNoSends(this))
196
+ this._tasks.push(new TaskFailAbandoned(this, 8 * Monitor.oneMinute))
197
+ this._tasks.push(new TaskUnFail(this))
198
+ //this._tasks.push(new TaskPurge(this, this.defaultPurgeParams, 6 * Monitor.oneHour))
199
+ this._tasks.push(new TaskReviewStatus(this))
200
+ this._tasks.push(new TaskReorg(this))
201
+ }
202
+
203
+ addTask(task: WalletMonitorTask): void {
204
+ if (this._tasks.some(t => t.name === task.name))
205
+ throw new WERR_BAD_REQUEST(`task ${task.name} has already been added.`)
206
+ this._tasks.push(task)
207
+ }
208
+
209
+ removeTask(name: string): void {
210
+ this._tasks = this._tasks.filter(t => t.name !== name)
211
+ }
212
+
213
+ async runTask(name: string): Promise<string> {
214
+ let task = this._tasks.find(t => t.name === name)
215
+ let log = ''
216
+ if (!task) task = this._otherTasks.find(t => t.name === name)
217
+ if (task) {
218
+ await task.asyncSetup()
219
+ log = await task.runTask()
220
+ }
221
+ return log
222
+ }
223
+
224
+ async runOnce(): Promise<void> {
225
+ if (this._runAsyncSetup) {
226
+ for (const t of this._tasks) {
227
+ try {
228
+ await t.asyncSetup()
229
+ } catch (eu: unknown) {
230
+ const e = WalletError.fromUnknown(eu)
231
+ const details = `monitor task ${t.name} asyncSetup error ${e.code} ${e.description}`
232
+ console.log(details)
233
+ await this.logEvent('error0', details)
234
+ }
235
+ if (!this._tasksRunning) break
236
+ }
237
+ this._runAsyncSetup = false
238
+ }
239
+
240
+ if (this.storage.getActive().isStorageProvider()) {
241
+ const tasksToRun: WalletMonitorTask[] = []
242
+ const now = new Date().getTime()
243
+ for (const t of this._tasks) {
244
+ try {
245
+ if (t.trigger(now).run) tasksToRun.push(t)
246
+ } catch (eu: unknown) {
247
+ const e = WalletError.fromUnknown(eu)
248
+ const details = `monitor task ${t.name} trigger error ${e.code} ${e.description}`
249
+ console.log(details)
250
+ await this.logEvent('error0', details)
251
+ }
252
+ }
253
+
254
+ for (const ttr of tasksToRun) {
255
+ try {
256
+ if (this.storage.getActive().isStorageProvider()) {
257
+ const log = await ttr.runTask()
258
+ if (log && log.length > 0) {
259
+ console.log(`Task${ttr.name} ${log.slice(0, 256)}`)
260
+ await this.logEvent(ttr.name, log)
261
+ }
262
+ }
263
+ } catch (eu: unknown) {
264
+ const e = WalletError.fromUnknown(eu)
265
+ const details = `monitor task ${ttr.name} runTask error ${e.code} ${e.description}\n${e.stack}`
266
+ console.log(details)
267
+ await this.logEvent('error1', details)
268
+ } finally {
269
+ ttr.lastRunMsecsSinceEpoch = new Date().getTime()
270
+ }
271
+ }
272
+ }
273
+ }
274
+
275
+ _runAsyncSetup: boolean = true
276
+ _tasksRunningPromise?: PromiseLike<void>
277
+ resolveCompletion: ((value: void | PromiseLike<void>) => void) | undefined = undefined
278
+
279
+ async startTasks(): Promise<void> {
280
+ if (this._tasksRunning) throw new WERR_BAD_REQUEST('monitor tasks are already runnining.')
281
+
282
+ this._tasksRunning = true
283
+ this._tasksRunningPromise = new Promise(resolve => {
284
+ this.resolveCompletion = resolve
285
+ })
286
+
287
+ for (; this._tasksRunning; ) {
288
+ await this.runOnce()
289
+
290
+ // console.log(`${new Date().toISOString()} tasks run, waiting...`)
291
+ await wait(this.options.taskRunWaitMsecs)
292
+ }
293
+
294
+ if (this.resolveCompletion) {
295
+ this.resolveCompletion()
296
+ this.resolveCompletion = undefined
297
+ }
298
+ }
299
+
300
+ async logEvent(event: string, details?: string): Promise<void> {
301
+ await this.storage.runAsStorageProvider(async sp => {
302
+ await sp.insertMonitorEvent({
303
+ created_at: new Date(),
304
+ updated_at: new Date(),
305
+ id: 0,
306
+ event,
307
+ details
308
+ })
309
+ })
310
+ }
311
+
312
+ stopTasks(): void {
313
+ this._tasksRunning = false
314
+ }
315
+
316
+ lastNewHeader: BlockHeader | undefined
317
+ lastNewHeaderWhen: Date | undefined
318
+
319
+ /**
320
+ * Process new chain header event received from Chaintracks
321
+ *
322
+ * Kicks processing 'unconfirmed' and 'unmined' request processing.
323
+ *
324
+ * @param reqs
325
+ */
326
+ processNewBlockHeader(header: BlockHeader): void {
327
+ const h = header
328
+ this.lastNewHeader = h
329
+ this.lastNewHeaderWhen = new Date()
330
+ // console.log(`WalletMonitor notified of new block header ${h.height}`)
331
+ // Nudge the proof checker to try again.
332
+ TaskCheckForProofs.checkNow = true
333
+ }
334
+
335
+ /**
336
+ * This is a function run from a TaskSendWaiting Monitor task.
337
+ *
338
+ * This allows the user of wallet-toolbox to 'subscribe' for transaction broadcast updates.
339
+ *
340
+ * @param broadcastResult
341
+ */
342
+ callOnBroadcastedTransaction(broadcastResult: ReviewActionResult): void {
343
+ if (this.onTransactionBroadcasted) {
344
+ this.onTransactionBroadcasted(broadcastResult)
345
+ }
346
+ }
347
+
348
+ /**
349
+ * This is a function run from a TaskCheckForProofs Monitor task.
350
+ *
351
+ * This allows the user of wallet-toolbox to 'subscribe' for transaction updates.
352
+ *
353
+ * @param txStatus
354
+ */
355
+ callOnProvenTransaction(txStatus: ProvenTransactionStatus): void {
356
+ if (this.onTransactionProven) {
357
+ this.onTransactionProven(txStatus)
358
+ }
359
+ }
360
+
361
+ deactivatedHeaders: DeactivedHeader[] = []
362
+
363
+ /**
364
+ * Process reorg event received from Chaintracks
365
+ *
366
+ * Reorgs can move recent transactions to new blocks at new index positions.
367
+ * Affected transaction proofs become invalid and must be updated.
368
+ *
369
+ * It is possible for a transaction to become invalid.
370
+ *
371
+ * Coinbase transactions always become invalid.
372
+ */
373
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
374
+ processReorg(depth: number, oldTip: BlockHeader, newTip: BlockHeader, deactivatedHeaders?: BlockHeader[]): void {
375
+ if (deactivatedHeaders) {
376
+ for (const header of deactivatedHeaders) {
377
+ this.deactivatedHeaders.push({
378
+ whenMsecs: Date.now(),
379
+ tries: 0,
380
+ header
381
+ })
382
+ }
383
+ }
384
+ }
385
+
386
+ /**
387
+ * Handler for new header events from Chaintracks.
388
+ *
389
+ * To minimize reorg processing, new headers are aged before processing via TaskNewHeader.
390
+ * Therefore this handler is intentionally a no-op.
391
+ *
392
+ * @param header
393
+ */
394
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
395
+ processHeader(header: BlockHeader): void {}
396
+ }
397
+
398
+ export interface DeactivedHeader {
399
+ /**
400
+ * To control aging of notification before pursuing updated proof data.
401
+ */
402
+ whenMsecs: number
403
+ /**
404
+ * Number of attempts made to process the header.
405
+ * Supports returning deactivation notification to the queue if proof data is not yet available.
406
+ */
407
+ tries: number
408
+ /**
409
+ * The deactivated block header.
410
+ */
411
+ header: BlockHeader
412
+ }
@@ -0,0 +1,188 @@
1
+ import { Knex, knex as makeKnex } from 'knex'
2
+
3
+ import dotenv from 'dotenv'
4
+ import { Chain } from '../sdk/types'
5
+ import { StorageKnex, StorageKnexOptions } from '../storage/StorageKnex'
6
+ import { StorageProvider } from '../storage/StorageProvider'
7
+ import { WalletStorageManager } from '../storage/WalletStorageManager'
8
+ import { WalletServicesOptions } from '../sdk/WalletServices.interfaces'
9
+ import { Services } from '../services/Services'
10
+ import { Monitor } from './Monitor'
11
+ import { WERR_INTERNAL, WERR_INVALID_PARAMETER } from '../sdk/WERR_errors'
12
+ import { wait } from '../utility/utilityHelpers'
13
+ import { WalletError } from '../sdk/WalletError'
14
+ import { Chaintracks } from '../services/chaintracker/chaintracks/Chaintracks'
15
+ dotenv.config()
16
+
17
+ const mainDojoConnection = process.env.MAIN_DOJO_CONNECTION || ''
18
+ const testDojoConnection = process.env.TEST_DOJO_CONNECTION || ''
19
+
20
+ export interface MonitorDaemonSetup {
21
+ chain?: Chain
22
+ sqliteFilename?: string
23
+ mySQLConnection?: string
24
+ knexConfig?: Knex.Config
25
+ knex?: Knex<any, any[]>
26
+ storageKnexOptions?: StorageKnexOptions
27
+ storageProvider?: StorageProvider
28
+ storageManager?: WalletStorageManager
29
+ servicesOptions?: WalletServicesOptions
30
+ services?: Services
31
+ monitor?: Monitor
32
+ chaintracks?: Chaintracks
33
+ }
34
+
35
+ export class MonitorDaemon {
36
+ setup?: MonitorDaemonSetup
37
+ doneListening?: Promise<void>
38
+ doneTasks?: Promise<void>
39
+ stopDaemon: boolean = false
40
+
41
+ constructor(
42
+ public args: MonitorDaemonSetup,
43
+ public noRunTasks?: boolean
44
+ ) {
45
+ /* */
46
+ }
47
+
48
+ async createSetup(): Promise<void> {
49
+ this.setup = { ...this.args }
50
+ const a = this.setup
51
+
52
+ if (!a.monitor) {
53
+ a.chain ||= 'test'
54
+
55
+ if (a.sqliteFilename) {
56
+ a.knexConfig = {
57
+ client: 'sqlite3',
58
+ connection: { filename: a.sqliteFilename },
59
+ useNullAsDefault: true
60
+ }
61
+ }
62
+
63
+ if (a.mySQLConnection) {
64
+ a.knexConfig = {
65
+ client: 'mysql2',
66
+ connection: JSON.parse(a.mySQLConnection),
67
+ useNullAsDefault: true,
68
+ pool: { min: 0, max: 7, idleTimeoutMillis: 15000 }
69
+ }
70
+ }
71
+
72
+ if (a.knexConfig) {
73
+ a.knex = makeKnex(a.knexConfig)
74
+ }
75
+
76
+ if (a.knex) {
77
+ a.storageKnexOptions = {
78
+ knex: a.knex,
79
+ chain: a.chain,
80
+ feeModel: { model: 'sat/kb', value: 1 },
81
+ commissionSatoshis: 0
82
+ }
83
+ }
84
+
85
+ if (a.storageKnexOptions) {
86
+ a.storageProvider = new StorageKnex(a.storageKnexOptions)
87
+ }
88
+
89
+ if (a.storageProvider) {
90
+ await a.storageProvider.makeAvailable()
91
+ const settings = await a.storageProvider.getSettings()
92
+ a.storageManager = new WalletStorageManager(settings.storageIdentityKey, a.storageProvider)
93
+ await a.storageManager.makeAvailable()
94
+ } else if (!a.storageManager) {
95
+ throw new WERR_INVALID_PARAMETER(
96
+ 'storageManager',
97
+ 'valid or one of mySQLConnection, knexConfig, knex, storageKnexOptions, or storageProvider'
98
+ )
99
+ }
100
+
101
+ if (a.servicesOptions) {
102
+ if (a.servicesOptions.chain != a.chain)
103
+ throw new WERR_INVALID_PARAMETER('serviceOptions.chain', 'same as args.chain')
104
+ a.servicesOptions.chaintracks ||= a.chaintracks
105
+ a.services = new Services(a.servicesOptions)
106
+ }
107
+
108
+ if (!a.services) {
109
+ a.services = new Services(a.chain)
110
+ }
111
+
112
+ a.storageManager.setServices(a.services)
113
+
114
+ const monitorOptions = Monitor.createDefaultWalletMonitorOptions(
115
+ a.chain,
116
+ a.storageManager,
117
+ a.services,
118
+ a.chaintracks
119
+ )
120
+ a.monitor = new Monitor(monitorOptions)
121
+ }
122
+
123
+ if (a.monitor._tasks.length === 0) {
124
+ a.monitor.addMultiUserTasks()
125
+ }
126
+ }
127
+
128
+ async start(): Promise<void> {
129
+ if (!this.setup) await this.createSetup()
130
+ if (!this.setup?.monitor) throw new WERR_INTERNAL('createSetup failed to initialize setup')
131
+
132
+ const { monitor } = this.setup
133
+
134
+ if (!this.noRunTasks) {
135
+ console.log('\n\nRunning startTasks\n\n')
136
+ this.doneTasks = monitor.startTasks()
137
+ }
138
+ }
139
+
140
+ async stop(): Promise<void> {
141
+ console.log('start of stop')
142
+
143
+ if (!this.setup || (!this.doneTasks && !this.noRunTasks) || !this.doneListening)
144
+ throw new WERR_INTERNAL('call start or createSetup first')
145
+
146
+ const { monitor } = this.setup
147
+
148
+ monitor!.stopTasks()
149
+
150
+ if (this.doneTasks) await this.doneTasks
151
+ this.doneTasks = undefined
152
+ await this.doneListening
153
+ this.doneListening = undefined
154
+ }
155
+
156
+ async destroy(): Promise<void> {
157
+ if (!this.setup) return
158
+ if (this.doneTasks || this.doneListening) await this.stop()
159
+ if (this.setup.storageProvider) this.setup.storageProvider.destroy()
160
+ this.setup = undefined
161
+ }
162
+
163
+ async runDaemon(): Promise<void> {
164
+ this.stopDaemon = false
165
+ for (;;) {
166
+ try {
167
+ await this.start()
168
+
169
+ while (!this.stopDaemon) {
170
+ await wait(10 * 1000)
171
+ }
172
+
173
+ console.log('stopping')
174
+
175
+ await this.stop()
176
+
177
+ console.log('cleanup')
178
+
179
+ await this.destroy()
180
+
181
+ console.log('done')
182
+ } catch (eu: unknown) {
183
+ const e = WalletError.fromUnknown(eu)
184
+ console.log(`\n\nrunWatchman Main Error Handler\n\ncode: ${e.code}\nDescription: ${e.description}\n\n\n`)
185
+ }
186
+ }
187
+ }
188
+ }
@@ -0,0 +1,3 @@
1
+ # Asynchronous Monitoring Service for Normal Wallet Operations
2
+
3
+ The principal purpsose of the monitoring service is to pursue broadcast of new transactions and the eventual acquisitioin of validity proof data for transactions once mined into a block on chain.
@@ -0,0 +1,45 @@
1
+ import { MonitorDaemon } from '../MonitorDaemon'
2
+ import { Chain } from '../../sdk/types'
3
+ import { Services } from '../../services/Services'
4
+ import { _tu } from '../../../test/utils/TestUtilsWalletStorage'
5
+ import { createDefaultNoDbChaintracksOptions } from '../../services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions'
6
+ import { Chaintracks } from '../../services/chaintracker/chaintracks/Chaintracks'
7
+
8
+ describe('MonitorDaemon tests', () => {
9
+ jest.setTimeout(99999999)
10
+
11
+ test('0 mainnet', async () => {
12
+ await test0Body('main')
13
+ })
14
+
15
+ test('0a testnet', async () => {
16
+ await test0Body('test')
17
+ })
18
+
19
+ async function test0Body(chain: Chain) {
20
+ const env = _tu.getEnv(chain)
21
+
22
+ const servicesOptions = Services.createDefaultOptions(chain)
23
+ if (env.taalApiKey) {
24
+ servicesOptions.taalApiKey = env.taalApiKey
25
+ servicesOptions.arcConfig.apiKey = env.taalApiKey
26
+ }
27
+ if (env.whatsonchainApiKey) servicesOptions.whatsOnChainApiKey = env.whatsonchainApiKey
28
+ if (env.bitailsApiKey) servicesOptions.bitailsApiKey = env.bitailsApiKey
29
+
30
+ const u = undefined
31
+ const maxRetained = 32
32
+ const chaintracksOptions = createDefaultNoDbChaintracksOptions(chain, env.whatsonchainApiKey, u, maxRetained)
33
+ const chaintracks = new Chaintracks(chaintracksOptions)
34
+ servicesOptions.chaintracks = chaintracks
35
+
36
+ const d = new MonitorDaemon({
37
+ chain: 'test',
38
+ mySQLConnection: env.cloudMySQLConnection,
39
+ servicesOptions,
40
+ chaintracks
41
+ })
42
+
43
+ await d.runDaemon()
44
+ }
45
+ })