@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,210 @@
1
+ import { TrxToken } from '../../../sdk/WalletStorage.interfaces'
2
+ import { StorageProvider } from '../../StorageProvider'
3
+
4
+ export type EntityStorage = StorageProvider
5
+
6
+ export abstract class EntityBase<T> {
7
+ api: T
8
+
9
+ constructor(api: T) {
10
+ this.api = api
11
+ }
12
+
13
+ /**
14
+ * Standard property for entity database Id
15
+ */
16
+ abstract get id(): number
17
+
18
+ /**
19
+ * Name of derived entity class
20
+ */
21
+ abstract get entityName(): string
22
+
23
+ /**
24
+ * Schema table name of entity
25
+ */
26
+ abstract get entityTable(): string
27
+
28
+ /**
29
+ * On construction, an entity may decode properties of the `api` object,
30
+ * such as JSON stringified objects.
31
+ *
32
+ * The `updateApi` method must re-encode the current state of those decoded properties
33
+ * into the `api` object.
34
+ *
35
+ * Used by the `toApi` method to return an updated `api` object.
36
+ */
37
+ abstract updateApi(): void
38
+
39
+ /**
40
+ * Tests for equality or 'merge' / 'convergent' equality if syncMap is provided.
41
+ *
42
+ * 'convergent' equality must satisfy (A sync B) equals (B sync A)
43
+ *
44
+ * @param ei
45
+ * @param syncMap
46
+ */
47
+ abstract equals(ei: T, syncMap?: SyncMap): boolean
48
+
49
+ /**
50
+ * Perform a 'merge' / 'convergent' equality migration of state
51
+ * to this new local entity which was constructed
52
+ * as a copy of the external object.
53
+ *
54
+ * @param userId local userId
55
+ * @param syncMap
56
+ */
57
+ abstract mergeNew(storage: EntityStorage, userId: number, syncMap: SyncMap, trx?: TrxToken): Promise<void>
58
+
59
+ /**
60
+ * Perform a 'merge' / 'convergent' equality migration of state
61
+ * from external `ei` to this existing local EntityUser
62
+ *
63
+ * @param ei
64
+ * @param syncMap
65
+ * @returns true iff entity state changed and was updated to storage
66
+ */
67
+ abstract mergeExisting(
68
+ storage: EntityStorage,
69
+ since: Date | undefined,
70
+ ei: T,
71
+ syncMap: SyncMap,
72
+ trx?: TrxToken
73
+ ): Promise<boolean>
74
+
75
+ /**
76
+ * An entity may decode properties of the underlying Api object on construction.
77
+ *
78
+ * The `toApi` method forces an `updateApi` before returning the underlying,
79
+ * now updated, Api object.
80
+ *
81
+ * @returns The underlying Api object with any entity decoded properties updated.
82
+ */
83
+ toApi(): T {
84
+ this.updateApi()
85
+ return this.api
86
+ }
87
+ }
88
+
89
+ export interface EntitySyncMap {
90
+ entityName: string
91
+
92
+ /**
93
+ * Maps foreign ids to local ids
94
+ * Some entities don't have idMaps (CertificateField, TxLabelMap and OutputTagMap)
95
+ */
96
+ idMap: Record<number, number>
97
+
98
+ /**
99
+ * the maximum updated_at value seen for this entity over chunks received
100
+ * during this udpate cycle.
101
+ */
102
+ maxUpdated_at?: Date
103
+
104
+ /**
105
+ * The cummulative count of items of this entity type received over all the `SyncChunk`s
106
+ * since the `since` was last updated.
107
+ *
108
+ * This is the `offset` value to use for the next SyncChunk request.
109
+ */
110
+ count: number
111
+ }
112
+
113
+ export interface SyncMap {
114
+ provenTx: EntitySyncMap
115
+ outputBasket: EntitySyncMap
116
+ transaction: EntitySyncMap
117
+ provenTxReq: EntitySyncMap
118
+ txLabel: EntitySyncMap
119
+ txLabelMap: EntitySyncMap
120
+ output: EntitySyncMap
121
+ outputTag: EntitySyncMap
122
+ outputTagMap: EntitySyncMap
123
+ certificate: EntitySyncMap
124
+ certificateField: EntitySyncMap
125
+ commission: EntitySyncMap
126
+ }
127
+
128
+ export function createSyncMap(): SyncMap {
129
+ const r: SyncMap = {
130
+ provenTx: {
131
+ entityName: 'provenTx',
132
+ idMap: {},
133
+ maxUpdated_at: undefined,
134
+ count: 0
135
+ },
136
+ outputBasket: {
137
+ entityName: 'outputBasket',
138
+ idMap: {},
139
+ maxUpdated_at: undefined,
140
+ count: 0
141
+ },
142
+ transaction: {
143
+ entityName: 'transaction',
144
+ idMap: {},
145
+ maxUpdated_at: undefined,
146
+ count: 0
147
+ },
148
+ provenTxReq: {
149
+ entityName: 'provenTxReq',
150
+ idMap: {},
151
+ maxUpdated_at: undefined,
152
+ count: 0
153
+ },
154
+ txLabel: {
155
+ entityName: 'txLabel',
156
+ idMap: {},
157
+ maxUpdated_at: undefined,
158
+ count: 0
159
+ },
160
+ txLabelMap: {
161
+ entityName: 'txLabelMap',
162
+ idMap: {},
163
+ maxUpdated_at: undefined,
164
+ count: 0
165
+ },
166
+ output: {
167
+ entityName: 'output',
168
+ idMap: {},
169
+ maxUpdated_at: undefined,
170
+ count: 0
171
+ },
172
+ outputTag: {
173
+ entityName: 'outputTag',
174
+ idMap: {},
175
+ maxUpdated_at: undefined,
176
+ count: 0
177
+ },
178
+ outputTagMap: {
179
+ entityName: 'outputTagMap',
180
+ idMap: {},
181
+ maxUpdated_at: undefined,
182
+ count: 0
183
+ },
184
+ certificate: {
185
+ entityName: 'certificate',
186
+ idMap: {},
187
+ maxUpdated_at: undefined,
188
+ count: 0
189
+ },
190
+ certificateField: {
191
+ entityName: 'certificateField',
192
+ idMap: {},
193
+ maxUpdated_at: undefined,
194
+ count: 0
195
+ },
196
+ commission: {
197
+ entityName: 'commission',
198
+ idMap: {},
199
+ maxUpdated_at: undefined,
200
+ count: 0
201
+ }
202
+ }
203
+ return r
204
+ }
205
+
206
+ export interface SyncError {
207
+ code: string
208
+ description: string
209
+ stack?: string
210
+ }
@@ -0,0 +1,188 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ import { TrxToken } from '../../../sdk/WalletStorage.interfaces'
3
+ import { verifyId, verifyOneOrNone } from '../../../utility/utilityHelpers'
4
+ import { TableCertificate } from '../tables/TableCertificate'
5
+ import { EntityBase, EntityStorage, SyncMap } from './EntityBase'
6
+
7
+ export class EntityCertificate extends EntityBase<TableCertificate> {
8
+ constructor(api?: TableCertificate) {
9
+ const now = new Date()
10
+ super(
11
+ api || {
12
+ certificateId: 0,
13
+ created_at: now,
14
+ updated_at: now,
15
+ userId: 0,
16
+ type: '',
17
+ subject: '',
18
+ verifier: undefined,
19
+ serialNumber: '',
20
+ certifier: '',
21
+ revocationOutpoint: '',
22
+ signature: '',
23
+ isDeleted: false
24
+ }
25
+ )
26
+ }
27
+
28
+ override updateApi(): void {
29
+ /* nothing needed yet... */
30
+ }
31
+
32
+ get certificateId() {
33
+ return this.api.certificateId
34
+ }
35
+ set certificateId(v: number) {
36
+ this.api.certificateId = v
37
+ }
38
+ get created_at() {
39
+ return this.api.created_at
40
+ }
41
+ set created_at(v: Date) {
42
+ this.api.created_at = v
43
+ }
44
+ get updated_at() {
45
+ return this.api.updated_at
46
+ }
47
+ set updated_at(v: Date) {
48
+ this.api.updated_at = v
49
+ }
50
+ get userId() {
51
+ return this.api.userId
52
+ }
53
+ set userId(v: number) {
54
+ this.api.userId = v
55
+ }
56
+ get type() {
57
+ return this.api.type
58
+ }
59
+ set type(v: string) {
60
+ this.api.type = v
61
+ }
62
+ get subject() {
63
+ return this.api.subject
64
+ }
65
+ set subject(v: string) {
66
+ this.api.subject = v
67
+ }
68
+ get verifier() {
69
+ return this.api.verifier
70
+ }
71
+ set verifier(v: string | undefined) {
72
+ this.api.verifier = v
73
+ }
74
+ get serialNumber() {
75
+ return this.api.serialNumber
76
+ }
77
+ set serialNumber(v: string) {
78
+ this.api.serialNumber = v
79
+ }
80
+ get certifier() {
81
+ return this.api.certifier
82
+ }
83
+ set certifier(v: string) {
84
+ this.api.certifier = v
85
+ }
86
+ get revocationOutpoint() {
87
+ return this.api.revocationOutpoint
88
+ }
89
+ set revocationOutpoint(v: string) {
90
+ this.api.revocationOutpoint = v
91
+ }
92
+ get signature() {
93
+ return this.api.signature
94
+ }
95
+ set signature(v: string) {
96
+ this.api.signature = v
97
+ }
98
+ get isDeleted() {
99
+ return this.api.isDeleted
100
+ }
101
+ set isDeleted(v: boolean) {
102
+ this.api.isDeleted = v
103
+ }
104
+
105
+ //get fields() { return this.api.fields }
106
+ //set fields(v: Record<string, string> | undefined) { this.api.fields = v }
107
+
108
+ override get id(): number {
109
+ return this.api.certificateId
110
+ }
111
+ override set id(v: number) {
112
+ this.api.certificateId = v
113
+ }
114
+ override get entityName(): string {
115
+ return 'certificate'
116
+ }
117
+ override get entityTable(): string {
118
+ return 'certificates'
119
+ }
120
+
121
+ override equals(ei: TableCertificate, syncMap?: SyncMap): boolean {
122
+ if (
123
+ this.type !== ei.type ||
124
+ this.subject !== ei.subject ||
125
+ this.serialNumber !== ei.serialNumber ||
126
+ this.revocationOutpoint !== ei.revocationOutpoint ||
127
+ this.signature !== ei.signature ||
128
+ this.verifier !== ei.verifier ||
129
+ this.isDeleted !== ei.isDeleted
130
+ )
131
+ return false
132
+
133
+ return true
134
+ }
135
+
136
+ static async mergeFind(
137
+ storage: EntityStorage,
138
+ userId: number,
139
+ ei: TableCertificate,
140
+ syncMap: SyncMap,
141
+ trx?: TrxToken
142
+ ): Promise<{ found: boolean; eo: EntityCertificate; eiId: number }> {
143
+ const ef = verifyOneOrNone(
144
+ await storage.findCertificates({
145
+ partial: {
146
+ serialNumber: ei.serialNumber,
147
+ certifier: ei.certifier,
148
+ userId
149
+ },
150
+ trx
151
+ })
152
+ )
153
+ return {
154
+ found: !!ef,
155
+ eo: new EntityCertificate(ef || { ...ei }),
156
+ eiId: verifyId(ei.certificateId)
157
+ }
158
+ }
159
+
160
+ override async mergeNew(storage: EntityStorage, userId: number, syncMap: SyncMap, trx?: TrxToken): Promise<void> {
161
+ this.userId = userId
162
+ this.certificateId = 0
163
+ this.certificateId = await storage.insertCertificate(this.toApi(), trx)
164
+ }
165
+
166
+ override async mergeExisting(
167
+ storage: EntityStorage,
168
+ since: Date | undefined,
169
+ ei: TableCertificate,
170
+ syncMap: SyncMap,
171
+ trx?: TrxToken
172
+ ): Promise<boolean> {
173
+ let wasMerged = false
174
+ if (ei.updated_at > this.updated_at) {
175
+ this.type = ei.type
176
+ this.subject = ei.subject
177
+ this.serialNumber = ei.serialNumber
178
+ this.revocationOutpoint = ei.revocationOutpoint
179
+ this.signature = ei.signature
180
+ this.verifier = ei.verifier
181
+ this.isDeleted = ei.isDeleted
182
+ this.updated_at = new Date(Math.max(ei.updated_at.getTime(), this.updated_at.getTime()))
183
+ await storage.updateCertificate(this.id, this.toApi(), trx)
184
+ wasMerged = true
185
+ }
186
+ return wasMerged
187
+ }
188
+ }
@@ -0,0 +1,136 @@
1
+ import { TrxToken } from '../../../sdk/WalletStorage.interfaces'
2
+ import { WERR_INVALID_OPERATION } from '../../../sdk/WERR_errors'
3
+ import { verifyOneOrNone } from '../../../utility/utilityHelpers'
4
+ import { TableCertificateField } from '../tables/TableCertificateField'
5
+ import { EntityBase, EntityStorage, SyncMap } from './EntityBase'
6
+
7
+ export class EntityCertificateField extends EntityBase<TableCertificateField> {
8
+ constructor(api?: TableCertificateField) {
9
+ const now = new Date()
10
+ super(
11
+ api || {
12
+ created_at: now,
13
+ updated_at: now,
14
+ userId: 0,
15
+ certificateId: 0,
16
+ fieldName: '',
17
+ fieldValue: '',
18
+ masterKey: ''
19
+ }
20
+ )
21
+ }
22
+
23
+ override updateApi(): void {
24
+ /* nothing needed yet... */
25
+ }
26
+
27
+ get userId() {
28
+ return this.api.userId
29
+ }
30
+ set userId(v: number) {
31
+ this.api.userId = v
32
+ }
33
+ get certificateId() {
34
+ return this.api.certificateId
35
+ }
36
+ set certificateId(v: number) {
37
+ this.api.certificateId = v
38
+ }
39
+ get created_at() {
40
+ return this.api.created_at
41
+ }
42
+ set created_at(v: Date) {
43
+ this.api.created_at = v
44
+ }
45
+ get updated_at() {
46
+ return this.api.updated_at
47
+ }
48
+ set updated_at(v: Date) {
49
+ this.api.updated_at = v
50
+ }
51
+ get fieldName() {
52
+ return this.api.fieldName
53
+ }
54
+ set fieldName(v: string) {
55
+ this.api.fieldName = v
56
+ }
57
+ get fieldValue() {
58
+ return this.api.fieldValue
59
+ }
60
+ set fieldValue(v: string) {
61
+ this.api.fieldValue = v
62
+ }
63
+ get masterKey() {
64
+ return this.api.masterKey
65
+ }
66
+ set masterKey(v: string) {
67
+ this.api.masterKey = v
68
+ }
69
+
70
+ override get id(): number {
71
+ throw new WERR_INVALID_OPERATION('entity has no "id" value')
72
+ }
73
+ override get entityName(): string {
74
+ return 'certificateField'
75
+ }
76
+ override get entityTable(): string {
77
+ return 'certificate_fields'
78
+ }
79
+
80
+ override equals(ei: TableCertificateField, syncMap?: SyncMap | undefined): boolean {
81
+ if (
82
+ this.certificateId !== (syncMap ? syncMap.certificate.idMap[ei.certificateId] : ei.certificateId) ||
83
+ this.fieldName !== ei.fieldName ||
84
+ this.fieldValue !== ei.fieldValue ||
85
+ this.masterKey !== ei.masterKey
86
+ )
87
+ return false
88
+
89
+ return true
90
+ }
91
+
92
+ static async mergeFind(
93
+ storage: EntityStorage,
94
+ userId: number,
95
+ ei: TableCertificateField,
96
+ syncMap: SyncMap,
97
+ trx?: TrxToken
98
+ ): Promise<{ found: boolean; eo: EntityCertificateField; eiId: number }> {
99
+ const certificateId = syncMap.certificate.idMap[ei.certificateId]
100
+ const ef = verifyOneOrNone(
101
+ await storage.findCertificateFields({
102
+ partial: { certificateId, userId, fieldName: ei.fieldName },
103
+ trx
104
+ })
105
+ )
106
+ return {
107
+ found: !!ef,
108
+ eo: new EntityCertificateField(ef || { ...ei }),
109
+ eiId: -1
110
+ }
111
+ }
112
+
113
+ override async mergeNew(storage: EntityStorage, userId: number, syncMap: SyncMap, trx?: TrxToken): Promise<void> {
114
+ this.certificateId = syncMap.certificate.idMap[this.certificateId]
115
+ this.userId = userId
116
+ await storage.insertCertificateField(this.toApi(), trx)
117
+ }
118
+
119
+ override async mergeExisting(
120
+ storage: EntityStorage,
121
+ since: Date | undefined,
122
+ ei: TableCertificateField,
123
+ syncMap: SyncMap,
124
+ trx?: TrxToken
125
+ ): Promise<boolean> {
126
+ let wasMerged = false
127
+ if (ei.updated_at > this.updated_at) {
128
+ this.fieldValue = ei.fieldValue
129
+ this.masterKey = ei.masterKey
130
+ this.updated_at = new Date(Math.max(ei.updated_at.getTime(), this.updated_at.getTime()))
131
+ await storage.updateCertificateField(this.certificateId, this.fieldName, this.toApi(), trx)
132
+ wasMerged = true
133
+ }
134
+ return wasMerged
135
+ }
136
+ }
@@ -0,0 +1,148 @@
1
+ import { TrxToken } from '../../../sdk/WalletStorage.interfaces'
2
+ import { arraysEqual, verifyId, verifyOneOrNone } from '../../../utility/utilityHelpers'
3
+ import { TableCommission } from '../tables/TableCommission'
4
+ import { EntityBase, EntityStorage, SyncMap } from './EntityBase'
5
+
6
+ export class EntityCommission extends EntityBase<TableCommission> {
7
+ constructor(api?: TableCommission) {
8
+ const now = new Date()
9
+ super(
10
+ api || {
11
+ commissionId: 0,
12
+ created_at: now,
13
+ updated_at: now,
14
+ transactionId: 0,
15
+ userId: 0,
16
+ isRedeemed: false,
17
+ keyOffset: '',
18
+ lockingScript: [],
19
+ satoshis: 0
20
+ }
21
+ )
22
+ }
23
+
24
+ override updateApi(): void {
25
+ /* nothing needed yet... */
26
+ }
27
+
28
+ get commissionId() {
29
+ return this.api.commissionId
30
+ }
31
+ set commissionId(v: number) {
32
+ this.api.commissionId = v
33
+ }
34
+ get created_at() {
35
+ return this.api.created_at
36
+ }
37
+ set created_at(v: Date) {
38
+ this.api.created_at = v
39
+ }
40
+ get updated_at() {
41
+ return this.api.updated_at
42
+ }
43
+ set updated_at(v: Date) {
44
+ this.api.updated_at = v
45
+ }
46
+ get transactionId() {
47
+ return this.api.transactionId
48
+ }
49
+ set transactionId(v: number) {
50
+ this.api.transactionId = v
51
+ }
52
+ get userId() {
53
+ return this.api.userId
54
+ }
55
+ set userId(v: number) {
56
+ this.api.userId = v
57
+ }
58
+ get isRedeemed() {
59
+ return this.api.isRedeemed
60
+ }
61
+ set isRedeemed(v: boolean) {
62
+ this.api.isRedeemed = v
63
+ }
64
+ get keyOffset() {
65
+ return this.api.keyOffset
66
+ }
67
+ set keyOffset(v: string) {
68
+ this.api.keyOffset = v
69
+ }
70
+ get lockingScript() {
71
+ return this.api.lockingScript
72
+ }
73
+ set lockingScript(v: number[]) {
74
+ this.api.lockingScript = v
75
+ }
76
+ get satoshis() {
77
+ return this.api.satoshis
78
+ }
79
+ set satoshis(v: number) {
80
+ this.api.satoshis = v
81
+ }
82
+
83
+ override get id(): number {
84
+ return this.api.commissionId
85
+ }
86
+ override set id(v: number) {
87
+ this.api.commissionId = v
88
+ }
89
+ override get entityName(): string {
90
+ return 'commission'
91
+ }
92
+ override get entityTable(): string {
93
+ return 'commissions'
94
+ }
95
+
96
+ override equals(ei: TableCommission, syncMap?: SyncMap | undefined): boolean {
97
+ if (
98
+ this.isRedeemed !== ei.isRedeemed ||
99
+ this.transactionId !== (syncMap ? syncMap.transaction.idMap[ei.transactionId] : ei.transactionId) ||
100
+ this.keyOffset !== ei.keyOffset ||
101
+ !arraysEqual(this.lockingScript, ei.lockingScript) ||
102
+ this.satoshis !== ei.satoshis
103
+ )
104
+ return false
105
+
106
+ return true
107
+ }
108
+
109
+ static async mergeFind(
110
+ storage: EntityStorage,
111
+ userId: number,
112
+ ei: TableCommission,
113
+ syncMap: SyncMap,
114
+ trx?: TrxToken
115
+ ): Promise<{ found: boolean; eo: EntityCommission; eiId: number }> {
116
+ const transactionId = syncMap.transaction.idMap[ei.transactionId]
117
+ const ef = verifyOneOrNone(await storage.findCommissions({ partial: { transactionId, userId }, trx }))
118
+ return {
119
+ found: !!ef,
120
+ eo: new EntityCommission(ef || { ...ei }),
121
+ eiId: verifyId(ei.commissionId)
122
+ }
123
+ }
124
+
125
+ override async mergeNew(storage: EntityStorage, userId: number, syncMap: SyncMap, trx?: TrxToken): Promise<void> {
126
+ if (this.transactionId) this.transactionId = syncMap.transaction.idMap[this.transactionId]
127
+ this.userId = userId
128
+ this.commissionId = 0
129
+ this.commissionId = await storage.insertCommission(this.toApi(), trx)
130
+ }
131
+
132
+ override async mergeExisting(
133
+ storage: EntityStorage,
134
+ since: Date | undefined,
135
+ ei: TableCommission,
136
+ syncMap: SyncMap,
137
+ trx?: TrxToken
138
+ ): Promise<boolean> {
139
+ let wasMerged = false
140
+ if (ei.updated_at > this.updated_at) {
141
+ this.isRedeemed = ei.isRedeemed
142
+ this.updated_at = new Date(Math.max(ei.updated_at.getTime(), this.updated_at.getTime()))
143
+ await storage.updateCommission(this.id, this.toApi(), trx)
144
+ wasMerged = true
145
+ }
146
+ return wasMerged
147
+ }
148
+ }