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