@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,953 @@
1
+ # MONITOR: BSV Wallet Toolbox API Documentation
2
+
3
+ The documentation is split into various pages, this page covers the [Monitor](#class-monitor) and related API.
4
+
5
+ To function properly, a wallet must be able to perform a number of house keeping tasks:
6
+
7
+ 1. Ensure transactions are sent to the network without slowing application flow or when created while offline.
8
+ 1. Obtain and merge proofs when transactions are mined.
9
+ 1. Detect and propagate transactions that fail due to double-spend, reorgs, or other reasons.
10
+
11
+ These tasks are the responsibility of the [Monitor](#class-monitor) class.
12
+
13
+ [Return To Top](./README.md)
14
+
15
+ <!--#region ts2md-api-merged-here-->
16
+ ### API
17
+
18
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
19
+
20
+ #### Interfaces
21
+
22
+ | |
23
+ | --- |
24
+ | [DeactivedHeader](#interface-deactivedheader) |
25
+ | [MonitorDaemonSetup](#interface-monitordaemonsetup) |
26
+ | [MonitorOptions](#interface-monitoroptions) |
27
+ | [TaskPurgeParams](#interface-taskpurgeparams) |
28
+
29
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
30
+
31
+ ---
32
+
33
+ ##### Interface: DeactivedHeader
34
+
35
+ ```ts
36
+ export interface DeactivedHeader {
37
+ whenMsecs: number;
38
+ tries: number;
39
+ header: BlockHeader;
40
+ }
41
+ ```
42
+
43
+ See also: [BlockHeader](./client.md#interface-blockheader)
44
+
45
+ ###### Property header
46
+
47
+ The deactivated block header.
48
+
49
+ ```ts
50
+ header: BlockHeader
51
+ ```
52
+ See also: [BlockHeader](./client.md#interface-blockheader)
53
+
54
+ ###### Property tries
55
+
56
+ Number of attempts made to process the header.
57
+ Supports returning deactivation notification to the queue if proof data is not yet available.
58
+
59
+ ```ts
60
+ tries: number
61
+ ```
62
+
63
+ ###### Property whenMsecs
64
+
65
+ To control aging of notification before pursuing updated proof data.
66
+
67
+ ```ts
68
+ whenMsecs: number
69
+ ```
70
+
71
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
72
+
73
+ ---
74
+ ##### Interface: MonitorDaemonSetup
75
+
76
+ ```ts
77
+ export interface MonitorDaemonSetup {
78
+ chain?: Chain;
79
+ sqliteFilename?: string;
80
+ mySQLConnection?: string;
81
+ knexConfig?: Knex.Config;
82
+ knex?: Knex<any, any[]>;
83
+ storageKnexOptions?: StorageKnexOptions;
84
+ storageProvider?: StorageProvider;
85
+ storageManager?: WalletStorageManager;
86
+ servicesOptions?: WalletServicesOptions;
87
+ services?: Services;
88
+ monitor?: Monitor;
89
+ chaintracks?: Chaintracks;
90
+ }
91
+ ```
92
+
93
+ See also: [Chain](./client.md#type-chain), [Chaintracks](./services.md#class-chaintracks), [Monitor](./monitor.md#class-monitor), [Services](./services.md#class-services), [StorageKnexOptions](./storage.md#interface-storageknexoptions), [StorageProvider](./storage.md#class-storageprovider), [WalletServicesOptions](./client.md#interface-walletservicesoptions), [WalletStorageManager](./storage.md#class-walletstoragemanager)
94
+
95
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
96
+
97
+ ---
98
+ ##### Interface: MonitorOptions
99
+
100
+ ```ts
101
+ export interface MonitorOptions {
102
+ chain: Chain;
103
+ services: Services;
104
+ storage: MonitorStorage;
105
+ chaintracks: ChaintracksClientApi;
106
+ chaintracksWithEvents?: Chaintracks;
107
+ msecsWaitPerMerkleProofServiceReq: number;
108
+ taskRunWaitMsecs: number;
109
+ abandonedMsecs: number;
110
+ unprovenAttemptsLimitTest: number;
111
+ unprovenAttemptsLimitMain: number;
112
+ onTransactionBroadcasted?: (broadcastResult: ReviewActionResult) => Promise<void>;
113
+ onTransactionProven?: (txStatus: ProvenTransactionStatus) => Promise<void>;
114
+ }
115
+ ```
116
+
117
+ See also: [Chain](./client.md#type-chain), [Chaintracks](./services.md#class-chaintracks), [ChaintracksClientApi](./services.md#interface-chaintracksclientapi), [MonitorStorage](./monitor.md#type-monitorstorage), [ProvenTransactionStatus](./client.md#interface-proventransactionstatus), [ReviewActionResult](./client.md#interface-reviewactionresult), [Services](./services.md#class-services)
118
+
119
+ ###### Property msecsWaitPerMerkleProofServiceReq
120
+
121
+ How many msecs to wait after each getMerkleProof service request.
122
+
123
+ ```ts
124
+ msecsWaitPerMerkleProofServiceReq: number
125
+ ```
126
+
127
+ ###### Property onTransactionBroadcasted
128
+
129
+ These are hooks for a wallet-toolbox client to get transaction updates.
130
+
131
+ ```ts
132
+ onTransactionBroadcasted?: (broadcastResult: ReviewActionResult) => Promise<void>
133
+ ```
134
+ See also: [ReviewActionResult](./client.md#interface-reviewactionresult)
135
+
136
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
137
+
138
+ ---
139
+ ##### Interface: TaskPurgeParams
140
+
141
+ The database stores a variety of data that may be considered transient.
142
+
143
+ At one extreme, the data that must be preserved:
144
+ - unspent outputs (UTXOs)
145
+ - in-use metadata (labels, baskets, tags...)
146
+
147
+ At the other extreme, everything can be preserved to fully log all transaction creation and processing actions.
148
+
149
+ The following purge actions are available to support sustained operation:
150
+ - Failed transactions, delete all associated data including:
151
+ + Delete tag and label mapping records
152
+ + Delete output records
153
+ + Delete transaction records
154
+ + Delete mapi_responses records
155
+ + Delete proven_tx_reqs records
156
+ + Delete commissions records
157
+ + Update output records marked spentBy failed transactions
158
+ - Completed transactions, delete transient data including:
159
+ + transactions table set truncatedExternalInputs = null
160
+ + transactions table set beef = null
161
+ + transactions table set rawTx = null
162
+ + Delete mapi_responses records
163
+ + proven_tx_reqs table delete records
164
+
165
+ ```ts
166
+ export interface TaskPurgeParams extends PurgeParams {
167
+ }
168
+ ```
169
+
170
+ See also: [PurgeParams](./client.md#interface-purgeparams)
171
+
172
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
173
+
174
+ ---
175
+ #### Classes
176
+
177
+ | | |
178
+ | --- | --- |
179
+ | [Monitor](#class-monitor) | [TaskPurge](#class-taskpurge) |
180
+ | [MonitorDaemon](#class-monitordaemon) | [TaskReorg](#class-taskreorg) |
181
+ | [TaskCheckForProofs](#class-taskcheckforproofs) | [TaskReviewStatus](#class-taskreviewstatus) |
182
+ | [TaskCheckNoSends](#class-taskchecknosends) | [TaskSendWaiting](#class-tasksendwaiting) |
183
+ | [TaskClock](#class-taskclock) | [TaskSyncWhenIdle](#class-tasksyncwhenidle) |
184
+ | [TaskFailAbandoned](#class-taskfailabandoned) | [TaskUnFail](#class-taskunfail) |
185
+ | [TaskMonitorCallHistory](#class-taskmonitorcallhistory) | [WalletMonitorTask](#class-walletmonitortask) |
186
+ | [TaskNewHeader](#class-tasknewheader) | |
187
+
188
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
189
+
190
+ ---
191
+
192
+ ##### Class: Monitor
193
+
194
+ Background task to make sure transactions are processed, transaction proofs are received and propagated,
195
+ and potentially that reorgs update proofs that were already received.
196
+
197
+ ```ts
198
+ export class Monitor {
199
+ static createDefaultWalletMonitorOptions(chain: Chain, storage: MonitorStorage, services?: Services, chaintracks?: Chaintracks): MonitorOptions
200
+ options: MonitorOptions;
201
+ services: Services;
202
+ chain: Chain;
203
+ storage: MonitorStorage;
204
+ chaintracks: ChaintracksClientApi;
205
+ chaintracksWithEvents?: Chaintracks;
206
+ reorgSubscriptionPromise?: Promise<string>;
207
+ headersSubscriptionPromise?: Promise<string>;
208
+ onTransactionBroadcasted?: (broadcastResult: ReviewActionResult) => Promise<void>;
209
+ onTransactionProven?: (txStatus: ProvenTransactionStatus) => Promise<void>;
210
+ constructor(options: MonitorOptions)
211
+ async destroy(): Promise<void>
212
+ static readonly oneSecond = 1000;
213
+ static readonly oneMinute = 60 * Monitor.oneSecond;
214
+ static readonly oneHour = 60 * Monitor.oneMinute;
215
+ static readonly oneDay = 24 * Monitor.oneHour;
216
+ static readonly oneWeek = 7 * Monitor.oneDay;
217
+ _tasks: WalletMonitorTask[] = [];
218
+ _otherTasks: WalletMonitorTask[] = [];
219
+ _tasksRunning = false;
220
+ defaultPurgeParams: TaskPurgeParams = {
221
+ purgeSpent: false,
222
+ purgeCompleted: false,
223
+ purgeFailed: true,
224
+ purgeSpentAge: 2 * Monitor.oneWeek,
225
+ purgeCompletedAge: 2 * Monitor.oneWeek,
226
+ purgeFailedAge: 5 * Monitor.oneDay
227
+ };
228
+ addAllTasksToOther(): void
229
+ addDefaultTasks(): void
230
+ addMultiUserTasks(): void
231
+ addTask(task: WalletMonitorTask): void
232
+ removeTask(name: string): void
233
+ async runTask(name: string): Promise<string>
234
+ async runOnce(): Promise<void>
235
+ _runAsyncSetup: boolean = true;
236
+ _tasksRunningPromise?: PromiseLike<void>;
237
+ resolveCompletion: ((value: void | PromiseLike<void>) => void) | undefined = undefined;
238
+ async startTasks(): Promise<void>
239
+ async logEvent(event: string, details?: string): Promise<void>
240
+ stopTasks(): void
241
+ lastNewHeader: BlockHeader | undefined;
242
+ lastNewHeaderWhen: Date | undefined;
243
+ processNewBlockHeader(header: BlockHeader): void
244
+ callOnBroadcastedTransaction(broadcastResult: ReviewActionResult): void
245
+ callOnProvenTransaction(txStatus: ProvenTransactionStatus): void
246
+ deactivatedHeaders: DeactivedHeader[] = [];
247
+ processReorg(depth: number, oldTip: BlockHeader, newTip: BlockHeader, deactivatedHeaders?: BlockHeader[]): void
248
+ processHeader(header: BlockHeader): void
249
+ }
250
+ ```
251
+
252
+ See also: [BlockHeader](./client.md#interface-blockheader), [Chain](./client.md#type-chain), [Chaintracks](./services.md#class-chaintracks), [ChaintracksClientApi](./services.md#interface-chaintracksclientapi), [DeactivedHeader](./monitor.md#interface-deactivedheader), [MonitorOptions](./monitor.md#interface-monitoroptions), [MonitorStorage](./monitor.md#type-monitorstorage), [ProvenTransactionStatus](./client.md#interface-proventransactionstatus), [ReviewActionResult](./client.md#interface-reviewactionresult), [Services](./services.md#class-services), [TaskPurgeParams](./monitor.md#interface-taskpurgeparams), [WalletMonitorTask](./monitor.md#class-walletmonitortask)
253
+
254
+ ###### Property _otherTasks
255
+
256
+ _otherTasks can be run by runTask but not by scheduler.
257
+
258
+ ```ts
259
+ _otherTasks: WalletMonitorTask[] = []
260
+ ```
261
+ See also: [WalletMonitorTask](./monitor.md#class-walletmonitortask)
262
+
263
+ ###### Property _tasks
264
+
265
+ _tasks are typically run by the scheduler but may also be run by runTask.
266
+
267
+ ```ts
268
+ _tasks: WalletMonitorTask[] = []
269
+ ```
270
+ See also: [WalletMonitorTask](./monitor.md#class-walletmonitortask)
271
+
272
+ ###### Method addDefaultTasks
273
+
274
+ Default tasks with settings appropriate for a single user storage
275
+ possibly with sync'ing enabled
276
+
277
+ ```ts
278
+ addDefaultTasks(): void
279
+ ```
280
+
281
+ ###### Method addMultiUserTasks
282
+
283
+ Tasks appropriate for multi-user storage
284
+ without sync'ing enabled.
285
+
286
+ ```ts
287
+ addMultiUserTasks(): void
288
+ ```
289
+
290
+ ###### Method callOnBroadcastedTransaction
291
+
292
+ This is a function run from a TaskSendWaiting Monitor task.
293
+
294
+ This allows the user of wallet-toolbox to 'subscribe' for transaction broadcast updates.
295
+
296
+ ```ts
297
+ callOnBroadcastedTransaction(broadcastResult: ReviewActionResult): void
298
+ ```
299
+ See also: [ReviewActionResult](./client.md#interface-reviewactionresult)
300
+
301
+ ###### Method callOnProvenTransaction
302
+
303
+ This is a function run from a TaskCheckForProofs Monitor task.
304
+
305
+ This allows the user of wallet-toolbox to 'subscribe' for transaction updates.
306
+
307
+ ```ts
308
+ callOnProvenTransaction(txStatus: ProvenTransactionStatus): void
309
+ ```
310
+ See also: [ProvenTransactionStatus](./client.md#interface-proventransactionstatus)
311
+
312
+ ###### Method processHeader
313
+
314
+ Handler for new header events from Chaintracks.
315
+
316
+ To minimize reorg processing, new headers are aged before processing via TaskNewHeader.
317
+ Therefore this handler is intentionally a no-op.
318
+
319
+ ```ts
320
+ processHeader(header: BlockHeader): void
321
+ ```
322
+ See also: [BlockHeader](./client.md#interface-blockheader)
323
+
324
+ ###### Method processNewBlockHeader
325
+
326
+ Process new chain header event received from Chaintracks
327
+
328
+ Kicks processing 'unconfirmed' and 'unmined' request processing.
329
+
330
+ ```ts
331
+ processNewBlockHeader(header: BlockHeader): void
332
+ ```
333
+ See also: [BlockHeader](./client.md#interface-blockheader)
334
+
335
+ ###### Method processReorg
336
+
337
+ Process reorg event received from Chaintracks
338
+
339
+ Reorgs can move recent transactions to new blocks at new index positions.
340
+ Affected transaction proofs become invalid and must be updated.
341
+
342
+ It is possible for a transaction to become invalid.
343
+
344
+ Coinbase transactions always become invalid.
345
+
346
+ ```ts
347
+ processReorg(depth: number, oldTip: BlockHeader, newTip: BlockHeader, deactivatedHeaders?: BlockHeader[]): void
348
+ ```
349
+ See also: [BlockHeader](./client.md#interface-blockheader)
350
+
351
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
352
+
353
+ ---
354
+ ##### Class: MonitorDaemon
355
+
356
+ ```ts
357
+ export class MonitorDaemon {
358
+ setup?: MonitorDaemonSetup;
359
+ doneListening?: Promise<void>;
360
+ doneTasks?: Promise<void>;
361
+ stopDaemon: boolean = false;
362
+ constructor(public args: MonitorDaemonSetup, public noRunTasks?: boolean)
363
+ async createSetup(): Promise<void>
364
+ async start(): Promise<void>
365
+ async stop(): Promise<void>
366
+ async destroy(): Promise<void>
367
+ async runDaemon(): Promise<void>
368
+ }
369
+ ```
370
+
371
+ See also: [MonitorDaemonSetup](./monitor.md#interface-monitordaemonsetup)
372
+
373
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
374
+
375
+ ---
376
+ ##### Class: TaskCheckForProofs
377
+
378
+ `TaskCheckForProofs` is a WalletMonitor task that retreives merkle proofs for
379
+ transactions.
380
+
381
+ It is normally triggered by the Chaintracks new block header event.
382
+
383
+ When a new block is found, cwi-external-services are used to obtain proofs for
384
+ any transactions that are currently in the 'unmined' or 'unknown' state.
385
+
386
+ If a proof is obtained and validated, a new ProvenTx record is created and
387
+ the original ProvenTxReq status is advanced to 'notifying'.
388
+
389
+ ```ts
390
+ export class TaskCheckForProofs extends WalletMonitorTask {
391
+ static taskName = "CheckForProofs";
392
+ static checkNow = false;
393
+ constructor(monitor: Monitor, public triggerMsecs = 0)
394
+ trigger(nowMsecsSinceEpoch: number): {
395
+ run: boolean;
396
+ }
397
+ async runTask(): Promise<string>
398
+ }
399
+ ```
400
+
401
+ See also: [Monitor](./monitor.md#class-monitor), [WalletMonitorTask](./monitor.md#class-walletmonitortask)
402
+
403
+ ###### Property checkNow
404
+
405
+ An external service such as the chaintracks new block header
406
+ listener can set this true to cause
407
+
408
+ ```ts
409
+ static checkNow = false
410
+ ```
411
+
412
+ ###### Method trigger
413
+
414
+ Normally triggered by checkNow getting set by new block header found event from chaintracks
415
+
416
+ ```ts
417
+ trigger(nowMsecsSinceEpoch: number): {
418
+ run: boolean;
419
+ }
420
+ ```
421
+
422
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
423
+
424
+ ---
425
+ ##### Class: TaskCheckNoSends
426
+
427
+ `TaskCheckNoSends` is a WalletMonitor task that retreives merkle proofs for
428
+ 'nosend' transactions that MAY have been shared externally.
429
+
430
+ Unlike intentionally processed transactions, 'nosend' transactions are fully valid
431
+ transactions which have not been processed by the wallet.
432
+
433
+ By default, this task runs once a day to check if any 'nosend' transaction has
434
+ managed to get mined by some external process.
435
+
436
+ If a proof is obtained and validated, a new ProvenTx record is created and
437
+ the original ProvenTxReq status is advanced to 'notifying'.
438
+
439
+ ```ts
440
+ export class TaskCheckNoSends extends WalletMonitorTask {
441
+ static taskName = "CheckNoSends";
442
+ static checkNow = false;
443
+ constructor(monitor: Monitor, public triggerMsecs = Monitor.oneDay * 1)
444
+ trigger(nowMsecsSinceEpoch: number): {
445
+ run: boolean;
446
+ }
447
+ async runTask(): Promise<string>
448
+ }
449
+ ```
450
+
451
+ See also: [Monitor](./monitor.md#class-monitor), [WalletMonitorTask](./monitor.md#class-walletmonitortask)
452
+
453
+ ###### Property checkNow
454
+
455
+ An external service such as the chaintracks new block header
456
+ listener can set this true to cause
457
+
458
+ ```ts
459
+ static checkNow = false
460
+ ```
461
+
462
+ ###### Method trigger
463
+
464
+ Normally triggered by checkNow getting set by new block header found event from chaintracks
465
+
466
+ ```ts
467
+ trigger(nowMsecsSinceEpoch: number): {
468
+ run: boolean;
469
+ }
470
+ ```
471
+
472
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
473
+
474
+ ---
475
+ ##### Class: TaskClock
476
+
477
+ ```ts
478
+ export class TaskClock extends WalletMonitorTask {
479
+ static taskName = "Clock";
480
+ nextMinute: number;
481
+ constructor(monitor: Monitor, public triggerMsecs = 1 * Monitor.oneSecond)
482
+ trigger(nowMsecsSinceEpoch: number): {
483
+ run: boolean;
484
+ }
485
+ async runTask(): Promise<string>
486
+ getNextMinute(): number
487
+ }
488
+ ```
489
+
490
+ See also: [Monitor](./monitor.md#class-monitor), [WalletMonitorTask](./monitor.md#class-walletmonitortask)
491
+
492
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
493
+
494
+ ---
495
+ ##### Class: TaskFailAbandoned
496
+
497
+ Handles transactions which do not have terminal status and have not been
498
+ updated for an extended time period.
499
+
500
+ Calls `updateTransactionStatus` to set `status` to `failed`.
501
+ This returns inputs to spendable status and verifies that any
502
+ outputs are not spendable.
503
+
504
+ ```ts
505
+ export class TaskFailAbandoned extends WalletMonitorTask {
506
+ static taskName = "FailAbandoned";
507
+ constructor(monitor: Monitor, public triggerMsecs = 1000 * 60 * 5)
508
+ trigger(nowMsecsSinceEpoch: number): {
509
+ run: boolean;
510
+ }
511
+ async runTask(): Promise<string>
512
+ }
513
+ ```
514
+
515
+ See also: [Monitor](./monitor.md#class-monitor), [WalletMonitorTask](./monitor.md#class-walletmonitortask)
516
+
517
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
518
+
519
+ ---
520
+ ##### Class: TaskMonitorCallHistory
521
+
522
+ ```ts
523
+ export class TaskMonitorCallHistory extends WalletMonitorTask {
524
+ static taskName = "MonitorCallHistory";
525
+ constructor(monitor: Monitor, public triggerMsecs = Monitor.oneMinute * 12)
526
+ trigger(nowMsecsSinceEpoch: number): {
527
+ run: boolean;
528
+ }
529
+ async runTask(): Promise<string>
530
+ }
531
+ ```
532
+
533
+ See also: [Monitor](./monitor.md#class-monitor), [WalletMonitorTask](./monitor.md#class-walletmonitortask)
534
+
535
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
536
+
537
+ ---
538
+ ##### Class: TaskNewHeader
539
+
540
+ This task polls for new block headers performing two essential functions:
541
+ 1. The arrival of a new block is the right time to check for proofs for recently broadcast transactions.
542
+ 2. The height of the block is used to limit which proofs are accepted with the aim of avoiding re-orged proofs.
543
+
544
+ The most common new block orphan is one which is almost immediately orphaned.
545
+ Waiting a minute before pursuing proof requests avoids almost all the re-org work that could be done.
546
+ Thus this task queues new headers for one cycle.
547
+ If a new header arrives during that cycle, it replaces the queued header and delays again.
548
+ Only when there is an elapsed cycle without a new header does proof solicitation get triggered,
549
+ with that header height as the limit for which proofs are accepted.
550
+
551
+ ```ts
552
+ export class TaskNewHeader extends WalletMonitorTask {
553
+ static taskName = "NewHeader";
554
+ header?: BlockHeader;
555
+ queuedHeader?: BlockHeader;
556
+ queuedHeaderWhen?: Date;
557
+ constructor(monitor: Monitor, public triggerMsecs = 1 * Monitor.oneMinute)
558
+ async getHeader(): Promise<BlockHeader>
559
+ override async asyncSetup(): Promise<void>
560
+ trigger(nowMsecsSinceEpoch: number): {
561
+ run: boolean;
562
+ }
563
+ async runTask(): Promise<string>
564
+ }
565
+ ```
566
+
567
+ See also: [BlockHeader](./client.md#interface-blockheader), [Monitor](./monitor.md#class-monitor), [WalletMonitorTask](./monitor.md#class-walletmonitortask)
568
+
569
+ ###### Property header
570
+
571
+ This is always the most recent chain tip header returned from the chaintracker.
572
+
573
+ ```ts
574
+ header?: BlockHeader
575
+ ```
576
+ See also: [BlockHeader](./client.md#interface-blockheader)
577
+
578
+ ###### Property queuedHeader
579
+
580
+ Tracks the value of `header` except that it is set to undefined
581
+ when a cycle without a new header occurs and `processNewBlockHeader` is called.
582
+
583
+ ```ts
584
+ queuedHeader?: BlockHeader
585
+ ```
586
+ See also: [BlockHeader](./client.md#interface-blockheader)
587
+
588
+ ###### Method asyncSetup
589
+
590
+ TODO: This is a temporary incomplete solution for which a full chaintracker
591
+ with new header and reorg event notification is required.
592
+
593
+ New header events drive retrieving merklePaths for newly mined transactions.
594
+ This implementation performs this function.
595
+
596
+ Reorg events are needed to know when previously retrieved mekrlePaths need to be
597
+ updated in the proven_txs table (and ideally notifications delivered to users).
598
+ Note that in-general, a reorg only shifts where in the block a transaction is mined,
599
+ and sometimes which block. In the case of coinbase transactions, a transaction may
600
+ also fail after a reorg.
601
+
602
+ ```ts
603
+ override async asyncSetup(): Promise<void>
604
+ ```
605
+
606
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
607
+
608
+ ---
609
+ ##### Class: TaskPurge
610
+
611
+ ```ts
612
+ export class TaskPurge extends WalletMonitorTask {
613
+ static taskName = "Purge";
614
+ static checkNow = false;
615
+ constructor(monitor: Monitor, public params: TaskPurgeParams, public triggerMsecs = 0)
616
+ trigger(nowMsecsSinceEpoch: number): {
617
+ run: boolean;
618
+ }
619
+ async runTask(): Promise<string>
620
+ }
621
+ ```
622
+
623
+ See also: [Monitor](./monitor.md#class-monitor), [TaskPurgeParams](./monitor.md#interface-taskpurgeparams), [WalletMonitorTask](./monitor.md#class-walletmonitortask)
624
+
625
+ ###### Property checkNow
626
+
627
+ Set to true to trigger running this task
628
+
629
+ ```ts
630
+ static checkNow = false
631
+ ```
632
+
633
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
634
+
635
+ ---
636
+ ##### Class: TaskReorg
637
+
638
+ Check the `monitor.deactivatedHeaders` for any headers that have been deactivated.
639
+
640
+ When headers are found, review matching ProvenTx records and update proof data as appropriate.
641
+
642
+ New deactivated headers are pushed onto the `deactivatedHeaders` array.
643
+ They must be shifted out as they are processed.
644
+
645
+ The current implementation ages deactivation notifications by 10 minutes with each retry.
646
+ If a successful proof update confirms original proof data after 3 retries, the original is retained.
647
+
648
+ In normal operation there should rarely be any work for this task to perform.
649
+ The most common result is that there are no matching proven_txs records because
650
+ generating new proven_txs records intentionally lags new block generation to
651
+ minimize this disruption.
652
+
653
+ It is very disruptive to update a proven_txs record because:
654
+ - Sync'ed storage is impacted.
655
+ - Generated beefs are impacted.
656
+ - Updated proof data may be unavailable at the time a reorg is first reported.
657
+
658
+ Proper reorg handling also requires repairing invalid beefs for new transactions when
659
+ createAction fails to verify a generated beef against the chaintracker.
660
+
661
+ ```ts
662
+ export class TaskReorg extends WalletMonitorTask {
663
+ static taskName = "Reorg";
664
+ process: DeactivedHeader[] = [];
665
+ constructor(monitor: Monitor, public agedMsecs = Monitor.oneMinute * 10, public maxRetries = 3)
666
+ trigger(nowMsecsSinceEpoch: number): {
667
+ run: boolean;
668
+ }
669
+ async runTask(): Promise<string>
670
+ }
671
+ ```
672
+
673
+ See also: [DeactivedHeader](./monitor.md#interface-deactivedheader), [Monitor](./monitor.md#class-monitor), [WalletMonitorTask](./monitor.md#class-walletmonitortask)
674
+
675
+ ###### Method trigger
676
+
677
+ Shift aged deactivated headers onto `process` array.
678
+
679
+ ```ts
680
+ trigger(nowMsecsSinceEpoch: number): {
681
+ run: boolean;
682
+ }
683
+ ```
684
+
685
+ Returns
686
+
687
+ `run` true iff there are aged deactivated headers to process.
688
+
689
+ Argument Details
690
+
691
+ + **nowMsecsSinceEpoch**
692
+ + current time in milliseconds since epoch.
693
+
694
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
695
+
696
+ ---
697
+ ##### Class: TaskReviewStatus
698
+
699
+ Notify Transaction records of changes in ProvenTxReq records they may have missed.
700
+
701
+ The `notified` property flags reqs that do not need to be checked.
702
+
703
+ Looks for aged Transactions with provenTxId with status != 'completed', sets status to 'completed'.
704
+
705
+ Looks for reqs with 'invalid' status that have corresonding transactions with status other than 'failed'.
706
+
707
+ ```ts
708
+ export class TaskReviewStatus extends WalletMonitorTask {
709
+ static taskName = "ReviewStatus";
710
+ static checkNow = false;
711
+ constructor(monitor: Monitor, public triggerMsecs = 1000 * 60 * 15, public agedMsecs = 1000 * 60 * 5)
712
+ trigger(nowMsecsSinceEpoch: number): {
713
+ run: boolean;
714
+ }
715
+ async runTask(): Promise<string>
716
+ }
717
+ ```
718
+
719
+ See also: [Monitor](./monitor.md#class-monitor), [WalletMonitorTask](./monitor.md#class-walletmonitortask)
720
+
721
+ ###### Property checkNow
722
+
723
+ Set to true to trigger running this task
724
+
725
+ ```ts
726
+ static checkNow = false
727
+ ```
728
+
729
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
730
+
731
+ ---
732
+ ##### Class: TaskSendWaiting
733
+
734
+ ```ts
735
+ export class TaskSendWaiting extends WalletMonitorTask {
736
+ static taskName = "SendWaiting";
737
+ lastSendingRunMsecsSinceEpoch: number | undefined;
738
+ includeSending: boolean = true;
739
+ constructor(monitor: Monitor, public triggerMsecs = Monitor.oneSecond * 8, public agedMsecs = Monitor.oneSecond * 7, public sendingMsecs = Monitor.oneMinute * 5)
740
+ trigger(nowMsecsSinceEpoch: number): {
741
+ run: boolean;
742
+ }
743
+ async runTask(): Promise<string>
744
+ async processUnsent(reqApis: TableProvenTxReq[], indent = 0): Promise<string>
745
+ }
746
+ ```
747
+
748
+ See also: [Monitor](./monitor.md#class-monitor), [TableProvenTxReq](./storage.md#interface-tableproventxreq), [WalletMonitorTask](./monitor.md#class-walletmonitortask)
749
+
750
+ ###### Method processUnsent
751
+
752
+ Process an array of 'unsent' status table.ProvenTxReq
753
+
754
+ Send rawTx to transaction processor(s), requesting proof callbacks when possible.
755
+
756
+ Set status 'invalid' if req is invalid.
757
+
758
+ Set status to 'callback' on successful network submission with callback service.
759
+
760
+ Set status to 'unmined' on successful network submission without callback service.
761
+
762
+ Add mapi responses to database table if received.
763
+
764
+ Increments attempts if sending was attempted.
765
+
766
+ ```ts
767
+ async processUnsent(reqApis: TableProvenTxReq[], indent = 0): Promise<string>
768
+ ```
769
+ See also: [TableProvenTxReq](./storage.md#interface-tableproventxreq)
770
+
771
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
772
+
773
+ ---
774
+ ##### Class: TaskSyncWhenIdle
775
+
776
+ ```ts
777
+ export class TaskSyncWhenIdle extends WalletMonitorTask {
778
+ static taskName = "SyncWhenIdle";
779
+ constructor(monitor: Monitor, public triggerMsecs = 1000 * 60 * 1)
780
+ trigger(nowMsecsSinceEpoch: number): {
781
+ run: boolean;
782
+ }
783
+ async runTask(): Promise<string>
784
+ }
785
+ ```
786
+
787
+ See also: [Monitor](./monitor.md#class-monitor), [WalletMonitorTask](./monitor.md#class-walletmonitortask)
788
+
789
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
790
+
791
+ ---
792
+ ##### Class: TaskUnFail
793
+
794
+ Setting provenTxReq status to 'unfail' when 'invalid' will attempt to find a merklePath, and if successful:
795
+
796
+ 1. set the req status to 'unmined'
797
+ 2. set the referenced txs to 'unproven'
798
+ 3. determine if any inputs match user's existing outputs and if so update spentBy and spendable of those outputs.
799
+ 4. set the txs outputs to spendable
800
+
801
+ If it fails (to find a merklePath), returns the req status to 'invalid'.
802
+
803
+ ```ts
804
+ export class TaskUnFail extends WalletMonitorTask {
805
+ static taskName = "UnFail";
806
+ static checkNow = false;
807
+ constructor(monitor: Monitor, public triggerMsecs = Monitor.oneMinute * 10)
808
+ trigger(nowMsecsSinceEpoch: number): {
809
+ run: boolean;
810
+ }
811
+ async runTask(): Promise<string>
812
+ async unfail(reqs: TableProvenTxReq[], indent = 0): Promise<{
813
+ log: string;
814
+ }>
815
+ async unfailReq(req: EntityProvenTxReq, indent: number): Promise<string>
816
+ }
817
+ ```
818
+
819
+ See also: [EntityProvenTxReq](./storage.md#class-entityproventxreq), [Monitor](./monitor.md#class-monitor), [TableProvenTxReq](./storage.md#interface-tableproventxreq), [WalletMonitorTask](./monitor.md#class-walletmonitortask)
820
+
821
+ ###### Property checkNow
822
+
823
+ Set to true to trigger running this task
824
+
825
+ ```ts
826
+ static checkNow = false
827
+ ```
828
+
829
+ ###### Method unfailReq
830
+
831
+ 2. set the referenced txs to 'unproven'
832
+ 3. determine if any inputs match user's existing outputs and if so update spentBy and spendable of those outputs.
833
+ 4. set the txs outputs to spendable
834
+
835
+ ```ts
836
+ async unfailReq(req: EntityProvenTxReq, indent: number): Promise<string>
837
+ ```
838
+ See also: [EntityProvenTxReq](./storage.md#class-entityproventxreq)
839
+
840
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
841
+
842
+ ---
843
+ ##### Class: WalletMonitorTask
844
+
845
+ A monitor task performs some periodic or state triggered maintenance function
846
+ on the data managed by a wallet (Bitcoin UTXO manager, aka wallet)
847
+
848
+ The monitor maintains a collection of tasks.
849
+
850
+ It runs each task's non-asynchronous trigger to determine if the runTask method needs to run.
851
+
852
+ Tasks that need to be run are run consecutively by awaiting their async runTask override method.
853
+
854
+ The monitor then waits a fixed interval before repeating...
855
+
856
+ Tasks may use the monitor_events table to persist their execution history.
857
+ This is done by accessing the wathman.storage object.
858
+
859
+ ```ts
860
+ export abstract class WalletMonitorTask {
861
+ lastRunMsecsSinceEpoch = 0;
862
+ storage: MonitorStorage;
863
+ constructor(public monitor: Monitor, public name: string)
864
+ async asyncSetup(): Promise<void>
865
+ abstract trigger(nowMsecsSinceEpoch: number): {
866
+ run: boolean;
867
+ };
868
+ abstract runTask(): Promise<string>;
869
+ }
870
+ ```
871
+
872
+ See also: [Monitor](./monitor.md#class-monitor), [MonitorStorage](./monitor.md#type-monitorstorage)
873
+
874
+ ###### Property lastRunMsecsSinceEpoch
875
+
876
+ Set by monitor each time runTask completes
877
+
878
+ ```ts
879
+ lastRunMsecsSinceEpoch = 0
880
+ ```
881
+
882
+ ###### Method asyncSetup
883
+
884
+ Override to handle async task setup configuration.
885
+
886
+ Called before first call to `trigger`
887
+
888
+ ```ts
889
+ async asyncSetup(): Promise<void>
890
+ ```
891
+
892
+ ###### Method trigger
893
+
894
+ Return true if `runTask` needs to be called now.
895
+
896
+ ```ts
897
+ abstract trigger(nowMsecsSinceEpoch: number): {
898
+ run: boolean;
899
+ }
900
+ ```
901
+
902
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
903
+
904
+ ---
905
+ #### Functions
906
+
907
+ ##### Function: getProofs
908
+
909
+ Process an array of table.ProvenTxReq (typically with status 'unmined' or 'unknown')
910
+
911
+ If req is invalid, set status 'invalid'
912
+
913
+ Verify the requests are valid, lookup proofs or updated transaction status using the array of getProofServices,
914
+
915
+ When proofs are found, create new ProvenTxApi records and transition the requests' status to 'unconfirmed' or 'notifying',
916
+ depending on chaintracks succeeding on proof verification.
917
+
918
+ Increments attempts if proofs where requested.
919
+
920
+ ```ts
921
+ export async function getProofs(task: WalletMonitorTask, reqs: TableProvenTxReq[], indent = 0, countsAsAttempt = false, ignoreStatus = false, maxAcceptableHeight: number): Promise<{
922
+ proven: TableProvenTxReq[];
923
+ invalid: TableProvenTxReq[];
924
+ log: string;
925
+ }>
926
+ ```
927
+
928
+ See also: [TableProvenTxReq](./storage.md#interface-tableproventxreq), [WalletMonitorTask](./monitor.md#class-walletmonitortask)
929
+
930
+ Returns
931
+
932
+ reqs partitioned by status
933
+
934
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
935
+
936
+ ---
937
+ #### Types
938
+
939
+ ##### Type: MonitorStorage
940
+
941
+ ```ts
942
+ export type MonitorStorage = WalletStorageManager
943
+ ```
944
+
945
+ See also: [WalletStorageManager](./storage.md#class-walletstoragemanager)
946
+
947
+ Links: [API](#api), [Interfaces](#interfaces), [Classes](#classes), [Functions](#functions), [Types](#types), [Variables](#variables)
948
+
949
+ ---
950
+ #### Variables
951
+
952
+
953
+ <!--#endregion ts2md-api-merged-here-->