@bsv/wallet-toolbox 1.7.18 → 2.0.0-beta.0

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 (606) hide show
  1. package/out/src/sdk/validationHelpers.d.ts +303 -0
  2. package/out/src/sdk/validationHelpers.d.ts.map +1 -0
  3. package/out/src/sdk/validationHelpers.js +632 -0
  4. package/out/src/sdk/validationHelpers.js.map +1 -0
  5. package/package.json +9 -2
  6. package/.env.template +0 -22
  7. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -40
  8. package/.github/ISSUE_TEMPLATE/discussion.md +0 -24
  9. package/.github/pull_request_template.md +0 -22
  10. package/.github/workflows/push.yaml +0 -145
  11. package/.prettierrc +0 -10
  12. package/CONTRIBUTING.md +0 -89
  13. package/jest.config.ts +0 -25
  14. package/out/test/Wallet/StorageClient/storageClient.man.test.d.ts +0 -2
  15. package/out/test/Wallet/StorageClient/storageClient.man.test.d.ts.map +0 -1
  16. package/out/test/Wallet/StorageClient/storageClient.man.test.js +0 -64
  17. package/out/test/Wallet/StorageClient/storageClient.man.test.js.map +0 -1
  18. package/out/test/Wallet/action/internalizeAction.a.test.d.ts +0 -2
  19. package/out/test/Wallet/action/internalizeAction.a.test.d.ts.map +0 -1
  20. package/out/test/Wallet/action/internalizeAction.a.test.js +0 -243
  21. package/out/test/Wallet/action/internalizeAction.a.test.js.map +0 -1
  22. package/out/test/Wallet/certificate/acquireCertificate.test.d.ts +0 -2
  23. package/out/test/Wallet/certificate/acquireCertificate.test.d.ts.map +0 -1
  24. package/out/test/Wallet/certificate/acquireCertificate.test.js +0 -210
  25. package/out/test/Wallet/certificate/acquireCertificate.test.js.map +0 -1
  26. package/out/test/Wallet/certificate/listCertificates.test.d.ts +0 -2
  27. package/out/test/Wallet/certificate/listCertificates.test.d.ts.map +0 -1
  28. package/out/test/Wallet/certificate/listCertificates.test.js +0 -305
  29. package/out/test/Wallet/certificate/listCertificates.test.js.map +0 -1
  30. package/out/test/Wallet/get/getHeaderForHeight.test.d.ts +0 -2
  31. package/out/test/Wallet/get/getHeaderForHeight.test.d.ts.map +0 -1
  32. package/out/test/Wallet/get/getHeaderForHeight.test.js +0 -74
  33. package/out/test/Wallet/get/getHeaderForHeight.test.js.map +0 -1
  34. package/out/test/Wallet/get/getHeight.test.d.ts +0 -2
  35. package/out/test/Wallet/get/getHeight.test.d.ts.map +0 -1
  36. package/out/test/Wallet/get/getHeight.test.js +0 -48
  37. package/out/test/Wallet/get/getHeight.test.js.map +0 -1
  38. package/out/test/Wallet/get/getKnownTxids.test.d.ts +0 -2
  39. package/out/test/Wallet/get/getKnownTxids.test.d.ts.map +0 -1
  40. package/out/test/Wallet/get/getKnownTxids.test.js +0 -73
  41. package/out/test/Wallet/get/getKnownTxids.test.js.map +0 -1
  42. package/out/test/Wallet/get/getNetwork.test.d.ts +0 -2
  43. package/out/test/Wallet/get/getNetwork.test.d.ts.map +0 -1
  44. package/out/test/Wallet/get/getNetwork.test.js +0 -26
  45. package/out/test/Wallet/get/getNetwork.test.js.map +0 -1
  46. package/out/test/Wallet/get/getVersion.test.d.ts +0 -2
  47. package/out/test/Wallet/get/getVersion.test.d.ts.map +0 -1
  48. package/out/test/Wallet/get/getVersion.test.js +0 -25
  49. package/out/test/Wallet/get/getVersion.test.js.map +0 -1
  50. package/out/test/Wallet/live/walletLive.man.test.d.ts +0 -26
  51. package/out/test/Wallet/live/walletLive.man.test.d.ts.map +0 -1
  52. package/out/test/Wallet/live/walletLive.man.test.js +0 -417
  53. package/out/test/Wallet/live/walletLive.man.test.js.map +0 -1
  54. package/out/test/Wallet/local/localWallet.man.test.d.ts +0 -2
  55. package/out/test/Wallet/local/localWallet.man.test.d.ts.map +0 -1
  56. package/out/test/Wallet/local/localWallet.man.test.js +0 -83
  57. package/out/test/Wallet/local/localWallet.man.test.js.map +0 -1
  58. package/out/test/Wallet/local/localWallet2.man.test.d.ts +0 -2
  59. package/out/test/Wallet/local/localWallet2.man.test.d.ts.map +0 -1
  60. package/out/test/Wallet/local/localWallet2.man.test.js +0 -284
  61. package/out/test/Wallet/local/localWallet2.man.test.js.map +0 -1
  62. package/out/test/Wallet/signAction/mountaintop.man.test.d.ts +0 -2
  63. package/out/test/Wallet/signAction/mountaintop.man.test.d.ts.map +0 -1
  64. package/out/test/Wallet/signAction/mountaintop.man.test.js +0 -109
  65. package/out/test/Wallet/signAction/mountaintop.man.test.js.map +0 -1
  66. package/out/test/Wallet/specOps/specOps.man.test.d.ts +0 -2
  67. package/out/test/Wallet/specOps/specOps.man.test.d.ts.map +0 -1
  68. package/out/test/Wallet/specOps/specOps.man.test.js +0 -163
  69. package/out/test/Wallet/specOps/specOps.man.test.js.map +0 -1
  70. package/out/test/Wallet/support/janitor.man.test.d.ts +0 -2
  71. package/out/test/Wallet/support/janitor.man.test.d.ts.map +0 -1
  72. package/out/test/Wallet/support/janitor.man.test.js +0 -38
  73. package/out/test/Wallet/support/janitor.man.test.js.map +0 -1
  74. package/out/test/Wallet/support/operations.man.test.d.ts +0 -2
  75. package/out/test/Wallet/support/operations.man.test.d.ts.map +0 -1
  76. package/out/test/Wallet/support/operations.man.test.js +0 -370
  77. package/out/test/Wallet/support/operations.man.test.js.map +0 -1
  78. package/out/test/Wallet/support/reqErrorReview.2025.05.06.man.test.d.ts +0 -2
  79. package/out/test/Wallet/support/reqErrorReview.2025.05.06.man.test.d.ts.map +0 -1
  80. package/out/test/Wallet/support/reqErrorReview.2025.05.06.man.test.js +0 -385
  81. package/out/test/Wallet/support/reqErrorReview.2025.05.06.man.test.js.map +0 -1
  82. package/out/test/Wallet/sync/Wallet.updateWalletLegacyTestData.man.test.d.ts +0 -2
  83. package/out/test/Wallet/sync/Wallet.updateWalletLegacyTestData.man.test.d.ts.map +0 -1
  84. package/out/test/Wallet/sync/Wallet.updateWalletLegacyTestData.man.test.js +0 -206
  85. package/out/test/Wallet/sync/Wallet.updateWalletLegacyTestData.man.test.js.map +0 -1
  86. package/out/test/Wallet/sync/setActive.test.d.ts +0 -2
  87. package/out/test/Wallet/sync/setActive.test.d.ts.map +0 -1
  88. package/out/test/Wallet/sync/setActive.test.js +0 -161
  89. package/out/test/Wallet/sync/setActive.test.js.map +0 -1
  90. package/out/test/WalletClient/LocalKVStore.man.test.d.ts +0 -2
  91. package/out/test/WalletClient/LocalKVStore.man.test.d.ts.map +0 -1
  92. package/out/test/WalletClient/LocalKVStore.man.test.js +0 -99
  93. package/out/test/WalletClient/LocalKVStore.man.test.js.map +0 -1
  94. package/out/test/WalletClient/WERR.man.test.d.ts +0 -2
  95. package/out/test/WalletClient/WERR.man.test.d.ts.map +0 -1
  96. package/out/test/WalletClient/WERR.man.test.js +0 -34
  97. package/out/test/WalletClient/WERR.man.test.js.map +0 -1
  98. package/out/test/bsv-ts-sdk/LocalKVStore.test.d.ts +0 -2
  99. package/out/test/bsv-ts-sdk/LocalKVStore.test.d.ts.map +0 -1
  100. package/out/test/bsv-ts-sdk/LocalKVStore.test.js +0 -98
  101. package/out/test/bsv-ts-sdk/LocalKVStore.test.js.map +0 -1
  102. package/out/test/checkDB.d.ts +0 -4
  103. package/out/test/checkDB.d.ts.map +0 -1
  104. package/out/test/checkDB.js +0 -55
  105. package/out/test/checkDB.js.map +0 -1
  106. package/out/test/examples/backup.man.test.d.ts +0 -14
  107. package/out/test/examples/backup.man.test.d.ts.map +0 -1
  108. package/out/test/examples/backup.man.test.js +0 -59
  109. package/out/test/examples/backup.man.test.js.map +0 -1
  110. package/out/test/examples/pushdrop.test.d.ts +0 -56
  111. package/out/test/examples/pushdrop.test.d.ts.map +0 -1
  112. package/out/test/examples/pushdrop.test.js +0 -232
  113. package/out/test/examples/pushdrop.test.js.map +0 -1
  114. package/out/test/monitor/Monitor.test.d.ts +0 -2
  115. package/out/test/monitor/Monitor.test.d.ts.map +0 -1
  116. package/out/test/monitor/Monitor.test.js +0 -560
  117. package/out/test/monitor/Monitor.test.js.map +0 -1
  118. package/out/test/services/Services.test.d.ts +0 -2
  119. package/out/test/services/Services.test.d.ts.map +0 -1
  120. package/out/test/services/Services.test.js +0 -246
  121. package/out/test/services/Services.test.js.map +0 -1
  122. package/out/test/storage/KnexMigrations.test.d.ts +0 -2
  123. package/out/test/storage/KnexMigrations.test.d.ts.map +0 -1
  124. package/out/test/storage/KnexMigrations.test.js +0 -81
  125. package/out/test/storage/KnexMigrations.test.js.map +0 -1
  126. package/out/test/storage/StorageMySQLDojoReader.man.test.d.ts +0 -2
  127. package/out/test/storage/StorageMySQLDojoReader.man.test.d.ts.map +0 -1
  128. package/out/test/storage/StorageMySQLDojoReader.man.test.js +0 -86
  129. package/out/test/storage/StorageMySQLDojoReader.man.test.js.map +0 -1
  130. package/out/test/storage/count.test.d.ts +0 -2
  131. package/out/test/storage/count.test.d.ts.map +0 -1
  132. package/out/test/storage/count.test.js +0 -142
  133. package/out/test/storage/count.test.js.map +0 -1
  134. package/out/test/storage/find.test.d.ts +0 -2
  135. package/out/test/storage/find.test.d.ts.map +0 -1
  136. package/out/test/storage/find.test.js +0 -144
  137. package/out/test/storage/find.test.js.map +0 -1
  138. package/out/test/storage/findLegacy.test.d.ts +0 -2
  139. package/out/test/storage/findLegacy.test.d.ts.map +0 -1
  140. package/out/test/storage/findLegacy.test.js +0 -52
  141. package/out/test/storage/findLegacy.test.js.map +0 -1
  142. package/out/test/storage/idb/allocateChange.test.d.ts +0 -2
  143. package/out/test/storage/idb/allocateChange.test.d.ts.map +0 -1
  144. package/out/test/storage/idb/allocateChange.test.js +0 -110
  145. package/out/test/storage/idb/allocateChange.test.js.map +0 -1
  146. package/out/test/storage/idb/count.test.d.ts +0 -2
  147. package/out/test/storage/idb/count.test.d.ts.map +0 -1
  148. package/out/test/storage/idb/count.test.js +0 -129
  149. package/out/test/storage/idb/count.test.js.map +0 -1
  150. package/out/test/storage/idb/find.test.d.ts +0 -2
  151. package/out/test/storage/idb/find.test.d.ts.map +0 -1
  152. package/out/test/storage/idb/find.test.js +0 -131
  153. package/out/test/storage/idb/find.test.js.map +0 -1
  154. package/out/test/storage/idb/idbSpeed.test.d.ts +0 -2
  155. package/out/test/storage/idb/idbSpeed.test.d.ts.map +0 -1
  156. package/out/test/storage/idb/idbSpeed.test.js +0 -30
  157. package/out/test/storage/idb/idbSpeed.test.js.map +0 -1
  158. package/out/test/storage/idb/insert.test.d.ts +0 -2
  159. package/out/test/storage/idb/insert.test.d.ts.map +0 -1
  160. package/out/test/storage/idb/insert.test.js +0 -242
  161. package/out/test/storage/idb/insert.test.js.map +0 -1
  162. package/out/test/storage/idb/transactionAbort.test.d.ts +0 -2
  163. package/out/test/storage/idb/transactionAbort.test.d.ts.map +0 -1
  164. package/out/test/storage/idb/transactionAbort.test.js +0 -97
  165. package/out/test/storage/idb/transactionAbort.test.js.map +0 -1
  166. package/out/test/storage/idb/update.test.d.ts +0 -2
  167. package/out/test/storage/idb/update.test.d.ts.map +0 -1
  168. package/out/test/storage/idb/update.test.js +0 -902
  169. package/out/test/storage/idb/update.test.js.map +0 -1
  170. package/out/test/storage/insert.test.d.ts +0 -2
  171. package/out/test/storage/insert.test.d.ts.map +0 -1
  172. package/out/test/storage/insert.test.js +0 -256
  173. package/out/test/storage/insert.test.js.map +0 -1
  174. package/out/test/storage/update.test.d.ts +0 -2
  175. package/out/test/storage/update.test.d.ts.map +0 -1
  176. package/out/test/storage/update.test.js +0 -919
  177. package/out/test/storage/update.test.js.map +0 -1
  178. package/out/test/storage/update2.test.d.ts +0 -2
  179. package/out/test/storage/update2.test.d.ts.map +0 -1
  180. package/out/test/storage/update2.test.js +0 -767
  181. package/out/test/storage/update2.test.js.map +0 -1
  182. package/out/test/utils/TestUtilsWalletStorage.d.ts +0 -523
  183. package/out/test/utils/TestUtilsWalletStorage.d.ts.map +0 -1
  184. package/out/test/utils/TestUtilsWalletStorage.js +0 -1958
  185. package/out/test/utils/TestUtilsWalletStorage.js.map +0 -1
  186. package/out/test/utils/localWalletMethods.d.ts +0 -33
  187. package/out/test/utils/localWalletMethods.d.ts.map +0 -1
  188. package/out/test/utils/localWalletMethods.js +0 -304
  189. package/out/test/utils/localWalletMethods.js.map +0 -1
  190. package/out/test/wallet/action/abortAction.test.d.ts +0 -2
  191. package/out/test/wallet/action/abortAction.test.d.ts.map +0 -1
  192. package/out/test/wallet/action/abortAction.test.js +0 -44
  193. package/out/test/wallet/action/abortAction.test.js.map +0 -1
  194. package/out/test/wallet/action/createAction.test.d.ts +0 -2
  195. package/out/test/wallet/action/createAction.test.d.ts.map +0 -1
  196. package/out/test/wallet/action/createAction.test.js +0 -272
  197. package/out/test/wallet/action/createAction.test.js.map +0 -1
  198. package/out/test/wallet/action/createAction2.test.d.ts +0 -37
  199. package/out/test/wallet/action/createAction2.test.d.ts.map +0 -1
  200. package/out/test/wallet/action/createAction2.test.js +0 -1143
  201. package/out/test/wallet/action/createAction2.test.js.map +0 -1
  202. package/out/test/wallet/action/createActionToGenerateBeefs.man.test.d.ts +0 -2
  203. package/out/test/wallet/action/createActionToGenerateBeefs.man.test.d.ts.map +0 -1
  204. package/out/test/wallet/action/createActionToGenerateBeefs.man.test.js +0 -273
  205. package/out/test/wallet/action/createActionToGenerateBeefs.man.test.js.map +0 -1
  206. package/out/test/wallet/action/internalizeAction.test.d.ts +0 -2
  207. package/out/test/wallet/action/internalizeAction.test.d.ts.map +0 -1
  208. package/out/test/wallet/action/internalizeAction.test.js +0 -608
  209. package/out/test/wallet/action/internalizeAction.test.js.map +0 -1
  210. package/out/test/wallet/action/relinquishOutput.test.d.ts +0 -2
  211. package/out/test/wallet/action/relinquishOutput.test.d.ts.map +0 -1
  212. package/out/test/wallet/action/relinquishOutput.test.js +0 -31
  213. package/out/test/wallet/action/relinquishOutput.test.js.map +0 -1
  214. package/out/test/wallet/construct/Wallet.constructor.test.d.ts +0 -2
  215. package/out/test/wallet/construct/Wallet.constructor.test.d.ts.map +0 -1
  216. package/out/test/wallet/construct/Wallet.constructor.test.js +0 -49
  217. package/out/test/wallet/construct/Wallet.constructor.test.js.map +0 -1
  218. package/out/test/wallet/list/listActions.test.d.ts +0 -2
  219. package/out/test/wallet/list/listActions.test.d.ts.map +0 -1
  220. package/out/test/wallet/list/listActions.test.js +0 -271
  221. package/out/test/wallet/list/listActions.test.js.map +0 -1
  222. package/out/test/wallet/list/listActions2.test.d.ts +0 -2
  223. package/out/test/wallet/list/listActions2.test.d.ts.map +0 -1
  224. package/out/test/wallet/list/listActions2.test.js +0 -1141
  225. package/out/test/wallet/list/listActions2.test.js.map +0 -1
  226. package/out/test/wallet/list/listCertificates.test.d.ts +0 -2
  227. package/out/test/wallet/list/listCertificates.test.d.ts.map +0 -1
  228. package/out/test/wallet/list/listCertificates.test.js +0 -111
  229. package/out/test/wallet/list/listCertificates.test.js.map +0 -1
  230. package/out/test/wallet/list/listOutputs.test.d.ts +0 -2
  231. package/out/test/wallet/list/listOutputs.test.d.ts.map +0 -1
  232. package/out/test/wallet/list/listOutputs.test.js +0 -424
  233. package/out/test/wallet/list/listOutputs.test.js.map +0 -1
  234. package/out/test/wallet/sync/Wallet.sync.test.d.ts +0 -2
  235. package/out/test/wallet/sync/Wallet.sync.test.d.ts.map +0 -1
  236. package/out/test/wallet/sync/Wallet.sync.test.js +0 -155
  237. package/out/test/wallet/sync/Wallet.sync.test.js.map +0 -1
  238. package/out/tsconfig.all.tsbuildinfo +0 -1
  239. package/src/CWIStyleWalletManager.ts +0 -1999
  240. package/src/Setup.ts +0 -579
  241. package/src/SetupClient.ts +0 -322
  242. package/src/SetupWallet.ts +0 -108
  243. package/src/SimpleWalletManager.ts +0 -526
  244. package/src/Wallet.ts +0 -1169
  245. package/src/WalletAuthenticationManager.ts +0 -153
  246. package/src/WalletLogger.ts +0 -213
  247. package/src/WalletPermissionsManager.ts +0 -3660
  248. package/src/WalletSettingsManager.ts +0 -114
  249. package/src/__tests/CWIStyleWalletManager.test.d.ts.map +0 -1
  250. package/src/__tests/CWIStyleWalletManager.test.js.map +0 -1
  251. package/src/__tests/CWIStyleWalletManager.test.ts +0 -675
  252. package/src/__tests/WalletPermissionsManager.callbacks.test.ts +0 -323
  253. package/src/__tests/WalletPermissionsManager.checks.test.ts +0 -844
  254. package/src/__tests/WalletPermissionsManager.encryption.test.ts +0 -412
  255. package/src/__tests/WalletPermissionsManager.fixtures.ts +0 -307
  256. package/src/__tests/WalletPermissionsManager.flows.test.ts +0 -462
  257. package/src/__tests/WalletPermissionsManager.initialization.test.ts +0 -300
  258. package/src/__tests/WalletPermissionsManager.pmodules.test.ts +0 -798
  259. package/src/__tests/WalletPermissionsManager.proxying.test.ts +0 -724
  260. package/src/__tests/WalletPermissionsManager.tokens.test.ts +0 -503
  261. package/src/index.all.ts +0 -27
  262. package/src/index.client.ts +0 -25
  263. package/src/index.mobile.ts +0 -21
  264. package/src/index.ts +0 -1
  265. package/src/monitor/Monitor.ts +0 -412
  266. package/src/monitor/MonitorDaemon.ts +0 -188
  267. package/src/monitor/README.md +0 -3
  268. package/src/monitor/__test/MonitorDaemon.man.test.ts +0 -45
  269. package/src/monitor/tasks/TaskCheckForProofs.ts +0 -243
  270. package/src/monitor/tasks/TaskCheckNoSends.ts +0 -73
  271. package/src/monitor/tasks/TaskClock.ts +0 -33
  272. package/src/monitor/tasks/TaskFailAbandoned.ts +0 -54
  273. package/src/monitor/tasks/TaskMonitorCallHistory.ts +0 -26
  274. package/src/monitor/tasks/TaskNewHeader.ts +0 -93
  275. package/src/monitor/tasks/TaskPurge.ts +0 -68
  276. package/src/monitor/tasks/TaskReorg.ts +0 -89
  277. package/src/monitor/tasks/TaskReviewStatus.ts +0 -48
  278. package/src/monitor/tasks/TaskSendWaiting.ts +0 -122
  279. package/src/monitor/tasks/TaskSyncWhenIdle.ts +0 -26
  280. package/src/monitor/tasks/TaskUnFail.ts +0 -151
  281. package/src/monitor/tasks/WalletMonitorTask.ts +0 -47
  282. package/src/sdk/CertOpsWallet.ts +0 -18
  283. package/src/sdk/PrivilegedKeyManager.ts +0 -372
  284. package/src/sdk/README.md +0 -13
  285. package/src/sdk/WERR_errors.ts +0 -234
  286. package/src/sdk/WalletError.ts +0 -170
  287. package/src/sdk/WalletErrorFromJson.ts +0 -80
  288. package/src/sdk/WalletServices.interfaces.ts +0 -700
  289. package/src/sdk/WalletSigner.interfaces.ts +0 -11
  290. package/src/sdk/WalletStorage.interfaces.ts +0 -606
  291. package/src/sdk/__test/CertificateLifeCycle.test.ts +0 -131
  292. package/src/sdk/__test/PrivilegedKeyManager.test.ts +0 -738
  293. package/src/sdk/__test/WalletError.test.ts +0 -318
  294. package/src/sdk/__test/validationHelpers.test.ts +0 -21
  295. package/src/sdk/index.ts +0 -10
  296. package/src/sdk/types.ts +0 -226
  297. package/src/services/README.md +0 -11
  298. package/src/services/ServiceCollection.ts +0 -248
  299. package/src/services/Services.ts +0 -603
  300. package/src/services/__tests/ARC.man.test.ts +0 -123
  301. package/src/services/__tests/ARC.timeout.man.test.ts +0 -79
  302. package/src/services/__tests/ArcGorillaPool.man.test.ts +0 -108
  303. package/src/services/__tests/arcServices.test.ts +0 -8
  304. package/src/services/__tests/bitrails.test.ts +0 -56
  305. package/src/services/__tests/getMerklePath.test.ts +0 -15
  306. package/src/services/__tests/getRawTx.test.ts +0 -13
  307. package/src/services/__tests/postBeef.test.ts +0 -104
  308. package/src/services/__tests/verifyBeef.test.ts +0 -50
  309. package/src/services/chaintracker/BHServiceClient.ts +0 -212
  310. package/src/services/chaintracker/ChaintracksChainTracker.ts +0 -71
  311. package/src/services/chaintracker/__tests/ChaintracksChainTracker.test.ts +0 -33
  312. package/src/services/chaintracker/__tests/ChaintracksServiceClient.test.ts +0 -29
  313. package/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.ts +0 -72
  314. package/src/services/chaintracker/chaintracks/Api/BulkIngestorApi.ts +0 -83
  315. package/src/services/chaintracker/chaintracks/Api/BulkStorageApi.ts +0 -92
  316. package/src/services/chaintracker/chaintracks/Api/ChaintracksApi.ts +0 -64
  317. package/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.ts +0 -189
  318. package/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.ts +0 -18
  319. package/src/services/chaintracker/chaintracks/Api/ChaintracksFsApi.ts +0 -58
  320. package/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.ts +0 -386
  321. package/src/services/chaintracker/chaintracks/Api/LiveIngestorApi.ts +0 -25
  322. package/src/services/chaintracker/chaintracks/Chaintracks.ts +0 -609
  323. package/src/services/chaintracker/chaintracks/ChaintracksService.ts +0 -199
  324. package/src/services/chaintracker/chaintracks/ChaintracksServiceClient.ts +0 -154
  325. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.ts +0 -176
  326. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.ts +0 -174
  327. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.ts +0 -18
  328. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.ts +0 -113
  329. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.ts +0 -81
  330. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.ts +0 -86
  331. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.ts +0 -59
  332. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.ts +0 -104
  333. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.ts +0 -66
  334. package/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.ts +0 -566
  335. package/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.ts +0 -219
  336. package/src/services/chaintracker/chaintracks/Ingest/__tests/BulkIngestorCDNBabbage.test.ts +0 -54
  337. package/src/services/chaintracker/chaintracks/Ingest/__tests/LiveIngestorWhatsOnChainPoll.test.ts +0 -33
  338. package/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.ts +0 -124
  339. package/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.ts +0 -92
  340. package/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.ts +0 -104
  341. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.ts +0 -382
  342. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.ts +0 -574
  343. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.ts +0 -438
  344. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageMemory.ts +0 -29
  345. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.ts +0 -304
  346. package/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageIdb.test.ts +0 -102
  347. package/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageKnex.test.ts +0 -45
  348. package/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.ts +0 -77
  349. package/src/services/chaintracker/chaintracks/__tests/ChaintracksClientApi.test.ts +0 -192
  350. package/src/services/chaintracker/chaintracks/__tests/LocalCdnServer.ts +0 -75
  351. package/src/services/chaintracker/chaintracks/__tests/createIdbChaintracks.test.ts +0 -62
  352. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNetBlockHeaders.json +0 -1
  353. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_0.headers +0 -0
  354. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_1.headers +0 -0
  355. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_2.headers +0 -0
  356. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_3.headers +0 -0
  357. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNetBlockHeaders.json +0 -1
  358. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_0.headers +0 -0
  359. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_1.headers +0 -0
  360. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_2.headers +0 -0
  361. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_3.headers +0 -0
  362. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNetBlockHeaders.json +0 -1
  363. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_0.headers +0 -0
  364. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_1.headers +0 -0
  365. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_2.headers +0 -0
  366. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_3.headers +0 -0
  367. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNetBlockHeaders.json +0 -1
  368. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_0.headers +0 -0
  369. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_1.headers +0 -0
  370. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_2.headers +0 -0
  371. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_3.headers +0 -0
  372. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_4.headers +0 -0
  373. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNetBlockHeaders.json +0 -1
  374. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_0.headers +0 -0
  375. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_1.headers +0 -0
  376. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_2.headers +0 -0
  377. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_3.headers +0 -0
  378. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_4.headers +0 -0
  379. package/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.ts +0 -92
  380. package/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.ts +0 -111
  381. package/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.ts +0 -91
  382. package/src/services/chaintracker/chaintracks/createIdbChaintracks.ts +0 -60
  383. package/src/services/chaintracker/chaintracks/createKnexChaintracks.ts +0 -65
  384. package/src/services/chaintracker/chaintracks/createNoDbChaintracks.ts +0 -60
  385. package/src/services/chaintracker/chaintracks/index.all.ts +0 -12
  386. package/src/services/chaintracker/chaintracks/index.client.ts +0 -4
  387. package/src/services/chaintracker/chaintracks/index.mobile.ts +0 -37
  388. package/src/services/chaintracker/chaintracks/util/BulkFileDataManager.ts +0 -975
  389. package/src/services/chaintracker/chaintracks/util/BulkFileDataReader.ts +0 -60
  390. package/src/services/chaintracker/chaintracks/util/BulkFilesReader.ts +0 -336
  391. package/src/services/chaintracker/chaintracks/util/BulkHeaderFile.ts +0 -247
  392. package/src/services/chaintracker/chaintracks/util/ChaintracksFetch.ts +0 -69
  393. package/src/services/chaintracker/chaintracks/util/ChaintracksFs.ts +0 -141
  394. package/src/services/chaintracker/chaintracks/util/HeightRange.ts +0 -153
  395. package/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.ts +0 -76
  396. package/src/services/chaintracker/chaintracks/util/__tests/BulkFileDataManager.test.ts +0 -304
  397. package/src/services/chaintracker/chaintracks/util/__tests/ChaintracksFetch.test.ts +0 -60
  398. package/src/services/chaintracker/chaintracks/util/__tests/HeightRange.test.ts +0 -67
  399. package/src/services/chaintracker/chaintracks/util/__tests/SingleWriterMultiReaderLock.test.ts +0 -49
  400. package/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.ts +0 -573
  401. package/src/services/chaintracker/chaintracks/util/dirtyHashes.ts +0 -29
  402. package/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.ts +0 -432
  403. package/src/services/chaintracker/index.all.ts +0 -4
  404. package/src/services/chaintracker/index.client.ts +0 -4
  405. package/src/services/chaintracker/index.mobile.ts +0 -4
  406. package/src/services/createDefaultWalletServicesOptions.ts +0 -77
  407. package/src/services/index.ts +0 -1
  408. package/src/services/processingErrors/arcSuccessError.json +0 -76
  409. package/src/services/providers/ARC.ts +0 -350
  410. package/src/services/providers/Bitails.ts +0 -256
  411. package/src/services/providers/SdkWhatsOnChain.ts +0 -83
  412. package/src/services/providers/WhatsOnChain.ts +0 -883
  413. package/src/services/providers/__tests/WhatsOnChain.test.ts +0 -242
  414. package/src/services/providers/__tests/exchangeRates.test.ts +0 -18
  415. package/src/services/providers/exchangeRates.ts +0 -265
  416. package/src/services/providers/getBeefForTxid.ts +0 -369
  417. package/src/signer/README.md +0 -5
  418. package/src/signer/WalletSigner.ts +0 -17
  419. package/src/signer/methods/acquireDirectCertificate.ts +0 -52
  420. package/src/signer/methods/buildSignableTransaction.ts +0 -183
  421. package/src/signer/methods/completeSignedTransaction.ts +0 -117
  422. package/src/signer/methods/createAction.ts +0 -172
  423. package/src/signer/methods/internalizeAction.ts +0 -106
  424. package/src/signer/methods/proveCertificate.ts +0 -43
  425. package/src/signer/methods/signAction.ts +0 -54
  426. package/src/storage/README.md +0 -14
  427. package/src/storage/StorageIdb.ts +0 -2304
  428. package/src/storage/StorageKnex.ts +0 -1425
  429. package/src/storage/StorageProvider.ts +0 -810
  430. package/src/storage/StorageReader.ts +0 -194
  431. package/src/storage/StorageReaderWriter.ts +0 -432
  432. package/src/storage/StorageSyncReader.ts +0 -34
  433. package/src/storage/WalletStorageManager.ts +0 -943
  434. package/src/storage/__test/StorageIdb.test.ts +0 -43
  435. package/src/storage/__test/WalletStorageManager.test.ts +0 -275
  436. package/src/storage/__test/adminStats.man.test.ts +0 -89
  437. package/src/storage/__test/getBeefForTransaction.test.ts +0 -385
  438. package/src/storage/index.all.ts +0 -11
  439. package/src/storage/index.client.ts +0 -7
  440. package/src/storage/index.mobile.ts +0 -6
  441. package/src/storage/methods/ListActionsSpecOp.ts +0 -70
  442. package/src/storage/methods/ListOutputsSpecOp.ts +0 -129
  443. package/src/storage/methods/__test/GenerateChange/generateChangeSdk.test.ts +0 -1057
  444. package/src/storage/methods/__test/GenerateChange/randomValsUsed1.ts +0 -20
  445. package/src/storage/methods/__test/offsetKey.test.ts +0 -274
  446. package/src/storage/methods/attemptToPostReqsToNetwork.ts +0 -389
  447. package/src/storage/methods/createAction.ts +0 -947
  448. package/src/storage/methods/generateChange.ts +0 -556
  449. package/src/storage/methods/getBeefForTransaction.ts +0 -139
  450. package/src/storage/methods/getSyncChunk.ts +0 -293
  451. package/src/storage/methods/internalizeAction.ts +0 -562
  452. package/src/storage/methods/listActionsIdb.ts +0 -183
  453. package/src/storage/methods/listActionsKnex.ts +0 -226
  454. package/src/storage/methods/listCertificates.ts +0 -73
  455. package/src/storage/methods/listOutputsIdb.ts +0 -203
  456. package/src/storage/methods/listOutputsKnex.ts +0 -263
  457. package/src/storage/methods/offsetKey.ts +0 -89
  458. package/src/storage/methods/processAction.ts +0 -420
  459. package/src/storage/methods/purgeData.ts +0 -251
  460. package/src/storage/methods/purgeDataIdb.ts +0 -10
  461. package/src/storage/methods/reviewStatus.ts +0 -101
  462. package/src/storage/methods/reviewStatusIdb.ts +0 -43
  463. package/src/storage/methods/utils.Buffer.ts +0 -33
  464. package/src/storage/methods/utils.ts +0 -56
  465. package/src/storage/remoting/StorageClient.ts +0 -567
  466. package/src/storage/remoting/StorageMobile.ts +0 -544
  467. package/src/storage/remoting/StorageServer.ts +0 -291
  468. package/src/storage/remoting/__test/StorageClient.test.ts +0 -113
  469. package/src/storage/schema/KnexMigrations.ts +0 -489
  470. package/src/storage/schema/StorageIdbSchema.ts +0 -150
  471. package/src/storage/schema/entities/EntityBase.ts +0 -210
  472. package/src/storage/schema/entities/EntityCertificate.ts +0 -188
  473. package/src/storage/schema/entities/EntityCertificateField.ts +0 -136
  474. package/src/storage/schema/entities/EntityCommission.ts +0 -148
  475. package/src/storage/schema/entities/EntityOutput.ts +0 -290
  476. package/src/storage/schema/entities/EntityOutputBasket.ts +0 -153
  477. package/src/storage/schema/entities/EntityOutputTag.ts +0 -121
  478. package/src/storage/schema/entities/EntityOutputTagMap.ts +0 -123
  479. package/src/storage/schema/entities/EntityProvenTx.ts +0 -319
  480. package/src/storage/schema/entities/EntityProvenTxReq.ts +0 -580
  481. package/src/storage/schema/entities/EntitySyncState.ts +0 -389
  482. package/src/storage/schema/entities/EntityTransaction.ts +0 -306
  483. package/src/storage/schema/entities/EntityTxLabel.ts +0 -121
  484. package/src/storage/schema/entities/EntityTxLabelMap.ts +0 -123
  485. package/src/storage/schema/entities/EntityUser.ts +0 -112
  486. package/src/storage/schema/entities/MergeEntity.ts +0 -73
  487. package/src/storage/schema/entities/__tests/CertificateFieldTests.test.ts +0 -353
  488. package/src/storage/schema/entities/__tests/CertificateTests.test.ts +0 -354
  489. package/src/storage/schema/entities/__tests/CommissionTests.test.ts +0 -371
  490. package/src/storage/schema/entities/__tests/OutputBasketTests.test.ts +0 -278
  491. package/src/storage/schema/entities/__tests/OutputTagMapTests.test.ts +0 -242
  492. package/src/storage/schema/entities/__tests/OutputTagTests.test.ts +0 -288
  493. package/src/storage/schema/entities/__tests/OutputTests.test.ts +0 -464
  494. package/src/storage/schema/entities/__tests/ProvenTxReqTests.test.ts +0 -340
  495. package/src/storage/schema/entities/__tests/ProvenTxTests.test.ts +0 -504
  496. package/src/storage/schema/entities/__tests/SyncStateTests.test.ts +0 -288
  497. package/src/storage/schema/entities/__tests/TransactionTests.test.ts +0 -604
  498. package/src/storage/schema/entities/__tests/TxLabelMapTests.test.ts +0 -361
  499. package/src/storage/schema/entities/__tests/TxLabelTests.test.ts +0 -198
  500. package/src/storage/schema/entities/__tests/stampLogTests.test.ts +0 -90
  501. package/src/storage/schema/entities/__tests/usersTests.test.ts +0 -340
  502. package/src/storage/schema/entities/index.ts +0 -16
  503. package/src/storage/schema/tables/TableCertificate.ts +0 -21
  504. package/src/storage/schema/tables/TableCertificateField.ts +0 -12
  505. package/src/storage/schema/tables/TableCommission.ts +0 -13
  506. package/src/storage/schema/tables/TableMonitorEvent.ts +0 -9
  507. package/src/storage/schema/tables/TableOutput.ts +0 -64
  508. package/src/storage/schema/tables/TableOutputBasket.ts +0 -12
  509. package/src/storage/schema/tables/TableOutputTag.ts +0 -10
  510. package/src/storage/schema/tables/TableOutputTagMap.ts +0 -9
  511. package/src/storage/schema/tables/TableProvenTx.ts +0 -14
  512. package/src/storage/schema/tables/TableProvenTxReq.ts +0 -65
  513. package/src/storage/schema/tables/TableSettings.ts +0 -17
  514. package/src/storage/schema/tables/TableSyncState.ts +0 -18
  515. package/src/storage/schema/tables/TableTransaction.ts +0 -54
  516. package/src/storage/schema/tables/TableTxLabel.ts +0 -10
  517. package/src/storage/schema/tables/TableTxLabelMap.ts +0 -9
  518. package/src/storage/schema/tables/TableUser.ts +0 -16
  519. package/src/storage/schema/tables/index.ts +0 -16
  520. package/src/storage/sync/StorageMySQLDojoReader.ts +0 -696
  521. package/src/storage/sync/index.ts +0 -1
  522. package/src/utility/Format.ts +0 -133
  523. package/src/utility/README.md +0 -3
  524. package/src/utility/ReaderUint8Array.ts +0 -187
  525. package/src/utility/ScriptTemplateBRC29.ts +0 -73
  526. package/src/utility/__tests/utilityHelpers.noBuffer.test.ts +0 -109
  527. package/src/utility/aggregateResults.ts +0 -68
  528. package/src/utility/identityUtils.ts +0 -159
  529. package/src/utility/index.all.ts +0 -7
  530. package/src/utility/index.client.ts +0 -7
  531. package/src/utility/parseTxScriptOffsets.ts +0 -29
  532. package/src/utility/stampLog.ts +0 -69
  533. package/src/utility/tscProofToMerklePath.ts +0 -48
  534. package/src/utility/utilityHelpers.buffer.ts +0 -34
  535. package/src/utility/utilityHelpers.noBuffer.ts +0 -60
  536. package/src/utility/utilityHelpers.ts +0 -275
  537. package/src/wab-client/WABClient.ts +0 -94
  538. package/src/wab-client/__tests/WABClient.man.test.ts +0 -59
  539. package/src/wab-client/auth-method-interactors/AuthMethodInteractor.ts +0 -47
  540. package/src/wab-client/auth-method-interactors/DevConsoleInteractor.ts +0 -73
  541. package/src/wab-client/auth-method-interactors/PersonaIDInteractor.ts +0 -35
  542. package/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.ts +0 -72
  543. package/syncVersions.js +0 -71
  544. package/test/Wallet/StorageClient/storageClient.man.test.ts +0 -75
  545. package/test/Wallet/action/internalizeAction.a.test.ts +0 -286
  546. package/test/Wallet/certificate/acquireCertificate.test.ts +0 -298
  547. package/test/Wallet/certificate/listCertificates.test.ts +0 -346
  548. package/test/Wallet/get/getHeaderForHeight.test.ts +0 -82
  549. package/test/Wallet/get/getHeight.test.ts +0 -52
  550. package/test/Wallet/get/getKnownTxids.test.ts +0 -86
  551. package/test/Wallet/get/getNetwork.test.ts +0 -27
  552. package/test/Wallet/get/getVersion.test.ts +0 -27
  553. package/test/Wallet/live/walletLive.man.test.ts +0 -521
  554. package/test/Wallet/local/localWallet.man.test.ts +0 -93
  555. package/test/Wallet/local/localWallet2.man.test.ts +0 -277
  556. package/test/Wallet/signAction/mountaintop.man.test.ts +0 -130
  557. package/test/Wallet/specOps/specOps.man.test.ts +0 -220
  558. package/test/Wallet/support/janitor.man.test.ts +0 -40
  559. package/test/Wallet/support/operations.man.test.ts +0 -407
  560. package/test/Wallet/support/reqErrorReview.2025.05.06.man.test.ts +0 -347
  561. package/test/Wallet/sync/Wallet.updateWalletLegacyTestData.man.test.ts +0 -203
  562. package/test/Wallet/sync/setActive.test.ts +0 -170
  563. package/test/WalletClient/LocalKVStore.man.test.ts +0 -114
  564. package/test/WalletClient/WERR.man.test.ts +0 -35
  565. package/test/bsv-ts-sdk/LocalKVStore.test.ts +0 -102
  566. package/test/checkDB.ts +0 -57
  567. package/test/checkdb +0 -0
  568. package/test/examples/backup.man.test.ts +0 -59
  569. package/test/examples/pushdrop.test.ts +0 -282
  570. package/test/monitor/Monitor.test.ts +0 -620
  571. package/test/services/Services.test.ts +0 -263
  572. package/test/storage/KnexMigrations.test.ts +0 -86
  573. package/test/storage/StorageMySQLDojoReader.man.test.ts +0 -60
  574. package/test/storage/count.test.ts +0 -177
  575. package/test/storage/find.test.ts +0 -195
  576. package/test/storage/findLegacy.test.ts +0 -67
  577. package/test/storage/idb/allocateChange.test.ts +0 -251
  578. package/test/storage/idb/count.test.ts +0 -158
  579. package/test/storage/idb/find.test.ts +0 -177
  580. package/test/storage/idb/idbSpeed.test.ts +0 -36
  581. package/test/storage/idb/insert.test.ts +0 -268
  582. package/test/storage/idb/transactionAbort.test.ts +0 -108
  583. package/test/storage/idb/update.test.ts +0 -999
  584. package/test/storage/insert.test.ts +0 -278
  585. package/test/storage/update.test.ts +0 -1021
  586. package/test/storage/update2.test.ts +0 -897
  587. package/test/utils/TestUtilsWalletStorage.ts +0 -2526
  588. package/test/utils/localWalletMethods.ts +0 -363
  589. package/test/utils/removeFailedFromDatabase.sql +0 -17
  590. package/test/wallet/action/abortAction.test.ts +0 -47
  591. package/test/wallet/action/createAction.test.ts +0 -299
  592. package/test/wallet/action/createAction2.test.ts +0 -1273
  593. package/test/wallet/action/createActionToGenerateBeefs.man.test.ts +0 -293
  594. package/test/wallet/action/internalizeAction.test.ts +0 -682
  595. package/test/wallet/action/relinquishOutput.test.ts +0 -37
  596. package/test/wallet/construct/Wallet.constructor.test.ts +0 -57
  597. package/test/wallet/list/listActions.test.ts +0 -279
  598. package/test/wallet/list/listActions2.test.ts +0 -1381
  599. package/test/wallet/list/listCertificates.test.ts +0 -118
  600. package/test/wallet/list/listOutputs.test.ts +0 -447
  601. package/test/wallet/sync/Wallet.sync.test.ts +0 -215
  602. package/ts2md.json +0 -44
  603. package/tsconfig.all.json +0 -31
  604. package/tsconfig.client.json +0 -29
  605. package/tsconfig.json +0 -17
  606. package/tsconfig.mobile.json +0 -28
