@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,290 @@
1
+ import { StorageProvidedBy, TrxToken } from '../../../sdk/WalletStorage.interfaces'
2
+ import { optionalArraysEqual, verifyId, verifyOneOrNone } from '../../../utility/utilityHelpers'
3
+ import { TableOutput } from '../tables/TableOutput'
4
+ import { EntityBase, EntityStorage, SyncMap } from './EntityBase'
5
+
6
+ export class EntityOutput extends EntityBase<TableOutput> {
7
+ constructor(api?: TableOutput) {
8
+ const now = new Date()
9
+ super(
10
+ api || {
11
+ outputId: 0,
12
+ created_at: now,
13
+ updated_at: now,
14
+ userId: 0,
15
+ transactionId: 0,
16
+ spendable: false,
17
+ change: false,
18
+ satoshis: 0,
19
+ outputDescription: '',
20
+ vout: 0,
21
+ type: '',
22
+ providedBy: 'you',
23
+ purpose: '',
24
+
25
+ txid: undefined,
26
+ basketId: undefined,
27
+ spentBy: undefined,
28
+ derivationPrefix: undefined,
29
+ derivationSuffix: undefined,
30
+ senderIdentityKey: undefined,
31
+ customInstructions: undefined,
32
+ spendingDescription: undefined,
33
+ scriptLength: undefined,
34
+ scriptOffset: undefined,
35
+ lockingScript: undefined
36
+ }
37
+ )
38
+ }
39
+
40
+ override updateApi(): void {
41
+ /* nothing needed yet... */
42
+ }
43
+
44
+ get outputId() {
45
+ return this.api.outputId
46
+ }
47
+ set outputId(v: number) {
48
+ this.api.outputId = v
49
+ }
50
+ get created_at() {
51
+ return this.api.created_at
52
+ }
53
+ set created_at(v: Date) {
54
+ this.api.created_at = v
55
+ }
56
+ get updated_at() {
57
+ return this.api.updated_at
58
+ }
59
+ set updated_at(v: Date) {
60
+ this.api.updated_at = v
61
+ }
62
+ get userId() {
63
+ return this.api.userId
64
+ }
65
+ set userId(v: number) {
66
+ this.api.userId = v
67
+ }
68
+ get transactionId() {
69
+ return this.api.transactionId
70
+ }
71
+ set transactionId(v: number) {
72
+ this.api.transactionId = v
73
+ }
74
+ get basketId() {
75
+ return this.api.basketId
76
+ }
77
+ set basketId(v: number | undefined) {
78
+ this.api.basketId = v
79
+ }
80
+ get spentBy() {
81
+ return this.api.spentBy
82
+ }
83
+ set spentBy(v: number | undefined) {
84
+ this.api.spentBy = v
85
+ }
86
+ get vout() {
87
+ return this.api.vout
88
+ }
89
+ set vout(v: number) {
90
+ this.api.vout = v
91
+ }
92
+ get satoshis() {
93
+ return this.api.satoshis
94
+ }
95
+ set satoshis(v: number) {
96
+ this.api.satoshis = v
97
+ }
98
+ get outputDescription() {
99
+ return this.api.outputDescription
100
+ }
101
+ set outputDescription(v: string) {
102
+ this.api.outputDescription = v
103
+ }
104
+ get spendable() {
105
+ return this.api.spendable
106
+ }
107
+ set spendable(v: boolean) {
108
+ this.api.spendable = v
109
+ }
110
+ get change() {
111
+ return this.api.change
112
+ }
113
+ set change(v: boolean) {
114
+ this.api.change = v
115
+ }
116
+
117
+ get txid() {
118
+ return this.api.txid
119
+ }
120
+ set txid(v: string | undefined) {
121
+ this.api.txid = v
122
+ }
123
+ get type() {
124
+ return this.api.type
125
+ }
126
+ set type(v: string) {
127
+ this.api.type = v
128
+ }
129
+ get providedBy() {
130
+ return this.api.providedBy
131
+ }
132
+ set providedBy(v: StorageProvidedBy) {
133
+ this.api.providedBy = v
134
+ }
135
+ get purpose() {
136
+ return this.api.purpose
137
+ }
138
+ set purpose(v: string) {
139
+ this.api.purpose = v
140
+ }
141
+ get spendingDescription() {
142
+ return this.api.spendingDescription
143
+ }
144
+ set spendingDescription(v: string | undefined) {
145
+ this.api.spendingDescription = v
146
+ }
147
+ get derivationPrefix() {
148
+ return this.api.derivationPrefix
149
+ }
150
+ set derivationPrefix(v: string | undefined) {
151
+ this.api.derivationPrefix = v
152
+ }
153
+ get derivationSuffix() {
154
+ return this.api.derivationSuffix
155
+ }
156
+ set derivationSuffix(v: string | undefined) {
157
+ this.api.derivationSuffix = v
158
+ }
159
+ get senderIdentityKey() {
160
+ return this.api.senderIdentityKey
161
+ }
162
+ set senderIdentityKey(v: string | undefined) {
163
+ this.api.senderIdentityKey = v
164
+ }
165
+ get customInstructions() {
166
+ return this.api.customInstructions
167
+ }
168
+ set customInstructions(v: string | undefined) {
169
+ this.api.customInstructions = v
170
+ }
171
+ get lockingScript() {
172
+ return this.api.lockingScript
173
+ }
174
+ set lockingScript(v: number[] | undefined) {
175
+ this.api.lockingScript = v
176
+ }
177
+ get scriptLength() {
178
+ return this.api.scriptLength
179
+ }
180
+ set scriptLength(v: number | undefined) {
181
+ this.api.scriptLength = v
182
+ }
183
+ get scriptOffset() {
184
+ return this.api.scriptOffset
185
+ }
186
+ set scriptOffset(v: number | undefined) {
187
+ this.api.scriptOffset = v
188
+ }
189
+
190
+ override get id(): number {
191
+ return this.api.outputId
192
+ }
193
+ override set id(v: number) {
194
+ this.api.outputId = v
195
+ }
196
+ override get entityName(): string {
197
+ return 'output'
198
+ }
199
+ override get entityTable(): string {
200
+ return 'outputs'
201
+ }
202
+
203
+ override equals(ei: TableOutput, syncMap?: SyncMap | undefined): boolean {
204
+ if (
205
+ this.transactionId !== (syncMap ? syncMap.transaction.idMap[ei.transactionId] : ei.transactionId) ||
206
+ this.basketId !== (syncMap && ei.basketId ? syncMap.outputBasket.idMap[ei.basketId] : ei.basketId) ||
207
+ this.spentBy !== (syncMap && ei.spentBy ? syncMap.transaction.idMap[ei.spentBy] : ei.spentBy) ||
208
+ this.vout !== ei.vout ||
209
+ this.satoshis !== ei.satoshis ||
210
+ this.spendable !== ei.spendable ||
211
+ this.change !== ei.change ||
212
+ this.txid !== ei.txid ||
213
+ this.type !== ei.type ||
214
+ this.providedBy !== ei.providedBy ||
215
+ this.purpose !== ei.purpose ||
216
+ this.outputDescription !== ei.outputDescription ||
217
+ this.spendingDescription !== ei.spendingDescription ||
218
+ this.derivationPrefix !== ei.derivationPrefix ||
219
+ this.derivationSuffix !== ei.derivationSuffix ||
220
+ this.senderIdentityKey !== ei.senderIdentityKey ||
221
+ this.customInstructions !== ei.customInstructions ||
222
+ !optionalArraysEqual(this.lockingScript, ei.lockingScript) ||
223
+ this.scriptLength !== ei.scriptLength ||
224
+ this.scriptOffset !== ei.scriptOffset
225
+ )
226
+ return false
227
+
228
+ return true
229
+ }
230
+
231
+ static async mergeFind(
232
+ storage: EntityStorage,
233
+ userId: number,
234
+ ei: TableOutput,
235
+ syncMap: SyncMap,
236
+ trx?: TrxToken
237
+ ): Promise<{ found: boolean; eo: EntityOutput; eiId: number }> {
238
+ const transactionId = syncMap.transaction.idMap[ei.transactionId]
239
+ const basketId = ei.basketId ? syncMap.outputBasket.idMap[ei.basketId] : null
240
+ const ef = verifyOneOrNone(
241
+ await storage.findOutputs({
242
+ partial: { userId, transactionId, vout: ei.vout },
243
+ trx
244
+ })
245
+ )
246
+ return {
247
+ found: !!ef,
248
+ eo: new EntityOutput(ef || { ...ei }),
249
+ eiId: verifyId(ei.outputId)
250
+ }
251
+ }
252
+
253
+ override async mergeNew(storage: EntityStorage, userId: number, syncMap: SyncMap, trx?: TrxToken): Promise<void> {
254
+ this.userId = userId
255
+ this.basketId = this.basketId ? syncMap.outputBasket.idMap[this.basketId] : undefined
256
+ this.transactionId = syncMap.transaction.idMap[this.transactionId]
257
+ this.spentBy = this.spentBy ? syncMap.transaction.idMap[this.spentBy] : undefined
258
+ this.outputId = 0
259
+ this.outputId = await storage.insertOutput(this.toApi(), trx)
260
+ }
261
+
262
+ override async mergeExisting(
263
+ storage: EntityStorage,
264
+ since: Date | undefined,
265
+ ei: TableOutput,
266
+ syncMap: SyncMap,
267
+ trx?: TrxToken
268
+ ): Promise<boolean> {
269
+ let wasMerged = false
270
+ if (ei.updated_at > this.updated_at) {
271
+ this.spentBy = ei.spentBy ? syncMap.transaction.idMap[ei.spentBy] : undefined
272
+ this.spendable = ei.spendable
273
+ this.change = ei.change
274
+ this.type = ei.type
275
+ this.providedBy = ei.providedBy
276
+ this.purpose = ei.purpose
277
+ this.outputDescription = ei.outputDescription
278
+ this.spendingDescription = ei.spendingDescription
279
+ this.senderIdentityKey = ei.senderIdentityKey
280
+ this.customInstructions = ei.customInstructions
281
+ this.scriptLength = ei.scriptLength
282
+ this.scriptOffset = ei.scriptOffset
283
+ this.lockingScript = ei.lockingScript
284
+ this.updated_at = new Date(Math.max(ei.updated_at.getTime(), this.updated_at.getTime()))
285
+ await storage.updateOutput(this.id, this.toApi(), trx)
286
+ wasMerged = true
287
+ }
288
+ return wasMerged
289
+ }
290
+ }
@@ -0,0 +1,153 @@
1
+ import { TrxToken } from '../../../sdk/WalletStorage.interfaces'
2
+ import { verifyId, verifyOneOrNone } from '../../../utility/utilityHelpers'
3
+ import { TableOutputBasket } from '../tables/TableOutputBasket'
4
+ import { EntityBase, EntityStorage, SyncMap } from './EntityBase'
5
+
6
+ export class EntityOutputBasket extends EntityBase<TableOutputBasket> {
7
+ constructor(api?: TableOutputBasket) {
8
+ const now = new Date()
9
+ super(
10
+ api || {
11
+ basketId: 0,
12
+ created_at: now,
13
+ updated_at: now,
14
+ userId: 0,
15
+ name: '',
16
+ numberOfDesiredUTXOs: 0,
17
+ minimumDesiredUTXOValue: 0,
18
+ isDeleted: false
19
+ }
20
+ )
21
+ }
22
+
23
+ get basketId() {
24
+ return this.api.basketId
25
+ }
26
+ set basketId(v: number) {
27
+ this.api.basketId = v
28
+ }
29
+ get created_at() {
30
+ return this.api.created_at
31
+ }
32
+ set created_at(v: Date) {
33
+ this.api.created_at = v
34
+ }
35
+ get updated_at() {
36
+ return this.api.updated_at
37
+ }
38
+ set updated_at(v: Date) {
39
+ this.api.updated_at = v
40
+ }
41
+ get userId() {
42
+ return this.api.userId
43
+ }
44
+ set userId(v: number) {
45
+ this.api.userId = v
46
+ }
47
+ get name() {
48
+ return this.api.name
49
+ }
50
+ set name(v: string) {
51
+ this.api.name = v
52
+ }
53
+ get numberOfDesiredUTXOs() {
54
+ return this.api.numberOfDesiredUTXOs
55
+ }
56
+ set numberOfDesiredUTXOs(v: number) {
57
+ this.api.numberOfDesiredUTXOs = v
58
+ }
59
+ get minimumDesiredUTXOValue() {
60
+ return this.api.minimumDesiredUTXOValue
61
+ }
62
+ set minimumDesiredUTXOValue(v: number) {
63
+ this.api.minimumDesiredUTXOValue = v
64
+ }
65
+ get isDeleted() {
66
+ return this.api.isDeleted
67
+ }
68
+ set isDeleted(v: boolean) {
69
+ this.api.isDeleted = v
70
+ }
71
+
72
+ override get id() {
73
+ return this.api.basketId
74
+ }
75
+ override set id(v: number) {
76
+ this.api.basketId = v
77
+ }
78
+ override get entityName(): string {
79
+ return 'outputBasket'
80
+ }
81
+ override get entityTable(): string {
82
+ return 'output_baskets'
83
+ }
84
+
85
+ override updateApi(): void {
86
+ /* nothing needed yet... */
87
+ }
88
+
89
+ override equals(ei: TableOutputBasket, syncMap?: SyncMap): boolean {
90
+ const eo = this.api
91
+ if (
92
+ eo.name != ei.name ||
93
+ eo.numberOfDesiredUTXOs != ei.numberOfDesiredUTXOs ||
94
+ eo.minimumDesiredUTXOValue != ei.minimumDesiredUTXOValue
95
+ )
96
+ return false
97
+ if (syncMap) {
98
+ if (eo.basketId !== syncMap.outputBasket.idMap[verifyId(ei.basketId)]) return false
99
+ } else {
100
+ if (eo.basketId !== ei.basketId || eo.userId !== ei.userId) return false
101
+ }
102
+ return true
103
+ }
104
+
105
+ static async mergeFind(
106
+ storage: EntityStorage,
107
+ userId: number,
108
+ ei: TableOutputBasket,
109
+ syncMap: SyncMap,
110
+ trx?: TrxToken
111
+ ): Promise<{ found: boolean; eo: EntityOutputBasket; eiId: number }> {
112
+ const ef = verifyOneOrNone(
113
+ await storage.findOutputBaskets({
114
+ partial: { name: ei.name, userId },
115
+ trx
116
+ })
117
+ )
118
+ return {
119
+ found: !!ef,
120
+ eo: new EntityOutputBasket(ef || { ...ei }),
121
+ eiId: verifyId(ei.basketId)
122
+ }
123
+ }
124
+
125
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
126
+ override async mergeNew(storage: EntityStorage, userId: number, syncMap: SyncMap, trx?: TrxToken): Promise<void> {
127
+ this.userId = userId
128
+ this.name ||= 'default'
129
+ this.basketId = 0
130
+ this.basketId = await storage.insertOutputBasket(this.toApi(), trx)
131
+ }
132
+
133
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
134
+ override async mergeExisting(
135
+ storage: EntityStorage,
136
+ since: Date | undefined,
137
+ ei: TableOutputBasket,
138
+ syncMap: SyncMap,
139
+ trx?: TrxToken
140
+ ): Promise<boolean> {
141
+ let wasMerged = false
142
+ if (ei.updated_at > this.updated_at) {
143
+ // basket name is its identity, should not change
144
+ this.minimumDesiredUTXOValue = ei.minimumDesiredUTXOValue
145
+ this.numberOfDesiredUTXOs = ei.numberOfDesiredUTXOs
146
+ this.isDeleted = ei.isDeleted
147
+ this.updated_at = new Date(Math.max(ei.updated_at.getTime(), this.updated_at.getTime()))
148
+ await storage.updateOutputBasket(this.id, this.toApi(), trx)
149
+ wasMerged = true
150
+ }
151
+ return wasMerged
152
+ }
153
+ }
@@ -0,0 +1,121 @@
1
+ import { TrxToken } from '../../../sdk/WalletStorage.interfaces'
2
+ import { verifyId, verifyOneOrNone } from '../../../utility/utilityHelpers'
3
+ import { TableOutputTag } from '../tables/TableOutputTag'
4
+ import { EntityBase, EntityStorage, SyncMap } from './EntityBase'
5
+
6
+ export class EntityOutputTag extends EntityBase<TableOutputTag> {
7
+ constructor(api?: TableOutputTag) {
8
+ const now = new Date()
9
+ super(
10
+ api || {
11
+ outputTagId: 0,
12
+ created_at: now,
13
+ updated_at: now,
14
+ tag: '',
15
+ userId: 0,
16
+ isDeleted: false
17
+ }
18
+ )
19
+ }
20
+
21
+ override updateApi(): void {
22
+ /* nothing needed yet... */
23
+ }
24
+
25
+ get outputTagId() {
26
+ return this.api.outputTagId
27
+ }
28
+ set outputTagId(v: number) {
29
+ this.api.outputTagId = v
30
+ }
31
+ get created_at() {
32
+ return this.api.created_at
33
+ }
34
+ set created_at(v: Date) {
35
+ this.api.created_at = v
36
+ }
37
+ get updated_at() {
38
+ return this.api.updated_at
39
+ }
40
+ set updated_at(v: Date) {
41
+ this.api.updated_at = v
42
+ }
43
+ get tag() {
44
+ return this.api.tag
45
+ }
46
+ set tag(v: string) {
47
+ this.api.tag = v
48
+ }
49
+ get userId() {
50
+ return this.api.userId
51
+ }
52
+ set userId(v: number) {
53
+ this.api.userId = v
54
+ }
55
+ get isDeleted() {
56
+ return this.api.isDeleted
57
+ }
58
+ set isDeleted(v: boolean) {
59
+ this.api.isDeleted = v
60
+ }
61
+
62
+ override get id(): number {
63
+ return this.api.outputTagId
64
+ }
65
+ override set id(v: number) {
66
+ this.api.outputTagId = v
67
+ }
68
+ override get entityName(): string {
69
+ return 'outputTag'
70
+ }
71
+ override get entityTable(): string {
72
+ return 'output_tags'
73
+ }
74
+
75
+ override equals(ei: TableOutputTag, syncMap?: SyncMap | undefined): boolean {
76
+ const eo = this.toApi()
77
+ if (eo.tag != ei.tag || eo.isDeleted != ei.isDeleted) return false
78
+ if (!syncMap) {
79
+ if (eo.userId !== ei.userId) return false
80
+ }
81
+ return true
82
+ }
83
+
84
+ static async mergeFind(
85
+ storage: EntityStorage,
86
+ userId: number,
87
+ ei: TableOutputTag,
88
+ syncMap: SyncMap,
89
+ trx?: TrxToken
90
+ ): Promise<{ found: boolean; eo: EntityOutputTag; eiId: number }> {
91
+ const ef = verifyOneOrNone(await storage.findOutputTags({ partial: { tag: ei.tag, userId }, trx }))
92
+ return {
93
+ found: !!ef,
94
+ eo: new EntityOutputTag(ef || { ...ei }),
95
+ eiId: verifyId(ei.outputTagId)
96
+ }
97
+ }
98
+
99
+ override async mergeNew(storage: EntityStorage, userId: number, syncMap: SyncMap, trx?: TrxToken): Promise<void> {
100
+ this.userId = userId
101
+ this.outputTagId = 0
102
+ this.outputTagId = await storage.insertOutputTag(this.toApi(), trx)
103
+ }
104
+
105
+ override async mergeExisting(
106
+ storage: EntityStorage,
107
+ since: Date | undefined,
108
+ ei: TableOutputTag,
109
+ syncMap: SyncMap,
110
+ trx?: TrxToken
111
+ ): Promise<boolean> {
112
+ let wasMerged = false
113
+ if (ei.updated_at > this.updated_at) {
114
+ this.isDeleted = ei.isDeleted
115
+ this.updated_at = new Date(Math.max(ei.updated_at.getTime(), this.updated_at.getTime()))
116
+ await storage.updateOutputTag(this.id, this.toApi(), trx)
117
+ wasMerged = true
118
+ }
119
+ return wasMerged
120
+ }
121
+ }
@@ -0,0 +1,123 @@
1
+ import { TrxToken } from '../../../sdk/WalletStorage.interfaces'
2
+ import { WERR_INVALID_OPERATION } from '../../../sdk/WERR_errors'
3
+ import { verifyId, verifyOneOrNone } from '../../../utility/utilityHelpers'
4
+ import { TableOutputTagMap } from '../tables/TableOutputTagMap'
5
+ import { EntityBase, EntityStorage, SyncMap } from './EntityBase'
6
+
7
+ export class EntityOutputTagMap extends EntityBase<TableOutputTagMap> {
8
+ constructor(api?: TableOutputTagMap) {
9
+ const now = new Date()
10
+ super(
11
+ api || {
12
+ created_at: now,
13
+ updated_at: now,
14
+ outputId: 0,
15
+ outputTagId: 0,
16
+ isDeleted: false
17
+ }
18
+ )
19
+ }
20
+
21
+ override updateApi(): void {
22
+ /* nothing needed yet... */
23
+ }
24
+
25
+ get outputTagId() {
26
+ return this.api.outputTagId
27
+ }
28
+ set outputTagId(v: number) {
29
+ this.api.outputTagId = v
30
+ }
31
+ get outputId() {
32
+ return this.api.outputId
33
+ }
34
+ set outputId(v: number) {
35
+ this.api.outputId = v
36
+ }
37
+ get created_at() {
38
+ return this.api.created_at
39
+ }
40
+ set created_at(v: Date) {
41
+ this.api.created_at = v
42
+ }
43
+ get updated_at() {
44
+ return this.api.updated_at
45
+ }
46
+ set updated_at(v: Date) {
47
+ this.api.updated_at = v
48
+ }
49
+ get isDeleted() {
50
+ return this.api.isDeleted
51
+ }
52
+ set isDeleted(v: boolean) {
53
+ this.api.isDeleted = v
54
+ }
55
+
56
+ override get id(): number {
57
+ throw new WERR_INVALID_OPERATION('entity has no "id" value')
58
+ }
59
+ override get entityName(): string {
60
+ return 'outputTagMap'
61
+ }
62
+ override get entityTable(): string {
63
+ return 'output_tags_map'
64
+ }
65
+
66
+ override equals(ei: TableOutputTagMap, syncMap?: SyncMap | undefined): boolean {
67
+ const eo = this.toApi()
68
+
69
+ if (
70
+ eo.outputId !== (syncMap ? syncMap.output.idMap[verifyId(ei.outputId)] : ei.outputId) ||
71
+ eo.outputTagId !== (syncMap ? syncMap.outputTag.idMap[verifyId(ei.outputTagId)] : ei.outputTagId) ||
72
+ eo.isDeleted !== ei.isDeleted
73
+ )
74
+ return false
75
+
76
+ return true
77
+ }
78
+
79
+ static async mergeFind(
80
+ storage: EntityStorage,
81
+ userId: number,
82
+ ei: TableOutputTagMap,
83
+ syncMap: SyncMap,
84
+ trx?: TrxToken
85
+ ): Promise<{ found: boolean; eo: EntityOutputTagMap; eiId: number }> {
86
+ const outputId = syncMap.output.idMap[ei.outputId]
87
+ const outputTagId = syncMap.outputTag.idMap[ei.outputTagId]
88
+ const ef = verifyOneOrNone(
89
+ await storage.findOutputTagMaps({
90
+ partial: { outputId, outputTagId },
91
+ trx
92
+ })
93
+ )
94
+ return {
95
+ found: !!ef,
96
+ eo: new EntityOutputTagMap(ef || { ...ei }),
97
+ eiId: -1
98
+ }
99
+ }
100
+
101
+ override async mergeNew(storage: EntityStorage, userId: number, syncMap: SyncMap, trx?: TrxToken): Promise<void> {
102
+ this.outputId = syncMap.output.idMap[this.outputId]
103
+ this.outputTagId = syncMap.outputTag.idMap[this.outputTagId]
104
+ await storage.insertOutputTagMap(this.toApi(), trx)
105
+ }
106
+
107
+ override async mergeExisting(
108
+ storage: EntityStorage,
109
+ since: Date | undefined,
110
+ ei: TableOutputTagMap,
111
+ syncMap: SyncMap,
112
+ trx?: TrxToken
113
+ ): Promise<boolean> {
114
+ let wasMerged = false
115
+ if (ei.updated_at > this.updated_at) {
116
+ this.isDeleted = ei.isDeleted
117
+ this.updated_at = new Date(Math.max(ei.updated_at.getTime(), this.updated_at.getTime()))
118
+ await storage.updateOutputTagMap(this.outputId, this.outputTagId, this.toApi(), trx)
119
+ wasMerged = true
120
+ }
121
+ return wasMerged
122
+ }
123
+ }