@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,48 @@
1
+ import { Monitor } from '../Monitor'
2
+ import { WalletMonitorTask } from './WalletMonitorTask'
3
+
4
+ /**
5
+ * Notify Transaction records of changes in ProvenTxReq records they may have missed.
6
+ *
7
+ * The `notified` property flags reqs that do not need to be checked.
8
+ *
9
+ * Looks for aged Transactions with provenTxId with status != 'completed', sets status to 'completed'.
10
+ *
11
+ * Looks for reqs with 'invalid' status that have corresonding transactions with status other than 'failed'.
12
+ */
13
+ export class TaskReviewStatus extends WalletMonitorTask {
14
+ static taskName = 'ReviewStatus'
15
+
16
+ /**
17
+ * Set to true to trigger running this task
18
+ */
19
+ static checkNow = false
20
+
21
+ constructor(
22
+ monitor: Monitor,
23
+ public triggerMsecs = 1000 * 60 * 15,
24
+ public agedMsecs = 1000 * 60 * 5
25
+ ) {
26
+ super(monitor, TaskReviewStatus.taskName)
27
+ }
28
+
29
+ trigger(nowMsecsSinceEpoch: number): { run: boolean } {
30
+ return {
31
+ run: this.triggerMsecs > 0 && nowMsecsSinceEpoch - this.lastRunMsecsSinceEpoch > this.triggerMsecs
32
+ }
33
+ }
34
+
35
+ async runTask(): Promise<string> {
36
+ let log = ''
37
+
38
+ const agedLimit = new Date(Date.now() - this.agedMsecs)
39
+ const r = await this.storage.runAsStorageProvider(async sp => {
40
+ const r = await sp.reviewStatus({ agedLimit })
41
+ return r
42
+ })
43
+
44
+ if (r.log.length > 0) log += `${r.log}`
45
+
46
+ return log
47
+ }
48
+ }
@@ -0,0 +1,122 @@
1
+ import { ReviewActionResult, SendWithResult } from '@bsv/sdk'
2
+ import { Monitor } from '../Monitor'
3
+ import { WalletMonitorTask } from './WalletMonitorTask'
4
+ import { attemptToPostReqsToNetwork } from '../../storage/methods/attemptToPostReqsToNetwork'
5
+ import { aggregateActionResults } from '../../utility/aggregateResults'
6
+ import { ProvenTxReqStatus } from '../../sdk/types'
7
+ import { verifyTruthy } from '../../utility/utilityHelpers'
8
+ import { TableProvenTxReq } from '../../storage/schema/tables/TableProvenTxReq'
9
+ import { EntityProvenTxReq } from '../../storage/schema/entities/EntityProvenTxReq'
10
+
11
+ export class TaskSendWaiting extends WalletMonitorTask {
12
+ static taskName = 'SendWaiting'
13
+
14
+ lastSendingRunMsecsSinceEpoch: number | undefined
15
+ includeSending: boolean = true
16
+
17
+ constructor(
18
+ monitor: Monitor,
19
+ public triggerMsecs = Monitor.oneSecond * 8,
20
+ public agedMsecs = Monitor.oneSecond * 7,
21
+ public sendingMsecs = Monitor.oneMinute * 5
22
+ ) {
23
+ super(monitor, TaskSendWaiting.taskName)
24
+ }
25
+
26
+ trigger(nowMsecsSinceEpoch: number): { run: boolean } {
27
+ this.includeSending =
28
+ !this.lastSendingRunMsecsSinceEpoch || nowMsecsSinceEpoch > this.lastSendingRunMsecsSinceEpoch + this.sendingMsecs
29
+ if (this.includeSending) this.lastSendingRunMsecsSinceEpoch = nowMsecsSinceEpoch
30
+ return {
31
+ run: nowMsecsSinceEpoch > this.lastRunMsecsSinceEpoch + this.triggerMsecs
32
+ }
33
+ }
34
+
35
+ async runTask(): Promise<string> {
36
+ let log = ''
37
+ const limit = 100
38
+ let offset = 0
39
+ const agedLimit = new Date(Date.now() - this.agedMsecs)
40
+ const status: ProvenTxReqStatus[] = this.includeSending ? ['unsent', 'sending'] : ['unsent']
41
+ for (;;) {
42
+ let reqs = await this.storage.findProvenTxReqs({
43
+ partial: {},
44
+ status,
45
+ paged: { limit, offset }
46
+ })
47
+ const count = reqs.length
48
+ if (reqs.length === 0) break
49
+ log += `${reqs.length} reqs with status ${status.join(' or ')}\n`
50
+ const agedReqs = reqs.filter(req => verifyTruthy(req.updated_at) < agedLimit)
51
+ log += ` Of those reqs, ${agedReqs.length} where last updated before ${agedLimit.toISOString()}.\n`
52
+ log += await this.processUnsent(agedReqs, 2)
53
+ if (count < limit) break
54
+ offset += limit
55
+ }
56
+ return log
57
+ }
58
+
59
+ /**
60
+ * Process an array of 'unsent' status table.ProvenTxReq
61
+ *
62
+ * Send rawTx to transaction processor(s), requesting proof callbacks when possible.
63
+ *
64
+ * Set status 'invalid' if req is invalid.
65
+ *
66
+ * Set status to 'callback' on successful network submission with callback service.
67
+ *
68
+ * Set status to 'unmined' on successful network submission without callback service.
69
+ *
70
+ * Add mapi responses to database table if received.
71
+ *
72
+ * Increments attempts if sending was attempted.
73
+ *
74
+ * @param reqApis
75
+ */
76
+ async processUnsent(reqApis: TableProvenTxReq[], indent = 0): Promise<string> {
77
+ let log = ''
78
+ for (let i = 0; i < reqApis.length; i++) {
79
+ const reqApi = reqApis[i]
80
+ log += ' '.repeat(indent)
81
+ log += `${i} reqId=${reqApi.provenTxReqId} attempts=${reqApi.attempts} txid=${reqApi.txid}: \n`
82
+ if (reqApi.status !== 'unsent' && reqApi.status !== 'sending') {
83
+ log += ` status now ${reqApi.status}\n`
84
+ continue
85
+ }
86
+ const req = new EntityProvenTxReq(reqApi)
87
+ const reqs: EntityProvenTxReq[] = []
88
+ if (req.batch) {
89
+ // Make sure wew process entire batch together for efficient beef generation
90
+ const batchReqApis = await this.storage.findProvenTxReqs({
91
+ partial: { batch: req.batch, status: 'unsent' }
92
+ })
93
+ for (const bra of batchReqApis) {
94
+ // Remove any matching batchReqApis from reqApis
95
+ const index = reqApis.findIndex(ra => ra.provenTxReqId === bra.provenTxReqId)
96
+ if (index > -1) reqApis.slice(index, index + 1)
97
+ // And add to reqs being processed now:
98
+ reqs.push(new EntityProvenTxReq(bra))
99
+ }
100
+ } else {
101
+ // Just a single non-batched req...
102
+ reqs.push(req)
103
+ }
104
+
105
+ const r = await this.storage.runAsStorageProvider(async sp => {
106
+ return attemptToPostReqsToNetwork(sp, reqs)
107
+ })
108
+
109
+ if (this.monitor.onTransactionBroadcasted) {
110
+ const rar = await this.storage.runAsStorageProvider(async sp => {
111
+ const ars: SendWithResult[] = [{ txid: req.txid, status: 'sending' }]
112
+ const { rar } = await aggregateActionResults(sp, ars, r)
113
+ return rar
114
+ })
115
+ this.monitor.callOnBroadcastedTransaction(rar[0])
116
+ }
117
+
118
+ log += r.log
119
+ }
120
+ return log
121
+ }
122
+ }
@@ -0,0 +1,26 @@
1
+ import { Monitor } from '../Monitor'
2
+ import { WalletMonitorTask } from './WalletMonitorTask'
3
+
4
+ export class TaskSyncWhenIdle extends WalletMonitorTask {
5
+ static taskName = 'SyncWhenIdle'
6
+
7
+ constructor(
8
+ monitor: Monitor,
9
+ public triggerMsecs = 1000 * 60 * 1
10
+ ) {
11
+ super(monitor, TaskSyncWhenIdle.taskName)
12
+ }
13
+
14
+ trigger(nowMsecsSinceEpoch: number): { run: boolean } {
15
+ const s = this.storage
16
+
17
+ const run = false
18
+
19
+ return { run }
20
+ }
21
+
22
+ async runTask(): Promise<string> {
23
+ // TODO...
24
+ return ''
25
+ }
26
+ }
@@ -0,0 +1,151 @@
1
+ import { Transaction, Utils } from '@bsv/sdk'
2
+ import { Monitor } from '../Monitor'
3
+ import { WalletMonitorTask } from './WalletMonitorTask'
4
+ import { TableProvenTxReq } from '../../storage/schema/tables'
5
+ import { EntityProvenTxReq } from '../../storage/schema/entities'
6
+ import { StorageProvider } from '../../index.client'
7
+
8
+ /**
9
+ * Setting provenTxReq status to 'unfail' when 'invalid' will attempt to find a merklePath, and if successful:
10
+ *
11
+ * 1. set the req status to 'unmined'
12
+ * 2. set the referenced txs to 'unproven'
13
+ * 3. determine if any inputs match user's existing outputs and if so update spentBy and spendable of those outputs.
14
+ * 4. set the txs outputs to spendable
15
+ *
16
+ * If it fails (to find a merklePath), returns the req status to 'invalid'.
17
+ */
18
+ export class TaskUnFail extends WalletMonitorTask {
19
+ static taskName = 'UnFail'
20
+
21
+ /**
22
+ * Set to true to trigger running this task
23
+ */
24
+ static checkNow = false
25
+
26
+ constructor(
27
+ monitor: Monitor,
28
+ public triggerMsecs = Monitor.oneMinute * 10
29
+ ) {
30
+ super(monitor, TaskUnFail.taskName)
31
+ }
32
+
33
+ trigger(nowMsecsSinceEpoch: number): { run: boolean } {
34
+ return {
35
+ run:
36
+ TaskUnFail.checkNow ||
37
+ (this.triggerMsecs > 0 && nowMsecsSinceEpoch - this.lastRunMsecsSinceEpoch > this.triggerMsecs)
38
+ }
39
+ }
40
+
41
+ async runTask(): Promise<string> {
42
+ let log = ''
43
+ TaskUnFail.checkNow = false
44
+
45
+ const limit = 100
46
+ let offset = 0
47
+ for (;;) {
48
+ const reqs = await this.storage.findProvenTxReqs({
49
+ partial: {},
50
+ status: ['unfail'],
51
+ paged: { limit, offset }
52
+ })
53
+ if (reqs.length === 0) break
54
+ log += `${reqs.length} reqs with status 'unfail'\n`
55
+ const r = await this.unfail(reqs, 2)
56
+ log += `${r.log}\n`
57
+ //console.log(log);
58
+ if (reqs.length < limit) break
59
+ offset += limit
60
+ }
61
+
62
+ return log
63
+ }
64
+
65
+ async unfail(reqs: TableProvenTxReq[], indent = 0): Promise<{ log: string }> {
66
+ let log = ''
67
+ for (const reqApi of reqs) {
68
+ const req = new EntityProvenTxReq(reqApi)
69
+ log += ' '.repeat(indent)
70
+ log += `reqId ${reqApi.provenTxReqId} txid ${reqApi.txid}: `
71
+ const r = await this.monitor.services.getMerklePath(req.txid)
72
+ if (r.merklePath) {
73
+ // 1. set the req status to 'unmined'
74
+ req.status = 'unmined'
75
+ req.attempts = 0
76
+ log += `unfailed. status is now 'unmined'\n`
77
+ log += await this.unfailReq(req, indent + 2)
78
+ } else {
79
+ req.status = 'invalid'
80
+ log += `returned to status 'invalid'\n`
81
+ }
82
+ await req.updateStorageDynamicProperties(this.storage)
83
+ }
84
+ return { log }
85
+ }
86
+
87
+ /**
88
+ * 2. set the referenced txs to 'unproven'
89
+ * 3. determine if any inputs match user's existing outputs and if so update spentBy and spendable of those outputs.
90
+ * 4. set the txs outputs to spendable
91
+ *
92
+ * @param req
93
+ * @param indent
94
+ * @returns
95
+ */
96
+ async unfailReq(req: EntityProvenTxReq, indent: number): Promise<string> {
97
+ let log = ''
98
+
99
+ const storage = this.storage
100
+ const services = this.monitor.services
101
+
102
+ const txIds = req.notify.transactionIds || []
103
+ for (const id of txIds) {
104
+ const bsvtx = Transaction.fromBinary(req.rawTx)
105
+ await this.storage.runAsStorageProvider(async sp => {
106
+ const spk = sp as StorageProvider
107
+ const tx = await sp.findTransactionById(id, undefined, true)
108
+ if (!tx) {
109
+ log += ' '.repeat(indent) + `transaction ${id} was not found\n`
110
+ return
111
+ }
112
+ await sp.updateTransaction(tx.transactionId, { status: 'unproven' })
113
+ tx.status = 'unproven'
114
+ log += ' '.repeat(indent) + `transaction ${id} status is now 'unproven'\n`
115
+ let vin = -1
116
+ for (const bi of bsvtx.inputs) {
117
+ vin++
118
+ const is = await sp.findOutputs({
119
+ partial: { userId: tx.userId, txid: bi.sourceTXID!, vout: bi.sourceOutputIndex }
120
+ })
121
+ if (is.length !== 1) {
122
+ log += ' '.repeat(indent + 2) + `input ${vin} not matched to user's outputs\n`
123
+ } else {
124
+ const oi = is[0]
125
+ log +=
126
+ ' '.repeat(indent + 2) +
127
+ `input ${vin} matched to output ${oi.outputId} updated spentBy ${tx.transactionId}\n`
128
+ await sp.updateOutput(oi.outputId, { spendable: false, spentBy: tx.transactionId })
129
+ }
130
+ }
131
+ const outputs = await sp.findOutputs({ partial: { userId: tx.userId, transactionId: tx.transactionId } })
132
+ for (const o of outputs) {
133
+ await spk.validateOutputScript(o)
134
+ if (!o.lockingScript) {
135
+ log += ' '.repeat(indent + 2) + `output ${o.outputId} does not have a valid locking script\n`
136
+ } else {
137
+ const isUtxo = await services.isUtxo(o)
138
+ if (isUtxo !== o.spendable) {
139
+ log += ' '.repeat(indent + 2) + `output ${o.outputId} set to ${isUtxo ? 'spendable' : 'spent'}\n`
140
+ await sp.updateOutput(o.outputId, { spendable: isUtxo })
141
+ } else {
142
+ log += ' '.repeat(indent + 2) + `output ${o.outputId} unchanged\n`
143
+ }
144
+ }
145
+ }
146
+ })
147
+ }
148
+
149
+ return log
150
+ }
151
+ }
@@ -0,0 +1,47 @@
1
+ import { MonitorStorage, Monitor } from '../Monitor'
2
+
3
+ /**
4
+ * A monitor task performs some periodic or state triggered maintenance function
5
+ * on the data managed by a wallet (Bitcoin UTXO manager, aka wallet)
6
+ *
7
+ * The monitor maintains a collection of tasks.
8
+ *
9
+ * It runs each task's non-asynchronous trigger to determine if the runTask method needs to run.
10
+ *
11
+ * Tasks that need to be run are run consecutively by awaiting their async runTask override method.
12
+ *
13
+ * The monitor then waits a fixed interval before repeating...
14
+ *
15
+ * Tasks may use the monitor_events table to persist their execution history.
16
+ * This is done by accessing the wathman.storage object.
17
+ */
18
+
19
+ export abstract class WalletMonitorTask {
20
+ /**
21
+ * Set by monitor each time runTask completes
22
+ */
23
+ lastRunMsecsSinceEpoch = 0
24
+
25
+ storage: MonitorStorage
26
+
27
+ constructor(
28
+ public monitor: Monitor,
29
+ public name: string
30
+ ) {
31
+ this.storage = monitor.storage
32
+ }
33
+
34
+ /**
35
+ * Override to handle async task setup configuration.
36
+ *
37
+ * Called before first call to `trigger`
38
+ */
39
+ async asyncSetup(): Promise<void> {}
40
+
41
+ /**
42
+ * Return true if `runTask` needs to be called now.
43
+ */
44
+ abstract trigger(nowMsecsSinceEpoch: number): { run: boolean }
45
+
46
+ abstract runTask(): Promise<string>
47
+ }
@@ -0,0 +1,18 @@
1
+ import {
2
+ GetPublicKeyArgs,
3
+ GetPublicKeyResult,
4
+ OriginatorDomainNameStringUnder250Bytes,
5
+ WalletDecryptArgs,
6
+ WalletDecryptResult,
7
+ WalletEncryptArgs,
8
+ WalletEncryptResult
9
+ } from '@bsv/sdk'
10
+
11
+ export interface CertOpsWallet {
12
+ getPublicKey(
13
+ args: GetPublicKeyArgs,
14
+ originator?: OriginatorDomainNameStringUnder250Bytes
15
+ ): Promise<GetPublicKeyResult>
16
+ encrypt(args: WalletEncryptArgs, originator?: OriginatorDomainNameStringUnder250Bytes): Promise<WalletEncryptResult>
17
+ decrypt(args: WalletDecryptArgs, originator?: OriginatorDomainNameStringUnder250Bytes): Promise<WalletDecryptResult>
18
+ }