@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,382 @@
1
+ import { WERR_INTERNAL, WERR_INVALID_PARAMETER, Chain } from '../../../../sdk'
2
+ import {
3
+ InsertHeaderResult,
4
+ ChaintracksStorageBaseOptions,
5
+ ChaintracksStorageIngestApi,
6
+ ChaintracksStorageQueryApi
7
+ } from '../Api/ChaintracksStorageApi'
8
+ import { BaseBlockHeader, BlockHeader, LiveBlockHeader } from '../Api/BlockHeaderApi'
9
+ import { HeightRange } from '../util/HeightRange'
10
+ import {
11
+ addWork,
12
+ convertBitsToWork,
13
+ deserializeBaseBlockHeaders,
14
+ isMoreWork,
15
+ serializeBaseBlockHeaders,
16
+ subWork
17
+ } from '../util/blockHeaderUtilities'
18
+ import { BulkFileDataManager } from '../util/BulkFileDataManager'
19
+ import { BulkFilesReaderStorage } from '../util/BulkFilesReader'
20
+ import { asArray } from '../../../../utility/utilityHelpers.noBuffer'
21
+ import { deserialize } from 'v8'
22
+
23
+ /**
24
+ * Required interface methods of a Chaintracks Storage Engine implementation.
25
+ */
26
+ export abstract class ChaintracksStorageBase implements ChaintracksStorageQueryApi, ChaintracksStorageIngestApi {
27
+ static createStorageBaseOptions(chain: Chain): ChaintracksStorageBaseOptions {
28
+ const options: ChaintracksStorageBaseOptions = {
29
+ chain,
30
+ liveHeightThreshold: 2000,
31
+ reorgHeightThreshold: 400,
32
+ bulkMigrationChunkSize: 500,
33
+ batchInsertLimit: 400,
34
+ bulkFileDataManager: undefined
35
+ }
36
+ return options
37
+ }
38
+
39
+ log: (...args: any[]) => void = () => {}
40
+
41
+ chain: Chain
42
+ liveHeightThreshold: number
43
+ reorgHeightThreshold: number
44
+ bulkMigrationChunkSize: number
45
+ batchInsertLimit: number
46
+
47
+ isAvailable: boolean = false
48
+ hasMigrated: boolean = false
49
+ bulkManager: BulkFileDataManager
50
+
51
+ constructor(options: ChaintracksStorageBaseOptions) {
52
+ this.chain = options.chain
53
+ this.liveHeightThreshold = options.liveHeightThreshold
54
+ this.reorgHeightThreshold = options.reorgHeightThreshold
55
+ this.bulkMigrationChunkSize = options.bulkMigrationChunkSize
56
+ this.batchInsertLimit = options.batchInsertLimit
57
+ this.bulkManager =
58
+ options.bulkFileDataManager || new BulkFileDataManager(BulkFileDataManager.createDefaultOptions(this.chain))
59
+ }
60
+ async shutdown(): Promise<void> {
61
+ /* base class does notning */
62
+ }
63
+
64
+ async makeAvailable(): Promise<void> {
65
+ if (this.isAvailable) return
66
+ this.isAvailable = true
67
+ }
68
+
69
+ async migrateLatest(): Promise<void> {
70
+ this.hasMigrated = true
71
+ }
72
+
73
+ async dropAllData(): Promise<void> {
74
+ await this.bulkManager.deleteBulkFiles()
75
+ await this.makeAvailable()
76
+ }
77
+
78
+ // Abstract functions to be defined by implementation classes
79
+
80
+ abstract deleteLiveBlockHeaders(): Promise<void>
81
+ abstract deleteOlderLiveBlockHeaders(maxHeight: number): Promise<number>
82
+ abstract findChainTipHeader(): Promise<LiveBlockHeader>
83
+ abstract findChainTipHeaderOrUndefined(): Promise<LiveBlockHeader | undefined>
84
+ abstract findLiveHeaderForBlockHash(hash: string): Promise<LiveBlockHeader | null>
85
+ abstract findLiveHeaderForHeaderId(headerId: number): Promise<LiveBlockHeader>
86
+ abstract findLiveHeaderForHeight(height: number): Promise<LiveBlockHeader | null>
87
+ abstract findLiveHeaderForMerkleRoot(merkleRoot: string): Promise<LiveBlockHeader | null>
88
+ abstract findLiveHeightRange(): Promise<HeightRange>
89
+ abstract findMaxHeaderId(): Promise<number>
90
+ abstract liveHeadersForBulk(count: number): Promise<LiveBlockHeader[]>
91
+ abstract getLiveHeaders(range: HeightRange): Promise<LiveBlockHeader[]>
92
+
93
+ /**
94
+ * @param header Header to attempt to add to live storage.
95
+ * @returns details of conditions found attempting to insert header
96
+ */
97
+ abstract insertHeader(header: BlockHeader): Promise<InsertHeaderResult>
98
+ abstract destroy(): Promise<void>
99
+
100
+ // BASE CLASS IMPLEMENTATIONS - MAY BE OVERRIDEN
101
+
102
+ async getBulkHeaders(range: HeightRange): Promise<Uint8Array> {
103
+ if (range.isEmpty) return new Uint8Array()
104
+
105
+ const fetch = this.bulkManager.fetch
106
+ const reader = await BulkFilesReaderStorage.fromStorage(this, fetch, range, range.length * 80)
107
+ const data = await reader.read()
108
+ if (!data) return new Uint8Array()
109
+ return data
110
+ }
111
+
112
+ async getHeadersUint8Array(height: number, count: number): Promise<Uint8Array> {
113
+ if (count <= 0) return new Uint8Array()
114
+ const ranges = await this.getAvailableHeightRanges()
115
+ const range = new HeightRange(height, height + count - 1)
116
+ const bulkRange = ranges.bulk.intersect(range)
117
+ const liveRange = ranges.live.intersect(range)
118
+
119
+ if (liveRange.isEmpty && bulkRange.isEmpty) return new Uint8Array()
120
+
121
+ const liveHeaders = await this.getLiveHeaders(liveRange)
122
+ const liveData = serializeBaseBlockHeaders(liveHeaders)
123
+ const bulkData = await this.getBulkHeaders(bulkRange)
124
+
125
+ const data = new Uint8Array(liveData.length + bulkData.length)
126
+
127
+ if (bulkData.length > 0) data.set(bulkData, 0)
128
+
129
+ if (liveData.length > 0) data.set(liveData, bulkData.length)
130
+
131
+ return data
132
+ }
133
+
134
+ async getHeaders(height: number, count: number): Promise<BaseBlockHeader[]> {
135
+ const data = await this.getHeadersUint8Array(height, count)
136
+ const headers = deserializeBaseBlockHeaders(data)
137
+ return headers
138
+ }
139
+
140
+ async deleteBulkBlockHeaders(): Promise<void> {
141
+ await this.bulkManager.deleteBulkFiles()
142
+ }
143
+
144
+ async getAvailableHeightRanges(): Promise<{ bulk: HeightRange; live: HeightRange }> {
145
+ await this.makeAvailable()
146
+ const bulk = await this.bulkManager.getHeightRange()
147
+ const live = await this.findLiveHeightRange()
148
+ if (bulk.isEmpty) {
149
+ if (!live.isEmpty && live.minHeight !== 0)
150
+ throw new Error('With empty bulk storage, live storage must start with genesis header.')
151
+ } else {
152
+ if (!bulk.isEmpty && bulk.minHeight != 0) throw new Error("Bulk storage doesn't start with genesis header.")
153
+ if (!live.isEmpty && !bulk.isEmpty && bulk.maxHeight + 1 !== live.minHeight)
154
+ throw new Error('There is a gap or overlap between bulk and live header storage.')
155
+ }
156
+ return { bulk, live }
157
+ }
158
+
159
+ private lastActiveMinHeight: number | undefined
160
+
161
+ async pruneLiveBlockHeaders(activeTipHeight: number): Promise<void> {
162
+ await this.makeAvailable()
163
+ try {
164
+ const minHeight = this.lastActiveMinHeight || (await this.findLiveHeightRange()).minHeight
165
+
166
+ let totalCount = activeTipHeight - minHeight + 1 - this.liveHeightThreshold
167
+ while (totalCount >= this.bulkMigrationChunkSize) {
168
+ const count = Math.min(totalCount, this.bulkMigrationChunkSize)
169
+ await this.migrateLiveToBulk(count)
170
+ totalCount -= count
171
+ this.lastActiveMinHeight = undefined
172
+ }
173
+ } catch (err: unknown) {
174
+ this.log(err)
175
+ throw err
176
+ }
177
+ }
178
+
179
+ async findChainTipHash(): Promise<string> {
180
+ await this.makeAvailable()
181
+ const tip = await this.findChainTipHeader()
182
+ return tip.hash
183
+ }
184
+
185
+ async findChainTipWork(): Promise<string> {
186
+ await this.makeAvailable()
187
+ const tip = await this.findChainTipHeader()
188
+ return tip.chainWork
189
+ }
190
+
191
+ async findChainWorkForBlockHash(hash: string): Promise<string> {
192
+ await this.makeAvailable()
193
+ const header = await this.findLiveHeaderForBlockHash(hash)
194
+ if (header !== null) return header.chainWork
195
+ throw new Error(`Header with hash of ${hash} was not found in the live headers database.`)
196
+ }
197
+
198
+ async findBulkFilesHeaderForHeightOrUndefined(height: number): Promise<BlockHeader | undefined> {
199
+ await this.makeAvailable()
200
+ return this.bulkManager.findHeaderForHeightOrUndefined(height)
201
+ }
202
+
203
+ async findHeaderForHeightOrUndefined(height: number): Promise<LiveBlockHeader | BlockHeader | undefined> {
204
+ await this.makeAvailable()
205
+ if (isNaN(height) || height < 0 || Math.ceil(height) !== height)
206
+ throw new WERR_INVALID_PARAMETER('height', `a non-negative integer (${height}).`)
207
+ const liveHeader = await this.findLiveHeaderForHeight(height)
208
+ if (liveHeader !== null) return liveHeader
209
+ const header = await this.findBulkFilesHeaderForHeightOrUndefined(height)
210
+ return header
211
+ }
212
+
213
+ async findHeaderForHeight(height: number): Promise<LiveBlockHeader | BlockHeader> {
214
+ await this.makeAvailable()
215
+ const header = await this.findHeaderForHeightOrUndefined(height)
216
+ if (header) return header
217
+ throw new Error(`Header with height of ${height} was not found.`)
218
+ }
219
+
220
+ async isMerkleRootActive(merkleRoot: string): Promise<boolean> {
221
+ await this.makeAvailable()
222
+ const header = await this.findLiveHeaderForMerkleRoot(merkleRoot)
223
+ return header ? header.isActive : false
224
+ }
225
+
226
+ async findCommonAncestor(header1: LiveBlockHeader, header2: LiveBlockHeader): Promise<LiveBlockHeader> {
227
+ await this.makeAvailable()
228
+ /*eslint no-constant-condition: ["error", { "checkLoops": false }]*/
229
+ while (true) {
230
+ if (header1.previousHeaderId === null || header2.previousHeaderId === null)
231
+ throw new Error('Reached start of live database without resolving the reorg.')
232
+ if (header1.previousHeaderId === header2.previousHeaderId)
233
+ return await this.findLiveHeaderForHeaderId(header1.previousHeaderId)
234
+ const backupHeader1 = header1.height >= header2.height
235
+ if (header2.height >= header1.height) header2 = await this.findLiveHeaderForHeaderId(header2.previousHeaderId)
236
+ if (backupHeader1) header1 = await this.findLiveHeaderForHeaderId(header1.previousHeaderId)
237
+ }
238
+ }
239
+
240
+ async findReorgDepth(header1: LiveBlockHeader, header2: LiveBlockHeader): Promise<number> {
241
+ await this.makeAvailable()
242
+ const ancestor = await this.findCommonAncestor(header1, header2)
243
+ return Math.max(header1.height, header2.height) - ancestor.height
244
+ }
245
+
246
+ private nowMigratingLiveToBulk = false
247
+
248
+ async migrateLiveToBulk(count: number, ignoreLimits = false): Promise<void> {
249
+ await this.makeAvailable()
250
+ if (!ignoreLimits && count > this.bulkMigrationChunkSize) return
251
+
252
+ if (this.nowMigratingLiveToBulk) {
253
+ this.log('Already migrating live to bulk.')
254
+ return
255
+ }
256
+
257
+ try {
258
+ this.nowMigratingLiveToBulk = true
259
+
260
+ const headers = await this.liveHeadersForBulk(count)
261
+
262
+ await this.addLiveHeadersToBulk(headers)
263
+
264
+ await this.deleteOlderLiveBlockHeaders(headers.slice(-1)[0].height)
265
+ } finally {
266
+ this.nowMigratingLiveToBulk = false
267
+ }
268
+ }
269
+
270
+ async addBulkHeaders(
271
+ headers: BlockHeader[],
272
+ bulkRange: HeightRange,
273
+ priorLiveHeaders: BlockHeader[]
274
+ ): Promise<BlockHeader[]> {
275
+ await this.makeAvailable()
276
+
277
+ if (!headers || headers.length === 0) return priorLiveHeaders
278
+
279
+ // Get the current extent of validated bulk and live block headers.
280
+ const before = await this.getAvailableHeightRanges()
281
+ const bulkFiles = this.bulkManager
282
+
283
+ // Review `headers`, applying the following rules:
284
+ // 1. Height must be outside the current bulk HeightRange.
285
+ // 2. Height must not exceed presentHeight - liveHeightThreshold. If presentHeight is unknown, use maximum height across all headers.
286
+ // 3. Compute chainWork for each header.
287
+ // 4. Verify chain of header hash and previousHash values. One header at each height. Retain chain with most chainWork.
288
+
289
+ const minHeight = !bulkRange.isEmpty ? bulkRange.minHeight : before.bulk.isEmpty ? 0 : before.bulk.maxHeight + 1
290
+ const filteredHeaders = headers.concat(priorLiveHeaders || []).filter(h => h.height >= minHeight)
291
+ const sortedHeaders = filteredHeaders.sort((a, b) => a.height - b.height)
292
+ const liveHeaders = sortedHeaders.filter(h => bulkRange.isEmpty || !bulkRange.contains(h.height))
293
+
294
+ if (liveHeaders.length === sortedHeaders.length) {
295
+ // All headers are live, no bulk headers to add.
296
+ return liveHeaders
297
+ }
298
+
299
+ const chains: AddBulkHeadersChain[] = []
300
+
301
+ for (const h of sortedHeaders) {
302
+ const dupe = chains.find(c => {
303
+ const lh = c.headers[c.headers.length - 1]
304
+ return lh.hash === h.hash
305
+ })
306
+ if (dupe) continue
307
+ const chainWork = convertBitsToWork(h.bits)
308
+ let chain = chains.find(c => {
309
+ const lh = c.headers[c.headers.length - 1]
310
+ return lh.height + 1 === h.height && lh.hash === h.previousHash
311
+ })
312
+ if (chain) {
313
+ chain.headers.push(h)
314
+ chain.chainWork = addWork(chain.chainWork, chainWork)
315
+ if (h.height <= bulkRange.maxHeight) {
316
+ chain.bulkChainWork = chain.chainWork
317
+ }
318
+ continue
319
+ }
320
+ // Since headers are assumed to be sorted by height,
321
+ // if this header doesn't extend an existing chain,
322
+ // it may be a branch from the previous header.
323
+ chain = chains.find(c => {
324
+ const lh = c.headers[c.headers.length - 2]
325
+ return lh.height + 1 === h.height && lh.hash === h.previousHash
326
+ })
327
+ if (chain) {
328
+ // This header competes with tip of `chain`.
329
+ // Create a new chain with this header as the tip.
330
+ const headers = chain.headers.slice(0, -1)
331
+ headers.push(h)
332
+ const otherHeaderChainWork = convertBitsToWork(chain.headers[chain.headers.length - 1].bits)
333
+ const newChainWork = addWork(subWork(chain.chainWork, otherHeaderChainWork), chainWork)
334
+ const newChain = {
335
+ headers,
336
+ chainWork: newChainWork,
337
+ bulkChainWork: h.height <= bulkRange.maxHeight ? newChainWork : undefined
338
+ }
339
+ chains.push(newChain)
340
+ continue
341
+ }
342
+ // Starting a new chain
343
+ chains.push({ headers: [h], chainWork, bulkChainWork: h.height <= bulkRange.maxHeight ? chainWork : undefined })
344
+ }
345
+
346
+ // Find the chain with the most chainWork.
347
+ const bestChain = chains.reduce((best, c) => (isMoreWork(c.chainWork, best.chainWork) ? c : best), chains[0])
348
+
349
+ const newBulkHeaders = bestChain.headers.slice(0, bulkRange.maxHeight - bestChain.headers[0].height + 1)
350
+
351
+ await this.addBulkHeadersFromBestChain(newBulkHeaders, bestChain)
352
+
353
+ return liveHeaders
354
+ }
355
+
356
+ private async addBulkHeadersFromBestChain(newBulkHeaders: BlockHeader[], bestChain: AddBulkHeadersChain) {
357
+ if (!bestChain.bulkChainWork) {
358
+ throw new WERR_INTERNAL(
359
+ `bulkChainWork is not defined for the best chain with height ${bestChain.headers[0].height}`
360
+ )
361
+ }
362
+ await this.bulkManager.mergeIncrementalBlockHeaders(newBulkHeaders, bestChain.bulkChainWork)
363
+ }
364
+
365
+ private async addLiveHeadersToBulk(liveHeaders: LiveBlockHeader[]) {
366
+ if (liveHeaders.length === 0) return
367
+ const lastChainWork = liveHeaders.slice(-1)[0].chainWork
368
+ await this.bulkManager.mergeIncrementalBlockHeaders(liveHeaders, lastChainWork)
369
+ }
370
+ }
371
+
372
+ interface AddBulkHeadersChain {
373
+ headers: BlockHeader[]
374
+ /**
375
+ * Total chainwork of headers.
376
+ */
377
+ chainWork: string
378
+ /**
379
+ * Total chainwork of headers with height not greater than maxBulkHeight.
380
+ */
381
+ bulkChainWork?: string
382
+ }