@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,347 @@
1
+ import { Beef, Transaction } from '@bsv/sdk'
2
+ import { EntityProvenTxReq, sdk, TableProvenTxReq, verifyOneOrNone } from '../../../src'
3
+ import { _tu, TuEnv } from '../../utils/TestUtilsWalletStorage'
4
+ import { LocalWalletTestOptions } from '../../utils/localWalletMethods'
5
+ import { Format } from '../../../src/utility/Format'
6
+
7
+ import * as dotenv from 'dotenv'
8
+ dotenv.config()
9
+
10
+ const chain: sdk.Chain = 'main'
11
+
12
+ const options: LocalWalletTestOptions = {
13
+ setActiveClient: true,
14
+ useMySQLConnectionForClient: true,
15
+ useTestIdentityKey: false,
16
+ useIdentityKey2: false
17
+ }
18
+
19
+ describe('reqErrorReview.2025.05.06.man tests', () => {
20
+ jest.setTimeout(99999999)
21
+
22
+ // OVERWRITES EXISTING FILE CONTENTS!!!!
23
+ test.skip('0 grab reqs history as local sqlite file', async () => {
24
+ const { env, storage, services } = await _tu.createMainReviewSetup()
25
+ const { activeStorage: s2 } = await _tu.createSQLiteTestWallet({
26
+ filePath: `${__dirname}/reqhistory.sqlite`,
27
+ databaseName: 'reqhistory',
28
+ chain: 'main',
29
+ rootKeyHex: '1'.repeat(64),
30
+ dropAll: true
31
+ })
32
+ await s2.makeAvailable()
33
+ const limit = 100
34
+ let offset = 0
35
+ for (;;) {
36
+ const r = await storage.knex.raw(`
37
+ select provenTxReqId as id, txid, status, history
38
+ from proven_tx_reqs
39
+ where history is not null
40
+ limit ${limit} offset ${offset}
41
+ `)
42
+ const reqs = r[0] as { id: number; txid: string; status: sdk.ProvenTxReqStatus; history: string }[]
43
+ for (const req of reqs) {
44
+ const { id, history, status, txid } = req
45
+ await s2.insertProvenTxReq({
46
+ created_at: new Date(),
47
+ updated_at: new Date(),
48
+ provenTxReqId: id,
49
+ status,
50
+ attempts: 0,
51
+ notified: false,
52
+ txid,
53
+ history,
54
+ notify: '',
55
+ rawTx: []
56
+ })
57
+ }
58
+ if (reqs.length < limit) break
59
+ offset += limit
60
+ }
61
+ await s2.destroy()
62
+ await storage.destroy()
63
+ })
64
+
65
+ test('1 review reqs history and final outcome', async () => {
66
+ let undouble: number[] = []
67
+ let uninvalid: number[] = []
68
+ let uncompleted: number[] = []
69
+ let deunmined: number[] = []
70
+ let noSuccessCompleted: number[] = []
71
+ let successDouble: number[] = []
72
+ let internalizeDouble: number[] = []
73
+ let successInvalid: number[] = []
74
+
75
+ const { activeStorage: storage } = await _tu.createSQLiteTestWallet({
76
+ filePath: `${__dirname}/reqhistory.sqlite`,
77
+ databaseName: 'reqhistory',
78
+ chain: 'main',
79
+ rootKeyHex: '1'.repeat(64),
80
+ dropAll: false
81
+ })
82
+ //const { env, storage, services } = await _tu.createMainReviewSetup()
83
+ let limit = 100
84
+ let offset = 0
85
+ let aggSum = -1
86
+ const partial: Partial<TableProvenTxReq> = {}
87
+ let log = ''
88
+ for (;;) {
89
+ const reqs = await storage.findProvenTxReqs({ partial, status: undefined, paged: { limit, offset } })
90
+ for (const reqApi of reqs) {
91
+ if (reqApi.provenTxReqId < 11312) continue
92
+ const r = reviewHistoryNotes(reqApi)
93
+ if (!r) continue
94
+ if (r.isCompleted && r.wasDoubleSpend) {
95
+ undouble.push(reqApi.provenTxReqId)
96
+ let review = ''
97
+ if (r.doubleReview) {
98
+ const rr = r.doubleReview
99
+ review = `0:${rr.status0},1:${rr.status1},2:${rr.status2},Txs:${rr.competingTxs}`
100
+ }
101
+ //log += `undouble ${reqApi.provenTxReqId} arc:${r.brArc} woc:${r.brWoC} bit:${r.brBitails} ${review}\n`
102
+ }
103
+ if (r.isCompleted && r.wasInvalid) {
104
+ uninvalid.push(reqApi.provenTxReqId)
105
+ //log += `uninvalid ${reqApi.provenTxReqId} arc:${r.brArc} woc:${r.brWoC} bit:${r.brBitails}\n`
106
+ }
107
+ if ((r.isDoubleSpend || r.isInvalid) && r.wasCompleted) {
108
+ uncompleted.push(reqApi.provenTxReqId)
109
+ }
110
+ if ((r.isDoubleSpend || r.isInvalid) && r.wasUnmined) {
111
+ if (r.wasInternalize) internalizeDouble.push(reqApi.provenTxReqId)
112
+ else {
113
+ deunmined.push(reqApi.provenTxReqId)
114
+ log += `deunmined ${reqApi.provenTxReqId} arc:${r.brArc} woc:${r.brWoC} bit:${r.brBitails}\n`
115
+ }
116
+ }
117
+ if (r.aggregate && r.aggregate.successCount === 0 && r.isCompleted) {
118
+ noSuccessCompleted.push(reqApi.provenTxReqId)
119
+ }
120
+ if (r.aggregate && r.aggregate.successCount > 0 && r.isDoubleSpend) {
121
+ successDouble.push(reqApi.provenTxReqId)
122
+ }
123
+ if (r.aggregate && r.aggregate.successCount > 0 && r.isInvalid) {
124
+ successInvalid.push(reqApi.provenTxReqId)
125
+ }
126
+ if (r.aggregate && r.aggSum !== aggSum) {
127
+ log += `aggSum changed ${aggSum} to ${r.aggSum} reqId=${reqApi.provenTxReqId}\n`
128
+ aggSum = r.aggSum
129
+ }
130
+ }
131
+ if (reqs.length < limit) break
132
+ offset += limit
133
+ }
134
+ if (undouble.length > 0) log += `undouble: ${JSON.stringify(undouble)}\n`
135
+ if (uninvalid.length > 0) log += `uninvalid: ${JSON.stringify(uninvalid)}\n`
136
+ if (uncompleted.length > 0) log += `uncompleted: ${JSON.stringify(uncompleted)}\n`
137
+ if (deunmined.length > 0) log += `deunmined: ${JSON.stringify(deunmined)}\n`
138
+ if (internalizeDouble.length > 0) log += `internalizeDouble: ${JSON.stringify(internalizeDouble)}\n`
139
+ if (noSuccessCompleted.length > 0) log += `noSuccessCompleted: ${JSON.stringify(noSuccessCompleted)}\n`
140
+ if (successDouble.length > 0) log += `successDouble: ${JSON.stringify(successDouble)}\n`
141
+ if (successInvalid.length > 0) log += `successInvalid: ${JSON.stringify(successInvalid)}\n`
142
+ console.log(log)
143
+ await storage.destroy()
144
+ })
145
+
146
+ const uninvalid = [
147
+ 10822, 12228, 14884, 14948, 1654, 1649, 2654, 2655, 2656, 2658, 2659, 2660, 2661, 2662, 2663, 2664, 2665, 2666,
148
+ 2667, 2669, 2707, 2719, 2723, 2724, 2726
149
+ ]
150
+
151
+ const undouble = [
152
+ 10732, 12303, 12476, 14084, 14111, 14956, 14972, 14874, 14789, 14810, 14813, 14817, 14588, 14640, 14641, 14531,
153
+ 2753, 2653, 2657, 2670, 2671, 2681, 2684, 2691, 2732, 4343, 4222, 4124, 4148, 3873, 3735, 3514, 3537, 5074, 5125,
154
+ 4958, 4977, 4730, 4365
155
+ ]
156
+
157
+ const deunmined = [
158
+ 12304, 12305, 12306, 12307, 12480, 12483, 12484, 12488, 12489, 12490, 12497, 14085, 14086, 14087, 14814, 14816,
159
+ 14821, 14953, 15170
160
+ ]
161
+
162
+ test('2 review deunmined reqs', async () => {
163
+ const { env, storage, services } = await _tu.createMainReviewSetup()
164
+
165
+ const chaintracker = await services.getChainTracker()
166
+
167
+ let log = ''
168
+ for (const id of deunmined) {
169
+ const reqApi = await storage.findProvenTxReqById(id)
170
+ if (!reqApi) continue
171
+ const beef = new Beef()
172
+ beef.mergeRawTx(reqApi.rawTx!)
173
+ if (reqApi.inputBEEF) beef.mergeBeef(reqApi.inputBEEF)
174
+ let tx = beef.findTxid(reqApi.txid)!.tx!
175
+ let allInputsFound = true
176
+ let ilog = ''
177
+ for (const input of tx.inputs) {
178
+ if (beef.findTxid(input.sourceTXID!)) continue
179
+ try {
180
+ const ib = await storage.getBeefForTransaction(input.sourceTXID!, {})
181
+ if (ib) beef.mergeBeef(ib)
182
+ } catch (e) {
183
+ if (input.sourceTXID) {
184
+ const r2 = verifyOneOrNone(await storage.findProvenTxReqs({ partial: { txid: input.sourceTXID } }))
185
+ if (r2 && r2.rawTx) {
186
+ const itx = Transaction.fromBinary(r2.rawTx)
187
+ ilog += 'missing input ' + Format.toLogStringTransaction(itx)
188
+ }
189
+ }
190
+ allInputsFound = false
191
+ }
192
+ }
193
+ if (allInputsFound) {
194
+ tx = beef.findAtomicTransaction(reqApi.txid)!
195
+ try {
196
+ const ok = await tx.verify('scripts only')
197
+ log += `${reqApi.provenTxReqId} ${reqApi.txid} ${ok ? 'OK' : 'FAIL'}\n`
198
+ } catch (e: unknown) {
199
+ log += `${reqApi.provenTxReqId} ${reqApi.txid} ${sdk.WalletError.fromUnknown(e).message}\n`
200
+ }
201
+ } else {
202
+ log += `${reqApi.provenTxReqId} FAILED `
203
+ log += Format.toLogStringBeefTxid(beef, reqApi.txid)
204
+ log += ilog
205
+ }
206
+ }
207
+ console.log(log)
208
+
209
+ await storage.destroy()
210
+ })
211
+ })
212
+
213
+ function reviewHistoryNotes(reqApi: TableProvenTxReq): HistoryReviewInfo | undefined {
214
+ const r: HistoryReviewInfo = {
215
+ req: new EntityProvenTxReq(reqApi),
216
+ wasDoubleSpend: false,
217
+ wasInvalid: false,
218
+ wasCompleted: false,
219
+ wasUnmined: false,
220
+ wasInternalize: false,
221
+ isDoubleSpend: false,
222
+ isInvalid: false,
223
+ isCompleted: false,
224
+ aggSum: 0,
225
+ aggregate: undefined
226
+ }
227
+ if (!r.req.history?.notes) return undefined
228
+ for (const note of r.req.history.notes) {
229
+ if (note.what === 'status') {
230
+ const statusWas = note.status_was as sdk.ProvenTxReqStatus
231
+ const statusNow = note.status_now as sdk.ProvenTxReqStatus
232
+ if (statusNow === 'doubleSpend') {
233
+ r.isDoubleSpend = r.wasDoubleSpend = true
234
+ r.isInvalid = false
235
+ r.isCompleted = false
236
+ } else if (statusNow === 'invalid') {
237
+ r.isDoubleSpend = false
238
+ r.isInvalid = r.wasInvalid = true
239
+ r.isCompleted = false
240
+ } else if (statusNow === 'completed') {
241
+ r.isDoubleSpend = false
242
+ r.isInvalid = false
243
+ r.isCompleted = r.wasCompleted = true
244
+ } else if (statusNow === 'unmined') {
245
+ r.isDoubleSpend = false
246
+ r.isInvalid = false
247
+ r.wasUnmined = true
248
+ }
249
+ } else if (note.what === 'aggregateResults') {
250
+ r.aggregate = {
251
+ successCount: note.successCount as number,
252
+ doubleSpendCount: note.doubleSpendCount as number,
253
+ statusErrorCount: note.statusErrorCount as number,
254
+ serviceErrorCount: note.serviceErrorCount as number,
255
+ newReqStatus: note.newReqStatus as sdk.ProvenTxReqStatus
256
+ }
257
+ const a = r.aggregate
258
+ r.aggSum = a.doubleSpendCount + a.statusErrorCount + a.serviceErrorCount + a.successCount
259
+ } else if (note.what === 'confirmDoubleSpend') {
260
+ r.doubleReview = {
261
+ status0: note.getStatus0 as string,
262
+ status1: note.getStatus1 as string,
263
+ status2: note.getStatus2 as string,
264
+ competingTxs: note.competingTxs as string
265
+ }
266
+ } else if (note.what === 'internalizeAction') {
267
+ r.wasInternalize = true
268
+ }
269
+
270
+ if (note.name === 'WoCpostRawTx') {
271
+ if (note.what === 'postRawTxErrorMissingInputs') {
272
+ r.brWoC = 'missingInputs'
273
+ } else if (note.what === 'postRawTxError') {
274
+ if (note.status === 504) {
275
+ r.brWoC = 'serviceError'
276
+ }
277
+ }
278
+ } else if (note.name === 'WoCpostBeef') {
279
+ if (note.what === 'postBeefSuccess') {
280
+ r.brWoC = 'success'
281
+ } else if (note.what === 'postBeefError' && r.brWoC === undefined) {
282
+ r.brWoC = 'invalidTx'
283
+ }
284
+ } else if (note.name === 'ARCpostBeef') {
285
+ if (note.what === 'postBeefGetTxDataSuccess') {
286
+ if (note.txStatus === 'STORED') r.brArc = 'success'
287
+ }
288
+ } else if (note.name === 'ARCv1tx') {
289
+ if (note.what === 'postRawTxDoubleSpend') {
290
+ if (note.txStatus === 'DOUBLE_SPEND_ATTEMPTED') r.brArc = 'doubleSpend'
291
+ } else if (note.what === 'postRawTxError') {
292
+ if (note.status === 469) r.brArc = 'badRoots'
293
+ else if (note.status === 463) r.brArc = 'badBump'
294
+ } else if (note.what === 'postRawTxSuccess') {
295
+ if (note.txStatus === 'ANNOUNCED_TO_NETWORK') r.brArc = 'success'
296
+ else if (note.txStatus === 'SEEN_ON_NETWORK') r.brArc = 'success'
297
+ else if (note.txStatus === 'REQUESTED_BY_NETWORK') r.brArc = 'success'
298
+ }
299
+ } else if (note.name === 'BitailsPostRawTx') {
300
+ if (note.what === 'postRawsSuccess') {
301
+ r.brBitails = 'success'
302
+ } else if (note.what === 'postRawsSuccessAlreadyInMempool') {
303
+ r.brBitails = 'success'
304
+ } else if (note.what === 'postRawsErrorMissingInputs') {
305
+ r.brBitails = 'invalidTx'
306
+ } else if (note.what === 'postRawsError') {
307
+ if (note.code === -26) {
308
+ r.brBitails = 'invalidTx'
309
+ } else if (note.code === -1) {
310
+ r.brBitails = 'serviceError'
311
+ } else if (note.code === 'ESOCKETTIMEDOUT') {
312
+ r.brBitails = 'serviceError'
313
+ }
314
+ }
315
+ }
316
+ }
317
+ return r
318
+ }
319
+
320
+ interface HistoryReviewInfo {
321
+ brArc?: string
322
+ brWoC?: string
323
+ brBitails?: string
324
+ req: EntityProvenTxReq
325
+ wasDoubleSpend: boolean
326
+ wasInvalid: boolean
327
+ wasCompleted: boolean
328
+ wasUnmined: boolean
329
+ wasInternalize: boolean
330
+ isDoubleSpend: boolean
331
+ isInvalid: boolean
332
+ isCompleted: boolean
333
+ aggSum: number
334
+ aggregate?: {
335
+ successCount: number
336
+ doubleSpendCount: number
337
+ statusErrorCount: number
338
+ serviceErrorCount: number
339
+ newReqStatus: sdk.ProvenTxReqStatus
340
+ }
341
+ doubleReview?: {
342
+ status0: string
343
+ status1: string
344
+ status2: string
345
+ competingTxs: string
346
+ }
347
+ }
@@ -0,0 +1,215 @@
1
+ import { verifyOne, verifyOneOrNone, verifyTruthy, wait, Wallet, WalletStorageManager } from '../../../src/index.client'
2
+ import { StorageKnex } from '../../../src/storage/StorageKnex'
3
+ import { _tu, logger, TestWalletNoSetup } from '../../utils/TestUtilsWalletStorage'
4
+
5
+ describe('Wallet sync tests', () => {
6
+ jest.setTimeout(99999999)
7
+
8
+ const env = _tu.getEnvFlags('test')
9
+
10
+ beforeAll(async () => {})
11
+
12
+ afterAll(async () => {})
13
+
14
+ test('0 syncToWriter initial-no changes-1 change', async () => {
15
+ const {
16
+ identityKey,
17
+ storage: storageManager,
18
+ activeStorage: storage
19
+ } = await _tu.createLegacyWalletSQLiteCopy('walletSyncTest1aSource')
20
+ const localSQLiteFile = await _tu.newTmpFile('walleltSyncTest0tmp.sqlite', true, false, false)
21
+ const knexSQLite = _tu.createLocalSQLite(localSQLiteFile)
22
+ const tmpStore = new StorageKnex({
23
+ ...StorageKnex.defaultOptions(),
24
+ chain: env.chain,
25
+ knex: knexSQLite
26
+ })
27
+ //await tmpStore.dropAllData()
28
+ await tmpStore.migrate('walletSyncTest0tmp', '1'.repeat(64))
29
+ const dstSettings = await tmpStore.makeAvailable()
30
+
31
+ const srcSettings = await storage.makeAvailable()
32
+ const manager = new WalletStorageManager(identityKey, storage, [tmpStore])
33
+
34
+ const auth = await manager.getAuth()
35
+ {
36
+ const r = await manager.syncToWriter(auth, tmpStore)
37
+ expect(r.inserts).toBeGreaterThan(1000)
38
+ expect(r.updates).toBe(2)
39
+ }
40
+ {
41
+ const r = await manager.syncToWriter(auth, tmpStore)
42
+ expect(r.inserts).toBe(0)
43
+ expect(r.updates).toBe(0)
44
+ }
45
+ {
46
+ _tu.insertTestOutputBasket(storage, auth.userId)
47
+ await wait(1000)
48
+ const r = await manager.syncToWriter(auth, tmpStore)
49
+ expect(r.inserts).toBe(1)
50
+ expect(r.updates).toBe(0)
51
+ }
52
+ await tmpStore.destroy()
53
+ await storageManager.destroy()
54
+ })
55
+
56
+ test('1a setActive to backup and back to original without backup first', async () => {
57
+ // wallet will be the original active wallet, a backup is added, then setActive is used to initiate backup in each direction.
58
+ const ctx = await _tu.createLegacyWalletSQLiteCopy('walletSyncTest1aSource')
59
+ const { activeStorage: backup, wallet: backupWallet } = await _tu.createSQLiteTestWallet({
60
+ databaseName: 'walletSyncTest1aBackup',
61
+ rootKeyHex: ctx.rootKey.toHex(),
62
+ dropAll: true
63
+ })
64
+ await ctx.storage.addWalletStorageProvider(backup)
65
+
66
+ await setActiveTwice(ctx, false, backup, backupWallet)
67
+
68
+ await setActiveTwice(ctx, false, backup, backupWallet)
69
+
70
+ await ctx.storage.destroy()
71
+ })
72
+
73
+ test('1b setActive to backup and back to original with backup first', async () => {
74
+ // wallet will be the original active wallet, a backup is added, then setActive is used to initiate backup in each direction.
75
+ const ctx = await _tu.createLegacyWalletSQLiteCopy('walletSyncTest1bSource')
76
+ const backup = (
77
+ await _tu.createSQLiteTestWallet({
78
+ databaseName: 'walletSyncTest1bBackup',
79
+ dropAll: true
80
+ })
81
+ ).activeStorage
82
+ await ctx.storage.addWalletStorageProvider(backup)
83
+
84
+ await setActiveTwice(ctx, true, backup)
85
+
86
+ await setActiveTwice(ctx, true, backup)
87
+
88
+ await ctx.storage.destroy()
89
+ })
90
+ })
91
+
92
+ async function setActiveTwice(
93
+ ctx: TestWalletNoSetup,
94
+ withBackupFirst: boolean,
95
+ backup: StorageKnex,
96
+ backupWallet?: Wallet
97
+ ) {
98
+ const { storage: storageManager, activeStorage: original, userId: originalUserId } = ctx
99
+
100
+ if (withBackupFirst) {
101
+ if (storageManager.isActiveEnabled) await storageManager.updateBackups()
102
+ else
103
+ await expect(storageManager.updateBackups()).rejects.toThrow(
104
+ `WalletStorageManager is not accessing user's active storage or there are conflicting active stores configured.`
105
+ )
106
+ }
107
+
108
+ const backupIdentityKey = (await backup.makeAvailable()).storageIdentityKey
109
+ const originalIdentityKey = (await original.makeAvailable()).storageIdentityKey
110
+ expect(backupIdentityKey).not.toBe(originalIdentityKey)
111
+
112
+ const originalAuth = { ...(await storageManager.getAuth()) }
113
+ expect(originalAuth.userId).toBe(originalUserId)
114
+ const originalTransactions = await original.findTransactions({
115
+ partial: { userId: originalAuth.userId }
116
+ })
117
+
118
+ const originalUserBefore = verifyTruthy(await original.findUserById(originalAuth.userId!))
119
+ const backupUserBefore = verifyOneOrNone(
120
+ await backup.findUsers({
121
+ partial: { identityKey: originalAuth.identityKey }
122
+ })
123
+ )
124
+
125
+ expect(originalUserBefore.activeStorage === undefined || originalUserBefore.activeStorage === originalIdentityKey)
126
+
127
+ let now = Date.now()
128
+
129
+ expect(originalUserBefore.updated_at.getTime()).toBeLessThan(now)
130
+ expect(!backupUserBefore || backupUserBefore.updated_at.getTime() < now).toBe(true)
131
+
132
+ expect(storageManager.getActiveStore()).toBe(originalIdentityKey)
133
+ expect(storageManager.getActiveUser().activeStorage).toBe(originalIdentityKey)
134
+
135
+ // sync to backup and make it active.
136
+ const log = await storageManager.setActive(backupIdentityKey)
137
+ logger(log)
138
+
139
+ expect(storageManager.getActiveStore()).toBe(backupIdentityKey)
140
+ expect(storageManager.getActiveUser().activeStorage).toBe(backupIdentityKey)
141
+ expect(storageManager.getBackupStores()).toEqual([originalIdentityKey])
142
+
143
+ let originalUserAfter = verifyTruthy(await original.findUserById(originalAuth.userId!))
144
+ let backupUserAfter = verifyOne(
145
+ await backup.findUsers({
146
+ partial: { identityKey: originalAuth.identityKey }
147
+ })
148
+ )
149
+
150
+ expect(originalUserAfter.updated_at.getTime()).toBeGreaterThanOrEqual(now)
151
+ expect(backupUserAfter.updated_at.getTime()).toBeGreaterThanOrEqual(now)
152
+ expect(originalUserAfter.activeStorage).toBe(backupIdentityKey)
153
+ expect(backupUserAfter.activeStorage).toBe(backupIdentityKey)
154
+
155
+ await expect(
156
+ ctx.wallet.relinquishOutput({
157
+ basket: 'xyzzy',
158
+ output: `${'1'.repeat(64)}.42`
159
+ })
160
+ ).rejects.toThrow('Result must exist and be unique.')
161
+ if (backupWallet) {
162
+ backupWallet.storage._isAvailable = false
163
+ backupWallet.storage._active!.user = undefined
164
+ await backupWallet.storage.makeAvailable()
165
+ await expect(
166
+ backupWallet.relinquishOutput({
167
+ basket: 'xyzzy',
168
+ output: `${'1'.repeat(64)}.42`
169
+ })
170
+ ).rejects.toThrow('Result must exist and be unique.')
171
+ }
172
+
173
+ const backupAuth = await storageManager.getAuth()
174
+ const backupTransactions = await backup.findTransactions({
175
+ partial: { userId: backupAuth.userId }
176
+ })
177
+
178
+ now = Date.now()
179
+
180
+ // sync back to original and make it active.
181
+ const log2 = await storageManager.setActive(original.getSettings().storageIdentityKey)
182
+ logger(log2)
183
+
184
+ originalUserAfter = verifyTruthy(await original.findUserById(originalAuth.userId!))
185
+ backupUserAfter = verifyOne(
186
+ await backup.findUsers({
187
+ partial: { identityKey: originalAuth.identityKey }
188
+ })
189
+ )
190
+
191
+ expect(originalUserAfter.updated_at.getTime()).toBeGreaterThanOrEqual(now)
192
+ expect(backupUserAfter.updated_at.getTime()).toBeGreaterThanOrEqual(now)
193
+ expect(originalUserAfter.activeStorage).toBe(originalIdentityKey)
194
+ expect(backupUserAfter.activeStorage).toBe(originalIdentityKey)
195
+
196
+ await expect(
197
+ ctx.wallet.relinquishOutput({
198
+ basket: 'xyzzy',
199
+ output: `${'1'.repeat(64)}.42`
200
+ })
201
+ ).rejects.toThrow('Result must exist and be unique.')
202
+ if (backupWallet) {
203
+ backupWallet.storage._isAvailable = false
204
+ backupWallet.storage._active!.user = undefined
205
+ await backupWallet.storage.makeAvailable()
206
+ await expect(
207
+ backupWallet.relinquishOutput({
208
+ basket: 'xyzzy',
209
+ output: `${'1'.repeat(64)}.42`
210
+ })
211
+ ).rejects.toThrow(
212
+ `WalletStorageManager is not accessing user's active storage or there are conflicting active stores configured.`
213
+ )
214
+ }
215
+ }