@@ -1,1425 +0,0 @@
1
- import { ListActionsResult, ListOutputsResult, Validation } from '@bsv/sdk'
2
- import {
3
- outputColumnsWithoutLockingScript,
4
- TableCertificate,
5
- TableCertificateField,
6
- TableCertificateX,
7
- TableCommission,
8
- TableMonitorEvent,
9
- TableOutput,
10
- TableOutputBasket,
11
- TableOutputTag,
12
- TableOutputTagMap,
13
- TableProvenTx,
14
- TableProvenTxReq,
15
- TableSettings,
16
- TableSyncState,
17
- TableTransaction,
18
- TableTxLabel,
19
- TableTxLabelMap,
20
- TableUser,
21
- transactionColumnsWithoutRawTx
22
- } from './schema/tables'
23
- import { KnexMigrations } from './schema/KnexMigrations'
24
- import { Knex } from 'knex'
25
- import { AdminStatsResult, StorageProvider, StorageProviderOptions } from './StorageProvider'
26
- import { purgeData } from './methods/purgeData'
27
- import { listActions } from './methods/listActionsKnex'
28
- import { listOutputs } from './methods/listOutputsKnex'
29
- import { DBType } from './StorageReader'
30
- import { reviewStatus } from './methods/reviewStatus'
31
- import { ServicesCallHistory } from '../sdk/WalletServices.interfaces'
32
- import {
33
- AuthId,
34
- FindCertificateFieldsArgs,
35
- FindCertificatesArgs,
36
- FindCommissionsArgs,
37
- FindForUserSincePagedArgs,
38
- FindMonitorEventsArgs,
39
- FindOutputBasketsArgs,
40
- FindOutputsArgs,
41
- FindOutputTagMapsArgs,
42
- FindOutputTagsArgs,
43
- FindPartialSincePagedArgs,
44
- FindProvenTxReqsArgs,
45
- FindProvenTxsArgs,
46
- FindSyncStatesArgs,
47
- FindTransactionsArgs,
48
- FindTxLabelMapsArgs,
49
- FindTxLabelsArgs,
50
- FindUsersArgs,
51
- ProvenOrRawTx,
52
- PurgeParams,
53
- PurgeResults,
54
- TrxToken,
55
- WalletStorageProvider
56
- } from '../sdk/WalletStorage.interfaces'
57
- import { WERR_INTERNAL, WERR_INVALID_PARAMETER, WERR_NOT_IMPLEMENTED, WERR_UNAUTHORIZED } from '../sdk/WERR_errors'
58
- import { verifyOne, verifyOneOrNone, verifyTruthy } from '../utility/utilityHelpers'
59
- import { EntityTimeStamp, TransactionStatus } from '../sdk/types'
60
-
61
- export interface StorageKnexOptions extends StorageProviderOptions {
62
- /**
63
- * Knex database interface initialized with valid connection configuration.
64
- */
65
- knex: Knex
66
- }
67
-
68
- export class StorageKnex extends StorageProvider implements WalletStorageProvider {
69
- knex: Knex
70
-
71
- constructor(options: StorageKnexOptions) {
72
- super(options)
73
- if (!options.knex) throw new WERR_INVALID_PARAMETER('options.knex', `valid`)
74
- this.knex = options.knex
75
- }
76
-
77
- async readSettings(): Promise<TableSettings> {
78
- return this.validateEntity(verifyOne(await this.toDb(undefined)<TableSettings>('settings')))
79
- }
80
-
81
- override async getProvenOrRawTx(txid: string, trx?: TrxToken): Promise<ProvenOrRawTx> {
82
- const k = this.toDb(trx)
83
- const r: ProvenOrRawTx = {
84
- proven: undefined,
85
- rawTx: undefined,
86
- inputBEEF: undefined
87
- }
88
-
89
- r.proven = verifyOneOrNone(await this.findProvenTxs({ partial: { txid: txid } }))
90
- if (!r.proven) {
91
- const reqRawTx = verifyOneOrNone(
92
- await k('proven_tx_reqs')
93
- .where('txid', txid)
94
- .whereIn('status', ['unsent', 'unmined', 'unconfirmed', 'sending', 'nosend', 'completed'])
95
- .select('rawTx', 'inputBEEF')
96
- )
97
- if (reqRawTx) {
98
- r.rawTx = Array.from(reqRawTx.rawTx)
99
- r.inputBEEF = Array.from(reqRawTx.inputBEEF)
100
- }
101
- }
102
- return r
103
- }
104
-
105
- dbTypeSubstring(source: string, fromOffset: number, forLength?: number) {
106
- if (this.dbtype === 'MySQL') return `substring(${source} from ${fromOffset} for ${forLength!})`
107
- return `substr(${source}, ${fromOffset}, ${forLength})`
108
- }
109
-
110
- override async getRawTxOfKnownValidTransaction(
111
- txid?: string,
112
- offset?: number,
113
- length?: number,
114
- trx?: TrxToken
115
- ): Promise<number[] | undefined> {
116
- if (!txid) return undefined
117
- if (!this.isAvailable()) await this.makeAvailable()
118
-
119
- let rawTx: number[] | undefined = undefined
120
- if (Number.isInteger(offset) && Number.isInteger(length)) {
121
- let rs: { rawTx: Buffer | null }[] = await this.toDb(trx).raw(
122
- `select ${this.dbTypeSubstring('rawTx', offset! + 1, length)} as rawTx from proven_txs where txid = '${txid}'`
123
- )
124
- if (this.dbtype === 'MySQL') rs = (rs as unknown as { rawTx: Buffer | null }[][])[0]
125
- const r = verifyOneOrNone(rs)
126
- if (r && r.rawTx) {
127
- rawTx = Array.from(r.rawTx)
128
- } else {
129
- let rs: { rawTx: Buffer | null }[] = await this.toDb(trx).raw(
130
- `select ${this.dbTypeSubstring('rawTx', offset! + 1, length)} as rawTx from proven_tx_reqs where txid = '${txid}' and status in ('unsent', 'nosend', 'sending', 'unmined', 'completed', 'unfail')`
131
- )
132
- if (this.dbtype === 'MySQL') rs = (rs as unknown as { rawTx: Buffer | null }[][])[0]
133
- const r = verifyOneOrNone(rs)
134
- if (r && r.rawTx) {
135
- rawTx = Array.from(r.rawTx)
136
- }
137
- }
138
- } else {
139
- const r = await this.getProvenOrRawTx(txid, trx)
140
- if (r.proven) rawTx = r.proven.rawTx
141
- else rawTx = r.rawTx
142
- }
143
- return rawTx
144
- }
145
-
146
- getProvenTxsForUserQuery(args: FindForUserSincePagedArgs): Knex.QueryBuilder {
147
- const k = this.toDb(args.trx)
148
- let q = k('proven_txs').where(function () {
149
- this.whereExists(
150
- k
151
- .select('*')
152
- .from('transactions')
153
- .whereRaw(`proven_txs.provenTxId = transactions.provenTxId and transactions.userId = ${args.userId}`)
154
- )
155
- })
156
- if (args.paged) {
157
- q = q.limit(args.paged.limit)
158
- q = q.offset(args.paged.offset || 0)
159
- }
160
- if (args.since) q = q.where('updated_at', '>=', this.validateDateForWhere(args.since))
161
- return q
162
- }
163
- override async getProvenTxsForUser(args: FindForUserSincePagedArgs): Promise<TableProvenTx[]> {
164
- const q = this.getProvenTxsForUserQuery(args)
165
- const rs = await q
166
- return this.validateEntities(rs)
167
- }
168
-
169
- getProvenTxReqsForUserQuery(args: FindForUserSincePagedArgs): Knex.QueryBuilder {
170
- const k = this.toDb(args.trx)
171
- let q = k('proven_tx_reqs').where(function () {
172
- this.whereExists(
173
- k
174
- .select('*')
175
- .from('transactions')
176
- .whereRaw(`proven_tx_reqs.txid = transactions.txid and transactions.userId = ${args.userId}`)
177
- )
178
- })
179
- if (args.paged) {
180
- q = q.limit(args.paged.limit)
181
- q = q.offset(args.paged.offset || 0)
182
- }
183
- if (args.since) q = q.where('updated_at', '>=', this.validateDateForWhere(args.since))
184
- return q
185
- }
186
- override async getProvenTxReqsForUser(args: FindForUserSincePagedArgs): Promise<TableProvenTxReq[]> {
187
- const q = this.getProvenTxReqsForUserQuery(args)
188
- const rs = await q
189
- return this.validateEntities(rs, undefined, ['notified'])
190
- }
191
-
192
- getTxLabelMapsForUserQuery(args: FindForUserSincePagedArgs): Knex.QueryBuilder {
193
- const k = this.toDb(args.trx)
194
- let q = k('tx_labels_map').whereExists(
195
- k
196
- .select('*')
197
- .from('tx_labels')
198
- .whereRaw(`tx_labels.txLabelId = tx_labels_map.txLabelId and tx_labels.userId = ${args.userId}`)
199
- )
200
- if (args.since) q = q.where('updated_at', '>=', this.validateDateForWhere(args.since))
201
- if (args.paged) {
202
- q = q.limit(args.paged.limit)
203
- q = q.offset(args.paged.offset || 0)
204
- }
205
- return q
206
- }
207
- override async getTxLabelMapsForUser(args: FindForUserSincePagedArgs): Promise<TableTxLabelMap[]> {
208
- const q = this.getTxLabelMapsForUserQuery(args)
209
- const rs = await q
210
- return this.validateEntities(rs, undefined, ['isDeleted'])
211
- }
212
-
213
- getOutputTagMapsForUserQuery(args: FindForUserSincePagedArgs): Knex.QueryBuilder {
214
- const k = this.toDb(args.trx)
215
- let q = k('output_tags_map').whereExists(
216
- k
217
- .select('*')
218
- .from('output_tags')
219
- .whereRaw(`output_tags.outputTagId = output_tags_map.outputTagId and output_tags.userId = ${args.userId}`)
220
- )
221
- if (args.since) q = q.where('updated_at', '>=', this.validateDateForWhere(args.since))
222
- if (args.paged) {
223
- q = q.limit(args.paged.limit)
224
- q = q.offset(args.paged.offset || 0)
225
- }
226
- return q
227
- }
228
- override async getOutputTagMapsForUser(args: FindForUserSincePagedArgs): Promise<TableOutputTagMap[]> {
229
- const q = this.getOutputTagMapsForUserQuery(args)
230
- const rs = await q
231
- return this.validateEntities(rs, undefined, ['isDeleted'])
232
- }
233
-
234
- override async listActions(auth: AuthId, vargs: Validation.ValidListActionsArgs): Promise<ListActionsResult> {
235
- if (!auth.userId) throw new WERR_UNAUTHORIZED()
236
- return await listActions(this, auth, vargs)
237
- }
238
- override async listOutputs(auth: AuthId, vargs: Validation.ValidListOutputsArgs): Promise<ListOutputsResult> {
239
- if (!auth.userId) throw new WERR_UNAUTHORIZED()
240
- return await listOutputs(this, auth, vargs)
241
- }
242
-
243
- override async insertProvenTx(tx: TableProvenTx, trx?: TrxToken): Promise<number> {
244
- const e = await this.validateEntityForInsert(tx, trx)
245
- if (e.provenTxId === 0) delete e.provenTxId
246
- const [id] = await this.toDb(trx)<TableProvenTx>('proven_txs').insert(e)
247
- tx.provenTxId = id
248
- return tx.provenTxId
249
- }
250
-
251
- override async insertProvenTxReq(tx: TableProvenTxReq, trx?: TrxToken): Promise<number> {
252
- const e = await this.validateEntityForInsert(tx, trx)
253
- if (e.provenTxReqId === 0) delete e.provenTxReqId
254
- const [id] = await this.toDb(trx)<TableProvenTxReq>('proven_tx_reqs').insert(e)
255
- tx.provenTxReqId = id
256
- return tx.provenTxReqId
257
- }
258
-
259
- override async insertUser(user: TableUser, trx?: TrxToken): Promise<number> {
260
- const e = await this.validateEntityForInsert(user, trx)
261
- if (e.userId === 0) delete e.userId
262
- const [id] = await this.toDb(trx)<TableUser>('users').insert(e)
263
- user.userId = id
264
- return user.userId
265
- }
266
-
267
- override async insertCertificateAuth(auth: AuthId, certificate: TableCertificateX): Promise<number> {
268
- if (!auth.userId || (certificate.userId && certificate.userId !== auth.userId)) throw new WERR_UNAUTHORIZED()
269
- certificate.userId = auth.userId
270
- return await this.insertCertificate(certificate)
271
- }
272
-
273
- override async insertCertificate(certificate: TableCertificateX, trx?: TrxToken): Promise<number> {
274
- const e = await this.validateEntityForInsert(certificate, trx, undefined, ['isDeleted'])
275
- if (e.certificateId === 0) delete e.certificateId
276
-
277
- const logger = e.logger
278
- if (e.logger) delete e.logger
279
-
280
- const fields = e.fields
281
- if (e.fields) delete e.fields
282
-
283
- const [id] = await this.toDb(trx)<TableCertificate>('certificates').insert(e)
284
- certificate.certificateId = id
285
-
286
- if (fields) {
287
- for (const field of fields) {
288
- field.certificateId = id
289
- field.userId = certificate.userId
290
- await this.insertCertificateField(field, trx)
291
- }
292
- }
293
-
294
- return certificate.certificateId
295
- }
296
-
297
- override async insertCertificateField(certificateField: TableCertificateField, trx?: TrxToken): Promise<void> {
298
- const e = await this.validateEntityForInsert(certificateField, trx)
299
- await this.toDb(trx)<TableCertificate>('certificate_fields').insert(e)
300
- }
301
-
302
- override async insertOutputBasket(basket: TableOutputBasket, trx?: TrxToken): Promise<number> {
303
- const e = await this.validateEntityForInsert(basket, trx, undefined, ['isDeleted'])
304
- if (e.basketId === 0) delete e.basketId
305
- const [id] = await this.toDb(trx)<TableOutputBasket>('output_baskets').insert(e)
306
- basket.basketId = id
307
- return basket.basketId
308
- }
309
-
310
- override async insertTransaction(tx: TableTransaction, trx?: TrxToken): Promise<number> {
311
- const e = await this.validateEntityForInsert(tx, trx)
312
- if (e.transactionId === 0) delete e.transactionId
313
- const [id] = await this.toDb(trx)<TableTransaction>('transactions').insert(e)
314
- tx.transactionId = id
315
- return tx.transactionId
316
- }
317
-
318
- override async insertCommission(commission: TableCommission, trx?: TrxToken): Promise<number> {
319
- const e = await this.validateEntityForInsert(commission, trx)
320
- if (e.commissionId === 0) delete e.commissionId
321
- const [id] = await this.toDb(trx)<TableCommission>('commissions').insert(e)
322
- commission.commissionId = id
323
- return commission.commissionId
324
- }
325
-
326
- override async insertOutput(output: TableOutput, trx?: TrxToken): Promise<number> {
327
- try {
328
- const e = await this.validateEntityForInsert(output, trx)
329
- if (e.outputId === 0) delete e.outputId
330
- const [id] = await this.toDb(trx)<TableOutput>('outputs').insert(e)
331
- output.outputId = id
332
- return output.outputId
333
- } catch (e) {
334
- throw e
335
- }
336
- }
337
-
338
- override async insertOutputTag(tag: TableOutputTag, trx?: TrxToken): Promise<number> {
339
- const e = await this.validateEntityForInsert(tag, trx, undefined, ['isDeleted'])
340
- if (e.outputTagId === 0) delete e.outputTagId
341
- const [id] = await this.toDb(trx)<TableOutputTag>('output_tags').insert(e)
342
- tag.outputTagId = id
343
- return tag.outputTagId
344
- }
345
-
346
- override async insertOutputTagMap(tagMap: TableOutputTagMap, trx?: TrxToken): Promise<void> {
347
- const e = await this.validateEntityForInsert(tagMap, trx, undefined, ['isDeleted'])
348
- const [id] = await this.toDb(trx)<TableOutputTagMap>('output_tags_map').insert(e)
349
- }
350
-
351
- override async insertTxLabel(label: TableTxLabel, trx?: TrxToken): Promise<number> {
352
- const e = await this.validateEntityForInsert(label, trx, undefined, ['isDeleted'])
353
- if (e.txLabelId === 0) delete e.txLabelId
354
- const [id] = await this.toDb(trx)<TableTxLabel>('tx_labels').insert(e)
355
- label.txLabelId = id
356
- return label.txLabelId
357
- }
358
-
359
- override async insertTxLabelMap(labelMap: TableTxLabelMap, trx?: TrxToken): Promise<void> {
360
- const e = await this.validateEntityForInsert(labelMap, trx, undefined, ['isDeleted'])
361
- const [id] = await this.toDb(trx)<TableTxLabelMap>('tx_labels_map').insert(e)
362
- }
363
-
364
- override async insertMonitorEvent(event: TableMonitorEvent, trx?: TrxToken): Promise<number> {
365
- const e = await this.validateEntityForInsert(event, trx)
366
- if (e.id === 0) delete e.id
367
- const [id] = await this.toDb(trx)<TableMonitorEvent>('monitor_events').insert(e)
368
- event.id = id
369
- return event.id
370
- }
371
-
372
- override async insertSyncState(syncState: TableSyncState, trx?: TrxToken): Promise<number> {
373
- const e = await this.validateEntityForInsert(syncState, trx, ['when'], ['init'])
374
- if (e.syncStateId === 0) delete e.syncStateId
375
- const [id] = await this.toDb(trx)<TableSyncState>('sync_states').insert(e)
376
- syncState.syncStateId = id
377
- return syncState.syncStateId
378
- }
379
-
380
- override async updateCertificateField(
381
- certificateId: number,
382
- fieldName: string,
383
- update: Partial<TableCertificateField>,
384
- trx?: TrxToken
385
- ): Promise<number> {
386
- await this.verifyReadyForDatabaseAccess(trx)
387
- return await this.toDb(trx)<TableCertificateField>('certificate_fields')
388
- .where({ certificateId, fieldName })
389
- .update(this.validatePartialForUpdate(update))
390
- }
391
- override async updateCertificate(id: number, update: Partial<TableCertificate>, trx?: TrxToken): Promise<number> {
392
- await this.verifyReadyForDatabaseAccess(trx)
393
- return await this.toDb(trx)<TableCertificate>('certificates')
394
- .where({ certificateId: id })
395
- .update(this.validatePartialForUpdate(update, undefined, ['isDeleted']))
396
- }
397
- override async updateCommission(id: number, update: Partial<TableCommission>, trx?: TrxToken): Promise<number> {
398
- await this.verifyReadyForDatabaseAccess(trx)
399
- return await this.toDb(trx)<TableCommission>('commissions')
400
- .where({ commissionId: id })
401
- .update(this.validatePartialForUpdate(update))
402
- }
403
- override async updateOutputBasket(id: number, update: Partial<TableOutputBasket>, trx?: TrxToken): Promise<number> {
404
- await this.verifyReadyForDatabaseAccess(trx)
405
- return await this.toDb(trx)<TableOutputBasket>('output_baskets')
406
- .where({ basketId: id })
407
- .update(this.validatePartialForUpdate(update, undefined, ['isDeleted']))
408
- }
409
- override async updateOutput(id: number, update: Partial<TableOutput>, trx?: TrxToken): Promise<number> {
410
- await this.verifyReadyForDatabaseAccess(trx)
411
- return await this.toDb(trx)<TableOutput>('outputs')
412
- .where({ outputId: id })
413
- .update(this.validatePartialForUpdate(update))
414
- }
415
- override async updateOutputTagMap(
416
- outputId: number,
417
- tagId: number,
418
- update: Partial<TableOutputTagMap>,
419
- trx?: TrxToken
420
- ): Promise<number> {
421
- await this.verifyReadyForDatabaseAccess(trx)
422
- return await this.toDb(trx)<TableOutputTagMap>('output_tags_map')
423
- .where({ outputId, outputTagId: tagId })
424
- .update(this.validatePartialForUpdate(update, undefined, ['isDeleted']))
425
- }
426
- override async updateOutputTag(id: number, update: Partial<TableOutputTag>, trx?: TrxToken): Promise<number> {
427
- await this.verifyReadyForDatabaseAccess(trx)
428
- return await this.toDb(trx)<TableOutputTag>('output_tags')
429
- .where({ outputTagId: id })
430
- .update(this.validatePartialForUpdate(update, undefined, ['isDeleted']))
431
- }
432
- override async updateProvenTxReq(
433
- id: number | number[],
434
- update: Partial<TableProvenTxReq>,
435
- trx?: TrxToken
436
- ): Promise<number> {
437
- await this.verifyReadyForDatabaseAccess(trx)
438
- let r: number
439
- if (Array.isArray(id)) {
440
- r = await this.toDb(trx)<TableProvenTxReq>('proven_tx_reqs')
441
- .whereIn('provenTxReqId', id)
442
- .update(this.validatePartialForUpdate(update))
443
- } else if (Number.isInteger(id)) {
444
- r = await this.toDb(trx)<TableProvenTxReq>('proven_tx_reqs')
445
- .where({ provenTxReqId: id })
446
- .update(this.validatePartialForUpdate(update))
447
- } else {
448
- throw new WERR_INVALID_PARAMETER('id', 'transactionId or array of transactionId')
449
- }
450
- return r
451
- }
452
- override async updateProvenTx(id: number, update: Partial<TableProvenTx>, trx?: TrxToken): Promise<number> {
453
- await this.verifyReadyForDatabaseAccess(trx)
454
- return await this.toDb(trx)<TableProvenTx>('proven_txs')
455
- .where({ provenTxId: id })
456
- .update(this.validatePartialForUpdate(update))
457
- }
458
- override async updateSyncState(id: number, update: Partial<TableSyncState>, trx?: TrxToken): Promise<number> {
459
- await this.verifyReadyForDatabaseAccess(trx)
460
- return await this.toDb(trx)<TableSyncState>('sync_states')
461
- .where({ syncStateId: id })
462
- .update(this.validatePartialForUpdate(update, ['when'], ['init']))
463
- }
464
- override async updateTransaction(
465
- id: number | number[],
466
- update: Partial<TableTransaction>,
467
- trx?: TrxToken
468
- ): Promise<number> {
469
- await this.verifyReadyForDatabaseAccess(trx)
470
- let r: number
471
- if (Array.isArray(id)) {
472
- r = await this.toDb(trx)<TableTransaction>('transactions')
473
- .whereIn('transactionId', id)
474
- .update(await this.validatePartialForUpdate(update))
475
- } else if (Number.isInteger(id)) {
476
- r = await this.toDb(trx)<TableTransaction>('transactions')
477
- .where({ transactionId: id })
478
- .update(await this.validatePartialForUpdate(update))
479
- } else {
480
- throw new WERR_INVALID_PARAMETER('id', 'transactionId or array of transactionId')
481
- }
482
- return r
483
- }
484
- override async updateTxLabelMap(
485
- transactionId: number,
486
- txLabelId: number,
487
- update: Partial<TableTxLabelMap>,
488
- trx?: TrxToken
489
- ): Promise<number> {
490
- await this.verifyReadyForDatabaseAccess(trx)
491
- return await this.toDb(trx)<TableTxLabelMap>('tx_labels_map')
492
- .where({ transactionId, txLabelId })
493
- .update(this.validatePartialForUpdate(update, undefined, ['isDeleted']))
494
- }
495
- override async updateTxLabel(id: number, update: Partial<TableTxLabel>, trx?: TrxToken): Promise<number> {
496
- await this.verifyReadyForDatabaseAccess(trx)
497
- return await this.toDb(trx)<TableTxLabel>('tx_labels')
498
- .where({ txLabelId: id })
499
- .update(this.validatePartialForUpdate(update, undefined, ['isDeleted']))
500
- }
501
- override async updateUser(id: number, update: Partial<TableUser>, trx?: TrxToken): Promise<number> {
502
- await this.verifyReadyForDatabaseAccess(trx)
503
- return await this.toDb(trx)<TableUser>('users').where({ userId: id }).update(this.validatePartialForUpdate(update))
504
- }
505
- override async updateMonitorEvent(id: number, update: Partial<TableMonitorEvent>, trx?: TrxToken): Promise<number> {
506
- await this.verifyReadyForDatabaseAccess(trx)
507
- return await this.toDb(trx)<TableMonitorEvent>('monitor_events')
508
- .where({ id })
509
- .update(this.validatePartialForUpdate(update))
510
- }
511
-
512
- setupQuery<T extends object>(table: string, args: FindPartialSincePagedArgs<T>): Knex.QueryBuilder {
513
- let q = this.toDb(args.trx)<T>(table)
514
- if (args.partial && Object.keys(args.partial).length > 0) q.where(args.partial)
515
- if (args.since) q.where('updated_at', '>=', this.validateDateForWhere(args.since))
516
- if (args.orderDescending) {
517
- let sortColumn = ''
518
- switch (table) {
519
- case 'certificates':
520
- sortColumn = 'certificateId'
521
- break
522
- case 'commissions':
523
- sortColumn = 'commissionId'
524
- break
525
- case 'output_baskets':
526
- sortColumn = 'basketId'
527
- break
528
- case 'outputs':
529
- sortColumn = 'outputId'
530
- break
531
- case 'output_tags':
532
- sortColumn = 'outputTagId'
533
- break
534
- case 'proven_tx_reqs':
535
- sortColumn = 'provenTxReqId'
536
- break
537
- case 'proven_txs':
538
- sortColumn = 'provenTxId'
539
- break
540
- case 'sync_states':
541
- sortColumn = 'syncStateId'
542
- break
543
- case 'transactions':
544
- sortColumn = 'transactionId'
545
- break
546
- case 'tx_labels':
547
- sortColumn = 'txLabelId'
548
- break
549
- case 'users':
550
- sortColumn = 'userId'
551
- break
552
- case 'monitor_events':
553
- sortColumn = 'id'
554
- break
555
- default:
556
- break
557
- }
558
- if (sortColumn !== '') {
559
- q.orderBy(sortColumn, 'desc')
560
- }
561
- }
562
- if (args.paged) {
563
- q.limit(args.paged.limit)
564
- q.offset(args.paged.offset || 0)
565
- }
566
- return q
567
- }
568
-
569
- findCertificateFieldsQuery(args: FindCertificateFieldsArgs): Knex.QueryBuilder {
570
- return this.setupQuery('certificate_fields', args)
571
- }
572
- findCertificatesQuery(args: FindCertificatesArgs): Knex.QueryBuilder {
573
- const q = this.setupQuery('certificates', args)
574
- if (args.certifiers && args.certifiers.length > 0) q.whereIn('certifier', args.certifiers)
575
- if (args.types && args.types.length > 0) q.whereIn('type', args.types)
576
- return q
577
- }
578
- findCommissionsQuery(args: FindCommissionsArgs): Knex.QueryBuilder {
579
- if (args.partial.lockingScript)
580
- throw new WERR_INVALID_PARAMETER(
581
- 'partial.lockingScript',
582
- `undefined. Commissions may not be found by lockingScript value.`
583
- )
584
- return this.setupQuery('commissions', args)
585
- }
586
- findOutputBasketsQuery(args: FindOutputBasketsArgs): Knex.QueryBuilder {
587
- return this.setupQuery('output_baskets', args)
588
- }
589
- findOutputsQuery(args: FindOutputsArgs, count?: boolean): Knex.QueryBuilder {
590
- if (args.partial.lockingScript)
591
- throw new WERR_INVALID_PARAMETER(
592
- 'args.partial.lockingScript',
593
- `undefined. Outputs may not be found by lockingScript value.`
594
- )
595
- const q = this.setupQuery('outputs', args)
596
- if (args.txStatus && args.txStatus.length > 0) {
597
- q.whereRaw(
598
- `(select status from transactions where transactions.transactionId = outputs.transactionId) in (${args.txStatus.map(s => `'${s}'`).join(',')})`
599
- )
600
- }
601
- if (args.noScript && !count) {
602
- const columns = outputColumnsWithoutLockingScript.map(c => `outputs.${c}`)
603
- q.select(columns)
604
- }
605
- return q
606
- }
607
- findOutputTagMapsQuery(args: FindOutputTagMapsArgs): Knex.QueryBuilder {
608
- const q = this.setupQuery('output_tags_map', args)
609
- if (args.tagIds && args.tagIds.length > 0) q.whereIn('outputTagId', args.tagIds)
610
- return q
611
- }
612
- findOutputTagsQuery(args: FindOutputTagsArgs): Knex.QueryBuilder {
613
- return this.setupQuery('output_tags', args)
614
- }
615
- findProvenTxReqsQuery(args: FindProvenTxReqsArgs): Knex.QueryBuilder {
616
- if (args.partial.rawTx)
617
- throw new WERR_INVALID_PARAMETER('args.partial.rawTx', `undefined. ProvenTxReqs may not be found by rawTx value.`)
618
- if (args.partial.inputBEEF)
619
- throw new WERR_INVALID_PARAMETER(
620
- 'args.partial.inputBEEF',
621
- `undefined. ProvenTxReqs may not be found by inputBEEF value.`
622
- )
623
- const q = this.setupQuery('proven_tx_reqs', args)
624
- if (args.status && args.status.length > 0) q.whereIn('status', args.status)
625
- if (args.txids) {
626
- const txids = args.txids.filter(txid => txid !== undefined)
627
- if (txids.length > 0) q.whereIn('txid', txids)
628
- }
629
- return q
630
- }
631
- findProvenTxsQuery(args: FindProvenTxsArgs): Knex.QueryBuilder {
632
- if (args.partial.rawTx)
633
- throw new WERR_INVALID_PARAMETER('args.partial.rawTx', `undefined. ProvenTxs may not be found by rawTx value.`)
634
- if (args.partial.merklePath)
635
- throw new WERR_INVALID_PARAMETER(
636
- 'args.partial.merklePath',
637
- `undefined. ProvenTxs may not be found by merklePath value.`
638
- )
639
- return this.setupQuery('proven_txs', args)
640
- }
641
- findSyncStatesQuery(args: FindSyncStatesArgs): Knex.QueryBuilder {
642
- return this.setupQuery('sync_states', args)
643
- }
644
- findTransactionsQuery(args: FindTransactionsArgs, count?: boolean): Knex.QueryBuilder {
645
- if (args.partial.rawTx)
646
- throw new WERR_INVALID_PARAMETER('args.partial.rawTx', `undefined. Transactions may not be found by rawTx value.`)
647
- if (args.partial.inputBEEF)
648
- throw new WERR_INVALID_PARAMETER(
649
- 'args.partial.inputBEEF',
650
- `undefined. Transactions may not be found by inputBEEF value.`
651
- )
652
- const q = this.setupQuery('transactions', args)
653
- if (args.status && args.status.length > 0) q.whereIn('status', args.status)
654
- if (args.noRawTx && !count) {
655
- const columns = transactionColumnsWithoutRawTx.map(c => `transactions.${c}`)
656
- q.select(columns)
657
- }
658
- return q
659
- }
660
- findTxLabelMapsQuery(args: FindTxLabelMapsArgs): Knex.QueryBuilder {
661
- const q = this.setupQuery('tx_labels_map', args)
662
- if (args.labelIds && args.labelIds.length > 0) q.whereIn('txLabelId', args.labelIds)
663
- return q
664
- }
665
- findTxLabelsQuery(args: FindTxLabelsArgs): Knex.QueryBuilder {
666
- return this.setupQuery('tx_labels', args)
667
- }
668
- findUsersQuery(args: FindUsersArgs): Knex.QueryBuilder {
669
- return this.setupQuery('users', args)
670
- }
671
- findMonitorEventsQuery(args: FindMonitorEventsArgs): Knex.QueryBuilder {
672
- return this.setupQuery('monitor_events', args)
673
- }
674
-
675
- override async findCertificatesAuth(auth: AuthId, args: FindCertificatesArgs): Promise<TableCertificateX[]> {
676
- if (!auth.userId || (args.partial.userId && args.partial.userId !== auth.userId)) throw new WERR_UNAUTHORIZED()
677
- args.partial.userId = auth.userId
678
- return await this.findCertificates(args)
679
- }
680
- override async findOutputBasketsAuth(auth: AuthId, args: FindOutputBasketsArgs): Promise<TableOutputBasket[]> {
681
- if (!auth.userId || (args.partial.userId && args.partial.userId !== auth.userId)) throw new WERR_UNAUTHORIZED()
682
- args.partial.userId = auth.userId
683
- return await this.findOutputBaskets(args)
684
- }
685
- override async findOutputsAuth(auth: AuthId, args: FindOutputsArgs): Promise<TableOutput[]> {
686
- if (!auth.userId || (args.partial.userId && args.partial.userId !== auth.userId)) throw new WERR_UNAUTHORIZED()
687
- args.partial.userId = auth.userId
688
- return await this.findOutputs(args)
689
- }
690
-
691
- override async findCertificateFields(args: FindCertificateFieldsArgs): Promise<TableCertificateField[]> {
692
- return this.validateEntities(await this.findCertificateFieldsQuery(args))
693
- }
694
- override async findCertificates(args: FindCertificatesArgs): Promise<TableCertificateX[]> {
695
- const q = this.findCertificatesQuery(args)
696
- let r: TableCertificateX[] = await q
697
- r = this.validateEntities(r, undefined, ['isDeleted'])
698
- if (args.includeFields) {
699
- for (const c of r) {
700
- c.fields = this.validateEntities(
701
- await this.findCertificateFields({
702
- partial: { certificateId: c.certificateId, userId: c.userId },
703
- trx: args.trx
704
- })
705
- )
706
- }
707
- }
708
- return r
709
- }
710
- override async findCommissions(args: FindCommissionsArgs): Promise<TableCommission[]> {
711
- const q = this.findCommissionsQuery(args)
712
- const r = await q
713
- return this.validateEntities(r, undefined, ['isRedeemed'])
714
- }
715
- override async findOutputBaskets(args: FindOutputBasketsArgs): Promise<TableOutputBasket[]> {
716
- const q = this.findOutputBasketsQuery(args)
717
- const r = await q
718
- return this.validateEntities(r, undefined, ['isDeleted'])
719
- }
720
- override async findOutputs(args: FindOutputsArgs): Promise<TableOutput[]> {
721
- const q = this.findOutputsQuery(args)
722
- const r = await q
723
- if (!args.noScript) {
724
- for (const o of r) {
725
- await this.validateOutputScript(o, args.trx)
726
- }
727
- }
728
- return this.validateEntities(r, undefined, ['spendable', 'change'])
729
- }
730
- override async findOutputTagMaps(args: FindOutputTagMapsArgs): Promise<TableOutputTagMap[]> {
731
- const q = this.findOutputTagMapsQuery(args)
732
- const r = await q
733
- return this.validateEntities(r, undefined, ['isDeleted'])
734
- }
735
- override async findOutputTags(args: FindOutputTagsArgs): Promise<TableOutputTag[]> {
736
- const q = this.findOutputTagsQuery(args)
737
- const r = await q
738
- return this.validateEntities(r, undefined, ['isDeleted'])
739
- }
740
- override async findProvenTxReqs(args: FindProvenTxReqsArgs): Promise<TableProvenTxReq[]> {
741
- const q = this.findProvenTxReqsQuery(args)
742
- const r = await q
743
- return this.validateEntities(r, undefined, ['notified'])
744
- }
745
- override async findProvenTxs(args: FindProvenTxsArgs): Promise<TableProvenTx[]> {
746
- const q = this.findProvenTxsQuery(args)
747
- const r = await q
748
- return this.validateEntities(r)
749
- }
750
- override async findSyncStates(args: FindSyncStatesArgs): Promise<TableSyncState[]> {
751
- const q = this.findSyncStatesQuery(args)
752
- const r = await q
753
- return this.validateEntities(r, ['when'], ['init'])
754
- }
755
- override async findTransactions(args: FindTransactionsArgs): Promise<TableTransaction[]> {
756
- const q = this.findTransactionsQuery(args)
757
- const r = await q
758
- if (!args.noRawTx) {
759
- for (const t of r) {
760
- await this.validateRawTransaction(t, args.trx)
761
- }
762
- }
763
- return this.validateEntities(r, undefined, ['isOutgoing'])
764
- }
765
- override async findTxLabelMaps(args: FindTxLabelMapsArgs): Promise<TableTxLabelMap[]> {
766
- const q = this.findTxLabelMapsQuery(args)
767
- const r = await q
768
- return this.validateEntities(r, undefined, ['isDeleted'])
769
- }
770
- override async findTxLabels(args: FindTxLabelsArgs): Promise<TableTxLabel[]> {
771
- const q = this.findTxLabelsQuery(args)
772
- const r = await q
773
- return this.validateEntities(r, undefined, ['isDeleted'])
774
- }
775
- override async findUsers(args: FindUsersArgs): Promise<TableUser[]> {
776
- const q = this.findUsersQuery(args)
777
- const r = await q
778
- return this.validateEntities(r)
779
- }
780
- override async findMonitorEvents(args: FindMonitorEventsArgs): Promise<TableMonitorEvent[]> {
781
- const q = this.findMonitorEventsQuery(args)
782
- const r = await q
783
- return this.validateEntities(r, ['when'], undefined)
784
- }
785
-
786
- async getCount<T extends object>(q: Knex.QueryBuilder<T, T[]>): Promise<number> {
787
- q.count()
788
- const r = await q
789
- return r[0]['count(*)']
790
- }
791
-
792
- override async countCertificateFields(args: FindCertificateFieldsArgs): Promise<number> {
793
- return await this.getCount(this.findCertificateFieldsQuery(args))
794
- }
795
- override async countCertificates(args: FindCertificatesArgs): Promise<number> {
796
- return await this.getCount(this.findCertificatesQuery(args))
797
- }
798
- override async countCommissions(args: FindCommissionsArgs): Promise<number> {
799
- return await this.getCount(this.findCommissionsQuery(args))
800
- }
801
- override async countOutputBaskets(args: FindOutputBasketsArgs): Promise<number> {
802
- return await this.getCount(this.findOutputBasketsQuery(args))
803
- }
804
- override async countOutputs(args: FindOutputsArgs): Promise<number> {
805
- return await this.getCount(this.findOutputsQuery(args, true))
806
- }
807
- override async countOutputTagMaps(args: FindOutputTagMapsArgs): Promise<number> {
808
- return await this.getCount(this.findOutputTagMapsQuery(args))
809
- }
810
- override async countOutputTags(args: FindOutputTagsArgs): Promise<number> {
811
- return await this.getCount(this.findOutputTagsQuery(args))
812
- }
813
- override async countProvenTxReqs(args: FindProvenTxReqsArgs): Promise<number> {
814
- return await this.getCount(this.findProvenTxReqsQuery(args))
815
- }
816
- override async countProvenTxs(args: FindProvenTxsArgs): Promise<number> {
817
- return await this.getCount(this.findProvenTxsQuery(args))
818
- }
819
- override async countSyncStates(args: FindSyncStatesArgs): Promise<number> {
820
- return await this.getCount(this.findSyncStatesQuery(args))
821
- }
822
- override async countTransactions(args: FindTransactionsArgs): Promise<number> {
823
- return await this.getCount(this.findTransactionsQuery(args, true))
824
- }
825
- override async countTxLabelMaps(args: FindTxLabelMapsArgs): Promise<number> {
826
- return await this.getCount(this.findTxLabelMapsQuery(args))
827
- }
828
- override async countTxLabels(args: FindTxLabelsArgs): Promise<number> {
829
- return await this.getCount(this.findTxLabelsQuery(args))
830
- }
831
- override async countUsers(args: FindUsersArgs): Promise<number> {
832
- return await this.getCount(this.findUsersQuery(args))
833
- }
834
- override async countMonitorEvents(args: FindMonitorEventsArgs): Promise<number> {
835
- return await this.getCount(this.findMonitorEventsQuery(args))
836
- }
837
-
838
- override async destroy(): Promise<void> {
839
- await this.knex?.destroy()
840
- }
841
-
842
- override async migrate(storageName: string, storageIdentityKey: string): Promise<string> {
843
- const config = {
844
- migrationSource: new KnexMigrations(this.chain, storageName, storageIdentityKey, 1024)
845
- }
846
- await this.knex.migrate.latest(config)
847
- const version = await this.knex.migrate.currentVersion(config)
848
- return version
849
- }
850
-
851
- override async dropAllData(): Promise<void> {
852
- // Only using migrations to migrate down, don't need valid properties for settings table.
853
- const config = {
854
- migrationSource: new KnexMigrations('test', '', '', 1024)
855
- }
856
- const count = Object.keys(config.migrationSource.migrations).length
857
- for (let i = 0; i < count; i++) {
858
- try {
859
- const r = await this.knex.migrate.down(config)
860
- if (!r) {
861
- console.error(`Migration returned falsy result await this.knex.migrate.down(config)`)
862
- break
863
- }
864
- } catch (eu: unknown) {
865
- break
866
- }
867
- }
868
- }
869
-
870
- override async transaction<T>(scope: (trx: TrxToken) => Promise<T>, trx?: TrxToken): Promise<T> {
871
- if (trx) return await scope(trx)
872
-
873
- return await this.knex.transaction<T>(async knextrx => {
874
- const trx = knextrx as TrxToken
875
- return await scope(trx)
876
- })
877
- }
878
-
879
- /**
880
- * Convert the standard optional `TrxToken` parameter into either a direct knex database instance,
881
- * or a Knex.Transaction as appropriate.
882
- */
883
- toDb(trx?: TrxToken) {
884
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
885
- const db = !trx ? this.knex : <Knex.Transaction<any, any[]>>trx
886
- this.whenLastAccess = new Date()
887
- return db
888
- }
889
-
890
- async validateRawTransaction(t: TableTransaction, trx?: TrxToken): Promise<void> {
891
- // if there is no txid or there is a rawTransaction return what we have.
892
- if (t.rawTx || !t.txid) return
893
-
894
- // rawTransaction is missing, see if we moved it ...
895
-
896
- const rawTx = await this.getRawTxOfKnownValidTransaction(t.txid, undefined, undefined, trx)
897
- if (!rawTx) return
898
- t.rawTx = rawTx
899
- }
900
-
901
- _verifiedReadyForDatabaseAccess: boolean = false
902
-
903
- /**
904
- * Make sure database is ready for access:
905
- *
906
- * - dateScheme is known
907
- * - foreign key constraints are enabled
908
- *
909
- * @param trx
910
- */
911
- async verifyReadyForDatabaseAccess(trx?: TrxToken): Promise<DBType> {
912
- if (!this._settings) {
913
- this._settings = await this.readSettings()
914
- }
915
-
916
- if (!this._verifiedReadyForDatabaseAccess) {
917
- // Make sure foreign key constraint checking is turned on in SQLite.
918
- if (this._settings.dbtype === 'SQLite') {
919
- await this.toDb(trx).raw('PRAGMA foreign_keys = ON;')
920
- }
921
-
922
- this._verifiedReadyForDatabaseAccess = true
923
- }
924
-
925
- return this._settings.dbtype
926
- }
927
-
928
- /**
929
- * Helper to force uniform behavior across database engines.
930
- * Use to process the update template for entities being updated.
931
- */
932
- validatePartialForUpdate<T extends EntityTimeStamp>(
933
- update: Partial<T>,
934
- dateFields?: string[],
935
- booleanFields?: string[]
936
- ): Partial<T> {
937
- if (!this.dbtype) throw new WERR_INTERNAL('must call verifyReadyForDatabaseAccess first')
938
- const v: any = update
939
- if (v.created_at) v.created_at = this.validateEntityDate(v.created_at)
940
- if (v.updated_at) v.updated_at = this.validateEntityDate(v.updated_at)
941
- if (!v.created_at) delete v.created_at
942
- if (!v.updated_at) v.updated_at = this.validateEntityDate(new Date())
943
-
944
- if (dateFields) {
945
- for (const df of dateFields) {
946
- if (v[df]) v[df] = this.validateOptionalEntityDate(v[df])
947
- }
948
- }
949
- if (booleanFields) {
950
- for (const df of booleanFields) {
951
- if (update[df] !== undefined) update[df] = !!update[df] ? 1 : 0
952
- }
953
- }
954
- for (const key of Object.keys(v)) {
955
- const val = v[key]
956
- if (Array.isArray(val) && (val.length === 0 || typeof val[0] === 'number')) {
957
- v[key] = Buffer.from(val)
958
- } else if (val === undefined) {
959
- v[key] = null
960
- }
961
- }
962
- this.isDirty = true
963
- return v
964
- }
965
-
966
- /**
967
- * Helper to force uniform behavior across database engines.
968
- * Use to process new entities being inserted into the database.
969
- */
970
- async validateEntityForInsert<T extends EntityTimeStamp>(
971
- entity: T,
972
- trx?: TrxToken,
973
- dateFields?: string[],
974
- booleanFields?: string[]
975
- ): Promise<any> {
976
- await this.verifyReadyForDatabaseAccess(trx)
977
- const v: any = { ...entity }
978
- v.created_at = this.validateOptionalEntityDate(v.created_at, true)!
979
- v.updated_at = this.validateOptionalEntityDate(v.updated_at, true)!
980
- if (!v.created_at) delete v.created_at
981
- if (!v.updated_at) delete v.updated_at
982
- if (dateFields) {
983
- for (const df of dateFields) {
984
- if (v[df]) v[df] = this.validateOptionalEntityDate(v[df])
985
- }
986
- }
987
- if (booleanFields) {
988
- for (const df of booleanFields) {
989
- if (entity[df] !== undefined) entity[df] = !!entity[df] ? 1 : 0
990
- }
991
- }
992
- for (const key of Object.keys(v)) {
993
- const val = v[key]
994
- if (Array.isArray(val) && (val.length === 0 || typeof val[0] === 'number')) {
995
- v[key] = Buffer.from(val)
996
- } else if (val === undefined) {
997
- v[key] = null
998
- }
999
- }
1000
- this.isDirty = true
1001
- return v
1002
- }
1003
-
1004
- override async getLabelsForTransactionId(transactionId?: number, trx?: TrxToken): Promise<TableTxLabel[]> {
1005
- if (transactionId === undefined) return []
1006
- const labels = await this.toDb(trx)<TableTxLabel>('tx_labels')
1007
- .join('tx_labels_map', 'tx_labels_map.txLabelId', 'tx_labels.txLabelId')
1008
- .where('tx_labels_map.transactionId', transactionId)
1009
- .whereNot('tx_labels_map.isDeleted', true)
1010
- .whereNot('tx_labels.isDeleted', true)
1011
- return this.validateEntities(labels, undefined, ['isDeleted'])
1012
- }
1013
-
1014
- override async getTagsForOutputId(outputId: number, trx?: TrxToken): Promise<TableOutputTag[]> {
1015
- const tags = await this.toDb(trx)<TableOutputTag>('output_tags')
1016
- .join('output_tags_map', 'output_tags_map.outputTagId', 'output_tags.outputTagId')
1017
- .where('output_tags_map.outputId', outputId)
1018
- .whereNot('output_tags_map.isDeleted', true)
1019
- .whereNot('output_tags.isDeleted', true)
1020
- return this.validateEntities(tags, undefined, ['isDeleted'])
1021
- }
1022
-
1023
- override async purgeData(params: PurgeParams, trx?: TrxToken): Promise<PurgeResults> {
1024
- return await purgeData(this, params, trx)
1025
- }
1026
-
1027
- override async reviewStatus(args: { agedLimit: Date; trx?: TrxToken }): Promise<{ log: string }> {
1028
- return await reviewStatus(this, args)
1029
- }
1030
-
1031
- /**
1032
- * Counts the outputs for userId in basketId that are spendable: true
1033
- * AND whose transaction status is one of:
1034
- * - completed
1035
- * - unproven
1036
- * - sending (if excludeSending is false)
1037
- */
1038
- async countChangeInputs(userId: number, basketId: number, excludeSending: boolean): Promise<number> {
1039
- const status: TransactionStatus[] = ['completed', 'unproven']
1040
- if (!excludeSending) status.push('sending')
1041
- const statusText = status.map(s => `'${s}'`).join(',')
1042
- const txStatusCondition = `(SELECT status FROM transactions WHERE outputs.transactionId = transactions.transactionId) in (${statusText})`
1043
- let q = this.knex<TableOutput>('outputs').where({ userId, spendable: true, basketId }).whereRaw(txStatusCondition)
1044
- const count = await this.getCount(q)
1045
- return count
1046
- }
1047
-
1048
- /**
1049
- * Finds closest matching available change output to use as input for new transaction.
1050
- *
1051
- * Transactionally allocate the output such that
1052
- */
1053
- async allocateChangeInput(
1054
- userId: number,
1055
- basketId: number,
1056
- targetSatoshis: number,
1057
- exactSatoshis: number | undefined,
1058
- excludeSending: boolean,
1059
- transactionId: number
1060
- ): Promise<TableOutput | undefined> {
1061
- const status: TransactionStatus[] = ['completed', 'unproven']
1062
- if (!excludeSending) status.push('sending')
1063
- const statusText = status.map(s => `'${s}'`).join(',')
1064
-
1065
- const r: TableOutput | undefined = await this.knex.transaction(async trx => {
1066
- const txStatusCondition = `AND (SELECT status FROM transactions WHERE outputs.transactionId = transactions.transactionId) in (${statusText})`
1067
-
1068
- let outputId: number | undefined
1069
- const setOutputId = async (rawQuery: string): Promise<void> => {
1070
- let oidr = await trx.raw(rawQuery)
1071
- outputId = undefined
1072
- if (!oidr['outputId'] && oidr.length > 0) oidr = oidr[0]
1073
- if (!oidr['outputId'] && oidr.length > 0) oidr = oidr[0]
1074
- if (oidr['outputId']) outputId = Number(oidr['outputId'])
1075
- }
1076
-
1077
- if (exactSatoshis !== undefined) {
1078
- // Find outputId of output that with exactSatoshis
1079
- await setOutputId(`
1080
- SELECT outputId
1081
- FROM outputs
1082
- WHERE userId = ${userId}
1083
- AND spendable = 1
1084
- AND basketId = ${basketId}
1085
- ${txStatusCondition}
1086
- AND satoshis = ${exactSatoshis}
1087
- LIMIT 1;
1088
- `)
1089
- }
1090
-
1091
- if (outputId === undefined) {
1092
- // Find outputId of output that would at least fund targetSatoshis
1093
- await setOutputId(`
1094
- SELECT outputId
1095
- FROM outputs
1096
- WHERE userId = ${userId}
1097
- AND spendable = 1
1098
- AND basketId = ${basketId}
1099
- ${txStatusCondition}
1100
- AND satoshis - ${targetSatoshis} = (
1101
- SELECT MIN(satoshis - ${targetSatoshis})
1102
- FROM outputs
1103
- WHERE userId = ${userId}
1104
- AND spendable = 1
1105
- AND basketId = ${basketId}
1106
- ${txStatusCondition}
1107
- AND satoshis - ${targetSatoshis} >= 0
1108
- )
1109
- LIMIT 1;
1110
- `)
1111
- }
1112
-
1113
- if (outputId === undefined) {
1114
- // Find outputId of output that would add the most fund targetSatoshis
1115
- await setOutputId(`
1116
- SELECT outputId
1117
- FROM outputs
1118
- WHERE userId = ${userId}
1119
- AND spendable = 1
1120
- AND basketId = ${basketId}
1121
- ${txStatusCondition}
1122
- AND satoshis - ${targetSatoshis} = (
1123
- SELECT MAX(satoshis - ${targetSatoshis})
1124
- FROM outputs
1125
- WHERE userId = ${userId}
1126
- AND spendable = 1
1127
- AND basketId = ${basketId}
1128
- ${txStatusCondition}
1129
- AND satoshis - ${targetSatoshis} < 0
1130
- )
1131
- LIMIT 1;
1132
- `)
1133
- }
1134
-
1135
- if (outputId === undefined) return undefined
1136
-
1137
- await this.updateOutput(
1138
- outputId,
1139
- {
1140
- spendable: false,
1141
- spentBy: transactionId
1142
- },
1143
- trx
1144
- )
1145
-
1146
- const r = verifyTruthy(await this.findOutputById(outputId, trx))
1147
- return r
1148
- })
1149
-
1150
- return r
1151
- }
1152
-
1153
- /**
1154
- * Helper to force uniform behavior across database engines.
1155
- * Use to process all individual records with time stamps retreived from database.
1156
- */
1157
- validateEntity<T extends EntityTimeStamp>(entity: T, dateFields?: string[], booleanFields?: string[]): T {
1158
- entity.created_at = this.validateDate(entity.created_at)
1159
- entity.updated_at = this.validateDate(entity.updated_at)
1160
- if (dateFields) {
1161
- for (const df of dateFields) {
1162
- if (entity[df]) entity[df] = this.validateDate(entity[df])
1163
- }
1164
- }
1165
- if (booleanFields) {
1166
- for (const df of booleanFields) {
1167
- if (entity[df] !== undefined) entity[df] = !!entity[df]
1168
- }
1169
- }
1170
- for (const key of Object.keys(entity)) {
1171
- const val = entity[key]
1172
- if (val === null) {
1173
- entity[key] = undefined
1174
- } else if (Buffer.isBuffer(val)) {
1175
- entity[key] = Array.from(val)
1176
- }
1177
- }
1178
- return entity
1179
- }
1180
-
1181
- /**
1182
- * Helper to force uniform behavior across database engines.
1183
- * Use to process all arrays of records with time stamps retreived from database.
1184
- * @returns input `entities` array with contained values validated.
1185
- */
1186
- validateEntities<T extends EntityTimeStamp>(entities: T[], dateFields?: string[], booleanFields?: string[]): T[] {
1187
- for (let i = 0; i < entities.length; i++) {
1188
- entities[i] = this.validateEntity(entities[i], dateFields, booleanFields)
1189
- }
1190
- return entities
1191
- }
1192
-
1193
- async adminStats(adminIdentityKey: string): Promise<AdminStatsResult> {
1194
- if (this.dbtype !== 'MySQL') throw new WERR_NOT_IMPLEMENTED('adminStats, only MySQL is supported')
1195
-
1196
- const monitorEvent = verifyOneOrNone(
1197
- await this.findMonitorEvents({
1198
- partial: { event: 'MonitorCallHistory' },
1199
- orderDescending: true,
1200
- paged: { limit: 1 }
1201
- })
1202
- )
1203
- const monitorStats: ServicesCallHistory | undefined = monitorEvent ? JSON.parse(monitorEvent.details!) : undefined
1204
- const servicesStats = this.getServices().getServicesCallHistory(true)
1205
- await this.insertMonitorEvent({
1206
- event: 'ServicesCallHistory',
1207
- details: JSON.stringify(servicesStats),
1208
- created_at: new Date(),
1209
- updated_at: new Date(),
1210
- id: 0
1211
- })
1212
-
1213
- const one_day_ago = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString()
1214
- const one_week_ago = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString()
1215
- const one_month_ago = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString()
1216
-
1217
- const [
1218
- [
1219
- {
1220
- usersDay,
1221
- usersMonth,
1222
- usersWeek,
1223
- usersTotal,
1224
- transactionsDay,
1225
- transactionsMonth,
1226
- transactionsWeek,
1227
- transactionsTotal,
1228
- txCompletedDay,
1229
- txCompletedMonth,
1230
- txCompletedWeek,
1231
- txCompletedTotal,
1232
- txFailedDay,
1233
- txFailedMonth,
1234
- txFailedWeek,
1235
- txFailedTotal,
1236
- txUnprocessedDay,
1237
- txUnprocessedMonth,
1238
- txUnprocessedWeek,
1239
- txUnprocessedTotal,
1240
- txSendingDay,
1241
- txSendingMonth,
1242
- txSendingWeek,
1243
- txSendingTotal,
1244
- txUnprovenDay,
1245
- txUnprovenMonth,
1246
- txUnprovenWeek,
1247
- txUnprovenTotal,
1248
- txUnsignedDay,
1249
- txUnsignedMonth,
1250
- txUnsignedWeek,
1251
- txUnsignedTotal,
1252
- txNosendDay,
1253
- txNosendMonth,
1254
- txNosendWeek,
1255
- txNosendTotal,
1256
- txNonfinalDay,
1257
- txNonfinalMonth,
1258
- txNonfinalWeek,
1259
- txNonfinalTotal,
1260
- txUnfailDay,
1261
- txUnfailMonth,
1262
- txUnfailWeek,
1263
- txUnfailTotal,
1264
- satoshisDefaultDay,
1265
- satoshisDefaultMonth,
1266
- satoshisDefaultWeek,
1267
- satoshisDefaultTotal,
1268
- satoshisOtherDay,
1269
- satoshisOtherMonth,
1270
- satoshisOtherWeek,
1271
- satoshisOtherTotal,
1272
- basketsDay,
1273
- basketsMonth,
1274
- basketsWeek,
1275
- basketsTotal,
1276
- labelsDay,
1277
- labelsMonth,
1278
- labelsWeek,
1279
- labelsTotal,
1280
- tagsDay,
1281
- tagsMonth,
1282
- tagsWeek,
1283
- tagsTotal
1284
- }
1285
- ]
1286
- ] = await this.knex.raw(`
1287
- select
1288
- (select count(*) from users where created_at > '${one_day_ago}') as usersDay,
1289
- (select count(*) from users where created_at > '${one_week_ago}') as usersWeek,
1290
- (select count(*) from users where created_at > '${one_month_ago}') as usersMonth,
1291
- (select count(*) from users) as usersTotal,
1292
- (select count(*) from transactions where created_at > '${one_day_ago}') as transactionsDay,
1293
- (select count(*) from transactions where created_at > '${one_week_ago}') as transactionsWeek,
1294
- (select count(*) from transactions where created_at > '${one_month_ago}') as transactionsMonth,
1295
- (select count(*) from transactions) as transactionsTotal,
1296
- (select count(*) from transactions where status = 'completed' and created_at > '${one_day_ago}') as txCompletedDay,
1297
- (select count(*) from transactions where status = 'completed' and created_at > '${one_week_ago}') as txCompletedWeek,
1298
- (select count(*) from transactions where status = 'completed' and created_at > '${one_month_ago}') as txCompletedMonth,
1299
- (select count(*) from transactions where status = 'completed') as txCompletedTotal,
1300
- (select count(*) from transactions where status = 'failed' and created_at > '${one_day_ago}') as txFailedDay,
1301
- (select count(*) from transactions where status = 'failed' and created_at > '${one_week_ago}') as txFailedWeek,
1302
- (select count(*) from transactions where status = 'failed' and created_at > '${one_month_ago}') as txFailedMonth,
1303
- (select count(*) from transactions where status = 'failed') as txFailedTotal,
1304
- (select count(*) from transactions where status = 'unprocessed' and created_at > '${one_day_ago}') as txUnprocessedDay,
1305
- (select count(*) from transactions where status = 'unprocessed' and created_at > '${one_week_ago}') as txUnprocessedWeek,
1306
- (select count(*) from transactions where status = 'unprocessed' and created_at > '${one_month_ago}') as txUnprocessedMonth,
1307
- (select count(*) from transactions where status = 'unprocessed') as txUnprocessedTotal,
1308
- (select count(*) from transactions where status = 'sending' and created_at > '${one_day_ago}') as txSendingDay,
1309
- (select count(*) from transactions where status = 'sending' and created_at > '${one_week_ago}') as txSendingWeek,
1310
- (select count(*) from transactions where status = 'sending' and created_at > '${one_month_ago}') as txSendingMonth,
1311
- (select count(*) from transactions where status = 'sending') as txSendingTotal,
1312
- (select count(*) from transactions where status = 'unproven' and created_at > '${one_day_ago}') as txUnprovenDay,
1313
- (select count(*) from transactions where status = 'unproven' and created_at > '${one_week_ago}') as txUnprovenWeek,
1314
- (select count(*) from transactions where status = 'unproven' and created_at > '${one_month_ago}') as txUnprovenMonth,
1315
- (select count(*) from transactions where status = 'unproven') as txUnprovenTotal,
1316
- (select count(*) from transactions where status = 'unsigned' and created_at > '${one_day_ago}') as txUnsignedDay,
1317
- (select count(*) from transactions where status = 'unsigned' and created_at > '${one_week_ago}') as txUnsignedWeek,
1318
- (select count(*) from transactions where status = 'unsigned' and created_at > '${one_month_ago}') as txUnsignedMonth,
1319
- (select count(*) from transactions where status = 'unsigned') as txUnsignedTotal,
1320
- (select count(*) from transactions where status = 'nosend' and created_at > '${one_day_ago}') as txNosendDay,
1321
- (select count(*) from transactions where status = 'nosend' and created_at > '${one_week_ago}') as txNosendWeek,
1322
- (select count(*) from transactions where status = 'nosend' and created_at > '${one_month_ago}') as txNosendMonth,
1323
- (select count(*) from transactions where status = 'nosend') as txNosendTotal,
1324
- (select count(*) from transactions where status = 'nonfinal' and created_at > '${one_day_ago}') as txNonfinalDay,
1325
- (select count(*) from transactions where status = 'nonfinal' and created_at > '${one_week_ago}') as txNonfinalWeek,
1326
- (select count(*) from transactions where status = 'nonfinal' and created_at > '${one_month_ago}') as txNonfinalMonth,
1327
- (select count(*) from transactions where status = 'nonfinal') as txNonfinalTotal,
1328
- (select count(*) from transactions where status = 'unfail' and created_at > '${one_day_ago}') as txUnfailDay,
1329
- (select count(*) from transactions where status = 'unfail' and created_at > '${one_week_ago}') as txUnfailWeek,
1330
- (select count(*) from transactions where status = 'unfail' and created_at > '${one_month_ago}') as txUnfailMonth,
1331
- (select count(*) from transactions where status = 'unfail') as txUnfailTotal,
1332
- (select sum(satoshis) from outputs where spendable = 1 and \`change\` = 1 and created_at > '${one_day_ago}') as satoshisDefaultDay,
1333
- (select sum(satoshis) from outputs where spendable = 1 and \`change\` = 1 and created_at > '${one_week_ago}') as satoshisDefaultWeek,
1334
- (select sum(satoshis) from outputs where spendable = 1 and \`change\` = 1 and created_at > '${one_month_ago}') as satoshisDefaultMonth,
1335
- (select sum(satoshis) from outputs where spendable = 1 and \`change\` = 1) as satoshisDefaultTotal,
1336
- (select sum(satoshis) from outputs where spendable = 1 and \`change\` = 0 and not basketId is null and created_at > '${one_day_ago}') as satoshisOtherDay,
1337
- (select sum(satoshis) from outputs where spendable = 1 and \`change\` = 0 and not basketId is null and created_at > '${one_week_ago}') as satoshisOtherWeek,
1338
- (select sum(satoshis) from outputs where spendable = 1 and \`change\` = 0 and not basketId is null and created_at > '${one_month_ago}') as satoshisOtherMonth,
1339
- (select sum(satoshis) from outputs where spendable = 1 and \`change\` = 0 and not basketId is null) as satoshisOtherTotal,
1340
- (select count(*) from output_baskets where created_at > '${one_day_ago}') as basketsDay,
1341
- (select count(*) from output_baskets where created_at > '${one_week_ago}') as basketsWeek,
1342
- (select count(*) from output_baskets where created_at > '${one_month_ago}') as basketsMonth,
1343
- (select count(*) from output_baskets) as basketsTotal,
1344
- (select count(*) from tx_labels where created_at > '${one_day_ago}') as labelsDay,
1345
- (select count(*) from tx_labels where created_at > '${one_week_ago}') as labelsWeek,
1346
- (select count(*) from tx_labels where created_at > '${one_month_ago}') as labelsMonth,
1347
- (select count(*) from tx_labels) as labelsTotal,
1348
- (select count(*) from output_tags where created_at > '${one_day_ago}') as tagsDay,
1349
- (select count(*) from output_tags where created_at > '${one_week_ago}') as tagsWeek,
1350
- (select count(*) from output_tags where created_at > '${one_month_ago}') as tagsMonth,
1351
- (select count(*) from output_tags) as tagsTotal
1352
- `)
1353
- const r: AdminStatsResult = {
1354
- monitorStats,
1355
- servicesStats,
1356
- requestedBy: adminIdentityKey,
1357
- when: new Date().toISOString(),
1358
- usersDay,
1359
- usersWeek,
1360
- usersMonth,
1361
- usersTotal,
1362
- transactionsDay,
1363
- transactionsWeek,
1364
- transactionsMonth,
1365
- transactionsTotal,
1366
- txCompletedDay,
1367
- txCompletedWeek,
1368
- txCompletedMonth,
1369
- txCompletedTotal,
1370
- txFailedDay,
1371
- txFailedWeek,
1372
- txFailedMonth,
1373
- txFailedTotal,
1374
- txUnprocessedDay,
1375
- txUnprocessedWeek,
1376
- txUnprocessedMonth,
1377
- txUnprocessedTotal,
1378
- txSendingDay,
1379
- txSendingWeek,
1380
- txSendingMonth,
1381
- txSendingTotal,
1382
- txUnprovenDay,
1383
- txUnprovenWeek,
1384
- txUnprovenMonth,
1385
- txUnprovenTotal,
1386
- txUnsignedDay,
1387
- txUnsignedWeek,
1388
- txUnsignedMonth,
1389
- txUnsignedTotal,
1390
- txNosendDay,
1391
- txNosendWeek,
1392
- txNosendMonth,
1393
- txNosendTotal,
1394
- txNonfinalDay,
1395
- txNonfinalWeek,
1396
- txNonfinalMonth,
1397
- txNonfinalTotal,
1398
- txUnfailDay,
1399
- txUnfailWeek,
1400
- txUnfailMonth,
1401
- txUnfailTotal,
1402
- satoshisDefaultDay: Number(satoshisDefaultDay),
1403
- satoshisDefaultWeek: Number(satoshisDefaultWeek),
1404
- satoshisDefaultMonth: Number(satoshisDefaultMonth),
1405
- satoshisDefaultTotal: Number(satoshisDefaultTotal),
1406
- satoshisOtherDay: Number(satoshisOtherDay),
1407
- satoshisOtherWeek: Number(satoshisOtherWeek),
1408
- satoshisOtherMonth: Number(satoshisOtherMonth),
1409
- satoshisOtherTotal: Number(satoshisOtherTotal),
1410
- basketsDay,
1411
- basketsWeek,
1412
- basketsMonth,
1413
- basketsTotal,
1414
- labelsDay,
1415
- labelsWeek,
1416
- labelsMonth,
1417
- labelsTotal,
1418
- tagsDay,
1419
- tagsWeek,
1420
- tagsMonth,
1421
- tagsTotal
1422
- }
1423
- return r
1424
- }
1425
- }