@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,361 @@
1
+ import { EntityTxLabelMap } from '../EntityTxLabelMap'
2
+ import { createSyncMap, sdk, SyncMap, TableTxLabelMap } from '../../../../../src'
3
+ import { TestUtilsWalletStorage as _tu, TestWalletNoSetup } from '../../../../../test/utils/TestUtilsWalletStorage'
4
+ import { EntityTransaction } from '../EntityTransaction'
5
+ import { EntityTxLabel } from '../EntityTxLabel'
6
+
7
+ describe('TxLabelMap Class Tests', () => {
8
+ jest.setTimeout(99999999) // Extend timeout for database operations
9
+
10
+ const env = _tu.getEnv('test') // Test environment
11
+ const ctxs: TestWalletNoSetup[] = [] // Context for primary databases
12
+ const ctxs2: TestWalletNoSetup[] = [] // Context for secondary databases
13
+
14
+ beforeAll(async () => {
15
+ // Set up MySQL and SQLite databases for testing
16
+ if (env.runMySQL) {
17
+ ctxs.push(await _tu.createLegacyWalletMySQLCopy('txLabelMapTests_db1'))
18
+ ctxs2.push(await _tu.createLegacyWalletMySQLCopy('txLabelMapTests_db2'))
19
+ }
20
+ ctxs.push(await _tu.createLegacyWalletSQLiteCopy('txLabelMapTests_db1'))
21
+ ctxs2.push(await _tu.createLegacyWalletSQLiteCopy('txLabelMapTests_db2'))
22
+ })
23
+
24
+ afterAll(async () => {
25
+ // Clean up primary databases
26
+ for (const ctx of ctxs) {
27
+ await ctx.storage.destroy()
28
+ }
29
+ // Clean up secondary databases
30
+ for (const ctx of ctxs2) {
31
+ await ctx.storage.destroy()
32
+ }
33
+ })
34
+
35
+ // Test: Constructor with default values
36
+ test('1_creates_instance_with_default_values', () => {
37
+ const txLabelMap = new EntityTxLabelMap()
38
+
39
+ const now = new Date()
40
+ expect(txLabelMap.transactionId).toBe(0)
41
+ expect(txLabelMap.txLabelId).toBe(0)
42
+ expect(txLabelMap.isDeleted).toBe(false)
43
+ expect(txLabelMap.created_at).toBeInstanceOf(Date)
44
+ expect(txLabelMap.updated_at).toBeInstanceOf(Date)
45
+ expect(txLabelMap.created_at.getTime()).toBeLessThanOrEqual(now.getTime())
46
+ expect(txLabelMap.updated_at.getTime()).toBeLessThanOrEqual(now.getTime())
47
+ })
48
+
49
+ // Test: Constructor with provided API object
50
+ test('2_creates_instance_with_provided_api_object', () => {
51
+ const now = new Date()
52
+ const apiObject: TableTxLabelMap = {
53
+ transactionId: 123,
54
+ txLabelId: 456,
55
+ created_at: now,
56
+ updated_at: now,
57
+ isDeleted: true
58
+ }
59
+ const txLabelMap = new EntityTxLabelMap(apiObject)
60
+
61
+ expect(txLabelMap.transactionId).toBe(123)
62
+ expect(txLabelMap.txLabelId).toBe(456)
63
+ expect(txLabelMap.isDeleted).toBe(true)
64
+ expect(txLabelMap.created_at).toBe(now)
65
+ expect(txLabelMap.updated_at).toBe(now)
66
+ })
67
+
68
+ // Test: Getters and setters
69
+ test('3_getters_and_setters_work_correctly', () => {
70
+ const txLabelMap = new EntityTxLabelMap()
71
+
72
+ const now = new Date()
73
+ txLabelMap.transactionId = 1001
74
+ txLabelMap.txLabelId = 2002
75
+ txLabelMap.isDeleted = true
76
+ txLabelMap.created_at = now
77
+ txLabelMap.updated_at = now
78
+
79
+ expect(txLabelMap.transactionId).toBe(1001)
80
+ expect(txLabelMap.txLabelId).toBe(2002)
81
+ expect(txLabelMap.isDeleted).toBe(true)
82
+ expect(txLabelMap.created_at).toBe(now)
83
+ expect(txLabelMap.updated_at).toBe(now)
84
+ })
85
+
86
+ // Test: `updateApi` does nothing
87
+ test('4_updateApi_does_nothing', () => {
88
+ const txLabelMap = new EntityTxLabelMap()
89
+ expect(() => txLabelMap.updateApi()).not.toThrow() // Method does nothing, so no errors should occur
90
+ })
91
+
92
+ // Test: `id` getter throws an error
93
+ test('5_get_id_throws_error', () => {
94
+ const txLabelMap = new EntityTxLabelMap()
95
+ expect(() => txLabelMap.id).toThrow(sdk.WERR_INVALID_OPERATION) // Entity has no "id"
96
+ })
97
+
98
+ // Test: Equality check
99
+ test('6_equals_checks_equality_correctly', () => {
100
+ const syncMap: any = {
101
+ transaction: { idMap: { 123: 123 } },
102
+ txLabel: { idMap: { 456: 456 } }
103
+ }
104
+
105
+ const txLabelMap = new EntityTxLabelMap({
106
+ transactionId: 123,
107
+ txLabelId: 456,
108
+ isDeleted: false,
109
+ created_at: new Date(),
110
+ updated_at: new Date()
111
+ })
112
+
113
+ const other = {
114
+ transactionId: 123, // Use mapped ID from syncMap
115
+ txLabelId: 456, // Use mapped ID from syncMap
116
+ isDeleted: false
117
+ }
118
+
119
+ const result = txLabelMap.equals(other as TableTxLabelMap, syncMap)
120
+ expect(result).toBe(true)
121
+ })
122
+
123
+ // Test: `mergeFind` with storage
124
+ test('7_mergeFind_finds_or_creates_entity', async () => {
125
+ const storage: any = {
126
+ findTxLabelMaps: async () => [{ transactionId: 999, txLabelId: 888 }]
127
+ }
128
+ const syncMap: any = {
129
+ transaction: { idMap: { 123: 999 } },
130
+ txLabel: { idMap: { 456: 888 } }
131
+ }
132
+
133
+ const ei = {
134
+ transactionId: 123,
135
+ txLabelId: 456
136
+ }
137
+
138
+ const result = await EntityTxLabelMap.mergeFind(storage, 1, ei as TableTxLabelMap, syncMap)
139
+ expect(result.found).toBe(true)
140
+ expect(result.eo.transactionId).toBe(999)
141
+ expect(result.eo.txLabelId).toBe(888)
142
+ })
143
+
144
+ // Test: `mergeNew` inserts entity
145
+ test('8_mergeNew_inserts_entity', async () => {
146
+ const storage: any = {
147
+ insertTxLabelMap: jest.fn()
148
+ }
149
+ const syncMap: any = {
150
+ transaction: { idMap: { 123: 999 } },
151
+ txLabel: { idMap: { 456: 888 } }
152
+ }
153
+
154
+ const txLabelMap = new EntityTxLabelMap({
155
+ transactionId: 123,
156
+ txLabelId: 456,
157
+ created_at: new Date(2022, 1, 1),
158
+ updated_at: new Date(2022, 1, 1),
159
+ isDeleted: false
160
+ })
161
+
162
+ await txLabelMap.mergeNew(storage, 1, syncMap)
163
+ expect(storage.insertTxLabelMap).toHaveBeenCalledWith(
164
+ expect.objectContaining({
165
+ transactionId: 999,
166
+ txLabelId: 888
167
+ }),
168
+ undefined
169
+ )
170
+ })
171
+
172
+ // Test: `mergeExisting` updates entity
173
+ test('9_mergeExisting_updates_entity', async () => {
174
+ const storage: any = {
175
+ updateTxLabelMap: jest.fn()
176
+ }
177
+
178
+ const txLabelMap = new EntityTxLabelMap({
179
+ transactionId: 123,
180
+ txLabelId: 456,
181
+ created_at: new Date(2022, 1, 1),
182
+ updated_at: new Date(2022, 1, 1),
183
+ isDeleted: false
184
+ })
185
+
186
+ const ei: TableTxLabelMap = {
187
+ transactionId: 123,
188
+ txLabelId: 456,
189
+ isDeleted: true,
190
+ created_at: new Date(),
191
+ updated_at: new Date(2023, 1, 1)
192
+ }
193
+
194
+ const syncMap: any = {
195
+ transaction: { idMap: { 123: 999 } },
196
+ txLabel: { idMap: { 456: 888 } }
197
+ }
198
+
199
+ const result = await txLabelMap.mergeExisting(storage, new Date(), ei, syncMap)
200
+ expect(result).toBe(true)
201
+ expect(storage.updateTxLabelMap).toHaveBeenCalledWith(
202
+ 123,
203
+ 456,
204
+ expect.objectContaining({
205
+ isDeleted: true
206
+ }),
207
+ undefined
208
+ )
209
+ })
210
+
211
+ // Test: `entityName` getter
212
+ test('10_entityName_returns_correct_value', () => {
213
+ const txLabelMap = new EntityTxLabelMap()
214
+ expect(txLabelMap.entityName).toBe('txLabelMap') // Ensure entityName returns the correct string
215
+ })
216
+
217
+ // Test: `entityTable` getter
218
+ test('11_entityTable_returns_correct_value', () => {
219
+ const txLabelMap = new EntityTxLabelMap()
220
+ expect(txLabelMap.entityTable).toBe('tx_labels_map') // Ensure entityTable returns the correct table name
221
+ })
222
+
223
+ test('12_equals_identifies_matching_entities', async () => {
224
+ const ctx1 = ctxs[0]
225
+ const ctx2 = ctxs2[0]
226
+
227
+ // Insert necessary foreign key references into the first database
228
+ const tx1 = new EntityTransaction({
229
+ transactionId: 405,
230
+ userId: 1,
231
+ txid: 'txid1',
232
+ created_at: new Date('2023-01-01'),
233
+ updated_at: new Date('2023-01-02'),
234
+ status: 'completed',
235
+ reference: 'ref1',
236
+ isOutgoing: true,
237
+ satoshis: 789,
238
+ description: 'desc1',
239
+ version: 2,
240
+ lockTime: 500,
241
+ rawTx: [1, 2, 3],
242
+ inputBEEF: [4, 5, 6]
243
+ })
244
+
245
+ await ctx1.activeStorage.insertTransaction(tx1.toApi())
246
+
247
+ // Insert necessary foreign key references into the second database
248
+ const tx2 = new EntityTransaction({
249
+ transactionId: 406,
250
+ userId: 1,
251
+ txid: 'txid1',
252
+ created_at: new Date('2023-01-01'),
253
+ updated_at: new Date('2023-01-02'),
254
+ status: 'completed',
255
+ reference: 'ref1',
256
+ isOutgoing: true,
257
+ satoshis: 789,
258
+ description: 'desc1',
259
+ version: 2,
260
+ lockTime: 500,
261
+ rawTx: [1, 2, 3],
262
+ inputBEEF: [4, 5, 6]
263
+ })
264
+
265
+ await ctx2.activeStorage.insertTransaction(tx2.toApi())
266
+
267
+ // Insert a TxLabel into the first database
268
+ const txLabel1 = new EntityTxLabel({
269
+ txLabelId: 306,
270
+ userId: 1,
271
+ label: 'Label B',
272
+ isDeleted: true, // Different isDeleted value
273
+ created_at: new Date('2023-01-01'),
274
+ updated_at: new Date('2023-01-02')
275
+ })
276
+
277
+ await ctx1.activeStorage.insertTxLabel(txLabel1.toApi())
278
+
279
+ // Insert a matching TxLabel into the second database
280
+ const txLabel2 = new EntityTxLabel({
281
+ txLabelId: 307,
282
+ userId: 1,
283
+ label: 'Label B',
284
+ isDeleted: true, // Different isDeleted value
285
+ created_at: new Date('2023-01-01'),
286
+ updated_at: new Date('2023-01-02')
287
+ })
288
+
289
+ await ctx2.activeStorage.insertTxLabel(txLabel2.toApi())
290
+
291
+ // Insert a TxLabelMap into the first database
292
+ const txLabelMap1 = new EntityTxLabelMap({
293
+ transactionId: 405,
294
+ txLabelId: 306,
295
+ isDeleted: false,
296
+ created_at: new Date('2023-01-01'),
297
+ updated_at: new Date('2023-01-02')
298
+ })
299
+
300
+ await ctx1.activeStorage.insertTxLabelMap(txLabelMap1.toApi())
301
+
302
+ // Insert a matching TxLabelMap into the second database
303
+ const txLabelMap2 = new EntityTxLabelMap({
304
+ transactionId: 406, // Different transaction ID mapped in syncMap
305
+ txLabelId: 307, // Different label ID mapped in syncMap
306
+ isDeleted: false,
307
+ created_at: new Date('2023-01-01'),
308
+ updated_at: new Date('2023-01-02')
309
+ })
310
+
311
+ await ctx2.activeStorage.insertTxLabelMap(txLabelMap2.toApi())
312
+
313
+ const syncMap = createSyncMap()
314
+ syncMap.transaction.idMap = { 406: 405 }
315
+ syncMap.transaction.count = 1
316
+ syncMap.txLabel.idMap = { 307: 306 }
317
+ syncMap.txLabel.count = 1
318
+
319
+ // Verify the entities match
320
+ expect(txLabelMap1.equals(txLabelMap2.toApi(), syncMap)).toBe(true)
321
+ })
322
+
323
+ // Test: equals method identifies non-matching entities
324
+ test('13_equals_identifies_non_matching_entities', async () => {
325
+ const ctx1 = ctxs[0]
326
+ const ctx2 = ctxs2[0]
327
+
328
+ // Insert a TxLabelMap into the first database
329
+ const txLabelMap1 = new EntityTxLabelMap({
330
+ transactionId: 103,
331
+ txLabelId: 1,
332
+ isDeleted: false,
333
+ created_at: new Date('2023-01-01'),
334
+ updated_at: new Date('2023-01-02')
335
+ })
336
+
337
+ await ctx1.activeStorage.insertTxLabelMap(txLabelMap1.toApi())
338
+
339
+ // Insert a non-matching TxLabelMap into the second database
340
+ const txLabelMap2 = new EntityTxLabelMap({
341
+ transactionId: 104, // Different transaction ID not mapped in syncMap
342
+ txLabelId: 1, // Different label ID not mapped in syncMap
343
+ isDeleted: true, // Different isDeleted value
344
+ created_at: new Date('2023-01-01'),
345
+ updated_at: new Date('2023-01-02')
346
+ })
347
+
348
+ await ctx2.activeStorage.insertTxLabelMap(txLabelMap2.toApi())
349
+
350
+ const syncMap = createSyncMap()
351
+ syncMap.transaction.idMap = {
352
+ [txLabelMap1.transactionId]: txLabelMap2.transactionId
353
+ }
354
+ syncMap.transaction.count = 1
355
+ syncMap.txLabel.idMap = { [txLabelMap1.txLabelId]: txLabelMap2.txLabelId }
356
+ syncMap.txLabel.count = 1
357
+
358
+ // Verify the entities do not match
359
+ expect(txLabelMap1.equals(txLabelMap2.toApi(), syncMap)).toBe(false)
360
+ })
361
+ })
@@ -0,0 +1,198 @@
1
+ import { EntityTxLabel } from '../EntityTxLabel'
2
+ import { createSyncMap, sdk, SyncMap, TableTxLabel } from '../../../../../src'
3
+ import { TestUtilsWalletStorage as _tu, TestWalletNoSetup } from '../../../../../test/utils/TestUtilsWalletStorage'
4
+
5
+ describe('TxLabel Class Tests', () => {
6
+ jest.setTimeout(99999999) // Extend timeout for database operations
7
+
8
+ const env = _tu.getEnv('test') // Test environment
9
+ const ctxs: TestWalletNoSetup[] = [] // Context for primary databases
10
+ const ctxs2: TestWalletNoSetup[] = [] // Context for secondary databases
11
+
12
+ beforeAll(async () => {
13
+ // Set up MySQL and SQLite databases for testing
14
+ if (env.runMySQL) {
15
+ ctxs.push(await _tu.createLegacyWalletMySQLCopy('txLabelTests_db1'))
16
+ ctxs2.push(await _tu.createLegacyWalletMySQLCopy('txLabelTests_db2'))
17
+ }
18
+ ctxs.push(await _tu.createLegacyWalletSQLiteCopy('txLabelTests_db1'))
19
+ ctxs2.push(await _tu.createLegacyWalletSQLiteCopy('txLabelTests_db2'))
20
+ })
21
+
22
+ afterAll(async () => {
23
+ // Clean up primary databases
24
+ for (const ctx of ctxs) {
25
+ await ctx.storage.destroy()
26
+ }
27
+ // Clean up secondary databases
28
+ for (const ctx of ctxs2) {
29
+ await ctx.storage.destroy()
30
+ }
31
+ })
32
+
33
+ // Test: Default constructor behavior
34
+ test('1_creates_txLabel_with_default_values', () => {
35
+ const txLabel = new EntityTxLabel()
36
+
37
+ // Default values
38
+ expect(txLabel.txLabelId).toBe(0)
39
+ expect(txLabel.label).toBe('')
40
+ expect(txLabel.userId).toBe(0)
41
+ expect(txLabel.isDeleted).toBe(false)
42
+ expect(txLabel.created_at).toBeInstanceOf(Date)
43
+ expect(txLabel.updated_at).toBeInstanceOf(Date)
44
+ expect(txLabel.created_at <= txLabel.updated_at).toBe(true)
45
+ })
46
+
47
+ // Test: Constructor with provided API object
48
+ test('2_creates_txLabel_with_provided_api_object', () => {
49
+ const now = new Date()
50
+ const apiObject: TableTxLabel = {
51
+ txLabelId: 42,
52
+ label: 'Test Label',
53
+ userId: 101,
54
+ isDeleted: false,
55
+ created_at: now,
56
+ updated_at: now
57
+ }
58
+ const txLabel = new EntityTxLabel(apiObject)
59
+
60
+ // Verify all properties match the API object
61
+ expect(txLabel.txLabelId).toBe(42)
62
+ expect(txLabel.label).toBe('Test Label')
63
+ expect(txLabel.userId).toBe(101)
64
+ expect(txLabel.isDeleted).toBe(false)
65
+ expect(txLabel.created_at).toBe(now)
66
+ expect(txLabel.updated_at).toBe(now)
67
+ })
68
+
69
+ // Test: Getters and setters behavior
70
+ test('3_getters_and_setters_work_correctly', () => {
71
+ const txLabel = new EntityTxLabel()
72
+
73
+ const now = new Date()
74
+ txLabel.txLabelId = 1
75
+ txLabel.label = 'New Label'
76
+ txLabel.userId = 200
77
+ txLabel.isDeleted = true
78
+ txLabel.created_at = now
79
+ txLabel.updated_at = now
80
+ txLabel.id = 2
81
+
82
+ expect(txLabel.id).toBe(2)
83
+ expect(txLabel.entityName).toBe('txLabel')
84
+ expect(txLabel.entityTable).toBe('tx_labels')
85
+ expect(txLabel.txLabelId).toBe(2)
86
+ expect(txLabel.label).toBe('New Label')
87
+ expect(txLabel.userId).toBe(200)
88
+ expect(txLabel.isDeleted).toBe(true)
89
+ expect(txLabel.created_at).toBe(now)
90
+ expect(txLabel.updated_at).toBe(now)
91
+ })
92
+
93
+ // Test: mergeExisting does not update TxLabel when `ei.updated_at` is older
94
+ test('5_mergeExisting_does_not_update_txLabel_when_ei_updated_at_is_older', async () => {
95
+ for (const { activeStorage } of ctxs) {
96
+ const txLabel = new EntityTxLabel({
97
+ txLabelId: 302,
98
+ label: 'Original Label',
99
+ userId: 1,
100
+ isDeleted: false,
101
+ created_at: new Date('2023-01-01'),
102
+ updated_at: new Date('2023-02-01')
103
+ })
104
+
105
+ await activeStorage.insertTxLabel(txLabel.toApi())
106
+
107
+ const olderEi: TableTxLabel = {
108
+ txLabelId: 302,
109
+ label: 'Outdated Label',
110
+ userId: 1,
111
+ isDeleted: true,
112
+ created_at: new Date('2023-01-01'),
113
+ updated_at: new Date('2023-01-01')
114
+ }
115
+
116
+ const result = await txLabel.mergeExisting(activeStorage, undefined, olderEi, {} as any)
117
+
118
+ const reloadedTxLabel = await activeStorage.findTxLabelById(txLabel.id)
119
+
120
+ expect(result).toBe(false)
121
+ expect(reloadedTxLabel?.label).toBe('Original Label')
122
+ expect(reloadedTxLabel?.isDeleted).toBe(false)
123
+ expect(reloadedTxLabel?.updated_at).toEqual(new Date('2023-02-01'))
124
+ }
125
+ })
126
+
127
+ test('6_equals_identifies_matching_entities', async () => {
128
+ const ctx1 = ctxs[0]
129
+ const ctx2 = ctxs2[0]
130
+
131
+ // Insert a TxLabel into the first database
132
+ const txLabel1 = new EntityTxLabel({
133
+ txLabelId: 303,
134
+ userId: 1,
135
+ label: 'Test Label',
136
+ isDeleted: false,
137
+ created_at: new Date('2023-01-01'),
138
+ updated_at: new Date('2023-01-02')
139
+ })
140
+
141
+ await ctx1.activeStorage.insertTxLabel(txLabel1.toApi())
142
+
143
+ // Insert a matching TxLabel into the second database
144
+ const txLabel2 = new EntityTxLabel({
145
+ txLabelId: 304,
146
+ userId: 1, // Different userId to simulate syncMap usage
147
+ label: 'Test Label',
148
+ isDeleted: false,
149
+ created_at: new Date('2023-01-01'),
150
+ updated_at: new Date('2023-01-02')
151
+ })
152
+
153
+ await ctx2.activeStorage.insertTxLabel(txLabel2.toApi())
154
+
155
+ const syncMap = createSyncMap()
156
+ syncMap.txLabel.idMap = { [txLabel2.userId]: txLabel1.userId }
157
+ syncMap.txLabel.count = 1
158
+
159
+ // Verify the entities match
160
+ expect(txLabel1.equals(txLabel2.toApi(), syncMap)).toBe(true)
161
+ })
162
+
163
+ test('7_equals_identifies_non_matching_entities', async () => {
164
+ const ctx1 = ctxs[0]
165
+ const ctx2 = ctxs2[0]
166
+
167
+ // Insert a TxLabel into the first database
168
+ const txLabel1 = new EntityTxLabel({
169
+ txLabelId: 305,
170
+ userId: 1,
171
+ label: 'Label A',
172
+ isDeleted: false,
173
+ created_at: new Date('2023-01-01'),
174
+ updated_at: new Date('2023-01-02')
175
+ })
176
+
177
+ await ctx1.activeStorage.insertTxLabel(txLabel1.toApi())
178
+
179
+ // Insert a non-matching TxLabel into the second database
180
+ const txLabel2 = new EntityTxLabel({
181
+ txLabelId: 306, // Different txLabelId
182
+ userId: 1, // Different userId
183
+ label: 'Label B', // Different label
184
+ isDeleted: true, // Different isDeleted value
185
+ created_at: new Date('2023-01-01'),
186
+ updated_at: new Date('2023-01-02')
187
+ })
188
+
189
+ await ctx2.activeStorage.insertTxLabel(txLabel2.toApi())
190
+
191
+ const syncMap = createSyncMap()
192
+ syncMap.txLabel.idMap = { [txLabel2.userId]: txLabel1.userId }
193
+ syncMap.txLabel.count = 1
194
+
195
+ // Verify the entities do not match
196
+ expect(txLabel1.equals(txLabel2.toApi(), syncMap)).toBe(false)
197
+ })
198
+ })
@@ -0,0 +1,90 @@
1
+ import { stampLog, stampLogFormat } from '../../../../../src/utility/stampLog'
2
+ import { TestUtilsWalletStorage as _tu, TestWalletNoSetup } from '../../../../../test/utils/TestUtilsWalletStorage'
3
+
4
+ describe('stampLog and stampLogFormat Tests', () => {
5
+ jest.setTimeout(99999999)
6
+
7
+ const ctxs: TestWalletNoSetup[] = []
8
+
9
+ beforeAll(async () => {
10
+ // Set up test contexts for MySQL and SQLite
11
+ ctxs.push(await _tu.createLegacyWalletSQLiteCopy('stampLogTests'))
12
+ })
13
+
14
+ afterAll(async () => {
15
+ for (const ctx of ctxs) {
16
+ await ctx.storage.destroy()
17
+ }
18
+ })
19
+
20
+ // Test: Appending to string logs
21
+ test('0_appends_to_string_log', async () => {
22
+ for (const { wallet } of ctxs) {
23
+ const initialLog = '2025-01-10T10:00:00.000Z Event 1\n'
24
+ const lineToAdd = 'Event 2'
25
+ const updatedLog = stampLog(initialLog, lineToAdd)
26
+ expect(updatedLog).toContain('Event 2')
27
+ expect(updatedLog).toMatch(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z Event 2\n$/)
28
+ }
29
+ })
30
+
31
+ // Test: Appending to object logs
32
+ test('1_appends_to_object_log', async () => {
33
+ for (const { wallet } of ctxs) {
34
+ const initialLog = { log: '2025-01-10T10:00:00.000Z Event 1\n' }
35
+ const lineToAdd = 'Event 2'
36
+ const updatedLog = stampLog(initialLog, lineToAdd)
37
+ expect(updatedLog).toContain('Event 2')
38
+ expect(updatedLog).toMatch(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z Event 2\n$/)
39
+ }
40
+ })
41
+
42
+ // Test: Returns undefined for invalid input
43
+ test('2_returns_undefined_for_invalid_input', async () => {
44
+ for (const { wallet } of ctxs) {
45
+ const updatedLog = stampLog(undefined, 'Event 1')
46
+ expect(updatedLog).toBeUndefined()
47
+ }
48
+ })
49
+
50
+ // Test: Formatting valid log without **NETWORK**
51
+ test('3_formats_valid_log_without_network', async () => {
52
+ for (const { wallet } of ctxs) {
53
+ const log = `2025-01-10T10:00:00.000Z Event 1\n2025-01-10T10:00:01.000Z Event 2\n2025-01-10T10:00:03.000Z Event 3`
54
+ const output = stampLogFormat(log)
55
+ expect(output).toContain('Total = 3000 msecs')
56
+ expect(output).toContain(' 1000 Event 2')
57
+ expect(output).toContain(' 2000 Event 3')
58
+ }
59
+ })
60
+
61
+ // Test: Formatting valid log with **NETWORK** entries
62
+ test('4_formats_log_with_network_entries', async () => {
63
+ for (const { wallet } of ctxs) {
64
+ const log = `2025-01-10T10:00:00.000Z Event 1\n2025-01-10T10:00:01.000Z **NETWORK**\n2025-01-10T10:00:02.000Z Event 2\n2025-01-10T10:00:03.000Z **NETWORK**\n2025-01-10T10:00:05.000Z Event 3`
65
+ const output = stampLogFormat(log)
66
+ expect(output).toContain('Total = 5000 msecs')
67
+ expect(output).toContain(' 1000 **NETWORK**')
68
+ expect(output).toContain(' 2000 Event 3')
69
+ }
70
+ })
71
+
72
+ // Test: Handles improperly formatted log entries
73
+ test('5_handles_invalid_log_entries_gracefully', async () => {
74
+ for (const { wallet } of ctxs) {
75
+ const log = `Invalid Timestamp Event 1\n2025-01-10T10:00:01.000Z Event 2`
76
+
77
+ // Expect the function to throw a RangeError due to invalid timestamp
78
+ expect(() => stampLogFormat(log)).toThrow(RangeError)
79
+ }
80
+ })
81
+
82
+ // Test: Handles non-string input
83
+ test('6_handles_non-string_log_gracefully', () => {
84
+ const nonStringInputs = [undefined, null, 123, {}, [], true] // Different non-string values
85
+ for (const input of nonStringInputs) {
86
+ const result = stampLogFormat(input as unknown as string)
87
+ expect(result).toBe('') // Should return an empty string for non-string inputs
88
+ }
89
+ })
90
+ })