@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,371 @@
1
+ import { createSyncMap, sdk, SyncMap, TableCommission, TableTransaction } from '../../../../../src'
2
+ import { TestUtilsWalletStorage as _tu, TestWalletNoSetup } from '../../../../../test/utils/TestUtilsWalletStorage'
3
+ import { EntityCommission } from '../EntityCommission'
4
+
5
+ describe('Commission class method tests', () => {
6
+ jest.setTimeout(99999999)
7
+
8
+ const env = _tu.getEnv('test')
9
+ const ctxs: TestWalletNoSetup[] = []
10
+ const ctxs2: TestWalletNoSetup[] = []
11
+
12
+ beforeAll(async () => {
13
+ if (env.runMySQL) {
14
+ ctxs.push(await _tu.createLegacyWalletMySQLCopy('CommissionTests'))
15
+ ctxs2.push(await _tu.createLegacyWalletMySQLCopy('CommissionTests2'))
16
+ }
17
+ ctxs.push(await _tu.createLegacyWalletSQLiteCopy('CommissionTests'))
18
+ ctxs2.push(await _tu.createLegacyWalletSQLiteCopy('CommissionTests2'))
19
+ })
20
+
21
+ afterAll(async () => {
22
+ for (const ctx of ctxs) {
23
+ await ctx.storage.destroy()
24
+ }
25
+ for (const ctx of ctxs2) {
26
+ await ctx.storage.destroy()
27
+ }
28
+ })
29
+ // Test: equals returns true for identical Commission entities
30
+ test('0_equals identifies matching Commission entities', async () => {
31
+ for (const { activeStorage } of ctxs) {
32
+ // Generate a unique transactionId
33
+ const transactionId = 192
34
+
35
+ // Insert the transaction to satisfy the foreign key constraint
36
+ const now = new Date()
37
+ const transactionData: TableTransaction = {
38
+ transactionId,
39
+ created_at: now,
40
+ updated_at: now,
41
+ userId: 1,
42
+ txid: 'unique-txid',
43
+ status: 'sending',
44
+ reference: 'test-transaction',
45
+ isOutgoing: false,
46
+ satoshis: 1000,
47
+ description: 'Test transaction'
48
+ }
49
+
50
+ await activeStorage.insertTransaction(transactionData)
51
+
52
+ // Insert initial Commission record
53
+ const initialData: TableCommission = {
54
+ commissionId: 801,
55
+ created_at: now,
56
+ updated_at: now,
57
+ transactionId,
58
+ userId: 1,
59
+ isRedeemed: false,
60
+ keyOffset: 'offset123',
61
+ lockingScript: [1, 2, 3],
62
+ satoshis: 500
63
+ }
64
+
65
+ await activeStorage.insertCommission(initialData)
66
+
67
+ // Create two Commission entities from the same data
68
+ const entity1 = new EntityCommission(initialData)
69
+ const entity2 = new EntityCommission(initialData)
70
+
71
+ const syncMap = createSyncMap()
72
+ syncMap.transaction.idMap[transactionId] = transactionId
73
+
74
+ // Test: equals returns true for identical entities without SyncMap
75
+ expect(entity1.equals(entity2.toApi())).toBe(true)
76
+
77
+ // Test: equals returns true for identical entities with SyncMap
78
+ expect(entity1.equals(entity2.toApi(), syncMap)).toBe(true)
79
+ }
80
+ })
81
+
82
+ // Test: equals identifies non-matching Commission entities
83
+ test('1_equals identifies non-matching Commission entities', async () => {
84
+ for (const { activeStorage } of ctxs) {
85
+ // Generate unique transactionIds
86
+ const transactionId1 = 200
87
+ const transactionId2 = 201
88
+
89
+ // Insert the first transaction to satisfy the foreign key constraint
90
+ const now = new Date()
91
+ const transactionData1: TableTransaction = {
92
+ transactionId: transactionId1,
93
+ created_at: now,
94
+ updated_at: now,
95
+ userId: 1,
96
+ txid: 'unique-txid-1',
97
+ status: 'sending',
98
+ reference: 'test-transaction-1',
99
+ isOutgoing: false,
100
+ satoshis: 1000,
101
+ description: 'Test transaction 1'
102
+ }
103
+ await activeStorage.insertTransaction(transactionData1)
104
+
105
+ // Insert the second transaction to satisfy the foreign key constraint for mismatched data
106
+ const transactionData2: TableTransaction = {
107
+ transactionId: transactionId2,
108
+ created_at: now,
109
+ updated_at: now,
110
+ userId: 1,
111
+ txid: 'unique-txid-2',
112
+ status: 'sending',
113
+ reference: 'test-transaction-2',
114
+ isOutgoing: false,
115
+ satoshis: 2000,
116
+ description: 'Test transaction 2'
117
+ }
118
+ await activeStorage.insertTransaction(transactionData2)
119
+
120
+ // Insert initial Commission record
121
+ const initialData: TableCommission = {
122
+ commissionId: 802,
123
+ created_at: now,
124
+ updated_at: now,
125
+ transactionId: transactionId1,
126
+ userId: 1,
127
+ isRedeemed: false,
128
+ keyOffset: 'offset123',
129
+ lockingScript: [1, 2, 3],
130
+ satoshis: 500
131
+ }
132
+ await activeStorage.insertCommission(initialData)
133
+
134
+ // Create a Commission entity from the initial data
135
+ const entity1 = new EntityCommission(initialData)
136
+
137
+ // Create mismatched entities and test each condition
138
+ const mismatchedEntities: Partial<TableCommission>[] = [
139
+ { isRedeemed: true },
140
+ { transactionId: transactionId2 }, // Requires valid transaction
141
+ { keyOffset: 'offset456' },
142
+ { lockingScript: [4, 5, 6] },
143
+ { satoshis: 1000 }
144
+ ]
145
+
146
+ for (const mismatch of mismatchedEntities) {
147
+ const mismatchedEntity = new EntityCommission({
148
+ ...initialData,
149
+ ...mismatch
150
+ })
151
+ expect(entity1.equals(mismatchedEntity.toApi())).toBe(false)
152
+
153
+ const syncMap = createSyncMap()
154
+ syncMap.transaction.idMap[transactionId1] = transactionId1
155
+ syncMap.transaction.idMap[transactionId2] = transactionId2
156
+
157
+ expect(entity1.equals(mismatchedEntity.toApi(), syncMap)).toBe(false)
158
+ }
159
+ }
160
+ })
161
+
162
+ // Test: mergeExisting updates entity and database when ei.updated_at > this.updated_at
163
+ test('2_mergeExisting updates entity and database when ei.updated_at > this.updated_at', async () => {
164
+ for (const { activeStorage } of ctxs) {
165
+ // Generate unique transactionId
166
+ const transactionId = 203
167
+
168
+ // Insert a valid transaction to satisfy foreign key constraints
169
+ const now = new Date()
170
+ const transactionData: TableTransaction = {
171
+ transactionId,
172
+ created_at: now,
173
+ updated_at: now,
174
+ userId: 1,
175
+ txid: 'unique-txid',
176
+ status: 'sending',
177
+ reference: 'test-transaction-5',
178
+ isOutgoing: false,
179
+ satoshis: 1000,
180
+ description: 'Test transaction'
181
+ }
182
+ await activeStorage.insertTransaction(transactionData)
183
+
184
+ // Insert the initial Commission record
185
+ const initialData: TableCommission = {
186
+ commissionId: 803,
187
+ created_at: now,
188
+ updated_at: now,
189
+ transactionId,
190
+ userId: 1,
191
+ isRedeemed: false,
192
+ keyOffset: 'offset123',
193
+ lockingScript: [1, 2, 3],
194
+ satoshis: 500
195
+ }
196
+ await activeStorage.insertCommission(initialData)
197
+
198
+ // Create a Commission entity from the initial data
199
+ const entity = new EntityCommission(initialData)
200
+
201
+ // Simulate the `ei` argument with a later `updated_at`
202
+ const updatedData: TableCommission = {
203
+ ...initialData,
204
+ updated_at: new Date(now.getTime() + 1000),
205
+ isRedeemed: true
206
+ }
207
+
208
+ const syncMap = createSyncMap()
209
+ syncMap.transaction.idMap[transactionId] = transactionId
210
+
211
+ // Call mergeExisting
212
+ const wasMergedRaw = await entity.mergeExisting(
213
+ activeStorage,
214
+ undefined, // `since` is not used
215
+ updatedData,
216
+ syncMap,
217
+ undefined // `trx` is not used
218
+ )
219
+
220
+ const wasMerged = Boolean(wasMergedRaw)
221
+
222
+ // Verify that wasMerged is true
223
+ expect(wasMerged).toBe(true)
224
+
225
+ // Verify that the entity is updated
226
+ expect(entity.isRedeemed).toBe(true)
227
+
228
+ // Verify that the database is updated
229
+ const updatedRecord = await activeStorage.findCommissions({
230
+ partial: { commissionId: 803 }
231
+ })
232
+ expect(updatedRecord.length).toBe(1)
233
+ expect(updatedRecord[0]).toBeDefined()
234
+ expect(updatedRecord[0].isRedeemed).toBe(true)
235
+ }
236
+ })
237
+
238
+ // Test: mergeExisting does not update when ei.updated_at <= this.updated_at
239
+ test('3_mergeExisting does not update when ei.updated_at <= this.updated_at', async () => {
240
+ for (const { activeStorage } of ctxs) {
241
+ // Generate unique transactionId
242
+ const transactionId = 193
243
+
244
+ // Insert a valid transaction to satisfy foreign key constraints
245
+ const now = new Date()
246
+ const transactionData: TableTransaction = {
247
+ transactionId,
248
+ created_at: now,
249
+ updated_at: now,
250
+ userId: 1,
251
+ txid: 'unique-txid-193',
252
+ status: 'sending',
253
+ reference: 'test-transaction-6',
254
+ isOutgoing: false,
255
+ satoshis: 1000,
256
+ description: 'Test transaction'
257
+ }
258
+ await activeStorage.insertTransaction(transactionData)
259
+
260
+ // Insert the initial Commission record
261
+ const initialData: TableCommission = {
262
+ commissionId: 804,
263
+ created_at: now,
264
+ updated_at: now,
265
+ transactionId,
266
+ userId: 1,
267
+ isRedeemed: false,
268
+ keyOffset: 'offset123',
269
+ lockingScript: [1, 2, 3],
270
+ satoshis: 500
271
+ }
272
+ await activeStorage.insertCommission(initialData)
273
+
274
+ // Create a Commission entity from the initial data
275
+ const entity = new EntityCommission(initialData)
276
+
277
+ // Simulate the `ei` argument with an earlier or equal `updated_at`
278
+ const olderOrEqualData: TableCommission = {
279
+ ...initialData,
280
+ updated_at: new Date(now.getTime()),
281
+ isRedeemed: true
282
+ }
283
+
284
+ const syncMap = createSyncMap()
285
+ syncMap.transaction.idMap[transactionId] = transactionId
286
+
287
+ // Call mergeExisting
288
+ const wasMergedRaw = await entity.mergeExisting(
289
+ activeStorage,
290
+ undefined,
291
+ olderOrEqualData,
292
+ syncMap,
293
+ undefined // `trx` is not used
294
+ )
295
+
296
+ const wasMerged = Boolean(wasMergedRaw)
297
+
298
+ // Verify that wasMerged is false
299
+ expect(wasMerged).toBe(false)
300
+
301
+ // Verify that the entity is not updated
302
+ expect(entity.isRedeemed).toBe(false)
303
+
304
+ // Verify that the database is not updated
305
+ const record = await activeStorage.findCommissions({
306
+ partial: { commissionId: 802 }
307
+ })
308
+ expect(record.length).toBe(1)
309
+ expect(record[0]).toBeDefined()
310
+ expect(record[0].isRedeemed).toBe(false)
311
+ }
312
+ })
313
+
314
+ // Test: Commission entity getters and setters
315
+ test('4_Commission entity getters and setters', async () => {
316
+ const now = new Date()
317
+
318
+ // Initial test data
319
+ const initialData: TableCommission = {
320
+ commissionId: 801,
321
+ created_at: now,
322
+ updated_at: now,
323
+ transactionId: 101,
324
+ userId: 1,
325
+ isRedeemed: false,
326
+ keyOffset: 'offset123',
327
+ lockingScript: [1, 2, 3],
328
+ satoshis: 500
329
+ }
330
+
331
+ // Create the Commission entity
332
+ const entity = new EntityCommission(initialData)
333
+
334
+ // Validate getters
335
+ expect(entity.commissionId).toBe(initialData.commissionId)
336
+ expect(entity.created_at).toEqual(initialData.created_at)
337
+ expect(entity.updated_at).toEqual(initialData.updated_at)
338
+ expect(entity.transactionId).toBe(initialData.transactionId)
339
+ expect(entity.userId).toBe(initialData.userId)
340
+ expect(entity.isRedeemed).toBe(initialData.isRedeemed)
341
+ expect(entity.keyOffset).toBe(initialData.keyOffset)
342
+ expect(entity.lockingScript).toEqual(initialData.lockingScript)
343
+ expect(entity.satoshis).toBe(initialData.satoshis)
344
+ expect(entity.id).toBe(initialData.commissionId)
345
+ expect(entity.entityName).toBe('commission')
346
+ expect(entity.entityTable).toBe('commissions')
347
+
348
+ // Validate setters
349
+ entity.commissionId = 900
350
+ entity.created_at = new Date('2024-01-01')
351
+ entity.updated_at = new Date('2024-01-02')
352
+ entity.transactionId = 202
353
+ entity.userId = 2
354
+ entity.isRedeemed = true
355
+ entity.keyOffset = 'offset456'
356
+ entity.lockingScript = [4, 5, 6]
357
+ entity.satoshis = 1000
358
+ entity.id = 900
359
+
360
+ expect(entity.commissionId).toBe(900)
361
+ expect(entity.created_at).toEqual(new Date('2024-01-01'))
362
+ expect(entity.updated_at).toEqual(new Date('2024-01-02'))
363
+ expect(entity.transactionId).toBe(202)
364
+ expect(entity.userId).toBe(2)
365
+ expect(entity.isRedeemed).toBe(true)
366
+ expect(entity.keyOffset).toBe('offset456')
367
+ expect(entity.lockingScript).toEqual([4, 5, 6])
368
+ expect(entity.satoshis).toBe(1000)
369
+ expect(entity.id).toBe(900)
370
+ })
371
+ })
@@ -0,0 +1,278 @@
1
+ import { createSyncMap, sdk, SyncMap, TableOutputBasket } from '../../../../../src'
2
+ import { TestUtilsWalletStorage as _tu, TestWalletNoSetup } from '../../../../../test/utils/TestUtilsWalletStorage'
3
+ import { EntityOutputBasket } from '../EntityOutputBasket'
4
+
5
+ describe('OutputBasket class method tests', () => {
6
+ jest.setTimeout(99999999)
7
+
8
+ const env = _tu.getEnv('test')
9
+ const ctxs: TestWalletNoSetup[] = []
10
+ const ctxs2: TestWalletNoSetup[] = []
11
+
12
+ beforeAll(async () => {
13
+ if (env.runMySQL) {
14
+ ctxs.push(await _tu.createLegacyWalletMySQLCopy('OutputBasketTests'))
15
+ ctxs2.push(await _tu.createLegacyWalletMySQLCopy('OutputBasketTests2'))
16
+ }
17
+ ctxs.push(await _tu.createLegacyWalletSQLiteCopy('OutputBasketTests'))
18
+ ctxs2.push(await _tu.createLegacyWalletSQLiteCopy('OutputBasketTests2'))
19
+ })
20
+
21
+ afterAll(async () => {
22
+ for (const ctx of ctxs) {
23
+ await ctx.storage.destroy()
24
+ }
25
+ for (const ctx of ctxs2) {
26
+ await ctx.storage.destroy()
27
+ }
28
+ })
29
+
30
+ test('1_mergeExisting merges and updates entity when ei.updated_at > this.updated_at', async () => {
31
+ const ctx = ctxs[0]
32
+
33
+ // Insert initial OutputBasket record with valid data
34
+ const initialData: TableOutputBasket = {
35
+ basketId: 100,
36
+ created_at: new Date('2023-01-01'),
37
+ updated_at: new Date('2023-01-02'),
38
+ userId: 1,
39
+ name: 'Basket1',
40
+ numberOfDesiredUTXOs: 10,
41
+ minimumDesiredUTXOValue: 5000,
42
+ isDeleted: false
43
+ }
44
+ await ctx.activeStorage.insertOutputBasket(initialData)
45
+
46
+ // Create an OutputBasket entity from the initial data
47
+ const entity = new EntityOutputBasket(initialData)
48
+
49
+ // Simulate the `ei` argument with a later `updated_at`
50
+ const updatedData: TableOutputBasket = {
51
+ ...initialData,
52
+ updated_at: new Date('2023-01-03'), // Later timestamp
53
+ numberOfDesiredUTXOs: 20, // Update this field
54
+ minimumDesiredUTXOValue: 10000, // Update this field
55
+ isDeleted: true // Simulate a change in `isDeleted`
56
+ }
57
+
58
+ const syncMap = createSyncMap()
59
+ syncMap.outputBasket.idMap[100] = 100
60
+
61
+ // Call mergeExisting
62
+ const wasMergedRaw = await entity.mergeExisting(
63
+ ctx.activeStorage,
64
+ undefined, // `since` is not used in this method
65
+ updatedData,
66
+ syncMap,
67
+ undefined // `trx` is not used
68
+ )
69
+
70
+ const wasMerged = Boolean(wasMergedRaw)
71
+
72
+ // Verify that wasMerged is true
73
+ expect(wasMerged).toBe(true)
74
+
75
+ // Verify that the entity is updated
76
+ expect(entity.numberOfDesiredUTXOs).toBe(20)
77
+ expect(entity.minimumDesiredUTXOValue).toBe(10000)
78
+ expect(entity.isDeleted).toBe(1)
79
+
80
+ // Verify that the database is updated
81
+ const updatedRecord = await ctx.activeStorage.findOutputBaskets({
82
+ partial: { basketId: 100 }
83
+ })
84
+ expect(updatedRecord.length).toBe(1)
85
+ expect(updatedRecord[0]).toBeDefined() // Ensure record exists
86
+ expect(updatedRecord[0].numberOfDesiredUTXOs).toBe(20)
87
+ expect(updatedRecord[0].minimumDesiredUTXOValue).toBe(10000)
88
+ expect(updatedRecord[0].isDeleted).toBe(true)
89
+ })
90
+
91
+ test('2_mergeExisting does not merge when ei.updated_at <= this.updated_at', async () => {
92
+ const ctx = ctxs[0]
93
+
94
+ // Insert initial OutputBasket record with valid data
95
+ const initialData: TableOutputBasket = {
96
+ basketId: 200,
97
+ created_at: new Date('2023-01-01'),
98
+ updated_at: new Date('2023-01-02'),
99
+ userId: 1,
100
+ name: 'Basket2',
101
+ numberOfDesiredUTXOs: 10,
102
+ minimumDesiredUTXOValue: 5000,
103
+ isDeleted: false
104
+ }
105
+ await ctx.activeStorage.insertOutputBasket(initialData)
106
+
107
+ // Create an OutputBasket entity from the initial data
108
+ const entity = new EntityOutputBasket(initialData)
109
+
110
+ // Simulate the `ei` argument with an earlier `updated_at`
111
+ const earlierData: TableOutputBasket = {
112
+ ...initialData,
113
+ updated_at: new Date('2023-01-01'), // Earlier timestamp
114
+ numberOfDesiredUTXOs: 20, // Simulate a change
115
+ minimumDesiredUTXOValue: 10000, // Simulate a change
116
+ isDeleted: true // Simulate a change
117
+ }
118
+
119
+ const syncMap = createSyncMap()
120
+ syncMap.outputBasket.idMap[200] = 200
121
+
122
+ // Call mergeExisting
123
+ const wasMergedRaw = await entity.mergeExisting(
124
+ ctx.activeStorage,
125
+ undefined, // `since` is not used in this method
126
+ earlierData,
127
+ syncMap,
128
+ undefined // `trx` is not used
129
+ )
130
+
131
+ const wasMerged = Boolean(wasMergedRaw)
132
+
133
+ // Verify that wasMerged is false
134
+ expect(wasMerged).toBe(false)
135
+
136
+ // Verify that the entity is not updated
137
+ expect(entity.numberOfDesiredUTXOs).toBe(10)
138
+ expect(entity.minimumDesiredUTXOValue).toBe(5000)
139
+ expect(entity.isDeleted).toBe(0)
140
+
141
+ // Verify that the database is not updated
142
+ const updatedRecord = await ctx.activeStorage.findOutputBaskets({
143
+ partial: { basketId: 200 }
144
+ })
145
+ expect(updatedRecord.length).toBe(1)
146
+ expect(updatedRecord[0]).toBeDefined() // Ensure record exists
147
+ expect(updatedRecord[0].numberOfDesiredUTXOs).toBe(10)
148
+ expect(updatedRecord[0].minimumDesiredUTXOValue).toBe(5000)
149
+ expect(updatedRecord[0].isDeleted).toBe(false)
150
+ })
151
+
152
+ test('equals identifies matching entities with and without SyncMap', async () => {
153
+ const ctx = ctxs[0]
154
+
155
+ // Insert two identical OutputBasket records in the database
156
+ const basketData: TableOutputBasket = {
157
+ basketId: 401,
158
+ created_at: new Date('2023-01-01'),
159
+ updated_at: new Date('2023-01-02'),
160
+ userId: 1,
161
+ name: 'Test Basket',
162
+ numberOfDesiredUTXOs: 10,
163
+ minimumDesiredUTXOValue: 1000,
164
+ isDeleted: false
165
+ }
166
+
167
+ await ctx.activeStorage.insertOutputBasket(basketData)
168
+
169
+ // Create two identical entities
170
+ const entity1 = new EntityOutputBasket(basketData)
171
+ const entity2 = new EntityOutputBasket(basketData)
172
+
173
+ // Test: equals returns true for identical entities without SyncMap
174
+ expect(entity1.equals(entity2.toApi())).toBe(true)
175
+
176
+ const syncMap = createSyncMap()
177
+ syncMap.outputBasket.idMap[401] = 401
178
+
179
+ // Test: equals returns true for identical entities with SyncMap
180
+ expect(entity1.equals(entity2.toApi(), syncMap)).toBe(true)
181
+ })
182
+
183
+ test('equals identifies non-matching entities', async () => {
184
+ const ctx = ctxs[0]
185
+
186
+ // Insert two different OutputBasket records in the database
187
+ const basketData1: TableOutputBasket = {
188
+ basketId: 402,
189
+ created_at: new Date('2023-01-01'),
190
+ updated_at: new Date('2023-01-02'),
191
+ userId: 1,
192
+ name: 'Test Basket 1',
193
+ numberOfDesiredUTXOs: 10,
194
+ minimumDesiredUTXOValue: 1000,
195
+ isDeleted: false
196
+ }
197
+
198
+ const basketData2: TableOutputBasket = {
199
+ basketId: 403,
200
+ created_at: new Date('2023-01-01'),
201
+ updated_at: new Date('2023-01-02'),
202
+ userId: 1,
203
+ name: 'Test Basket 2',
204
+ numberOfDesiredUTXOs: 5,
205
+ minimumDesiredUTXOValue: 500,
206
+ isDeleted: true
207
+ }
208
+
209
+ await ctx.activeStorage.insertOutputBasket(basketData1)
210
+ await ctx.activeStorage.insertOutputBasket(basketData2)
211
+
212
+ // Create entities
213
+ const entity1 = new EntityOutputBasket(basketData1)
214
+ const entity2 = new EntityOutputBasket(basketData2)
215
+
216
+ // Test: equals returns false for different entities without SyncMap
217
+ expect(entity1.equals(entity2.toApi())).toBe(false)
218
+
219
+ const syncMap = createSyncMap()
220
+ syncMap.outputBasket.idMap[1] = 2
221
+
222
+ // Test: equals returns false for different entities with SyncMap
223
+ expect(entity1.equals(entity2.toApi(), syncMap)).toBe(false)
224
+ })
225
+
226
+ test('OutputBasket getters, setters, and updateApi', () => {
227
+ // Create a mock OutputBasket instance
228
+ const initialData: TableOutputBasket = {
229
+ basketId: 123,
230
+ created_at: new Date('2023-01-01'),
231
+ updated_at: new Date('2023-01-02'),
232
+ userId: 1,
233
+ name: 'Test Basket',
234
+ numberOfDesiredUTXOs: 10,
235
+ minimumDesiredUTXOValue: 1000,
236
+ isDeleted: false
237
+ }
238
+
239
+ const entity = new EntityOutputBasket(initialData)
240
+
241
+ // Test getters
242
+ expect(entity.basketId).toBe(123)
243
+ expect(entity.created_at.getTime()).toBe(new Date('2023-01-01').getTime())
244
+ expect(entity.updated_at.getTime()).toBe(new Date('2023-01-02').getTime())
245
+ expect(entity.userId).toBe(1)
246
+ expect(entity.name).toBe('Test Basket')
247
+ expect(entity.numberOfDesiredUTXOs).toBe(10)
248
+ expect(entity.minimumDesiredUTXOValue).toBe(1000)
249
+ expect(entity.isDeleted).toBe(false)
250
+ expect(entity.id).toBe(123)
251
+ expect(entity.entityName).toBe('outputBasket')
252
+ expect(entity.entityTable).toBe('output_baskets')
253
+
254
+ // Test setters
255
+ entity.basketId = 456
256
+ entity.created_at = new Date('2023-02-01')
257
+ entity.updated_at = new Date('2023-02-02')
258
+ entity.userId = 2
259
+ entity.name = 'Updated Basket'
260
+ entity.numberOfDesiredUTXOs = 20
261
+ entity.minimumDesiredUTXOValue = 2000
262
+ entity.isDeleted = true
263
+ entity.id = 456
264
+
265
+ expect(entity.basketId).toBe(456)
266
+ expect(entity.created_at.getTime()).toBe(new Date('2023-02-01').getTime())
267
+ expect(entity.updated_at.getTime()).toBe(new Date('2023-02-02').getTime())
268
+ expect(entity.userId).toBe(2)
269
+ expect(entity.name).toBe('Updated Basket')
270
+ expect(entity.numberOfDesiredUTXOs).toBe(20)
271
+ expect(entity.minimumDesiredUTXOValue).toBe(2000)
272
+ expect(entity.isDeleted).toBe(true)
273
+ expect(entity.id).toBe(456)
274
+
275
+ // Test updateApi (even though it does nothing)
276
+ expect(() => entity.updateApi()).not.toThrow()
277
+ })
278
+ })