@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,203 @@
1
+ import { Setup } from '../../../src'
2
+ import { sdk, StorageSyncReader, wait } from '../../../src/index.client'
3
+ import { TaskCheckForProofs } from '../../../src/monitor/tasks/TaskCheckForProofs'
4
+ import { TaskClock } from '../../../src/monitor/tasks/TaskClock'
5
+ import { TaskNewHeader } from '../../../src/monitor/tasks/TaskNewHeader'
6
+ import { TaskPurge } from '../../../src/monitor/tasks/TaskPurge'
7
+ import { StorageMySQLDojoReader } from '../../../src/storage/sync'
8
+ import { _tu, TestSetup1Wallet } from '../../utils/TestUtilsWalletStorage'
9
+
10
+ import * as dotenv from 'dotenv'
11
+ dotenv.config()
12
+ const main_satoshi_shop = process.env.SATOSHI_SHOP_MAIN_IDENTITY || ''
13
+
14
+ /**
15
+ * NOTICE: These tests are designed to chain one after the other.
16
+ * Disable the "await WaitFor*()" lines to run them individually.
17
+ *
18
+ * The inital import from staging dojo takes around 100 seconds... be patient.
19
+ */
20
+ describe('Wallet sync tests', () => {
21
+ jest.setTimeout(99999999)
22
+
23
+ beforeAll(async () => {})
24
+
25
+ afterAll(async () => {})
26
+
27
+ let doWait = false
28
+ let done0 = false
29
+ const waitFor0 = async () => {
30
+ while (doWait && !done0) await wait(100)
31
+ }
32
+ let done1 = false
33
+ const waitFor1 = async () => {
34
+ while (doWait && !done1) await wait(100)
35
+ }
36
+ let done2 = false
37
+ const waitFor2 = async () => {
38
+ while (doWait && !done2) await wait(100)
39
+ }
40
+
41
+ const env = _tu.getEnv('test')
42
+ const identityKeyTone = '03ac2d10bdb0023f4145cc2eba2fcd2ad3070cb2107b0b48170c46a9440e4cc3fe'
43
+ const rootKeyHex = env.devKeys[identityKeyTone]
44
+
45
+ test('0 sync staging dojo to local MySQL', async () => {
46
+ console.log('Importing from staging dojo to local MySQL stagingdojotone')
47
+ const chain: sdk.Chain = 'test'
48
+ const connection = JSON.parse(process.env.TEST_DOJO_CONNECTION || '')
49
+ const readerKnex = _tu.createMySQLFromConnection(connection)
50
+ const reader = new StorageMySQLDojoReader({ chain, knex: readerKnex })
51
+ const writer = await _tu.createMySQLTestWallet({
52
+ databaseName: 'stagingdojotone',
53
+ chain: 'test',
54
+ rootKeyHex,
55
+ dropAll: true
56
+ })
57
+
58
+ const identityKey = writer.identityKey
59
+ await writer.storage.syncFromReader(identityKey, new StorageSyncReader({ identityKey }, reader))
60
+
61
+ await reader.destroy()
62
+ await writer.activeStorage.destroy()
63
+ done0 = true
64
+ })
65
+
66
+ test.skip('0a sync production dojo to local MySQL', async () => {
67
+ const chain: sdk.Chain = 'main'
68
+ const env = _tu.getEnv(chain)
69
+ console.log('Importing from production dojo to local MySQL productiondojotone')
70
+ const identityKey = main_satoshi_shop
71
+ const rootKeyHex = env.devKeys[identityKey]
72
+ const connection = JSON.parse(process.env.MAIN_DOJO_CONNECTION || '')
73
+ const readerKnex = _tu.createMySQLFromConnection(connection)
74
+ const reader = new StorageMySQLDojoReader({ chain, knex: readerKnex })
75
+ const writer = await _tu.createMySQLTestWallet({
76
+ databaseName: 'main_satoshi_shop',
77
+ chain: 'main',
78
+ rootKeyHex,
79
+ dropAll: true
80
+ })
81
+
82
+ await writer.storage.syncFromReader(identityKey, new StorageSyncReader({ identityKey }, reader))
83
+
84
+ await reader.destroy()
85
+ await writer.activeStorage.destroy()
86
+ })
87
+
88
+ test.skip('0b sweep mysql dojo sync to another wallet', async () => {
89
+ const chain: sdk.Chain = 'main'
90
+ const env = _tu.getEnv(chain)
91
+ // const prod_faucet = '030b78da8101cd8929ec355c694c275fbaf4f73d4eaa104873463779cac69a2a01' // prod faucet
92
+ // const identityKeyTone = process.env.MY_MAIN_IDENTITY || ''
93
+ const identityKey = main_satoshi_shop
94
+ const rootKeyHex = env.devKeys[identityKey]
95
+
96
+ const sweepFrom = await _tu.createMySQLTestWallet({
97
+ databaseName: 'main_satoshi_shop',
98
+ chain,
99
+ rootKeyHex
100
+ })
101
+
102
+ const sweepTo = await _tu.createTestWalletWithStorageClient({
103
+ rootKeyHex: env.devKeys[env.identityKey],
104
+ chain
105
+ })
106
+
107
+ //await sweepTo.activeStorage.updateProvenTxReq(2, { status: 'invalid' })
108
+ //await sweepTo.activeStorage.updateTransactionStatus('failed', 2)
109
+
110
+ await sweepFrom.wallet.sweepTo(sweepTo.wallet)
111
+
112
+ await sweepTo.wallet.destroy()
113
+ await sweepFrom.wallet.destroy()
114
+ })
115
+
116
+ test.skip('1 aggressively purge records from MySQL stagingdojotone', async () => {
117
+ await waitFor0()
118
+
119
+ const { monitor, activeStorage } = await _tu.createMySQLTestWallet({
120
+ databaseName: 'stagingdojotone',
121
+ chain: 'test',
122
+ rootKeyHex
123
+ })
124
+
125
+ {
126
+ const task = new TaskPurge(monitor, {
127
+ purgeCompleted: true,
128
+ purgeFailed: true,
129
+ purgeSpent: true,
130
+ purgeCompletedAge: 1,
131
+ purgeFailedAge: 1,
132
+ purgeSpentAge: 1
133
+ })
134
+ TaskPurge.checkNow = true
135
+ monitor._tasks.push(task)
136
+ await monitor.runTask('Purge')
137
+ }
138
+
139
+ await activeStorage.destroy()
140
+
141
+ done1 = true
142
+ })
143
+
144
+ test.skip('2 sync pruned MySQL stagingdojotone to SQLite walletLegacyTestData', async () => {
145
+ await waitFor1()
146
+ console.log('syncing local MySQL stagingdojotone to local SQLite walletLegacyTestData in tmp folder')
147
+ const reader = await _tu.createMySQLTestWallet({
148
+ databaseName: 'stagingdojotone',
149
+ chain: 'test',
150
+ rootKeyHex
151
+ })
152
+ const writer = await _tu.createSQLiteTestWallet({
153
+ databaseName: 'walletLegacyTestData',
154
+ chain: 'test',
155
+ rootKeyHex,
156
+ dropAll: true
157
+ })
158
+
159
+ const identityKey = writer.identityKey
160
+ await writer.storage.syncFromReader(identityKey, new StorageSyncReader({ identityKey }, reader.activeStorage))
161
+
162
+ await reader.activeStorage.destroy()
163
+ await writer.activeStorage.destroy()
164
+
165
+ console.log('REMEMBER: copy walletLegacyTestData.sqlite from tmp up to data!')
166
+ done2 = true
167
+ })
168
+
169
+ test.skip('3 sync pruned MySQL stagingdojotone to MySQL walletLegacyTestData', async () => {
170
+ await waitFor2()
171
+ console.log('syncing local MySQL stagingdojotone to local SQLite walletLegacyTestData in tmp folder')
172
+ const reader = await _tu.createMySQLTestWallet({
173
+ databaseName: 'stagingdojotone',
174
+ chain: 'test',
175
+ rootKeyHex
176
+ })
177
+ const writer = await _tu.createMySQLTestWallet({
178
+ databaseName: 'walletLegacyTestData',
179
+ chain: 'test',
180
+ rootKeyHex,
181
+ dropAll: true
182
+ })
183
+
184
+ const identityKey = writer.identityKey
185
+ await writer.storage.syncFromReader(identityKey, new StorageSyncReader({ identityKey }, reader.activeStorage))
186
+
187
+ await reader.activeStorage.destroy()
188
+ await writer.activeStorage.destroy()
189
+ })
190
+
191
+ test('8b run monitor mainnet', async () => {
192
+ if (Setup.noEnv('main')) return
193
+ if (!Setup.getEnv('main').filePath) return
194
+
195
+ // Only run if `Setup` style .env is present with a sqlite filePath...
196
+
197
+ const c = await _tu.createWalletSetupEnv('main')
198
+
199
+ await c.monitor.runOnce()
200
+
201
+ await c.wallet.destroy()
202
+ })
203
+ })
@@ -0,0 +1,170 @@
1
+ import knex from 'knex'
2
+ import { sdk, Setup, StorageKnex, wait } from '../../../src'
3
+ import { _tu, logger, TestWalletNoSetup } from '../../utils/TestUtilsWalletStorage'
4
+
5
+ let done0 = false
6
+ const waitFor0 = async () => {
7
+ while (!done0) await wait(100)
8
+ }
9
+ let done1 = false
10
+ const waitFor1 = async () => {
11
+ while (!done1) await wait(100)
12
+ }
13
+ let done2 = false
14
+ const waitFor2 = async () => {
15
+ while (!done2) await wait(100)
16
+ }
17
+
18
+ describe('setActive tests', () => {
19
+ jest.setTimeout(99999999)
20
+
21
+ const env = _tu.getEnv('test')
22
+ const chain = env.chain
23
+ const rootKeyHex = env.devKeys[env.identityKey]
24
+ let setup: {
25
+ a: TestWalletNoSetup
26
+ b: TestWalletNoSetup
27
+ c: TestWalletNoSetup
28
+ }
29
+ let store: { a: StorageKnex; b: StorageKnex; c: StorageKnex }
30
+ let storeKey: { a: string; b: string; c: string }
31
+ const testName = () => expect.getState().currentTestName || 'test'
32
+
33
+ beforeEach(async () => {
34
+ const a = await _tu.createSQLiteTestWallet({
35
+ databaseName: `${testName()}_a`,
36
+ chain,
37
+ rootKeyHex,
38
+ dropAll: true
39
+ })
40
+ const b = await _tu.createSQLiteTestWallet({
41
+ databaseName: `${testName()}_b`,
42
+ chain,
43
+ rootKeyHex,
44
+ dropAll: true
45
+ })
46
+ const c = await _tu.createSQLiteTestWallet({
47
+ databaseName: `${testName()}_c`,
48
+ chain,
49
+ rootKeyHex,
50
+ dropAll: true
51
+ })
52
+ setup = { a, b, c }
53
+ store = { a: a.activeStorage, b: b.activeStorage, c: c.activeStorage }
54
+ storeKey = {
55
+ a: store.a._settings!.storageIdentityKey,
56
+ b: store.b._settings!.storageIdentityKey,
57
+ c: store.c._settings!.storageIdentityKey
58
+ }
59
+ })
60
+
61
+ afterEach(async () => {
62
+ await setup.a.wallet.destroy()
63
+ await setup.b.wallet.destroy()
64
+ await setup.c.wallet.destroy()
65
+ })
66
+
67
+ test('0 cycle active over three new sqlite wallets', async () => {
68
+ const s = await _tu.createWalletOnly({
69
+ chain,
70
+ rootKeyHex,
71
+ active: store.a,
72
+ backups: [store.b, store.c]
73
+ })
74
+ let first: boolean = true
75
+ for (const active of [storeKey.b, storeKey.c, storeKey.a]) {
76
+ expect(s.storage.isAvailable() === true)
77
+ expect(s.storage.isActiveEnabled === !first)
78
+ const log = await s.storage.setActive(active)
79
+ logger(log)
80
+ expect(s.storage.getActiveStore()).toBe(active)
81
+ expect(s.storage.isActiveEnabled === true)
82
+ first = false
83
+ }
84
+ })
85
+
86
+ test.skip('1 setActive on main storage wallet with local backup', async () => {
87
+ const chain: sdk.Chain = 'main'
88
+ if (Setup.noEnv(chain)) return
89
+ const env = _tu.getEnv(chain)
90
+ if (!env.filePath) return
91
+
92
+ try {
93
+ const s = await _tu.createTestWallet({
94
+ chain,
95
+ rootKeyHex: env.devKeys[env.identityKey],
96
+ filePath: env.filePath,
97
+ setActiveClient: true,
98
+ addLocalBackup: false,
99
+ useMySQLConnectionForClient: true
100
+ })
101
+
102
+ {
103
+ const log = await s.storage.setActive(s.clientStorageIdentityKey!)
104
+ logger(log)
105
+ }
106
+ {
107
+ const log = await s.storage.setActive(s.localStorageIdentityKey!)
108
+ logger(log)
109
+ }
110
+ {
111
+ const log = await s.storage.setActive(s.clientStorageIdentityKey!)
112
+ logger(log)
113
+ }
114
+ expect(s.storage.isActiveEnabled)
115
+
116
+ await s.wallet.destroy()
117
+ } finally {
118
+ done1 = true
119
+ }
120
+ })
121
+
122
+ test.skip('2 setActive between two local backups', async () => {
123
+ await waitFor1()
124
+ try {
125
+ if (Setup.noEnv('main')) return
126
+ const env = _tu.getEnv('main')
127
+ const s = await _tu.createKnexTestWallet({
128
+ knex: _tu.createLocalSQLite(env.filePath!),
129
+ databaseName: `envFilePath for ${env.identityKey}`,
130
+ chain: env.chain
131
+ })
132
+ const envStorageIdentityKey = s.storage.getActiveStore()
133
+ const filePath = '/Users/tone/Kz/tone42_backup.sqlite'
134
+ const localStore = (
135
+ await _tu.createKnexTestWallet({
136
+ knex: _tu.createLocalSQLite(filePath),
137
+ databaseName: `sqlite for ${env.identityKey}`,
138
+ chain: env.chain
139
+ })
140
+ ).activeStorage
141
+ await s.storage.addWalletStorageProvider(localStore)
142
+ {
143
+ const log = await s.storage.setActive(envStorageIdentityKey)
144
+ logger(log)
145
+ }
146
+ {
147
+ const log = await s.storage.setActive(localStore._settings!.storageIdentityKey)
148
+ logger(log)
149
+ }
150
+ {
151
+ const log = await s.storage.setActive(envStorageIdentityKey)
152
+ logger(log)
153
+ }
154
+ expect(s.storage.isActiveEnabled)
155
+ await s.wallet.destroy()
156
+ } finally {
157
+ done2 = true
158
+ }
159
+ })
160
+
161
+ test.skip('3 compare wallet balances', async () => {
162
+ await waitFor2()
163
+ const chain: sdk.Chain = 'test'
164
+ if (Setup.noEnv(chain)) return
165
+
166
+ const s = await _tu.createTestWallet(chain)
167
+
168
+ await s.wallet.destroy()
169
+ })
170
+ })
@@ -0,0 +1,114 @@
1
+ import { LocalKVStore, WalletClient } from '@bsv/sdk'
2
+ import { Chain } from '../../src/sdk/types'
3
+ import { createSetup, LocalWalletTestOptions } from '../utils/localWalletMethods'
4
+
5
+ const chain: Chain = 'main'
6
+
7
+ const options: LocalWalletTestOptions = {
8
+ setActiveClient: true,
9
+ useMySQLConnectionForClient: true,
10
+ useTestIdentityKey: false,
11
+ useIdentityKey2: false
12
+ }
13
+
14
+ describe('LocalKVStore tests', () => {
15
+ jest.setTimeout(99999999)
16
+
17
+ test('0 unencrypted Wallet', async () => {
18
+ const originator = 'wallet-toolbox.tests'
19
+ const setup = await createSetup(chain, options)
20
+ const { wallet } = setup
21
+
22
+ const basket = 'kvstoretest5'
23
+ const kv = new LocalKVStore(wallet, basket, false, originator)
24
+
25
+ const r1 = await kv.set('a', 'apple')
26
+ expect(r1).toBeTruthy() // the outpoint of the new stored value
27
+ const r1a = await kv.set('a', 'apple')
28
+ expect(r1a).toBe(r1) // same value must return same outpoint
29
+ const r2 = await kv.get('a')
30
+ expect(r2).toBe('apple')
31
+ const r3 = await kv.get('b', 'banana')
32
+ expect(r3).toBe('banana')
33
+ const r4 = await kv.remove('b')
34
+ expect(r4.length).toBe(0)
35
+ const r5 = await kv.remove('a')
36
+ expect(r5.length).toBe(1)
37
+ const lor = await wallet.listOutputs({ basket })
38
+ expect(lor.totalOutputs).toBe(0)
39
+
40
+ await wallet.destroy()
41
+ })
42
+
43
+ test('1 unencrypted Wallet', async () => {
44
+ const originator = 'wallet-toolbox.tests'
45
+ const setup = await createSetup(chain, options)
46
+ const { wallet } = setup
47
+
48
+ const basket = 'kvstoretest6'
49
+ const kv = new LocalKVStore(wallet, basket, true, originator)
50
+
51
+ const r1 = await kv.set('a', 'apple')
52
+ expect(r1).toBeTruthy() // the outpoint of the new stored value
53
+ const r1a = await kv.set('a', 'apple')
54
+ expect(r1a).toBe(r1) // same value must return same outpoint
55
+ const r2 = await kv.get('a')
56
+ expect(r2).toBe('apple')
57
+ const r3 = await kv.get('b', 'banana')
58
+ expect(r3).toBe('banana')
59
+ const r4 = await kv.remove('b')
60
+ expect(r4.length).toBe(0)
61
+ const r5 = await kv.remove('a')
62
+ expect(r5.length).toBe(1)
63
+ const lor = await wallet.listOutputs({ basket })
64
+ expect(lor.totalOutputs).toBe(0)
65
+
66
+ await wallet.destroy()
67
+ })
68
+
69
+ test('0a unencrypted WalletClient', async () => {
70
+ const originator = 'wallet-toolbox.tests'
71
+ const wallet = new WalletClient(undefined, originator)
72
+
73
+ const basket = 'kvstoretest7'
74
+ const kv = new LocalKVStore(wallet, basket, false, originator)
75
+
76
+ const r1 = await kv.set('a', 'apple')
77
+ expect(r1).toBeTruthy() // the outpoint of the new stored value
78
+ const r1a = await kv.set('a', 'apple')
79
+ expect(r1a).toBe(r1) // same value must return same outpoint
80
+ const r2 = await kv.get('a')
81
+ expect(r2).toBe('apple')
82
+ const r3 = await kv.get('b', 'banana')
83
+ expect(r3).toBe('banana')
84
+ const r4 = await kv.remove('b')
85
+ expect(r4.length).toBe(0)
86
+ const r5 = await kv.remove('a')
87
+ expect(r5.length).toBe(1)
88
+ const lor = await wallet.listOutputs({ basket })
89
+ expect(lor.totalOutputs).toBe(0)
90
+ })
91
+
92
+ test('1a unencrypted WalletClient', async () => {
93
+ const originator = 'wallet-toolbox.tests'
94
+ const wallet = new WalletClient(undefined, originator)
95
+
96
+ const basket = 'kvstoretest8'
97
+ const kv = new LocalKVStore(wallet, basket, true, originator)
98
+
99
+ const r1 = await kv.set('a', 'apple')
100
+ expect(r1).toBeTruthy() // the outpoint of the new stored value
101
+ const r1a = await kv.set('a', 'apple')
102
+ expect(r1a).toBe(r1) // same value must return same outpoint
103
+ const r2 = await kv.get('a')
104
+ expect(r2).toBe('apple')
105
+ const r3 = await kv.get('b', 'banana')
106
+ expect(r3).toBe('banana')
107
+ const r4 = await kv.remove('b')
108
+ expect(r4.length).toBe(0)
109
+ const r5 = await kv.remove('a')
110
+ expect(r5.length).toBe(1)
111
+ const lor = await wallet.listOutputs({ basket })
112
+ expect(lor.totalOutputs).toBe(0)
113
+ })
114
+ })
@@ -0,0 +1,35 @@
1
+ import { Validation as V, CreateActionArgs, WalletClient } from '@bsv/sdk'
2
+ import { specOpThrowReviewActions } from '../../src/sdk/types'
3
+ import { WalletError } from '../../src/sdk/WalletError'
4
+ import { WERR_REVIEW_ACTIONS } from '../../src/sdk/WERR_errors'
5
+ import { WalletErrorFromJson } from '../../src/sdk'
6
+
7
+ describe('WERR.man tests', () => {
8
+ jest.setTimeout(99999999)
9
+
10
+ test('0 WERR_REVIEW_ACTIONS via WalletClient', async () => {
11
+ const wallet = new WalletClient('auto', '0.WERR.man.test')
12
+
13
+ const args: CreateActionArgs = {
14
+ labels: [specOpThrowReviewActions],
15
+ description: 'must throw'
16
+ }
17
+ const vargs = V.validateCreateActionArgs(args)
18
+
19
+ try {
20
+ const r = await wallet.createAction(args)
21
+ expect(true).toBe(false)
22
+ } catch (eu: unknown) {
23
+ const e = WalletError.fromUnknown(eu) as WERR_REVIEW_ACTIONS
24
+ expect(e.code).toBe('WERR_REVIEW_ACTIONS')
25
+ expect(e.reviewActionResults).toBeTruthy()
26
+ }
27
+ })
28
+
29
+ test('1', async () => {
30
+ const s = `{\"isError\":true,\"name\":\"WERR_REVIEW_ACTIONS\",\"reviewActionResults\":[{\"txid\":\"344556f1c428367689e09e29aa4dc7cfe755db1fab5cf7c1cf8d1f99b507004b\",\"status\":\"doubleSpend\",\"competingTxs\":[\"344556f1c428367689e09e29aa4dc7cfe755db1fab5cf7c1cf8d1f99b507004b\"],\"competingBeef\":[1,0,190,239,1,254,12,52,25,0,3,2,2,2,13,153,15,202,45,179,254,102,34,161,222,144,207,214,224,219,57,76,176,248,213,137,238,7,63,67,204,253,45,62,70,190,3,0,206,69,142,120,152,200,85,221,140,68,16,34,144,39,29,181,67,66,245,76,24,46,209,253,246,204,133,193,175,188,98,241,2,0,0,119,165,81,236,153,173,143,252,69,138,209,229,97,189,36,123,84,160,234,127,63,185,82,5,26,106,157,73,26,107,32,100,1,0,143,243,215,201,227,2,63,39,103,57,216,42,131,190,76,56,216,43,104,59,7,4,174,137,191,49,49,128,249,252,45,42,2,0,0,25,6,223,99,50,23,119,231,67,155,160,205,224,45,74,194,190,202,18,106,135,17,234,165,66,245,89,135,90,255,10,227,1,0,35,96,209,29,146,83,58,174,231,36,40,57,137,94,136,75,149,86,89,160,195,121,92,180,37,191,31,187,23,71,219,209,2,1,0,0,0,2,1,247,147,92,34,59,244,55,220,70,138,231,75,160,174,137,68,202,34,151,142,102,170,47,246,106,0,25,152,90,245,197,0,0,0,0,106,71,48,68,2,32,23,143,242,5,200,252,85,12,167,137,194,54,96,107,40,141,240,219,145,62,182,133,119,224,94,146,94,249,214,213,212,121,2,32,15,130,24,137,152,12,86,54,141,67,39,178,80,29,110,48,77,114,212,69,237,139,89,152,246,124,138,91,19,32,71,43,65,33,3,16,229,154,223,195,210,19,58,106,26,124,66,99,139,137,43,164,213,109,60,35,235,32,30,122,36,252,12,131,190,69,63,255,255,255,255,1,247,147,92,34,59,244,55,220,70,138,231,75,160,174,137,68,202,34,151,142,102,170,47,246,106,0,25,152,90,245,197,2,0,0,0,107,72,48,69,2,33,0,154,55,50,224,237,75,147,58,95,164,173,104,149,13,24,125,198,35,126,194,134,91,150,238,179,25,192,213,136,196,51,66,2,32,98,84,153,139,248,106,241,122,65,180,241,124,30,233,140,74,172,74,217,165,129,143,127,156,49,230,34,46,188,15,28,52,65,33,2,146,89,63,53,57,196,48,37,118,17,182,193,201,75,44,105,67,181,136,23,25,104,127,48,146,231,88,99,197,53,56,239,255,255,255,255,2,225,3,0,0,0,0,0,0,25,118,169,20,255,161,196,19,38,201,6,21,136,26,207,151,137,162,75,232,58,201,53,88,136,172,1,0,0,0,0,0,0,0,25,118,169,20,39,140,42,205,54,197,3,247,165,173,16,224,138,193,127,34,191,29,126,7,136,172,0,0,0,0,1,0,1,0,0,0,1,13,153,15,202,45,179,254,102,34,161,222,144,207,214,224,219,57,76,176,248,213,137,238,7,63,67,204,253,45,62,70,190,0,0,0,0,106,71,48,68,2,32,113,14,233,125,141,249,154,234,138,195,178,164,149,171,255,63,165,28,128,191,230,247,66,128,150,223,65,199,233,39,23,251,2,32,80,77,229,88,242,236,59,27,87,164,79,120,131,240,100,247,182,28,231,200,43,86,4,88,118,214,123,86,89,234,15,220,65,33,2,126,31,155,113,109,251,248,50,61,159,13,216,133,12,125,72,157,20,95,38,54,244,202,14,140,141,176,184,127,210,62,36,255,255,255,255,3,42,0,0,0,0,0,0,0,25,118,169,20,56,12,202,72,139,24,243,136,130,254,20,130,110,109,96,207,112,30,168,123,136,172,1,0,0,0,0,0,0,0,25,118,169,20,70,66,47,177,97,74,57,246,237,66,211,206,113,253,228,175,14,128,182,53,136,172,181,3,0,0,0,0,0,0,25,118,169,20,168,166,193,185,78,43,31,133,215,58,172,227,98,32,56,171,116,85,185,171,136,172,0,0,0,0,0]}],\"sendWithResults\":[{\"txid\":\"344556f1c428367689e09e29aa4dc7cfe755db1fab5cf7c1cf8d1f99b507004b\",\"status\":\"failed\"}],\"txid\":\"344556f1c428367689e09e29aa4dc7cfe755db1fab5cf7c1cf8d1f99b507004b\",\"tx\":[1,1,1,1,75,0,7,181,153,31,141,207,193,247,92,171,31,219,85,231,207,199,77,170,41,158,224,137,118,54,40,196,241,86,69,52,1,0,190,239,1,254,12,52,25,0,3,2,2,2,13,153,15,202,45,179,254,102,34,161,222,144,207,214,224,219,57,76,176,248,213,137,238,7,63,67,204,253,45,62,70,190,3,0,206,69,142,120,152,200,85,221,140,68,16,34,144,39,29,181,67,66,245,76,24,46,209,253,246,204,133,193,175,188,98,241,2,0,0,119,165,81,236,153,173,143,252,69,138,209,229,97,189,36,123,84,160,234,127,63,185,82,5,26,106,157,73,26,107,32,100,1,0,143,243,215,201,227,2,63,39,103,57,216,42,131,190,76,56,216,43,104,59,7,4,174,137,191,49,49,128,249,252,45,42,2,0,0,25,6,223,99,50,23,119,231,67,155,160,205,224,45,74,194,190,202,18,106,135,17,234,165,66,245,89,135,90,255,10,227,1,0,35,96,209,29,146,83,58,174,231,36,40,57,137,94,136,75,149,86,89,160,195,121,92,180,37,191,31,187,23,71,219,209,2,1,0,0,0,2,1,247,147,92,34,59,244,55,220,70,138,231,75,160,174,137,68,202,34,151,142,102,170,47,246,106,0,25,152,90,245,197,0,0,0,0,106,71,48,68,2,32,23,143,242,5,200,252,85,12,167,137,194,54,96,107,40,141,240,219,145,62,182,133,119,224,94,146,94,249,214,213,212,121,2,32,15,130,24,137,152,12,86,54,141,67,39,178,80,29,110,48,77,114,212,69,237,139,89,152,246,124,138,91,19,32,71,43,65,33,3,16,229,154,223,195,210,19,58,106,26,124,66,99,139,137,43,164,213,109,60,35,235,32,30,122,36,252,12,131,190,69,63,255,255,255,255,1,247,147,92,34,59,244,55,220,70,138,231,75,160,174,137,68,202,34,151,142,102,170,47,246,106,0,25,152,90,245,197,2,0,0,0,107,72,48,69,2,33,0,154,55,50,224,237,75,147,58,95,164,173,104,149,13,24,125,198,35,126,194,134,91,150,238,179,25,192,213,136,196,51,66,2,32,98,84,153,139,248,106,241,122,65,180,241,124,30,233,140,74,172,74,217,165,129,143,127,156,49,230,34,46,188,15,28,52,65,33,2,146,89,63,53,57,196,48,37,118,17,182,193,201,75,44,105,67,181,136,23,25,104,127,48,146,231,88,99,197,53,56,239,255,255,255,255,2,225,3,0,0,0,0,0,0,25,118,169,20,255,161,196,19,38,201,6,21,136,26,207,151,137,162,75,232,58,201,53,88,136,172,1,0,0,0,0,0,0,0,25,118,169,20,39,140,42,205,54,197,3,247,165,173,16,224,138,193,127,34,191,29,126,7,136,172,0,0,0,0,1,0,1,0,0,0,1,13,153,15,202,45,179,254,102,34,161,222,144,207,214,224,219,57,76,176,248,213,137,238,7,63,67,204,253,45,62,70,190,0,0,0,0,106,71,48,68,2,32,113,14,233,125,141,249,154,234,138,195,178,164,149,171,255,63,165,28,128,191,230,247,66,128,150,223,65,199,233,39,23,251,2,32,80,77,229,88,242,236,59,27,87,164,79,120,131,240,100,247,182,28,231,200,43,86,4,88,118,214,123,86,89,234,15,220,65,33,2,126,31,155,113,109,251,248,50,61,159,13,216,133,12,125,72,157,20,95,38,54,244,202,14,140,141,176,184,127,210,62,36,255,255,255,255,3,42,0,0,0,0,0,0,0,25,118,169,20,56,12,202,72,139,24,243,136,130,254,20,130,110,109,96,207,112,30,168,123,136,172,1,0,0,0,0,0,0,0,25,118,169,20,70,66,47,177,97,74,57,246,237,66,211,206,113,253,228,175,14,128,182,53,136,172,181,3,0,0,0,0,0,0,25,118,169,20,168,166,193,185,78,43,31,133,215,58,172,227,98,32,56,171,116,85,185,171,136,172,0,0,0,0,0],\"noSendChange\":[\"344556f1c428367689e09e29aa4dc7cfe755db1fab5cf7c1cf8d1f99b507004b.0\"]}`
31
+ const o = JSON.parse(s)
32
+ const e = WalletErrorFromJson(o)
33
+ expect(e instanceof WERR_REVIEW_ACTIONS).toBe(true)
34
+ })
35
+ })
@@ -0,0 +1,102 @@
1
+ import { _tu, logger, TestWalletNoSetup } from '../utils/TestUtilsWalletStorage'
2
+ import { LocalKVStore } from '@bsv/sdk'
3
+
4
+ const includeTestChaintracks = false
5
+
6
+ describe('LocalKVStore tests', () => {
7
+ jest.setTimeout(99999999)
8
+
9
+ const testName = () => expect.getState().currentTestName || 'test'
10
+ let ctxs: TestWalletNoSetup[] = []
11
+ const context = 'test kv store'
12
+ const key1 = 'key1'
13
+ const key2 = 'key2'
14
+
15
+ beforeEach(async () => {
16
+ ctxs = [await _tu.createLegacyWalletSQLiteCopy(`${testName()}`)]
17
+ })
18
+
19
+ afterEach(async () => {
20
+ for (const ctx of ctxs) {
21
+ await ctx.storage.destroy()
22
+ }
23
+ })
24
+
25
+ test('0 get non-existent', async () => {
26
+ for (const { storage, wallet } of ctxs) {
27
+ const kvStore = new LocalKVStore(wallet, context, false, undefined, true)
28
+ const value = await kvStore.get(key1)
29
+ expect(value).toBeUndefined()
30
+ }
31
+ })
32
+
33
+ test('1 set get', async () => {
34
+ if (!includeTestChaintracks) return
35
+ for (const { storage, wallet } of ctxs) {
36
+ const kvStore = new LocalKVStore(wallet, context, false, undefined, true)
37
+ await kvStore.set(key1, 'value1')
38
+ const value = await kvStore.get(key1)
39
+ expect(value).toBe('value1')
40
+ }
41
+ })
42
+
43
+ test('3 set x 4 get', async () => {
44
+ if (!includeTestChaintracks) return
45
+ for (const { storage, wallet } of ctxs) {
46
+ const kvStore = new LocalKVStore(wallet, context, false, undefined, true)
47
+ const promises = [
48
+ kvStore.set(key1, 'value1'),
49
+ kvStore.set(key1, 'value2'),
50
+ kvStore.set(key1, 'value3'),
51
+ kvStore.set(key1, 'value4')
52
+ ]
53
+ await Promise.all(promises)
54
+ const value = await kvStore.get(key1)
55
+ expect(value).toBe('value4')
56
+ }
57
+ })
58
+
59
+ test('4 promise test', async () => {
60
+ jest.useFakeTimers()
61
+ let resolveNewLock: () => void = () => {}
62
+ const newLock = new Promise<void>(resolve => {
63
+ resolveNewLock = resolve
64
+ })
65
+ const t = Date.now()
66
+ setTimeout(() => {
67
+ resolveNewLock()
68
+ }, 1000)
69
+ jest.advanceTimersByTime(1000)
70
+ await newLock
71
+ const elapsed = Date.now() - t
72
+ logger(`Elapsed time: ${elapsed} ms`)
73
+ expect(elapsed).toBeGreaterThanOrEqual(1000)
74
+ jest.useRealTimers()
75
+ })
76
+
77
+ test('5 set x 4 get set x 4 get', async () => {
78
+ if (!includeTestChaintracks) return
79
+ for (const { storage, wallet } of ctxs) {
80
+ const kvStore = new LocalKVStore(wallet, context, false, undefined, true)
81
+ let v4: string | undefined
82
+ async function captureValue(): Promise<void> {
83
+ v4 = await kvStore.get(key1)
84
+ }
85
+ const promises = [
86
+ kvStore.set(key1, 'value1'),
87
+ kvStore.set(key1, 'value2'),
88
+ kvStore.set(key1, 'value3'),
89
+ kvStore.set(key1, 'value4'),
90
+ captureValue(),
91
+ kvStore.set(key1, 'value5'),
92
+ kvStore.set(key1, 'value6'),
93
+ kvStore.set(key1, 'value7'),
94
+ kvStore.set(key1, 'value8')
95
+ ]
96
+ await Promise.all(promises)
97
+ const v8 = await kvStore.get(key1)
98
+ expect(v4).toBe('value4')
99
+ expect(v8).toBe('value8')
100
+ }
101
+ })
102
+ })
@@ -0,0 +1,57 @@
1
+ const sqlite3 = require('sqlite3').verbose()
2
+
3
+ const dbPath = 'test/data/tmp/updatetest.sqlite' // Path to your SQLite database file
4
+
5
+ const runTest = async () => {
6
+ // Open the database
7
+ const db = new sqlite3.Database(dbPath, err => {
8
+ if (err) {
9
+ console.error('Error opening database:', err.message)
10
+ process.exit(1)
11
+ }
12
+ console.log(`Connected to the SQLite database at ${dbPath}`)
13
+ })
14
+
15
+ // Check if foreign key enforcement is enabled
16
+ db.get('PRAGMA foreign_keys;', (err, row) => {
17
+ if (err) {
18
+ console.error('Error running PRAGMA foreign_keys:', err.message)
19
+ } else {
20
+ console.log('Foreign key enforcement:', row.foreign_keys === 1 ? 'Enabled' : 'Disabled')
21
+ }
22
+ })
23
+
24
+ // List foreign key constraints for a specific table
25
+ const tables = ['certificates', 'commissions', 'output_baskets', 'outputs']
26
+ for (const table of tables) {
27
+ db.all(`PRAGMA foreign_key_list('${table}');`, (err, rows) => {
28
+ if (err) {
29
+ console.error(`Error querying foreign key list for table '${table}':`, err.message)
30
+ } else {
31
+ console.log(`Foreign key constraints for table '${table}':`)
32
+ if (rows.length === 0) {
33
+ console.log(' No foreign key constraints defined.')
34
+ } else {
35
+ rows.forEach(fk => {
36
+ console.log(
37
+ ` Column '${fk.from}' references '${fk.table}(${fk.to})' ` +
38
+ `ON UPDATE ${fk.on_update} ON DELETE ${fk.on_delete}`
39
+ )
40
+ })
41
+ }
42
+ }
43
+ })
44
+ }
45
+
46
+ // Close the database
47
+ db.close(err => {
48
+ if (err) {
49
+ console.error('Error closing database:', err.message)
50
+ } else {
51
+ console.log('Database connection closed.')
52
+ }
53
+ })
54
+ }
55
+
56
+ // Run the test
57
+ runTest()
package/test/checkdb ADDED
File without changes