@bopen-io/wallet-toolbox 2.6.2-brc153.5 → 2.15.0-bopen.1

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 (886) hide show
  1. package/CHANGELOG.md +789 -1
  2. package/LICENSES/Open-BSV-License-4-wallet-pre-2026.txt +28 -0
  3. package/README.md +889 -14
  4. package/THIRD_PARTY_NOTICES.md +35 -0
  5. package/docs/README.md +44 -31
  6. package/docs/action-batch-planning.md +80 -37
  7. package/docs/client.md +11241 -2525
  8. package/docs/identity-verification.md +218 -0
  9. package/docs/local-first-chaintracks.md +129 -0
  10. package/docs/managed-change-liquidity.md +258 -0
  11. package/docs/managed-change-policy.md +14 -1
  12. package/docs/monitor.md +411 -85
  13. package/docs/no-send-expiry.md +167 -0
  14. package/docs/prepared-beef.md +197 -0
  15. package/docs/services.md +5163 -2157
  16. package/docs/setup.md +153 -57
  17. package/docs/storage.md +5051 -851
  18. package/docs/sync-transfer.md +144 -0
  19. package/docs/wab-shamir.md +5 -1
  20. package/docs/wallet.md +10202 -10670
  21. package/out/src/CWIStyleWalletManager.d.ts +39 -31
  22. package/out/src/CWIStyleWalletManager.d.ts.map +1 -1
  23. package/out/src/CWIStyleWalletManager.js +309 -258
  24. package/out/src/CWIStyleWalletManager.js.map +1 -1
  25. package/out/src/Setup.d.ts +24 -0
  26. package/out/src/Setup.d.ts.map +1 -1
  27. package/out/src/Setup.js +30 -2
  28. package/out/src/Setup.js.map +1 -1
  29. package/out/src/SetupClient.d.ts +3 -0
  30. package/out/src/SetupClient.d.ts.map +1 -1
  31. package/out/src/SetupClient.js +1 -0
  32. package/out/src/SetupClient.js.map +1 -1
  33. package/out/src/SetupWallet.d.ts +3 -0
  34. package/out/src/SetupWallet.d.ts.map +1 -1
  35. package/out/src/ShamirWalletManager.d.ts.map +1 -1
  36. package/out/src/ShamirWalletManager.js +34 -19
  37. package/out/src/ShamirWalletManager.js.map +1 -1
  38. package/out/src/SimpleWalletManager.d.ts.map +1 -1
  39. package/out/src/SimpleWalletManager.js +7 -6
  40. package/out/src/SimpleWalletManager.js.map +1 -1
  41. package/out/src/Wallet.d.ts +54 -14
  42. package/out/src/Wallet.d.ts.map +1 -1
  43. package/out/src/Wallet.js +216 -114
  44. package/out/src/Wallet.js.map +1 -1
  45. package/out/src/WalletAuthenticationManager.d.ts +32 -0
  46. package/out/src/WalletAuthenticationManager.d.ts.map +1 -1
  47. package/out/src/WalletAuthenticationManager.js +531 -78
  48. package/out/src/WalletAuthenticationManager.js.map +1 -1
  49. package/out/src/WalletLogger.js +1 -1
  50. package/out/src/WalletLogger.js.map +1 -1
  51. package/out/src/WalletPermissionsManager.d.ts +101 -43
  52. package/out/src/WalletPermissionsManager.d.ts.map +1 -1
  53. package/out/src/WalletPermissionsManager.js +897 -414
  54. package/out/src/WalletPermissionsManager.js.map +1 -1
  55. package/out/src/WalletSettingsManager.d.ts +3 -2
  56. package/out/src/WalletSettingsManager.d.ts.map +1 -1
  57. package/out/src/WalletSettingsManager.js +143 -8
  58. package/out/src/WalletSettingsManager.js.map +1 -1
  59. package/out/src/entropy/EntropyCollector.d.ts.map +1 -1
  60. package/out/src/entropy/EntropyCollector.js +3 -2
  61. package/out/src/entropy/EntropyCollector.js.map +1 -1
  62. package/out/src/fundWalletP2PKH.d.ts.map +1 -1
  63. package/out/src/fundWalletP2PKH.js +143 -44
  64. package/out/src/fundWalletP2PKH.js.map +1 -1
  65. package/out/src/index.client.d.ts +6 -0
  66. package/out/src/index.client.d.ts.map +1 -1
  67. package/out/src/index.client.js +16 -1
  68. package/out/src/index.client.js.map +1 -1
  69. package/out/src/index.mobile.d.ts +7 -0
  70. package/out/src/index.mobile.d.ts.map +1 -1
  71. package/out/src/index.mobile.js +17 -1
  72. package/out/src/index.mobile.js.map +1 -1
  73. package/out/src/mockchain/MockChainTracker.d.ts.map +1 -1
  74. package/out/src/mockchain/MockChainTracker.js +5 -5
  75. package/out/src/mockchain/MockChainTracker.js.map +1 -1
  76. package/out/src/mockchain/MockServices.d.ts +2 -0
  77. package/out/src/mockchain/MockServices.d.ts.map +1 -1
  78. package/out/src/mockchain/MockServices.js +54 -14
  79. package/out/src/mockchain/MockServices.js.map +1 -1
  80. package/out/src/monitor/Monitor.d.ts +51 -0
  81. package/out/src/monitor/Monitor.d.ts.map +1 -1
  82. package/out/src/monitor/Monitor.js +282 -41
  83. package/out/src/monitor/Monitor.js.map +1 -1
  84. package/out/src/monitor/MonitorDaemon.d.ts +2 -0
  85. package/out/src/monitor/MonitorDaemon.d.ts.map +1 -1
  86. package/out/src/monitor/MonitorDaemon.js +73 -17
  87. package/out/src/monitor/MonitorDaemon.js.map +1 -1
  88. package/out/src/monitor/monitorValidation.d.ts +12 -0
  89. package/out/src/monitor/monitorValidation.d.ts.map +1 -0
  90. package/out/src/monitor/monitorValidation.js +133 -0
  91. package/out/src/monitor/monitorValidation.js.map +1 -0
  92. package/out/src/monitor/tasks/TaskArcSSE.d.ts +6 -1
  93. package/out/src/monitor/tasks/TaskArcSSE.d.ts.map +1 -1
  94. package/out/src/monitor/tasks/TaskArcSSE.js +117 -74
  95. package/out/src/monitor/tasks/TaskArcSSE.js.map +1 -1
  96. package/out/src/monitor/tasks/TaskCheckForProofs.d.ts +5 -0
  97. package/out/src/monitor/tasks/TaskCheckForProofs.d.ts.map +1 -1
  98. package/out/src/monitor/tasks/TaskCheckForProofs.js +29 -24
  99. package/out/src/monitor/tasks/TaskCheckForProofs.js.map +1 -1
  100. package/out/src/monitor/tasks/TaskCheckNoSends.d.ts.map +1 -1
  101. package/out/src/monitor/tasks/TaskCheckNoSends.js +11 -3
  102. package/out/src/monitor/tasks/TaskCheckNoSends.js.map +1 -1
  103. package/out/src/monitor/tasks/TaskFailAbandoned.d.ts.map +1 -1
  104. package/out/src/monitor/tasks/TaskFailAbandoned.js +9 -4
  105. package/out/src/monitor/tasks/TaskFailAbandoned.js.map +1 -1
  106. package/out/src/monitor/tasks/TaskNewHeader.d.ts.map +1 -1
  107. package/out/src/monitor/tasks/TaskNewHeader.js +3 -1
  108. package/out/src/monitor/tasks/TaskNewHeader.js.map +1 -1
  109. package/out/src/monitor/tasks/TaskNoSendExpiry.d.ts +19 -0
  110. package/out/src/monitor/tasks/TaskNoSendExpiry.d.ts.map +1 -0
  111. package/out/src/monitor/tasks/TaskNoSendExpiry.js +47 -0
  112. package/out/src/monitor/tasks/TaskNoSendExpiry.js.map +1 -0
  113. package/out/src/monitor/tasks/TaskReconcilePendingTransactions.d.ts +27 -0
  114. package/out/src/monitor/tasks/TaskReconcilePendingTransactions.d.ts.map +1 -0
  115. package/out/src/monitor/tasks/TaskReconcilePendingTransactions.js +242 -0
  116. package/out/src/monitor/tasks/TaskReconcilePendingTransactions.js.map +1 -0
  117. package/out/src/monitor/tasks/TaskReorg.d.ts.map +1 -1
  118. package/out/src/monitor/tasks/TaskReorg.js +4 -4
  119. package/out/src/monitor/tasks/TaskReorg.js.map +1 -1
  120. package/out/src/monitor/tasks/TaskReviewDoubleSpends.d.ts.map +1 -1
  121. package/out/src/monitor/tasks/TaskReviewDoubleSpends.js +31 -9
  122. package/out/src/monitor/tasks/TaskReviewDoubleSpends.js.map +1 -1
  123. package/out/src/monitor/tasks/TaskReviewProvenTxs.d.ts +18 -1
  124. package/out/src/monitor/tasks/TaskReviewProvenTxs.d.ts.map +1 -1
  125. package/out/src/monitor/tasks/TaskReviewProvenTxs.js +99 -21
  126. package/out/src/monitor/tasks/TaskReviewProvenTxs.js.map +1 -1
  127. package/out/src/monitor/tasks/TaskReviewUtxos.d.ts +33 -6
  128. package/out/src/monitor/tasks/TaskReviewUtxos.d.ts.map +1 -1
  129. package/out/src/monitor/tasks/TaskReviewUtxos.js +189 -13
  130. package/out/src/monitor/tasks/TaskReviewUtxos.js.map +1 -1
  131. package/out/src/monitor/tasks/TaskSendWaiting.d.ts.map +1 -1
  132. package/out/src/monitor/tasks/TaskSendWaiting.js +52 -11
  133. package/out/src/monitor/tasks/TaskSendWaiting.js.map +1 -1
  134. package/out/src/monitor/tasks/TaskUnFail.d.ts +1 -0
  135. package/out/src/monitor/tasks/TaskUnFail.d.ts.map +1 -1
  136. package/out/src/monitor/tasks/TaskUnFail.js +26 -8
  137. package/out/src/monitor/tasks/TaskUnFail.js.map +1 -1
  138. package/out/src/monitor/tasks/index.all.d.ts +2 -0
  139. package/out/src/monitor/tasks/index.all.d.ts.map +1 -1
  140. package/out/src/monitor/tasks/index.all.js +2 -0
  141. package/out/src/monitor/tasks/index.all.js.map +1 -1
  142. package/out/src/sdk/ActionBatch.interfaces.d.ts +23 -0
  143. package/out/src/sdk/ActionBatch.interfaces.d.ts.map +1 -1
  144. package/out/src/sdk/PrivilegedKeyManager.d.ts.map +1 -1
  145. package/out/src/sdk/PrivilegedKeyManager.js +3 -2
  146. package/out/src/sdk/PrivilegedKeyManager.js.map +1 -1
  147. package/out/src/sdk/WERR_errors.d.ts +23 -0
  148. package/out/src/sdk/WERR_errors.d.ts.map +1 -1
  149. package/out/src/sdk/WERR_errors.js +51 -7
  150. package/out/src/sdk/WERR_errors.js.map +1 -1
  151. package/out/src/sdk/WalletError.d.ts.map +1 -1
  152. package/out/src/sdk/WalletError.js +7 -21
  153. package/out/src/sdk/WalletError.js.map +1 -1
  154. package/out/src/sdk/WalletErrorFromJson.d.ts.map +1 -1
  155. package/out/src/sdk/WalletErrorFromJson.js +121 -3
  156. package/out/src/sdk/WalletErrorFromJson.js.map +1 -1
  157. package/out/src/sdk/WalletServices.interfaces.d.ts +45 -2
  158. package/out/src/sdk/WalletServices.interfaces.d.ts.map +1 -1
  159. package/out/src/sdk/WalletStorage.interfaces.d.ts +87 -4
  160. package/out/src/sdk/WalletStorage.interfaces.d.ts.map +1 -1
  161. package/out/src/sdk/types.d.ts +3 -2
  162. package/out/src/sdk/types.d.ts.map +1 -1
  163. package/out/src/sdk/types.js +3 -2
  164. package/out/src/sdk/types.js.map +1 -1
  165. package/out/src/services/ServiceCollection.js +2 -2
  166. package/out/src/services/ServiceCollection.js.map +1 -1
  167. package/out/src/services/Services.d.ts +5 -0
  168. package/out/src/services/Services.d.ts.map +1 -1
  169. package/out/src/services/Services.js +346 -120
  170. package/out/src/services/Services.js.map +1 -1
  171. package/out/src/services/chaintracker/BHServiceClient.d.ts +21 -4
  172. package/out/src/services/chaintracker/BHServiceClient.d.ts.map +1 -1
  173. package/out/src/services/chaintracker/BHServiceClient.js +269 -66
  174. package/out/src/services/chaintracker/BHServiceClient.js.map +1 -1
  175. package/out/src/services/chaintracker/ChaintracksChainTracker.d.ts +25 -3
  176. package/out/src/services/chaintracker/ChaintracksChainTracker.d.ts.map +1 -1
  177. package/out/src/services/chaintracker/ChaintracksChainTracker.js +188 -53
  178. package/out/src/services/chaintracker/ChaintracksChainTracker.js.map +1 -1
  179. package/out/src/services/chaintracker/LocalChainTracker.d.ts +122 -0
  180. package/out/src/services/chaintracker/LocalChainTracker.d.ts.map +1 -0
  181. package/out/src/services/chaintracker/LocalChainTracker.js +465 -0
  182. package/out/src/services/chaintracker/LocalChainTracker.js.map +1 -0
  183. package/out/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.d.ts.map +1 -1
  184. package/out/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.js +59 -7
  185. package/out/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.js.map +1 -1
  186. package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.d.ts +48 -0
  187. package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.d.ts.map +1 -0
  188. package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.js +3 -0
  189. package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.js.map +1 -0
  190. package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataValidatorApi.d.ts +70 -0
  191. package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataValidatorApi.d.ts.map +1 -0
  192. package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataValidatorApi.js +21 -0
  193. package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataValidatorApi.js.map +1 -0
  194. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksApi.d.ts +6 -0
  195. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksApi.d.ts.map +1 -1
  196. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.d.ts +53 -0
  197. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.d.ts.map +1 -1
  198. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.d.ts +9 -2
  199. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.d.ts.map +1 -1
  200. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts +9 -0
  201. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts.map +1 -1
  202. package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts +28 -3
  203. package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts.map +1 -1
  204. package/out/src/services/chaintracker/chaintracks/Chaintracks.js +282 -64
  205. package/out/src/services/chaintracker/chaintracks/Chaintracks.js.map +1 -1
  206. package/out/src/services/chaintracker/chaintracks/ChaintracksService.d.ts +16 -0
  207. package/out/src/services/chaintracker/chaintracks/ChaintracksService.d.ts.map +1 -1
  208. package/out/src/services/chaintracker/chaintracks/ChaintracksService.js +150 -26
  209. package/out/src/services/chaintracker/chaintracks/ChaintracksService.js.map +1 -1
  210. package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.d.ts +30 -1
  211. package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.d.ts.map +1 -1
  212. package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.js +348 -30
  213. package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.js.map +1 -1
  214. package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.d.ts +32 -1
  215. package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.d.ts.map +1 -1
  216. package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.js +378 -44
  217. package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.js.map +1 -1
  218. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.d.ts.map +1 -1
  219. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.js +28 -3
  220. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.js.map +1 -1
  221. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.d.ts.map +1 -1
  222. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.js +33 -9
  223. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.js.map +1 -1
  224. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.d.ts.map +1 -1
  225. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.js.map +1 -1
  226. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorChaintracks.d.ts.map +1 -1
  227. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorChaintracks.js +4 -2
  228. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorChaintracks.js.map +1 -1
  229. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.d.ts +2 -0
  230. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.d.ts.map +1 -1
  231. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.js +17 -4
  232. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.js.map +1 -1
  233. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.d.ts +2 -0
  234. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.d.ts.map +1 -1
  235. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.js +40 -20
  236. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.js.map +1 -1
  237. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.d.ts.map +1 -1
  238. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.js +14 -0
  239. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.js.map +1 -1
  240. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.d.ts +6 -0
  241. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.d.ts.map +1 -1
  242. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.js +56 -9
  243. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.js.map +1 -1
  244. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.d.ts.map +1 -1
  245. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.js +6 -3
  246. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.js.map +1 -1
  247. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.d.ts +4 -0
  248. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.d.ts.map +1 -1
  249. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.js +27 -9
  250. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.js.map +1 -1
  251. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.d.ts +8 -0
  252. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.d.ts.map +1 -1
  253. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.js +49 -5
  254. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.js.map +1 -1
  255. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.d.ts +1 -1
  256. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.d.ts.map +1 -1
  257. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.js +90 -21
  258. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.js.map +1 -1
  259. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.d.ts +3 -1
  260. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.d.ts.map +1 -1
  261. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.js +185 -38
  262. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.js.map +1 -1
  263. package/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.d.ts.map +1 -1
  264. package/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.js +59 -6
  265. package/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.js.map +1 -1
  266. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.d.ts +2 -0
  267. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.d.ts.map +1 -1
  268. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.js +89 -39
  269. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.js.map +1 -1
  270. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.d.ts +10 -0
  271. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.d.ts.map +1 -1
  272. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.js +230 -28
  273. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.js.map +1 -1
  274. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.d.ts +2 -1
  275. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.d.ts.map +1 -1
  276. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js +265 -96
  277. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js.map +1 -1
  278. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.d.ts +8 -1
  279. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.d.ts.map +1 -1
  280. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js +248 -87
  281. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js.map +1 -1
  282. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts +3 -0
  283. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts.map +1 -1
  284. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js +121 -35
  285. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js.map +1 -1
  286. package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.d.ts +8 -0
  287. package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.d.ts.map +1 -1
  288. package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.js +6 -3
  289. package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.js.map +1 -1
  290. package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.d.ts.map +1 -1
  291. package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.js.map +1 -1
  292. package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.d.ts.map +1 -1
  293. package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.js.map +1 -1
  294. package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.d.ts.map +1 -1
  295. package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.js.map +1 -1
  296. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.d.ts.map +1 -1
  297. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js +1 -7
  298. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js.map +1 -1
  299. package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.d.ts.map +1 -1
  300. package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.js +1 -7
  301. package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.js.map +1 -1
  302. package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.d.ts.map +1 -1
  303. package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js +1 -7
  304. package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js.map +1 -1
  305. package/out/src/services/chaintracker/chaintracks/index.all.d.ts +3 -0
  306. package/out/src/services/chaintracker/chaintracks/index.all.d.ts.map +1 -1
  307. package/out/src/services/chaintracker/chaintracks/index.all.js +3 -0
  308. package/out/src/services/chaintracker/chaintracks/index.all.js.map +1 -1
  309. package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts +5 -0
  310. package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts.map +1 -1
  311. package/out/src/services/chaintracker/chaintracks/index.mobile.js +5 -0
  312. package/out/src/services/chaintracker/chaintracks/index.mobile.js.map +1 -1
  313. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.d.ts +51 -0
  314. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.d.ts.map +1 -0
  315. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.js +394 -0
  316. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.js.map +1 -0
  317. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts +45 -1
  318. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts.map +1 -1
  319. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js +733 -166
  320. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js.map +1 -1
  321. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataReader.d.ts.map +1 -1
  322. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataReader.js +17 -1
  323. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataReader.js.map +1 -1
  324. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.d.ts +32 -0
  325. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.d.ts.map +1 -0
  326. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.js +40 -0
  327. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.js.map +1 -0
  328. package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.d.ts.map +1 -1
  329. package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.js +99 -30
  330. package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.js.map +1 -1
  331. package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.d.ts +3 -1
  332. package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.d.ts.map +1 -1
  333. package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.js +23 -15
  334. package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.js.map +1 -1
  335. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts +38 -4
  336. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts.map +1 -1
  337. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.js +191 -47
  338. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.js.map +1 -1
  339. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.d.ts +2 -1
  340. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.d.ts.map +1 -1
  341. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.js +57 -11
  342. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.js.map +1 -1
  343. package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.d.ts +48 -0
  344. package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.d.ts.map +1 -0
  345. package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.js +280 -0
  346. package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.js.map +1 -0
  347. package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.d.ts +30 -0
  348. package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.d.ts.map +1 -0
  349. package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.js +57 -0
  350. package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.js.map +1 -0
  351. package/out/src/services/chaintracker/chaintracks/util/HeightRange.d.ts.map +1 -1
  352. package/out/src/services/chaintracker/chaintracks/util/HeightRange.js.map +1 -1
  353. package/out/src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.d.ts +14 -0
  354. package/out/src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.d.ts.map +1 -0
  355. package/out/src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.js +148 -0
  356. package/out/src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.js.map +1 -0
  357. package/out/src/services/chaintracker/chaintracks/util/NodeBulkFileDataValidator.d.ts +41 -0
  358. package/out/src/services/chaintracker/chaintracks/util/NodeBulkFileDataValidator.d.ts.map +1 -0
  359. package/out/src/services/chaintracker/chaintracks/util/NodeBulkFileDataValidator.js +271 -0
  360. package/out/src/services/chaintracker/chaintracks/util/NodeBulkFileDataValidator.js.map +1 -0
  361. package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.d.ts +3 -0
  362. package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.d.ts.map +1 -1
  363. package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.js +15 -0
  364. package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.js.map +1 -1
  365. package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.d.ts +17 -4
  366. package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.d.ts.map +1 -1
  367. package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.js +362 -105
  368. package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.js.map +1 -1
  369. package/out/src/services/chaintracker/chaintracks/util/safeDiagnostic.d.ts +4 -0
  370. package/out/src/services/chaintracker/chaintracks/util/safeDiagnostic.d.ts.map +1 -0
  371. package/out/src/services/chaintracker/chaintracks/util/safeDiagnostic.js +33 -0
  372. package/out/src/services/chaintracker/chaintracks/util/safeDiagnostic.js.map +1 -0
  373. package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.d.ts.map +1 -1
  374. package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js.map +1 -1
  375. package/out/src/services/chaintracker/index.all.d.ts +1 -0
  376. package/out/src/services/chaintracker/index.all.d.ts.map +1 -1
  377. package/out/src/services/chaintracker/index.all.js +1 -0
  378. package/out/src/services/chaintracker/index.all.js.map +1 -1
  379. package/out/src/services/chaintracker/index.client.d.ts +1 -0
  380. package/out/src/services/chaintracker/index.client.d.ts.map +1 -1
  381. package/out/src/services/chaintracker/index.client.js +1 -0
  382. package/out/src/services/chaintracker/index.client.js.map +1 -1
  383. package/out/src/services/chaintracker/index.mobile.d.ts +1 -0
  384. package/out/src/services/chaintracker/index.mobile.d.ts.map +1 -1
  385. package/out/src/services/chaintracker/index.mobile.js +1 -0
  386. package/out/src/services/chaintracker/index.mobile.js.map +1 -1
  387. package/out/src/services/classifyOutputUtxo.d.ts +25 -0
  388. package/out/src/services/classifyOutputUtxo.d.ts.map +1 -0
  389. package/out/src/services/classifyOutputUtxo.js +96 -0
  390. package/out/src/services/classifyOutputUtxo.js.map +1 -0
  391. package/out/src/services/createDefaultWalletServicesOptions.d.ts +16 -3
  392. package/out/src/services/createDefaultWalletServicesOptions.d.ts.map +1 -1
  393. package/out/src/services/createDefaultWalletServicesOptions.js +38 -8
  394. package/out/src/services/createDefaultWalletServicesOptions.js.map +1 -1
  395. package/out/src/services/fiatRateValidation.d.ts +12 -0
  396. package/out/src/services/fiatRateValidation.d.ts.map +1 -0
  397. package/out/src/services/fiatRateValidation.js +138 -0
  398. package/out/src/services/fiatRateValidation.js.map +1 -0
  399. package/out/src/services/getCanonicalMerklePath.d.ts +15 -0
  400. package/out/src/services/getCanonicalMerklePath.d.ts.map +1 -0
  401. package/out/src/services/getCanonicalMerklePath.js +90 -0
  402. package/out/src/services/getCanonicalMerklePath.js.map +1 -0
  403. package/out/src/services/providers/ARC.d.ts +3 -16
  404. package/out/src/services/providers/ARC.d.ts.map +1 -1
  405. package/out/src/services/providers/ARC.js +36 -37
  406. package/out/src/services/providers/ARC.js.map +1 -1
  407. package/out/src/services/providers/ArcSSEClient.d.ts +38 -23
  408. package/out/src/services/providers/ArcSSEClient.d.ts.map +1 -1
  409. package/out/src/services/providers/ArcSSEClient.js +384 -63
  410. package/out/src/services/providers/ArcSSEClient.js.map +1 -1
  411. package/out/src/services/providers/Arcade.d.ts +11 -1
  412. package/out/src/services/providers/Arcade.d.ts.map +1 -1
  413. package/out/src/services/providers/Arcade.js +111 -33
  414. package/out/src/services/providers/Arcade.js.map +1 -1
  415. package/out/src/services/providers/Bitails.d.ts +3 -0
  416. package/out/src/services/providers/Bitails.d.ts.map +1 -1
  417. package/out/src/services/providers/Bitails.js +79 -12
  418. package/out/src/services/providers/Bitails.js.map +1 -1
  419. package/out/src/services/providers/SdkWhatsOnChain.d.ts +8 -2
  420. package/out/src/services/providers/SdkWhatsOnChain.d.ts.map +1 -1
  421. package/out/src/services/providers/SdkWhatsOnChain.js +83 -10
  422. package/out/src/services/providers/SdkWhatsOnChain.js.map +1 -1
  423. package/out/src/services/providers/WhatsOnChain.d.ts +3 -0
  424. package/out/src/services/providers/WhatsOnChain.d.ts.map +1 -1
  425. package/out/src/services/providers/WhatsOnChain.js +221 -69
  426. package/out/src/services/providers/WhatsOnChain.js.map +1 -1
  427. package/out/src/services/providers/arcProviderConfig.d.ts +27 -0
  428. package/out/src/services/providers/arcProviderConfig.d.ts.map +1 -0
  429. package/out/src/services/providers/arcProviderConfig.js +83 -0
  430. package/out/src/services/providers/arcProviderConfig.js.map +1 -0
  431. package/out/src/services/providers/arcTxDataValidation.d.ts +4 -0
  432. package/out/src/services/providers/arcTxDataValidation.d.ts.map +1 -0
  433. package/out/src/services/providers/arcTxDataValidation.js +92 -0
  434. package/out/src/services/providers/arcTxDataValidation.js.map +1 -0
  435. package/out/src/services/providers/arcadeStatus.d.ts +18 -0
  436. package/out/src/services/providers/arcadeStatus.d.ts.map +1 -0
  437. package/out/src/services/providers/arcadeStatus.js +56 -0
  438. package/out/src/services/providers/arcadeStatus.js.map +1 -0
  439. package/out/src/services/providers/exchangeRates.d.ts +3 -3
  440. package/out/src/services/providers/exchangeRates.d.ts.map +1 -1
  441. package/out/src/services/providers/exchangeRates.js +153 -226
  442. package/out/src/services/providers/exchangeRates.js.map +1 -1
  443. package/out/src/services/providers/getBeefForTxid.d.ts.map +1 -1
  444. package/out/src/services/providers/getBeefForTxid.js.map +1 -1
  445. package/out/src/services/providers/whatsOnChainHelpers.d.ts +2 -2
  446. package/out/src/services/providers/whatsOnChainHelpers.d.ts.map +1 -1
  447. package/out/src/services/providers/whatsOnChainHelpers.js +11 -8
  448. package/out/src/services/providers/whatsOnChainHelpers.js.map +1 -1
  449. package/out/src/services/validateMerklePathResult.d.ts +30 -0
  450. package/out/src/services/validateMerklePathResult.d.ts.map +1 -0
  451. package/out/src/services/validateMerklePathResult.js +272 -0
  452. package/out/src/services/validateMerklePathResult.js.map +1 -0
  453. package/out/src/services/validatePostBeefResult.d.ts +17 -0
  454. package/out/src/services/validatePostBeefResult.d.ts.map +1 -0
  455. package/out/src/services/validatePostBeefResult.js +334 -0
  456. package/out/src/services/validatePostBeefResult.js.map +1 -0
  457. package/out/src/services/validateRawTxResult.d.ts +6 -0
  458. package/out/src/services/validateRawTxResult.d.ts.map +1 -0
  459. package/out/src/services/validateRawTxResult.js +77 -0
  460. package/out/src/services/validateRawTxResult.js.map +1 -0
  461. package/out/src/services/validateScriptHashHistoryResult.d.ts +5 -0
  462. package/out/src/services/validateScriptHashHistoryResult.d.ts.map +1 -0
  463. package/out/src/services/validateScriptHashHistoryResult.js +99 -0
  464. package/out/src/services/validateScriptHashHistoryResult.js.map +1 -0
  465. package/out/src/services/validateStatusForTxidsResult.d.ts +8 -0
  466. package/out/src/services/validateStatusForTxidsResult.d.ts.map +1 -0
  467. package/out/src/services/validateStatusForTxidsResult.js +181 -0
  468. package/out/src/services/validateStatusForTxidsResult.js.map +1 -0
  469. package/out/src/services/validateUtxoStatusResult.d.ts +6 -0
  470. package/out/src/services/validateUtxoStatusResult.d.ts.map +1 -0
  471. package/out/src/services/validateUtxoStatusResult.js +126 -0
  472. package/out/src/services/validateUtxoStatusResult.js.map +1 -0
  473. package/out/src/signer/actionBatch/ActionBatchPlanner.d.ts +3 -2
  474. package/out/src/signer/actionBatch/ActionBatchPlanner.d.ts.map +1 -1
  475. package/out/src/signer/actionBatch/ActionBatchPlanner.js +29 -6
  476. package/out/src/signer/actionBatch/ActionBatchPlanner.js.map +1 -1
  477. package/out/src/signer/actionBatch/ActionBatchWorkspace.d.ts +8 -5
  478. package/out/src/signer/actionBatch/ActionBatchWorkspace.d.ts.map +1 -1
  479. package/out/src/signer/actionBatch/ActionBatchWorkspace.js +186 -73
  480. package/out/src/signer/actionBatch/ActionBatchWorkspace.js.map +1 -1
  481. package/out/src/signer/actionBatch/actionBatchBootstrap.d.ts +2 -2
  482. package/out/src/signer/actionBatch/actionBatchBootstrap.d.ts.map +1 -1
  483. package/out/src/signer/actionBatch/actionBatchBootstrap.js +3 -3
  484. package/out/src/signer/actionBatch/actionBatchBootstrap.js.map +1 -1
  485. package/out/src/signer/methods/acquireDirectCertificate.d.ts +3 -2
  486. package/out/src/signer/methods/acquireDirectCertificate.d.ts.map +1 -1
  487. package/out/src/signer/methods/acquireDirectCertificate.js.map +1 -1
  488. package/out/src/signer/methods/buildSignableTransaction.d.ts +6 -5
  489. package/out/src/signer/methods/buildSignableTransaction.d.ts.map +1 -1
  490. package/out/src/signer/methods/buildSignableTransaction.js +6 -11
  491. package/out/src/signer/methods/buildSignableTransaction.js.map +1 -1
  492. package/out/src/signer/methods/createAction.d.ts +4 -3
  493. package/out/src/signer/methods/createAction.d.ts.map +1 -1
  494. package/out/src/signer/methods/createAction.js +3 -1
  495. package/out/src/signer/methods/createAction.js.map +1 -1
  496. package/out/src/signer/methods/createNoSendExpiryAction.d.ts +7 -0
  497. package/out/src/signer/methods/createNoSendExpiryAction.d.ts.map +1 -0
  498. package/out/src/signer/methods/createNoSendExpiryAction.js +254 -0
  499. package/out/src/signer/methods/createNoSendExpiryAction.js.map +1 -0
  500. package/out/src/signer/methods/internalizeAction.d.ts.map +1 -1
  501. package/out/src/signer/methods/internalizeAction.js +9 -5
  502. package/out/src/signer/methods/internalizeAction.js.map +1 -1
  503. package/out/src/signer/methods/proveCertificate.d.ts +3 -2
  504. package/out/src/signer/methods/proveCertificate.d.ts.map +1 -1
  505. package/out/src/signer/methods/proveCertificate.js.map +1 -1
  506. package/out/src/signer/methods/signAction.d.ts.map +1 -1
  507. package/out/src/signer/methods/signAction.js +12 -2
  508. package/out/src/signer/methods/signAction.js.map +1 -1
  509. package/out/src/signer/methods/verifyUnlockScripts.d.ts.map +1 -1
  510. package/out/src/signer/methods/verifyUnlockScripts.js +12 -17
  511. package/out/src/signer/methods/verifyUnlockScripts.js.map +1 -1
  512. package/out/src/storage/StorageIdb.d.ts +11 -3
  513. package/out/src/storage/StorageIdb.d.ts.map +1 -1
  514. package/out/src/storage/StorageIdb.js +134 -44
  515. package/out/src/storage/StorageIdb.js.map +1 -1
  516. package/out/src/storage/StorageKnex.d.ts +71 -7
  517. package/out/src/storage/StorageKnex.d.ts.map +1 -1
  518. package/out/src/storage/StorageKnex.js +616 -262
  519. package/out/src/storage/StorageKnex.js.map +1 -1
  520. package/out/src/storage/StorageProvider.d.ts +41 -10
  521. package/out/src/storage/StorageProvider.d.ts.map +1 -1
  522. package/out/src/storage/StorageProvider.js +397 -107
  523. package/out/src/storage/StorageProvider.js.map +1 -1
  524. package/out/src/storage/StorageReader.d.ts +9 -3
  525. package/out/src/storage/StorageReader.d.ts.map +1 -1
  526. package/out/src/storage/StorageReader.js +21 -43
  527. package/out/src/storage/StorageReader.js.map +1 -1
  528. package/out/src/storage/StorageReaderWriter.d.ts +4 -0
  529. package/out/src/storage/StorageReaderWriter.d.ts.map +1 -1
  530. package/out/src/storage/StorageReaderWriter.js +68 -38
  531. package/out/src/storage/StorageReaderWriter.js.map +1 -1
  532. package/out/src/storage/StorageSyncReader.d.ts +1 -1
  533. package/out/src/storage/StorageSyncReader.d.ts.map +1 -1
  534. package/out/src/storage/StorageSyncReader.js +3 -36
  535. package/out/src/storage/StorageSyncReader.js.map +1 -1
  536. package/out/src/storage/WalletStorageManager.d.ts +31 -6
  537. package/out/src/storage/WalletStorageManager.d.ts.map +1 -1
  538. package/out/src/storage/WalletStorageManager.js +166 -75
  539. package/out/src/storage/WalletStorageManager.js.map +1 -1
  540. package/out/src/storage/adminServer/adminServer.d.ts +3 -1
  541. package/out/src/storage/adminServer/adminServer.d.ts.map +1 -1
  542. package/out/src/storage/adminServer/adminServer.js +41 -90
  543. package/out/src/storage/adminServer/adminServer.js.map +1 -1
  544. package/out/src/storage/adminServer/adminUi.d.ts.map +1 -1
  545. package/out/src/storage/adminServer/adminUi.js +32 -9
  546. package/out/src/storage/adminServer/adminUi.js.map +1 -1
  547. package/out/src/storage/adminServer/reqReviewQuery.d.ts +41 -0
  548. package/out/src/storage/adminServer/reqReviewQuery.d.ts.map +1 -0
  549. package/out/src/storage/adminServer/reqReviewQuery.js +67 -0
  550. package/out/src/storage/adminServer/reqReviewQuery.js.map +1 -0
  551. package/out/src/storage/adminServer/reviewUtxos.d.ts +27 -0
  552. package/out/src/storage/adminServer/reviewUtxos.d.ts.map +1 -0
  553. package/out/src/storage/adminServer/reviewUtxos.js +62 -0
  554. package/out/src/storage/adminServer/reviewUtxos.js.map +1 -0
  555. package/out/src/storage/idbHelpers.d.ts.map +1 -1
  556. package/out/src/storage/idbHelpers.js +14 -2
  557. package/out/src/storage/idbHelpers.js.map +1 -1
  558. package/out/src/storage/index.all.d.ts +4 -0
  559. package/out/src/storage/index.all.d.ts.map +1 -1
  560. package/out/src/storage/index.all.js +4 -0
  561. package/out/src/storage/index.all.js.map +1 -1
  562. package/out/src/storage/index.client.d.ts +1 -0
  563. package/out/src/storage/index.client.d.ts.map +1 -1
  564. package/out/src/storage/index.client.js +1 -0
  565. package/out/src/storage/index.client.js.map +1 -1
  566. package/out/src/storage/index.mobile.d.ts +1 -0
  567. package/out/src/storage/index.mobile.d.ts.map +1 -1
  568. package/out/src/storage/index.mobile.js +1 -0
  569. package/out/src/storage/index.mobile.js.map +1 -1
  570. package/out/src/storage/knexPostgres.d.ts +16 -0
  571. package/out/src/storage/knexPostgres.d.ts.map +1 -0
  572. package/out/src/storage/knexPostgres.js +34 -0
  573. package/out/src/storage/knexPostgres.js.map +1 -0
  574. package/out/src/storage/methods/ListActionsSpecOp.d.ts +2 -2
  575. package/out/src/storage/methods/ListActionsSpecOp.d.ts.map +1 -1
  576. package/out/src/storage/methods/ListActionsSpecOp.js.map +1 -1
  577. package/out/src/storage/methods/ListOutputsSpecOp.d.ts +7 -4
  578. package/out/src/storage/methods/ListOutputsSpecOp.d.ts.map +1 -1
  579. package/out/src/storage/methods/ListOutputsSpecOp.js +5 -44
  580. package/out/src/storage/methods/ListOutputsSpecOp.js.map +1 -1
  581. package/out/src/storage/methods/actionBatch.d.ts +9 -2
  582. package/out/src/storage/methods/actionBatch.d.ts.map +1 -1
  583. package/out/src/storage/methods/actionBatch.js +260 -67
  584. package/out/src/storage/methods/actionBatch.js.map +1 -1
  585. package/out/src/storage/methods/actionBatchBlobs.d.ts +2 -0
  586. package/out/src/storage/methods/actionBatchBlobs.d.ts.map +1 -1
  587. package/out/src/storage/methods/actionBatchBlobs.js +47 -26
  588. package/out/src/storage/methods/actionBatchBlobs.js.map +1 -1
  589. package/out/src/storage/methods/actionBatchValidation.d.ts.map +1 -1
  590. package/out/src/storage/methods/actionBatchValidation.js +22 -30
  591. package/out/src/storage/methods/actionBatchValidation.js.map +1 -1
  592. package/out/src/storage/methods/attemptToPostReqsToNetwork.d.ts +7 -2
  593. package/out/src/storage/methods/attemptToPostReqsToNetwork.d.ts.map +1 -1
  594. package/out/src/storage/methods/attemptToPostReqsToNetwork.js +59 -110
  595. package/out/src/storage/methods/attemptToPostReqsToNetwork.js.map +1 -1
  596. package/out/src/storage/methods/availableManagedChange.d.ts +8 -1
  597. package/out/src/storage/methods/availableManagedChange.d.ts.map +1 -1
  598. package/out/src/storage/methods/availableManagedChange.js.map +1 -1
  599. package/out/src/storage/methods/createAction.d.ts +60 -3
  600. package/out/src/storage/methods/createAction.d.ts.map +1 -1
  601. package/out/src/storage/methods/createAction.js +390 -105
  602. package/out/src/storage/methods/createAction.js.map +1 -1
  603. package/out/src/storage/methods/generateChange.d.ts +15 -5
  604. package/out/src/storage/methods/generateChange.d.ts.map +1 -1
  605. package/out/src/storage/methods/generateChange.js +187 -27
  606. package/out/src/storage/methods/generateChange.js.map +1 -1
  607. package/out/src/storage/methods/getBeefForTransaction.js +5 -7
  608. package/out/src/storage/methods/getBeefForTransaction.js.map +1 -1
  609. package/out/src/storage/methods/getSyncChunk.d.ts.map +1 -1
  610. package/out/src/storage/methods/getSyncChunk.js +42 -11
  611. package/out/src/storage/methods/getSyncChunk.js.map +1 -1
  612. package/out/src/storage/methods/internalizeAction.d.ts +3 -3
  613. package/out/src/storage/methods/internalizeAction.d.ts.map +1 -1
  614. package/out/src/storage/methods/internalizeAction.js +171 -133
  615. package/out/src/storage/methods/internalizeAction.js.map +1 -1
  616. package/out/src/storage/methods/listActionsIdb.d.ts +3 -2
  617. package/out/src/storage/methods/listActionsIdb.d.ts.map +1 -1
  618. package/out/src/storage/methods/listActionsIdb.js +2 -2
  619. package/out/src/storage/methods/listActionsIdb.js.map +1 -1
  620. package/out/src/storage/methods/listActionsKnex.d.ts +3 -2
  621. package/out/src/storage/methods/listActionsKnex.d.ts.map +1 -1
  622. package/out/src/storage/methods/listActionsKnex.js +21 -11
  623. package/out/src/storage/methods/listActionsKnex.js.map +1 -1
  624. package/out/src/storage/methods/listCertificates.d.ts +3 -2
  625. package/out/src/storage/methods/listCertificates.d.ts.map +1 -1
  626. package/out/src/storage/methods/listCertificates.js.map +1 -1
  627. package/out/src/storage/methods/listOutputsIdb.d.ts +3 -2
  628. package/out/src/storage/methods/listOutputsIdb.d.ts.map +1 -1
  629. package/out/src/storage/methods/listOutputsIdb.js +25 -18
  630. package/out/src/storage/methods/listOutputsIdb.js.map +1 -1
  631. package/out/src/storage/methods/listOutputsKnex.d.ts +3 -2
  632. package/out/src/storage/methods/listOutputsKnex.d.ts.map +1 -1
  633. package/out/src/storage/methods/listOutputsKnex.js +31 -30
  634. package/out/src/storage/methods/listOutputsKnex.js.map +1 -1
  635. package/out/src/storage/methods/managedChangePolicy.d.ts +44 -0
  636. package/out/src/storage/methods/managedChangePolicy.d.ts.map +1 -0
  637. package/out/src/storage/methods/managedChangePolicy.js +58 -0
  638. package/out/src/storage/methods/managedChangePolicy.js.map +1 -0
  639. package/out/src/storage/methods/maxPossibleSatoshis.d.ts +13 -0
  640. package/out/src/storage/methods/maxPossibleSatoshis.d.ts.map +1 -0
  641. package/out/src/storage/methods/maxPossibleSatoshis.js +16 -0
  642. package/out/src/storage/methods/maxPossibleSatoshis.js.map +1 -0
  643. package/out/src/storage/methods/noSendExpiry.d.ts +11 -0
  644. package/out/src/storage/methods/noSendExpiry.d.ts.map +1 -0
  645. package/out/src/storage/methods/noSendExpiry.js +359 -0
  646. package/out/src/storage/methods/noSendExpiry.js.map +1 -0
  647. package/out/src/storage/methods/noSendExpiryLifecycle.d.ts +14 -0
  648. package/out/src/storage/methods/noSendExpiryLifecycle.d.ts.map +1 -0
  649. package/out/src/storage/methods/noSendExpiryLifecycle.js +691 -0
  650. package/out/src/storage/methods/noSendExpiryLifecycle.js.map +1 -0
  651. package/out/src/storage/methods/preparedBeef.d.ts +104 -0
  652. package/out/src/storage/methods/preparedBeef.d.ts.map +1 -0
  653. package/out/src/storage/methods/preparedBeef.js +524 -0
  654. package/out/src/storage/methods/preparedBeef.js.map +1 -0
  655. package/out/src/storage/methods/processAction.d.ts.map +1 -1
  656. package/out/src/storage/methods/processAction.js +144 -32
  657. package/out/src/storage/methods/processAction.js.map +1 -1
  658. package/out/src/storage/methods/purgeData.d.ts.map +1 -1
  659. package/out/src/storage/methods/purgeData.js +18 -3
  660. package/out/src/storage/methods/purgeData.js.map +1 -1
  661. package/out/src/storage/methods/reconcileFailedTransactionInputs.d.ts +32 -0
  662. package/out/src/storage/methods/reconcileFailedTransactionInputs.d.ts.map +1 -0
  663. package/out/src/storage/methods/reconcileFailedTransactionInputs.js +142 -0
  664. package/out/src/storage/methods/reconcileFailedTransactionInputs.js.map +1 -0
  665. package/out/src/storage/methods/reviewStatus.js +4 -4
  666. package/out/src/storage/methods/reviewStatus.js.map +1 -1
  667. package/out/src/storage/methods/reviewStatusIdb.d.ts +1 -1
  668. package/out/src/storage/methods/reviewStatusIdb.d.ts.map +1 -1
  669. package/out/src/storage/methods/reviewStatusIdb.js.map +1 -1
  670. package/out/src/storage/methods/reviewUtxoOutputs.d.ts +38 -0
  671. package/out/src/storage/methods/reviewUtxoOutputs.d.ts.map +1 -0
  672. package/out/src/storage/methods/reviewUtxoOutputs.js +197 -0
  673. package/out/src/storage/methods/reviewUtxoOutputs.js.map +1 -0
  674. package/out/src/storage/methods/validateSyncProof.d.ts +32 -0
  675. package/out/src/storage/methods/validateSyncProof.d.ts.map +1 -0
  676. package/out/src/storage/methods/validateSyncProof.js +139 -0
  677. package/out/src/storage/methods/validateSyncProof.js.map +1 -0
  678. package/out/src/storage/portable/index.d.ts.map +1 -1
  679. package/out/src/storage/portable/index.js +63 -27
  680. package/out/src/storage/portable/index.js.map +1 -1
  681. package/out/src/storage/remoting/BinaryJson.d.ts +11 -0
  682. package/out/src/storage/remoting/BinaryJson.d.ts.map +1 -1
  683. package/out/src/storage/remoting/BinaryJson.js +94 -8
  684. package/out/src/storage/remoting/BinaryJson.js.map +1 -1
  685. package/out/src/storage/remoting/KnexPaymentReplayStore.d.ts.map +1 -1
  686. package/out/src/storage/remoting/KnexPaymentReplayStore.js +1 -0
  687. package/out/src/storage/remoting/KnexPaymentReplayStore.js.map +1 -1
  688. package/out/src/storage/remoting/KnexSessionManager.d.ts +26 -2
  689. package/out/src/storage/remoting/KnexSessionManager.d.ts.map +1 -1
  690. package/out/src/storage/remoting/KnexSessionManager.js +221 -40
  691. package/out/src/storage/remoting/KnexSessionManager.js.map +1 -1
  692. package/out/src/storage/remoting/KnexSyncTransferStore.d.ts +26 -0
  693. package/out/src/storage/remoting/KnexSyncTransferStore.d.ts.map +1 -0
  694. package/out/src/storage/remoting/KnexSyncTransferStore.js +222 -0
  695. package/out/src/storage/remoting/KnexSyncTransferStore.js.map +1 -0
  696. package/out/src/storage/remoting/StorageClient.d.ts +6 -1
  697. package/out/src/storage/remoting/StorageClient.d.ts.map +1 -1
  698. package/out/src/storage/remoting/StorageClient.js +65 -8
  699. package/out/src/storage/remoting/StorageClient.js.map +1 -1
  700. package/out/src/storage/remoting/StorageClientBase.d.ts +57 -10
  701. package/out/src/storage/remoting/StorageClientBase.d.ts.map +1 -1
  702. package/out/src/storage/remoting/StorageClientBase.js +372 -9
  703. package/out/src/storage/remoting/StorageClientBase.js.map +1 -1
  704. package/out/src/storage/remoting/StorageMobile.d.ts +5 -0
  705. package/out/src/storage/remoting/StorageMobile.d.ts.map +1 -1
  706. package/out/src/storage/remoting/StorageMobile.js +13 -11
  707. package/out/src/storage/remoting/StorageMobile.js.map +1 -1
  708. package/out/src/storage/remoting/StorageServer.d.ts +27 -5
  709. package/out/src/storage/remoting/StorageServer.d.ts.map +1 -1
  710. package/out/src/storage/remoting/StorageServer.js +243 -33
  711. package/out/src/storage/remoting/StorageServer.js.map +1 -1
  712. package/out/src/storage/remoting/SyncTransfer.d.ts +29 -0
  713. package/out/src/storage/remoting/SyncTransfer.d.ts.map +1 -0
  714. package/out/src/storage/remoting/SyncTransfer.js +153 -0
  715. package/out/src/storage/remoting/SyncTransfer.js.map +1 -0
  716. package/out/src/storage/remoting/entityValidationHelpers.d.ts.map +1 -1
  717. package/out/src/storage/remoting/entityValidationHelpers.js +35 -0
  718. package/out/src/storage/remoting/entityValidationHelpers.js.map +1 -1
  719. package/out/src/storage/remoting/syncChunkBinary.d.ts +4 -0
  720. package/out/src/storage/remoting/syncChunkBinary.d.ts.map +1 -0
  721. package/out/src/storage/remoting/syncChunkBinary.js +38 -0
  722. package/out/src/storage/remoting/syncChunkBinary.js.map +1 -0
  723. package/out/src/storage/remoting/validateRpcSyncProofs.d.ts +5 -0
  724. package/out/src/storage/remoting/validateRpcSyncProofs.d.ts.map +1 -0
  725. package/out/src/storage/remoting/validateRpcSyncProofs.js +82 -0
  726. package/out/src/storage/remoting/validateRpcSyncProofs.js.map +1 -0
  727. package/out/src/storage/schema/KnexMigrations.d.ts +13 -2
  728. package/out/src/storage/schema/KnexMigrations.d.ts.map +1 -1
  729. package/out/src/storage/schema/KnexMigrations.js +334 -43
  730. package/out/src/storage/schema/KnexMigrations.js.map +1 -1
  731. package/out/src/storage/schema/StorageIdbSchema.d.ts +3 -0
  732. package/out/src/storage/schema/StorageIdbSchema.d.ts.map +1 -1
  733. package/out/src/storage/schema/entities/EntityOutput.d.ts.map +1 -1
  734. package/out/src/storage/schema/entities/EntityOutput.js +24 -4
  735. package/out/src/storage/schema/entities/EntityOutput.js.map +1 -1
  736. package/out/src/storage/schema/entities/EntityOutputBasket.d.ts.map +1 -1
  737. package/out/src/storage/schema/entities/EntityOutputBasket.js +5 -2
  738. package/out/src/storage/schema/entities/EntityOutputBasket.js.map +1 -1
  739. package/out/src/storage/schema/entities/EntityProvenTx.d.ts +4 -1
  740. package/out/src/storage/schema/entities/EntityProvenTx.d.ts.map +1 -1
  741. package/out/src/storage/schema/entities/EntityProvenTx.js +125 -41
  742. package/out/src/storage/schema/entities/EntityProvenTx.js.map +1 -1
  743. package/out/src/storage/schema/entities/EntityProvenTxReq.js +1 -1
  744. package/out/src/storage/schema/entities/EntityProvenTxReq.js.map +1 -1
  745. package/out/src/storage/schema/entities/EntitySyncState.d.ts +4 -2
  746. package/out/src/storage/schema/entities/EntitySyncState.d.ts.map +1 -1
  747. package/out/src/storage/schema/entities/EntitySyncState.js +12 -6
  748. package/out/src/storage/schema/entities/EntitySyncState.js.map +1 -1
  749. package/out/src/storage/schema/entities/EntityTransaction.d.ts +26 -0
  750. package/out/src/storage/schema/entities/EntityTransaction.d.ts.map +1 -1
  751. package/out/src/storage/schema/entities/EntityTransaction.js +221 -21
  752. package/out/src/storage/schema/entities/EntityTransaction.js.map +1 -1
  753. package/out/src/storage/schema/tables/TableCertificate.d.ts +1 -1
  754. package/out/src/storage/schema/tables/TableCertificate.d.ts.map +1 -1
  755. package/out/src/storage/schema/tables/TableCertificateField.d.ts +1 -1
  756. package/out/src/storage/schema/tables/TableCertificateField.d.ts.map +1 -1
  757. package/out/src/storage/schema/tables/TableCommission.d.ts +1 -1
  758. package/out/src/storage/schema/tables/TableCommission.d.ts.map +1 -1
  759. package/out/src/storage/schema/tables/TableMonitorEvent.d.ts +1 -1
  760. package/out/src/storage/schema/tables/TableMonitorEvent.d.ts.map +1 -1
  761. package/out/src/storage/schema/tables/TableOutput.d.ts +1 -1
  762. package/out/src/storage/schema/tables/TableOutput.d.ts.map +1 -1
  763. package/out/src/storage/schema/tables/TableOutputBasket.d.ts +1 -1
  764. package/out/src/storage/schema/tables/TableOutputBasket.d.ts.map +1 -1
  765. package/out/src/storage/schema/tables/TableOutputTag.d.ts +1 -1
  766. package/out/src/storage/schema/tables/TableOutputTag.d.ts.map +1 -1
  767. package/out/src/storage/schema/tables/TableOutputTagMap.d.ts +1 -1
  768. package/out/src/storage/schema/tables/TableOutputTagMap.d.ts.map +1 -1
  769. package/out/src/storage/schema/tables/TablePreparedBeef.interfaces.d.ts +23 -0
  770. package/out/src/storage/schema/tables/TablePreparedBeef.interfaces.d.ts.map +1 -0
  771. package/out/src/storage/schema/tables/TablePreparedBeef.interfaces.js +3 -0
  772. package/out/src/storage/schema/tables/TablePreparedBeef.interfaces.js.map +1 -0
  773. package/out/src/storage/schema/tables/TableProvenTx.d.ts +1 -1
  774. package/out/src/storage/schema/tables/TableProvenTx.d.ts.map +1 -1
  775. package/out/src/storage/schema/tables/TableProvenTxReq.d.ts +1 -1
  776. package/out/src/storage/schema/tables/TableProvenTxReq.d.ts.map +1 -1
  777. package/out/src/storage/schema/tables/TableSettings.d.ts +2 -2
  778. package/out/src/storage/schema/tables/TableSettings.d.ts.map +1 -1
  779. package/out/src/storage/schema/tables/TableSyncState.d.ts +1 -1
  780. package/out/src/storage/schema/tables/TableSyncState.d.ts.map +1 -1
  781. package/out/src/storage/schema/tables/TableTransaction.d.ts +17 -1
  782. package/out/src/storage/schema/tables/TableTransaction.d.ts.map +1 -1
  783. package/out/src/storage/schema/tables/TableTransaction.js +14 -1
  784. package/out/src/storage/schema/tables/TableTransaction.js.map +1 -1
  785. package/out/src/storage/schema/tables/TableTxLabel.d.ts +1 -1
  786. package/out/src/storage/schema/tables/TableTxLabel.d.ts.map +1 -1
  787. package/out/src/storage/schema/tables/TableTxLabelMap.d.ts +1 -1
  788. package/out/src/storage/schema/tables/TableTxLabelMap.d.ts.map +1 -1
  789. package/out/src/storage/schema/tables/TableUser.d.ts +1 -1
  790. package/out/src/storage/schema/tables/TableUser.d.ts.map +1 -1
  791. package/out/src/storage/sync/StorageMySQLDojoReader.d.ts.map +1 -1
  792. package/out/src/storage/sync/StorageMySQLDojoReader.js +8 -7
  793. package/out/src/storage/sync/StorageMySQLDojoReader.js.map +1 -1
  794. package/out/src/storage/sync/SyncPageBudget.d.ts +8 -0
  795. package/out/src/storage/sync/SyncPageBudget.d.ts.map +1 -0
  796. package/out/src/storage/sync/SyncPageBudget.js +24 -0
  797. package/out/src/storage/sync/SyncPageBudget.js.map +1 -0
  798. package/out/src/storage/sync/syncCheckpoint.d.ts +4 -0
  799. package/out/src/storage/sync/syncCheckpoint.d.ts.map +1 -0
  800. package/out/src/storage/sync/syncCheckpoint.js +49 -0
  801. package/out/src/storage/sync/syncCheckpoint.js.map +1 -0
  802. package/out/src/utility/Argon2idBackend.d.ts +36 -0
  803. package/out/src/utility/Argon2idBackend.d.ts.map +1 -0
  804. package/out/src/utility/Argon2idBackend.js +60 -0
  805. package/out/src/utility/Argon2idBackend.js.map +1 -0
  806. package/out/src/utility/actionBatchDigest.d.ts.map +1 -1
  807. package/out/src/utility/actionBatchDigest.js +9 -7
  808. package/out/src/utility/actionBatchDigest.js.map +1 -1
  809. package/out/src/utility/actionBatchPack.d.ts.map +1 -1
  810. package/out/src/utility/actionBatchPack.js +7 -12
  811. package/out/src/utility/actionBatchPack.js.map +1 -1
  812. package/out/src/utility/beefForTxids.d.ts +12 -3
  813. package/out/src/utility/beefForTxids.d.ts.map +1 -1
  814. package/out/src/utility/beefForTxids.js +69 -21
  815. package/out/src/utility/beefForTxids.js.map +1 -1
  816. package/out/src/utility/brc153ReferenceLabels.d.ts +16 -0
  817. package/out/src/utility/brc153ReferenceLabels.d.ts.map +1 -1
  818. package/out/src/utility/brc153ReferenceLabels.js +20 -5
  819. package/out/src/utility/brc153ReferenceLabels.js.map +1 -1
  820. package/out/src/utility/brc177NoSendExpiry.d.ts +34 -0
  821. package/out/src/utility/brc177NoSendExpiry.d.ts.map +1 -0
  822. package/out/src/utility/brc177NoSendExpiry.js +81 -0
  823. package/out/src/utility/brc177NoSendExpiry.js.map +1 -0
  824. package/out/src/utility/canonicalizeAtomicBeef.d.ts +12 -0
  825. package/out/src/utility/canonicalizeAtomicBeef.d.ts.map +1 -0
  826. package/out/src/utility/canonicalizeAtomicBeef.js +23 -0
  827. package/out/src/utility/canonicalizeAtomicBeef.js.map +1 -0
  828. package/out/src/utility/exactActionSpend.d.ts +9 -0
  829. package/out/src/utility/exactActionSpend.d.ts.map +1 -0
  830. package/out/src/utility/exactActionSpend.js +26 -0
  831. package/out/src/utility/exactActionSpend.js.map +1 -0
  832. package/out/src/utility/hashWasm.d.ts +1 -1
  833. package/out/src/utility/hashWasm.d.ts.map +1 -1
  834. package/out/src/utility/hashWasm.js +83 -1
  835. package/out/src/utility/hashWasm.js.map +1 -1
  836. package/out/src/utility/identityUtils.d.ts +44 -4
  837. package/out/src/utility/identityUtils.d.ts.map +1 -1
  838. package/out/src/utility/identityUtils.js +523 -61
  839. package/out/src/utility/identityUtils.js.map +1 -1
  840. package/out/src/utility/index.all.d.ts +2 -0
  841. package/out/src/utility/index.all.d.ts.map +1 -1
  842. package/out/src/utility/index.all.js +2 -0
  843. package/out/src/utility/index.all.js.map +1 -1
  844. package/out/src/utility/index.client.d.ts +2 -0
  845. package/out/src/utility/index.client.d.ts.map +1 -1
  846. package/out/src/utility/index.client.js +2 -0
  847. package/out/src/utility/index.client.js.map +1 -1
  848. package/out/src/utility/parseTxScriptOffsets.d.ts.map +1 -1
  849. package/out/src/utility/parseTxScriptOffsets.js +1 -19
  850. package/out/src/utility/parseTxScriptOffsets.js.map +1 -1
  851. package/out/src/utility/tscProofToMerklePath.d.ts.map +1 -1
  852. package/out/src/utility/tscProofToMerklePath.js +35 -4
  853. package/out/src/utility/tscProofToMerklePath.js.map +1 -1
  854. package/out/src/utility/utilityHelpers.d.ts +1 -1
  855. package/out/src/utility/utilityHelpers.d.ts.map +1 -1
  856. package/out/src/utility/utilityHelpers.js +10 -7
  857. package/out/src/utility/utilityHelpers.js.map +1 -1
  858. package/out/src/utility/utilityHelpers.noBuffer.d.ts.map +1 -1
  859. package/out/src/utility/utilityHelpers.noBuffer.js +6 -6
  860. package/out/src/utility/utilityHelpers.noBuffer.js.map +1 -1
  861. package/out/src/utility/verifyOverlayOutput.d.ts +12 -0
  862. package/out/src/utility/verifyOverlayOutput.d.ts.map +1 -0
  863. package/out/src/utility/verifyOverlayOutput.js +22 -0
  864. package/out/src/utility/verifyOverlayOutput.js.map +1 -0
  865. package/out/src/utility/walletResultGuards.d.ts +14 -0
  866. package/out/src/utility/walletResultGuards.d.ts.map +1 -0
  867. package/out/src/utility/walletResultGuards.js +28 -0
  868. package/out/src/utility/walletResultGuards.js.map +1 -0
  869. package/out/src/wab-client/WABClient.d.ts +4 -17
  870. package/out/src/wab-client/WABClient.d.ts.map +1 -1
  871. package/out/src/wab-client/WABClient.js +35 -12
  872. package/out/src/wab-client/WABClient.js.map +1 -1
  873. package/out/src/wab-client/WABResponseValidation.d.ts +48 -0
  874. package/out/src/wab-client/WABResponseValidation.d.ts.map +1 -0
  875. package/out/src/wab-client/WABResponseValidation.js +321 -0
  876. package/out/src/wab-client/WABResponseValidation.js.map +1 -0
  877. package/out/src/wab-client/WABTransport.d.ts +17 -23
  878. package/out/src/wab-client/WABTransport.d.ts.map +1 -1
  879. package/out/src/wab-client/WABTransport.js +130 -142
  880. package/out/src/wab-client/WABTransport.js.map +1 -1
  881. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.d.ts +8 -0
  882. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.d.ts.map +1 -1
  883. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.js +3 -2
  884. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.js.map +1 -1
  885. package/package.json +35 -30
  886. package/docs/open-rpc/index.html +0 -46
@@ -11,12 +11,18 @@ const reviewStatus_1 = require("./methods/reviewStatus");
11
11
  const WERR_errors_1 = require("../sdk/WERR_errors");
12
12
  const utilityHelpers_1 = require("../utility/utilityHelpers");
13
13
  const managedChange_1 = require("./methods/managedChange");
14
+ const preparedBeef_1 = require("./methods/preparedBeef");
15
+ const knexPostgres_1 = require("./knexPostgres");
14
16
  // Keep bulk statements below conservative SQLite/MySQL bind-parameter
15
17
  // ceilings. The surrounding transaction still makes a complete pack atomic.
16
18
  const ACTION_BATCH_BLOB_SQL_CHUNK = 500;
17
19
  const OUTPUT_INSERT_SQL_CHUNK = 500;
18
20
  class StorageKnex extends StorageProvider_1.StorageProvider {
19
21
  knex;
22
+ preparedBeefPolicy;
23
+ preparedBeefCoordinator;
24
+ preparedBeefReadSuspensions = new Set();
25
+ nextPreparedBeefReadSuspension = 0;
20
26
  querySpans = new Map();
21
27
  onQuery = (query) => {
22
28
  if (!this.telemetry.enabled || query.__knexQueryUid == null)
@@ -42,6 +48,9 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
42
48
  if (options.knex == null)
43
49
  throw new WERR_errors_1.WERR_INVALID_PARAMETER('options.knex', 'valid');
44
50
  this.knex = options.knex;
51
+ (0, knexPostgres_1.usePostgresInt8Numbers)(this.knex);
52
+ this.preparedBeefPolicy = (0, preparedBeef_1.validatePreparedBeefPolicy)(options.preparedBeef);
53
+ this.preparedBeefCoordinator = new preparedBeef_1.PreparedBeefCoordinator(this);
45
54
  if (this.telemetry.enabled) {
46
55
  this.knex.on('query', this.onQuery);
47
56
  this.knex.on('query-response', this.onQueryResponse);
@@ -67,10 +76,26 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
67
76
  this.querySpans.delete(query.__knexQueryUid);
68
77
  span.end(error == null ? {} : { status: 'error', error });
69
78
  }
70
- supportsActionBatchPersistence() { return true; }
71
- requiresActionBatchCleanupBeforeCreateAction() { return false; }
72
- async readSettings() {
73
- return this.validateEntity((0, utilityHelpers_1.verifyOne)(await this.toDb()('settings')));
79
+ supportsActionBatchPersistence() {
80
+ return true;
81
+ }
82
+ supportsNoSendExpiryPersistence() {
83
+ return true;
84
+ }
85
+ requiresActionBatchCleanupBeforeCreateAction() {
86
+ return false;
87
+ }
88
+ async makeAvailable() {
89
+ const settings = await super.makeAvailable();
90
+ this.startPreparedBeefBackfill();
91
+ return settings;
92
+ }
93
+ setServices(services) {
94
+ super.setServices(services);
95
+ this.startPreparedBeefBackfill();
96
+ }
97
+ async readSettings(trx) {
98
+ return this.validateEntity((0, utilityHelpers_1.verifyOne)(await this.toDb(trx)('settings')));
74
99
  }
75
100
  async getProvenOrRawTx(txid, trx) {
76
101
  const k = this.toDb(trx);
@@ -87,7 +112,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
87
112
  .select('rawTx', 'inputBEEF'));
88
113
  if (reqRawTx != null) {
89
114
  r.rawTx = Array.from(reqRawTx.rawTx);
90
- r.inputBEEF = Array.from(reqRawTx.inputBEEF);
115
+ r.inputBEEF = reqRawTx.inputBEEF == null ? undefined : Array.from(reqRawTx.inputBEEF);
91
116
  }
92
117
  }
93
118
  return r;
@@ -124,33 +149,234 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
124
149
  }
125
150
  return results;
126
151
  }
127
- dbTypeSubstring(source, fromOffset, forLength) {
128
- if (this.dbtype === 'MySQL')
129
- return `substring(${source} from ${fromOffset} for ${String(forLength)})`;
130
- return `substr(${source}, ${fromOffset}, ${String(forLength)})`;
152
+ async findPreparedBeefs(userId, rootTxids, trx) {
153
+ const unique = [...new Set(rootTxids)];
154
+ if (unique.length === 0)
155
+ return [];
156
+ let query = this.toDb(trx)('prepared_beefs')
157
+ .where({ userId, state: 'ready', formatVersion: preparedBeef_1.PREPARED_BEEF_FORMAT_VERSION })
158
+ .whereIn('rootTxid', unique);
159
+ // Enforce the per-row byte limit in SQL so a corrupt metadata value cannot
160
+ // make Knex transfer an oversized blob before JavaScript validates it.
161
+ query = query.whereRaw('length(??) <= ?', ['beef', this.preparedBeefPolicy.maxArtifactBytes]);
162
+ const rows = await query;
163
+ return this.validateEntities(rows);
164
+ }
165
+ /**
166
+ * Metadata-only foreground preflight for fragmented actions. SQL computes
167
+ * the actual blob lengths; BEEF bytes are not transferred to the process.
168
+ */
169
+ async readPreparedBeefLookupByteLength(userId, rootTxids) {
170
+ const unique = [...new Set(rootTxids)];
171
+ if (unique.length === 0)
172
+ return 0;
173
+ const row = (await this.knex('prepared_beefs')
174
+ .where({ userId, state: 'ready', formatVersion: preparedBeef_1.PREPARED_BEEF_FORMAT_VERSION })
175
+ .whereIn('rootTxid', unique)
176
+ .first({ byteLength: this.knex.raw('coalesce(sum(length(??)), 0)', ['beef']) }));
177
+ return Number(row?.byteLength ?? 0);
178
+ }
179
+ async readPreparedBeefProofEpoch(trx) {
180
+ const row = await this.toDb(trx)('prepared_beef_metadata')
181
+ .where({ preparedBeefMetadataId: 1 })
182
+ .first('proofEpoch');
183
+ if (row == null || !Number.isSafeInteger(Number(row.proofEpoch))) {
184
+ throw new WERR_errors_1.WERR_INTERNAL('prepared BEEF proof epoch is unavailable');
185
+ }
186
+ return Number(row.proofEpoch);
187
+ }
188
+ /**
189
+ * Cheap worker preflight. It prevents a large tenant-controlled no-send BEEF
190
+ * from being loaded and parsed merely to discover that COOK will reject it.
191
+ */
192
+ async readPreparedBeefSourceByteLength(rootTxid) {
193
+ const byteLength = (...columns) => this.knex.raw(columns.map(() => 'coalesce(length(??), 0)').join(' + '), columns);
194
+ const proven = (await this.knex('proven_txs')
195
+ .where({ txid: rootTxid })
196
+ .first({ byteLength: byteLength('rawTx', 'merklePath') }));
197
+ if (proven != null)
198
+ return Number(proven.byteLength);
199
+ const request = (await this.knex('proven_tx_reqs')
200
+ .where({ txid: rootTxid })
201
+ .whereIn('status', ['unsent', 'unmined', 'unconfirmed', 'sending', 'nosend', 'completed'])
202
+ .first({ byteLength: byteLength('rawTx', 'inputBEEF') }));
203
+ return request == null ? undefined : Number(request.byteLength);
204
+ }
205
+ async upsertPreparedBeef(artifact, expectedProofEpoch) {
206
+ return await this.transaction(async (trx) => {
207
+ let epochQuery = this.toDb(trx)('prepared_beef_metadata').where({
208
+ preparedBeefMetadataId: 1
209
+ });
210
+ // Serialize a worker commit with proof invalidation across MySQL and
211
+ // Postgres server processes. SQLite serializes the subsequent write transaction.
212
+ if (this.dbtype === 'MySQL' || this.dbtype === 'Postgres')
213
+ epochQuery = epochQuery.forUpdate();
214
+ const metadata = await epochQuery.first('proofEpoch');
215
+ if (metadata == null || Number(metadata.proofEpoch) !== expectedProofEpoch)
216
+ return false;
217
+ const row = await this.validateEntityForInsert(artifact, trx);
218
+ if (row.preparedBeefId === 0)
219
+ delete row.preparedBeefId;
220
+ const update = {
221
+ beef: row.beef,
222
+ checksum: row.checksum,
223
+ formatVersion: row.formatVersion,
224
+ state: row.state,
225
+ txCount: row.txCount,
226
+ bumpCount: row.bumpCount,
227
+ byteLength: row.byteLength,
228
+ updated_at: row.updated_at
229
+ };
230
+ await this.toDb(trx)('prepared_beefs')
231
+ .insert(row)
232
+ .onConflict(['userId', 'rootTxid'])
233
+ .merge(update);
234
+ return true;
235
+ });
236
+ }
237
+ async findPreparedBeefBackfillRoots(limit, formatVersion) {
238
+ const rows = (await this.knex('outputs as o')
239
+ .join('transactions as t', function () {
240
+ this.on('t.transactionId', '=', 'o.transactionId').andOn('t.userId', '=', 'o.userId');
241
+ })
242
+ .leftJoin('prepared_beefs as pb', function () {
243
+ this.on('pb.userId', '=', 'o.userId')
244
+ .andOn('pb.rootTxid', '=', 'o.txid')
245
+ .andOnVal('pb.formatVersion', '=', formatVersion);
246
+ })
247
+ .where('o.spendable', true)
248
+ .whereNull('o.spentBy')
249
+ .where('o.change', true)
250
+ .where('o.providedBy', 'storage')
251
+ .where('o.purpose', 'change')
252
+ .where('o.type', 'P2PKH')
253
+ .whereNotNull('o.derivationPrefix')
254
+ .whereNotNull('o.derivationSuffix')
255
+ .whereNotNull('o.txid')
256
+ // Backfill only settled roots. Pending roots receive one organic
257
+ // processAction attempt and can be retried after a canonical read; a
258
+ // perpetual backfill loop must not poll an unconfirmed ancestry chain.
259
+ .where('t.status', 'completed')
260
+ .whereNotNull('t.provenTxId')
261
+ .whereNull('pb.preparedBeefId')
262
+ .select('o.userId', 'o.txid as rootTxid')
263
+ .groupBy('o.userId', 'o.txid')
264
+ .orderByRaw('MIN(??)', ['o.outputId'])
265
+ .limit(limit));
266
+ return rows;
267
+ }
268
+ async invalidatePreparedBeefs(trx) {
269
+ if (trx == null) {
270
+ return await this.transaction(async (transaction) => await this.invalidatePreparedBeefs(transaction));
271
+ }
272
+ const metadataUpdates = await this.toDb(trx)('prepared_beef_metadata')
273
+ .where({ preparedBeefMetadataId: 1 })
274
+ .increment('proofEpoch', 1);
275
+ if (metadataUpdates !== 1)
276
+ throw new WERR_errors_1.WERR_INTERNAL('prepared BEEF proof epoch update failed');
277
+ return await this.toDb(trx)('prepared_beefs')
278
+ .where({ state: 'ready' })
279
+ .update(this.validatePartialForUpdate({
280
+ state: 'stale',
281
+ // A later backfill pass must not mistake an invalidated current-format
282
+ // row for a completed artifact.
283
+ formatVersion: 0
284
+ }));
131
285
  }
132
- normaliseKnexRawResult(rs) {
133
- if (this.dbtype === 'MySQL')
134
- return rs[0];
135
- return rs;
286
+ async lookupPreparedBeefs(userId, rootTxids, parent) {
287
+ return await (0, preparedBeef_1.lookupPreparedBeefs)(this, userId, rootTxids, parent);
136
288
  }
137
- async getRawTxSlice(txid, offset, length, trx) {
138
- const sub = this.dbTypeSubstring('rawTx', offset + 1, length);
139
- let rs = await this.toDb(trx).raw(`select ${sub} as rawTx from proven_txs where txid = '${txid}'`);
140
- const proven = (0, utilityHelpers_1.verifyOneOrNone)(this.normaliseKnexRawResult(rs));
289
+ preparedBeefReadsEnabled() {
290
+ return this.preparedBeefPolicy.readEnabled && this.preparedBeefReadSuspensions.size === 0;
291
+ }
292
+ /**
293
+ * Synchronously close the local prepared-read gate before asynchronous reorg
294
+ * invalidation waits for manager/database locks. The returned release is
295
+ * idempotent; callers release it only after invalidation commits.
296
+ */
297
+ suspendPreparedBeefReads() {
298
+ const suspension = ++this.nextPreparedBeefReadSuspension;
299
+ this.preparedBeefReadSuspensions.add(suspension);
300
+ let released = false;
301
+ return () => {
302
+ if (released)
303
+ return;
304
+ released = true;
305
+ // This committed invalidation covers every reorg observed before it,
306
+ // including an earlier failed attempt. Do not clear a newer suspension
307
+ // whose database invalidation may still be pending.
308
+ for (const pending of this.preparedBeefReadSuspensions) {
309
+ if (pending <= suspension)
310
+ this.preparedBeefReadSuspensions.delete(pending);
311
+ }
312
+ };
313
+ }
314
+ preparedBeefWritesEnabled() {
315
+ return this.preparedBeefPolicy.writeEnabled;
316
+ }
317
+ /** Queue best-effort preparation after foreground action work has completed. */
318
+ enqueuePreparedBeef(preparation) {
319
+ return this.preparedBeefCoordinator.enqueue(preparation);
320
+ }
321
+ /** Start the optional, rate-limited existing-wallet backfill. */
322
+ startPreparedBeefBackfill() {
323
+ if (!this.isAvailable() || this._services == null)
324
+ return;
325
+ this.preparedBeefCoordinator.startBackfill();
326
+ }
327
+ /** Test/operator hook for waiting until currently queued work is complete. */
328
+ async waitForPreparedBeefTasks() {
329
+ await this.preparedBeefCoordinator.waitForIdle();
330
+ }
331
+ /** Stop accepting background work and settle an active preparation before shutdown. */
332
+ async stopPreparedBeefTasks() {
333
+ await this.preparedBeefCoordinator.stop();
334
+ }
335
+ rawTxSliceExpression(offset, length, dbtype) {
336
+ const sql = dbtype === 'MySQL' ? 'substring(?? from ? for ?)' : 'substr(??, ?, ?)';
337
+ return this.knex.raw(sql, ['rawTx', offset + 1, length]);
338
+ }
339
+ async getRawTxSlice(txid, offset, length, dbtype, trx) {
340
+ const k = this.toDb(trx);
341
+ const slice = this.rawTxSliceExpression(offset, length, dbtype);
342
+ const proven = (0, utilityHelpers_1.verifyOneOrNone)(await k('proven_txs').select({ rawTx: slice }).where({ txid }));
141
343
  if (proven?.rawTx != null)
142
344
  return Array.from(proven.rawTx);
143
- rs = await this.toDb(trx).raw(`select ${sub} as rawTx from proven_tx_reqs where txid = '${txid}' and status in ('unsent', 'nosend', 'sending', 'unmined', 'completed', 'unfail')`);
144
- const req = (0, utilityHelpers_1.verifyOneOrNone)(this.normaliseKnexRawResult(rs));
345
+ const req = (0, utilityHelpers_1.verifyOneOrNone)(await k('proven_tx_reqs')
346
+ .select({ rawTx: slice })
347
+ .where({ txid })
348
+ .whereIn('status', ['unsent', 'nosend', 'sending', 'unmined', 'completed', 'unfail']));
145
349
  return req?.rawTx != null ? Array.from(req.rawTx) : undefined;
146
350
  }
147
351
  async getRawTxOfKnownValidTransaction(txid, offset, length, trx) {
148
352
  if (txid == null || txid === '')
149
353
  return undefined;
150
- if (!this.isAvailable())
151
- await this.makeAvailable();
152
- if (Number.isInteger(offset) && Number.isInteger(length)) {
153
- return await this.getRawTxSlice(txid, offset, length, trx);
354
+ const hasOffset = offset !== undefined;
355
+ const hasLength = length !== undefined;
356
+ if (hasOffset !== hasLength) {
357
+ throw new WERR_errors_1.WERR_INVALID_PARAMETER('offset and length', 'both defined or both undefined');
358
+ }
359
+ if (hasOffset &&
360
+ (!/^[0-9a-f]{64}$/i.test(txid) ||
361
+ !Number.isSafeInteger(offset) ||
362
+ !Number.isSafeInteger(length) ||
363
+ offset < 0 ||
364
+ length < 0 ||
365
+ !Number.isSafeInteger(offset + length))) {
366
+ throw new WERR_errors_1.WERR_INVALID_PARAMETER('txid, offset and length', 'a hexadecimal transaction id and non-negative safe slice integers with a safe sum');
367
+ }
368
+ // A cold caller may already own SQLite's only connection. Read settings
369
+ // through that transaction without caching uncommitted state or starting
370
+ // the background backfill before the caller commits.
371
+ let settings;
372
+ if (this.isAvailable())
373
+ settings = this.getSettings();
374
+ else if (trx != null)
375
+ settings = await this.readSettings(trx);
376
+ else
377
+ settings = await this.makeAvailable();
378
+ if (hasOffset) {
379
+ return await this.getRawTxSlice(txid, offset, length, settings.dbtype, trx);
154
380
  }
155
381
  const r = await this.getProvenOrRawTx(txid, trx);
156
382
  return r.proven != null ? r.proven.rawTx : r.rawTx;
@@ -161,9 +387,15 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
161
387
  void this.whereExists(k
162
388
  .select('*')
163
389
  .from('transactions')
164
- .whereRaw(`proven_txs.provenTxId = transactions.provenTxId and transactions.userId = ${args.userId}`));
390
+ .whereRaw('?? = ?? and ?? = ?', [
391
+ 'proven_txs.provenTxId',
392
+ 'transactions.provenTxId',
393
+ 'transactions.userId',
394
+ args.userId
395
+ ]));
165
396
  });
166
397
  if (args.paged != null) {
398
+ q = q.orderBy(pagingOrder('proven_txs'));
167
399
  q = q.limit(args.paged.limit);
168
400
  q = q.offset(args.paged.offset ?? 0);
169
401
  }
@@ -182,9 +414,10 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
182
414
  void this.whereExists(k
183
415
  .select('*')
184
416
  .from('transactions')
185
- .whereRaw(`proven_tx_reqs.txid = transactions.txid and transactions.userId = ${args.userId}`));
417
+ .whereRaw('proven_tx_reqs.txid = transactions.txid and ?? = ?', ['transactions.userId', args.userId]));
186
418
  });
187
419
  if (args.paged != null) {
420
+ q = q.orderBy(pagingOrder('proven_tx_reqs'));
188
421
  q = q.limit(args.paged.limit);
189
422
  q = q.offset(args.paged.offset ?? 0);
190
423
  }
@@ -202,10 +435,16 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
202
435
  let q = k('tx_labels_map').whereExists(k
203
436
  .select('*')
204
437
  .from('tx_labels')
205
- .whereRaw(`tx_labels.txLabelId = tx_labels_map.txLabelId and tx_labels.userId = ${args.userId}`));
438
+ .whereRaw('?? = ?? and ?? = ?', [
439
+ 'tx_labels.txLabelId',
440
+ 'tx_labels_map.txLabelId',
441
+ 'tx_labels.userId',
442
+ args.userId
443
+ ]));
206
444
  if (args.since != null)
207
445
  q = q.where('updated_at', '>=', this.validateDateForWhere(args.since));
208
446
  if (args.paged != null) {
447
+ q = q.orderBy(pagingOrder('tx_labels_map'));
209
448
  q = q.limit(args.paged.limit);
210
449
  q = q.offset(args.paged.offset ?? 0);
211
450
  }
@@ -221,10 +460,16 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
221
460
  let q = k('output_tags_map').whereExists(k
222
461
  .select('*')
223
462
  .from('output_tags')
224
- .whereRaw(`output_tags.outputTagId = output_tags_map.outputTagId and output_tags.userId = ${args.userId}`));
463
+ .whereRaw('?? = ?? and ?? = ?', [
464
+ 'output_tags.outputTagId',
465
+ 'output_tags_map.outputTagId',
466
+ 'output_tags.userId',
467
+ args.userId
468
+ ]));
225
469
  if (args.since != null)
226
470
  q = q.where('updated_at', '>=', this.validateDateForWhere(args.since));
227
471
  if (args.paged != null) {
472
+ q = q.orderBy(pagingOrder('output_tags_map'));
228
473
  q = q.limit(args.paged.limit);
229
474
  q = q.offset(args.paged.offset ?? 0);
230
475
  }
@@ -235,6 +480,45 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
235
480
  const rs = await q;
236
481
  return this.validateEntities(rs, undefined, ['isDeleted']);
237
482
  }
483
+ async countSyncQuery(query) {
484
+ const row = await query.count({ count: '*' }).first();
485
+ return Number(row?.count ?? 0);
486
+ }
487
+ async getSyncChunkTotals(args, userId) {
488
+ const since = args.since;
489
+ const [provenTxs, outputBaskets, outputTags, txLabels, transactions, outputs, txLabelMaps, outputTagMaps, certificates, certificateFields, commissions, provenTxReqs] = await Promise.all([
490
+ this.countSyncQuery(this.getProvenTxsForUserQuery({ userId, since })),
491
+ this.countOutputBaskets({ partial: { userId }, since }),
492
+ this.countOutputTags({ partial: { userId }, since }),
493
+ this.countTxLabels({ partial: { userId }, since }),
494
+ this.countTransactions({ partial: { userId }, since, noRawTx: true }),
495
+ this.countOutputs({ partial: { userId }, since, noScript: true }),
496
+ this.countSyncQuery(this.getTxLabelMapsForUserQuery({ userId, since })),
497
+ this.countSyncQuery(this.getOutputTagMapsForUserQuery({ userId, since })),
498
+ this.countCertificates({ partial: { userId }, since }),
499
+ this.countCertificateFields({ partial: { userId }, since }),
500
+ this.countCommissions({ partial: { userId }, since }),
501
+ this.countSyncQuery(this.getProvenTxReqsForUserQuery({ userId, since }))
502
+ ]);
503
+ const records = {
504
+ provenTxs,
505
+ outputBaskets,
506
+ outputTags,
507
+ txLabels,
508
+ transactions,
509
+ outputs,
510
+ txLabelMaps,
511
+ outputTagMaps,
512
+ certificates,
513
+ certificateFields,
514
+ commissions,
515
+ provenTxReqs
516
+ };
517
+ return {
518
+ totalRecords: Object.values(records).reduce((total, count) => total + count, 0),
519
+ records
520
+ };
521
+ }
238
522
  async listActions(auth, vargs) {
239
523
  if (auth.userId == null)
240
524
  throw new WERR_errors_1.WERR_UNAUTHORIZED();
@@ -245,11 +529,40 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
245
529
  throw new WERR_errors_1.WERR_UNAUTHORIZED();
246
530
  return await (0, listOutputsKnex_1.listOutputs)(this, auth, vargs);
247
531
  }
532
+ /**
533
+ * Insert one row and return its auto-increment primary key. MySQL and SQLite
534
+ * report the id as the insert result; Postgres requires a RETURNING clause.
535
+ *
536
+ * `recoverable` marks inserts that the findOrInsert helpers retry as a find
537
+ * after a duplicate-key error, in the same transaction; see `inSavepoint`.
538
+ */
539
+ async insertReturningId(table, idColumn, row, trx, recoverable = false) {
540
+ if (this.dbtype !== 'Postgres') {
541
+ const [id] = await this.toDb(trx)(table).insert(row);
542
+ return id;
543
+ }
544
+ const insert = async (db) => {
545
+ const [r] = await db(table).insert(row).returning(idColumn);
546
+ return r[idColumn];
547
+ };
548
+ return recoverable ? await this.inSavepoint(trx, insert) : await insert(this.toDb(trx));
549
+ }
550
+ /**
551
+ * The findOrInsert helpers catch a failed insert and find the row again in
552
+ * the same transaction. MySQL and SQLite allow that. Postgres aborts the
553
+ * whole transaction on any statement error, so there the insert runs in a
554
+ * savepoint that is rolled back on its own.
555
+ */
556
+ async inSavepoint(trx, run) {
557
+ if (trx == null || this.dbtype !== 'Postgres')
558
+ return await run(this.toDb(trx));
559
+ return await trx.transaction(async (savepoint) => await run(savepoint));
560
+ }
248
561
  async insertProvenTx(tx, trx) {
249
562
  const e = await this.validateEntityForInsert(tx, trx);
250
563
  if (e.provenTxId === 0)
251
564
  delete e.provenTxId;
252
- const [id] = await this.toDb(trx)('proven_txs').insert(e);
565
+ const id = await this.insertReturningId('proven_txs', 'provenTxId', e, trx, true);
253
566
  tx.provenTxId = id;
254
567
  return tx.provenTxId;
255
568
  }
@@ -257,7 +570,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
257
570
  const e = await this.validateEntityForInsert(batch, trx, ['expiresAt', 'hardExpiresAt']);
258
571
  if (e.actionBatchId === 0)
259
572
  delete e.actionBatchId;
260
- const [id] = await this.toDb(trx)('action_batches').insert(e);
573
+ const id = await this.insertReturningId('action_batches', 'actionBatchId', e, trx);
261
574
  batch.actionBatchId = id;
262
575
  return id;
263
576
  }
@@ -266,10 +579,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
266
579
  return row == null ? undefined : this.validateEntity(row, ['expiresAt', 'hardExpiresAt']);
267
580
  }
268
581
  async findActionBatchForUpdate(userId, batchId, trx) {
269
- const row = await this.toDb(trx)('action_batches')
270
- .where({ userId, batchId })
271
- .forUpdate()
272
- .first();
582
+ const row = await this.toDb(trx)('action_batches').where({ userId, batchId }).forUpdate().first();
273
583
  return row == null ? undefined : this.validateEntity(row, ['expiresAt', 'hardExpiresAt']);
274
584
  }
275
585
  async findExpiredActionBatches(now, trx) {
@@ -345,9 +655,9 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
345
655
  const rows = [];
346
656
  const uniqueDigests = [...new Set(digests)];
347
657
  for (let offset = 0; offset < uniqueDigests.length; offset += ACTION_BATCH_BLOB_SQL_CHUNK) {
348
- rows.push(...await this.toDb(trx)('action_batch_blobs')
658
+ rows.push(...(await this.toDb(trx)('action_batch_blobs')
349
659
  .where({ actionBatchId })
350
- .whereIn('digest', uniqueDigests.slice(offset, offset + ACTION_BATCH_BLOB_SQL_CHUNK)));
660
+ .whereIn('digest', uniqueDigests.slice(offset, offset + ACTION_BATCH_BLOB_SQL_CHUNK))));
351
661
  }
352
662
  for (const row of rows) {
353
663
  if (Buffer.isBuffer(row.bytes)) {
@@ -380,7 +690,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
380
690
  const e = await this.validateEntityForInsert(tx, trx);
381
691
  if (e.provenTxReqId === 0)
382
692
  delete e.provenTxReqId;
383
- const [id] = await this.toDb(trx)('proven_tx_reqs').insert(e);
693
+ const id = await this.insertReturningId('proven_tx_reqs', 'provenTxReqId', e, trx, true);
384
694
  tx.provenTxReqId = id;
385
695
  return tx.provenTxReqId;
386
696
  }
@@ -388,12 +698,13 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
388
698
  const e = await this.validateEntityForInsert(user, trx);
389
699
  if (e.userId === 0)
390
700
  delete e.userId;
391
- const [id] = await this.toDb(trx)('users').insert(e);
701
+ const id = await this.insertReturningId('users', 'userId', e, trx);
392
702
  user.userId = id;
393
703
  return user.userId;
394
704
  }
395
705
  async insertCertificateAuth(auth, certificate) {
396
- if (auth.userId == null || (certificate.userId != null && certificate.userId !== 0 && certificate.userId !== auth.userId))
706
+ if (auth.userId == null ||
707
+ (certificate.userId != null && certificate.userId !== 0 && certificate.userId !== auth.userId))
397
708
  throw new WERR_errors_1.WERR_UNAUTHORIZED();
398
709
  certificate.userId = auth.userId;
399
710
  return await this.insertCertificate(certificate);
@@ -407,7 +718,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
407
718
  const fields = e.fields;
408
719
  if (e.fields != null)
409
720
  delete e.fields;
410
- const [id] = await this.toDb(trx)('certificates').insert(e);
721
+ const id = await this.insertReturningId('certificates', 'certificateId', e, trx);
411
722
  certificate.certificateId = id;
412
723
  if (fields != null) {
413
724
  for (const field of fields) {
@@ -426,7 +737,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
426
737
  const e = await this.validateEntityForInsert(basket, trx, undefined, ['isDeleted']);
427
738
  if (e.basketId === 0)
428
739
  delete e.basketId;
429
- const [id] = await this.toDb(trx)('output_baskets').insert(e);
740
+ const id = await this.insertReturningId('output_baskets', 'basketId', e, trx, true);
430
741
  basket.basketId = id;
431
742
  return basket.basketId;
432
743
  }
@@ -434,7 +745,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
434
745
  const e = await this.validateEntityForInsert(tx, trx);
435
746
  if (e.transactionId === 0)
436
747
  delete e.transactionId;
437
- const [id] = await this.toDb(trx)('transactions').insert(e);
748
+ const id = await this.insertReturningId('transactions', 'transactionId', e, trx, true);
438
749
  tx.transactionId = id;
439
750
  return tx.transactionId;
440
751
  }
@@ -442,7 +753,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
442
753
  const e = await this.validateEntityForInsert(commission, trx);
443
754
  if (e.commissionId === 0)
444
755
  delete e.commissionId;
445
- const [id] = await this.toDb(trx)('commissions').insert(e);
756
+ const id = await this.insertReturningId('commissions', 'commissionId', e, trx);
446
757
  commission.commissionId = id;
447
758
  return commission.commissionId;
448
759
  }
@@ -450,7 +761,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
450
761
  const e = await this.validateEntityForInsert(output, trx);
451
762
  if (e.outputId === 0)
452
763
  delete e.outputId;
453
- const [id] = await this.toDb(trx)('outputs').insert(e);
764
+ const id = await this.insertReturningId('outputs', 'outputId', e, trx);
454
765
  output.outputId = id;
455
766
  return output.outputId;
456
767
  }
@@ -471,31 +782,31 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
471
782
  const e = await this.validateEntityForInsert(tag, trx, undefined, ['isDeleted']);
472
783
  if (e.outputTagId === 0)
473
784
  delete e.outputTagId;
474
- const [id] = await this.toDb(trx)('output_tags').insert(e);
785
+ const id = await this.insertReturningId('output_tags', 'outputTagId', e, trx, true);
475
786
  tag.outputTagId = id;
476
787
  return tag.outputTagId;
477
788
  }
478
789
  async insertOutputTagMap(tagMap, trx) {
479
790
  const e = await this.validateEntityForInsert(tagMap, trx, undefined, ['isDeleted']);
480
- await this.toDb(trx)('output_tags_map').insert(e);
791
+ await this.inSavepoint(trx, async (db) => await db('output_tags_map').insert(e));
481
792
  }
482
793
  async insertTxLabel(label, trx) {
483
794
  const e = await this.validateEntityForInsert(label, trx, undefined, ['isDeleted']);
484
795
  if (e.txLabelId === 0)
485
796
  delete e.txLabelId;
486
- const [id] = await this.toDb(trx)('tx_labels').insert(e);
797
+ const id = await this.insertReturningId('tx_labels', 'txLabelId', e, trx, true);
487
798
  label.txLabelId = id;
488
799
  return label.txLabelId;
489
800
  }
490
801
  async insertTxLabelMap(labelMap, trx) {
491
802
  const e = await this.validateEntityForInsert(labelMap, trx, undefined, ['isDeleted']);
492
- await this.toDb(trx)('tx_labels_map').insert(e);
803
+ await this.inSavepoint(trx, async (db) => await db('tx_labels_map').insert(e));
493
804
  }
494
805
  async insertMonitorEvent(event, trx) {
495
806
  const e = await this.validateEntityForInsert(event, trx);
496
807
  if (e.id === 0)
497
808
  delete e.id;
498
- const [id] = await this.toDb(trx)('monitor_events').insert(e);
809
+ const id = await this.insertReturningId('monitor_events', 'id', e, trx);
499
810
  event.id = id;
500
811
  return event.id;
501
812
  }
@@ -503,7 +814,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
503
814
  const e = await this.validateEntityForInsert(syncState, trx, ['when'], ['init']);
504
815
  if (e.syncStateId === 0)
505
816
  delete e.syncStateId;
506
- const [id] = await this.toDb(trx)('sync_states').insert(e);
817
+ const id = await this.insertReturningId('sync_states', 'syncStateId', e, trx);
507
818
  syncState.syncStateId = id;
508
819
  return syncState.syncStateId;
509
820
  }
@@ -597,6 +908,13 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
597
908
  }
598
909
  return r;
599
910
  }
911
+ async compareAndSetNoSendExpiryState(transactionId, expected, next, trx) {
912
+ await this.verifyReadyForDatabaseAccess(trx);
913
+ const updated = await this.toDb(trx)('transactions')
914
+ .where({ transactionId, noSendExpiryState: expected })
915
+ .update(this.validatePartialForUpdate({ noSendExpiryState: next }));
916
+ return updated === 1;
917
+ }
600
918
  async updateTxLabelMap(transactionId, txLabelId, update, trx) {
601
919
  await this.verifyReadyForDatabaseAccess(trx);
602
920
  return await this.toDb(trx)('tx_labels_map')
@@ -672,6 +990,8 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
672
990
  }
673
991
  }
674
992
  if (args.paged != null) {
993
+ if (args.orderDescending !== true)
994
+ void q.orderBy(pagingOrder(table));
675
995
  void q.limit(args.paged.limit);
676
996
  void q.offset(args.paged.offset ?? 0);
677
997
  }
@@ -682,9 +1002,9 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
682
1002
  }
683
1003
  findCertificatesQuery(args) {
684
1004
  const q = this.setupQuery('certificates', args);
685
- if ((args.certifiers != null) && args.certifiers.length > 0)
1005
+ if (args.certifiers != null && args.certifiers.length > 0)
686
1006
  void q.whereIn('certifier', args.certifiers);
687
- if ((args.types != null) && args.types.length > 0)
1007
+ if (args.types != null && args.types.length > 0)
688
1008
  void q.whereIn('type', args.types);
689
1009
  return q;
690
1010
  }
@@ -702,10 +1022,30 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
702
1022
  throw new WERR_errors_1.WERR_INVALID_PARAMETER('args.partial.lockingScript', 'undefined. Outputs may not be found by lockingScript value.');
703
1023
  }
704
1024
  const q = this.setupQuery('outputs', args);
705
- if ((args.txStatus != null) && args.txStatus.length > 0) {
706
- void q.whereRaw(`(select status from transactions where transactions.transactionId = outputs.transactionId) in (${args.txStatus.map(s => "'" + s + "'").join(',')})`);
1025
+ if (args.txStatus != null && args.txStatus.length > 0) {
1026
+ const allowedStatuses = new Set([
1027
+ 'completed',
1028
+ 'failed',
1029
+ 'unprocessed',
1030
+ 'sending',
1031
+ 'unproven',
1032
+ 'unsigned',
1033
+ 'nosend',
1034
+ 'nonfinal',
1035
+ 'unfail'
1036
+ ]);
1037
+ if (args.txStatus.some(status => !allowedStatuses.has(status))) {
1038
+ throw new WERR_errors_1.WERR_INVALID_PARAMETER('args.txStatus', 'supported transaction statuses');
1039
+ }
1040
+ const statuses = [...new Set(args.txStatus)];
1041
+ void q.whereExists(function () {
1042
+ void this.select(1)
1043
+ .from('transactions')
1044
+ .whereRaw('?? = ??', ['transactions.transactionId', 'outputs.transactionId'])
1045
+ .whereIn('transactions.status', statuses);
1046
+ });
707
1047
  }
708
- if ((args.noScript === true) && count !== true) {
1048
+ if (args.noScript === true && count !== true) {
709
1049
  const columns = tables_1.outputColumnsWithoutLockingScript.map(c => `outputs.${c}`);
710
1050
  void q.select(columns);
711
1051
  }
@@ -713,7 +1053,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
713
1053
  }
714
1054
  findOutputTagMapsQuery(args) {
715
1055
  const q = this.setupQuery('output_tags_map', args);
716
- if ((args.tagIds != null) && args.tagIds.length > 0)
1056
+ if (args.tagIds != null && args.tagIds.length > 0)
717
1057
  void q.whereIn('outputTagId', args.tagIds);
718
1058
  return q;
719
1059
  }
@@ -728,7 +1068,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
728
1068
  throw new WERR_errors_1.WERR_INVALID_PARAMETER('args.partial.inputBEEF', 'undefined. ProvenTxReqs may not be found by inputBEEF value.');
729
1069
  }
730
1070
  const q = this.setupQuery('proven_tx_reqs', args);
731
- if ((args.status != null) && args.status.length > 0)
1071
+ if (args.status != null && args.status.length > 0)
732
1072
  void q.whereIn('status', args.status);
733
1073
  if (args.txids != null) {
734
1074
  const txids = args.txids.filter(txid => txid !== undefined);
@@ -771,13 +1111,13 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
771
1111
  throw new WERR_errors_1.WERR_INVALID_PARAMETER('args.partial.inputBEEF', 'undefined. Transactions may not be found by inputBEEF value.');
772
1112
  }
773
1113
  const q = this.setupQuery('transactions', args);
774
- if ((args.status != null) && args.status.length > 0)
1114
+ if (args.status != null && args.status.length > 0)
775
1115
  void q.whereIn('status', args.status);
776
1116
  if (args.from != null)
777
1117
  void q.where('created_at', '>=', this.validateDateForWhere(args.from));
778
1118
  if (args.to != null)
779
1119
  void q.where('created_at', '<', this.validateDateForWhere(args.to));
780
- if ((args.noRawTx === true) && count !== true) {
1120
+ if (args.noRawTx === true && count !== true) {
781
1121
  const columns = tables_1.transactionColumnsWithoutRawTx.map(c => `transactions.${c}`);
782
1122
  void q.select(columns);
783
1123
  }
@@ -785,7 +1125,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
785
1125
  }
786
1126
  findTxLabelMapsQuery(args) {
787
1127
  const q = this.setupQuery('tx_labels_map', args);
788
- if ((args.labelIds != null) && args.labelIds.length > 0)
1128
+ if (args.labelIds != null && args.labelIds.length > 0)
789
1129
  void q.whereIn('txLabelId', args.labelIds);
790
1130
  return q;
791
1131
  }
@@ -799,19 +1139,32 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
799
1139
  return this.setupQuery('monitor_events', args);
800
1140
  }
801
1141
  async findCertificatesAuth(auth, args) {
802
- if (auth.userId == null || (args.partial.userId != null && args.partial.userId !== 0 && args.partial.userId !== auth.userId))
1142
+ if (auth.userId == null ||
1143
+ (args.partial.userId != null && args.partial.userId !== 0 && args.partial.userId !== auth.userId))
803
1144
  throw new WERR_errors_1.WERR_UNAUTHORIZED();
804
1145
  args.partial.userId = auth.userId;
805
1146
  return await this.findCertificates(args);
806
1147
  }
1148
+ async findProvenTxReqsAuth(auth, args) {
1149
+ const userId = (0, utilityHelpers_1.verifyId)(auth.userId);
1150
+ const k = this.toDb(args.trx);
1151
+ const q = this.findProvenTxReqsQuery(args).whereExists(k
1152
+ .select(1)
1153
+ .from('transactions')
1154
+ .whereRaw('proven_tx_reqs.txid = transactions.txid')
1155
+ .where('transactions.userId', userId));
1156
+ return this.validateEntities(await q, undefined, ['notified', 'wasBroadcast']);
1157
+ }
807
1158
  async findOutputBasketsAuth(auth, args) {
808
- if (auth.userId == null || (args.partial.userId != null && args.partial.userId !== 0 && args.partial.userId !== auth.userId))
1159
+ if (auth.userId == null ||
1160
+ (args.partial.userId != null && args.partial.userId !== 0 && args.partial.userId !== auth.userId))
809
1161
  throw new WERR_errors_1.WERR_UNAUTHORIZED();
810
1162
  args.partial.userId = auth.userId;
811
1163
  return await this.findOutputBaskets(args);
812
1164
  }
813
1165
  async findOutputsAuth(auth, args) {
814
- if (auth.userId == null || (args.partial.userId != null && args.partial.userId !== 0 && args.partial.userId !== auth.userId))
1166
+ if (auth.userId == null ||
1167
+ (args.partial.userId != null && args.partial.userId !== 0 && args.partial.userId !== auth.userId))
815
1168
  throw new WERR_errors_1.WERR_UNAUTHORIZED();
816
1169
  args.partial.userId = auth.userId;
817
1170
  return await this.findOutputs(args);
@@ -880,6 +1233,12 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
880
1233
  }
881
1234
  async findSyncStates(args) {
882
1235
  const q = this.findSyncStatesQuery(args);
1236
+ // Serialize sync checkpoint reads with the page transaction on MySQL and Postgres too.
1237
+ if (args.trx != null &&
1238
+ (this.dbtype === 'MySQL' || this.dbtype === 'Postgres') &&
1239
+ args.partial.userId != null &&
1240
+ (args.partial.syncStateId != null || args.partial.storageIdentityKey != null))
1241
+ q.forUpdate();
883
1242
  const r = await q;
884
1243
  return this.validateEntities(r, ['when'], ['init']);
885
1244
  }
@@ -928,9 +1287,12 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
928
1287
  return this.validateEntities(r, ['when']);
929
1288
  }
930
1289
  async getCount(q) {
931
- void q.count();
1290
+ // Alias the count: the default result key differs by dialect, and Postgres
1291
+ // returns count(*) as a bigint string.
1292
+ // A paged find query orders its rows; an aggregate cannot keep that order on Postgres.
1293
+ void q.clearOrder().count({ count: '*' });
932
1294
  const r = await q;
933
- return r[0]['count(*)'];
1295
+ return Number(r[0].count);
934
1296
  }
935
1297
  async countCertificateFields(args) {
936
1298
  return await this.getCount(this.findCertificateFieldsQuery(args));
@@ -978,6 +1340,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
978
1340
  return await this.getCount(this.findMonitorEventsQuery(args));
979
1341
  }
980
1342
  async destroy() {
1343
+ await this.stopPreparedBeefTasks();
981
1344
  this.knex.off('query', this.onQuery);
982
1345
  this.knex.off('query-response', this.onQueryResponse);
983
1346
  this.knex.off('query-error', this.onQueryError);
@@ -990,24 +1353,46 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
990
1353
  // Check if this is a SQLite database by looking at the Knex client config
991
1354
  const clientName = this.knex.client.config?.client ?? '';
992
1355
  const isSQLite = clientName.includes('sqlite');
993
- // For SQLite, disable transactions during migrations and turn off foreign keys.
994
- // PRAGMA foreign_keys is silently ignored inside transactions, so we must
995
- // disable transactions for the migration to allow the PRAGMA to take effect.
996
- // See: https://github.com/knex/knex/issues/4155
1356
+ // For SQLite, turn foreign keys off for the duration of the migration.
1357
+ // PRAGMA foreign_keys is silently ignored *when executed inside* a
1358
+ // transaction (https://github.com/knex/knex/issues/4155), so it is issued
1359
+ // here, outside migrate.latest(). SQLite's single-connection pool means
1360
+ // knex's per-migration transaction runs on this same connection and
1361
+ // inherits the setting, and knex's own SQLite alter-table rebuild leaves an
1362
+ // ambient pragma alone while transacting (sqlite3/schema/ddl.js: alter()
1363
+ // uses `enforceForeignCheck = this.client.transacting ? null : false`).
997
1364
  if (isSQLite) {
998
1365
  await this.knex.raw('PRAGMA foreign_keys = OFF;');
999
1366
  }
1000
- const config = {
1001
- migrationSource: new KnexMigrations_1.KnexMigrations(this.chain, storageName, storageIdentityKey, 1024),
1002
- disableTransactions: isSQLite
1003
- };
1004
- await this.knex.migrate.latest(config);
1005
- const version = await this.knex.migrate.currentVersion(config);
1006
- // Re-enable foreign key checks for SQLite
1007
- if (isSQLite) {
1008
- await this.knex.raw('PRAGMA foreign_keys = ON;');
1367
+ const isPostgres = this.knex.client.dialect === 'postgresql';
1368
+ try {
1369
+ const config = {
1370
+ migrationSource: new KnexMigrations_1.KnexMigrations(this.chain, storageName, storageIdentityKey, 1024, isPostgres ? 'Postgres' : undefined),
1371
+ // Keep DDL and its migration journal entry in the same transaction.
1372
+ disableTransactions: false
1373
+ };
1374
+ if (isPostgres) {
1375
+ // Postgres index migrations run outside a transaction (CREATE INDEX
1376
+ // CONCURRENTLY). When any pending migration does, knex's latest()
1377
+ // journals every migration of the batch outside its transaction, so
1378
+ // run one migration per up() to keep the others atomic with their journal row.
1379
+ for (;;) {
1380
+ const [, applied] = (await this.knex.migrate.up(config));
1381
+ if (applied.length === 0)
1382
+ break;
1383
+ }
1384
+ }
1385
+ else {
1386
+ await this.knex.migrate.latest(config);
1387
+ }
1388
+ return await this.knex.migrate.currentVersion(config);
1389
+ }
1390
+ finally {
1391
+ // Leaving foreign-key enforcement disabled after a failed migration would
1392
+ // weaken every subsequent write on this connection.
1393
+ if (isSQLite)
1394
+ await this.knex.raw('PRAGMA foreign_keys = ON;');
1009
1395
  }
1010
- return version;
1011
1396
  }
1012
1397
  async dropAllData() {
1013
1398
  // Only using migrations to migrate down, don't need valid properties for settings table.
@@ -1029,24 +1414,22 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1029
1414
  if (isSQLite) {
1030
1415
  await this.knex.raw('PRAGMA foreign_keys = OFF;');
1031
1416
  }
1032
- for (let i = 0; i < count; i++) {
1033
- try {
1034
- const r = await this.knex.migrate.down(config);
1035
- if (r == null) {
1036
- console.error('Migration returned falsy result await this.knex.migrate.down(config)');
1037
- break;
1038
- }
1417
+ try {
1418
+ for (let i = 0; i < count; i++) {
1419
+ const version = await this.knex.migrate.currentVersion(config);
1420
+ if (version === 'none')
1421
+ return;
1422
+ const result = await this.knex.migrate.down(config);
1423
+ if (result == null)
1424
+ throw new WERR_errors_1.WERR_INTERNAL('database migration rollback returned no result');
1039
1425
  }
1040
- catch (migrationError) {
1041
- // migrate.down throws when there are no more migrations to roll back — this is
1042
- // the expected terminal condition, so we stop iterating rather than propagating.
1043
- console.debug('migrate.down stopped (no more migrations or error):', migrationError);
1044
- break;
1426
+ if ((await this.knex.migrate.currentVersion(config)) !== 'none') {
1427
+ throw new WERR_errors_1.WERR_INTERNAL('database migration rollback did not reach the empty schema');
1045
1428
  }
1046
1429
  }
1047
- // Re-enable foreign key checks for SQLite
1048
- if (isSQLite) {
1049
- await this.knex.raw('PRAGMA foreign_keys = ON;');
1430
+ finally {
1431
+ if (isSQLite)
1432
+ await this.knex.raw('PRAGMA foreign_keys = ON;');
1050
1433
  }
1051
1434
  }
1052
1435
  async transaction(scope, trx) {
@@ -1064,7 +1447,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1064
1447
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1065
1448
  toDb(trx) {
1066
1449
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1067
- const db = (trx == null) ? this.knex : trx;
1450
+ const db = trx == null ? this.knex : trx;
1068
1451
  this.whenLastAccess = new Date();
1069
1452
  return db;
1070
1453
  }
@@ -1088,7 +1471,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1088
1471
  * @param trx
1089
1472
  */
1090
1473
  async verifyReadyForDatabaseAccess(trx) {
1091
- this._settings ??= await this.readSettings();
1474
+ this._settings ??= await this.readSettings(trx);
1092
1475
  // Always run the PRAGMA for SQLite to ensure foreign key constraints are enabled.
1093
1476
  // This is necessary because PRAGMA foreign_keys is a per-connection setting,
1094
1477
  // and connection pools may create new connections that don't have it set.
@@ -1236,7 +1619,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1236
1619
  void this.select(1)
1237
1620
  .from('action_batch_outputs as abo')
1238
1621
  .join('action_batches as ab', 'abo.actionBatchId', 'ab.actionBatchId')
1239
- .whereRaw('abo.outputId = o.outputId')
1622
+ .whereRaw('?? = ??', ['abo.outputId', 'o.outputId'])
1240
1623
  .whereIn('ab.status', ['active', 'prepared'])
1241
1624
  .where('ab.expiresAt', '>', now)
1242
1625
  .where('ab.hardExpiresAt', '>', now);
@@ -1270,7 +1653,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1270
1653
  void this.select(1)
1271
1654
  .from('action_batch_outputs as abo')
1272
1655
  .join('action_batches as ab', 'abo.actionBatchId', 'ab.actionBatchId')
1273
- .whereRaw('abo.outputId = o.outputId')
1656
+ .whereRaw('?? = ??', ['abo.outputId', 'o.outputId'])
1274
1657
  .whereIn('ab.status', ['active', 'prepared'])
1275
1658
  .where('ab.expiresAt', '>', now)
1276
1659
  .where('ab.hardExpiresAt', '>', now);
@@ -1304,13 +1687,13 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1304
1687
  void this.select(1)
1305
1688
  .from('action_batch_outputs as abo')
1306
1689
  .join('action_batches as ab', 'abo.actionBatchId', 'ab.actionBatchId')
1307
- .whereRaw('abo.outputId = o.outputId')
1690
+ .whereRaw('?? = ??', ['abo.outputId', 'o.outputId'])
1308
1691
  .whereIn('ab.status', ['active', 'prepared'])
1309
1692
  .where('ab.expiresAt', '>', now)
1310
1693
  .where('ab.hardExpiresAt', '>', now);
1311
1694
  })
1312
1695
  .whereIn('t.status', statuses)
1313
- .select('o.outputId', 'o.transactionId', 'o.satoshis', 'o.txid', 'o.vout');
1696
+ .select('o.outputId', 'o.transactionId', 'o.satoshis', 'o.txid', 'o.vout', 't.status as transactionStatus');
1314
1697
  }
1315
1698
  async findOutputsByIds(outputIds, trx) {
1316
1699
  const byId = {};
@@ -1481,7 +1864,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1481
1864
  .whereIn('t.status', status)
1482
1865
  .sum({ totalSatoshis: 'o.satoshis' })
1483
1866
  .first();
1484
- const total = (row != null) ? row.totalSatoshis : undefined;
1867
+ const total = row != null ? row.totalSatoshis : undefined;
1485
1868
  return Number(total ?? 0);
1486
1869
  }
1487
1870
  /**
@@ -1511,27 +1894,40 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1511
1894
  .whereNot('o.derivationSuffix', '')
1512
1895
  .whereNull('o.spentBy')
1513
1896
  .whereNotExists(function () {
1514
- void this.select(1)
1515
- .from('action_batch_outputs as abo')
1516
- .whereRaw('abo.outputId = o.outputId');
1897
+ void this.select(1).from('action_batch_outputs as abo').whereRaw('?? = ??', ['abo.outputId', 'o.outputId']);
1517
1898
  })
1518
1899
  .whereIn('t.status', status)
1519
1900
  .select('o.*')
1520
1901
  .forUpdate();
1521
- let output;
1522
- if (exactSatoshis !== undefined) {
1523
- output = await baseQuery().where('o.satoshis', exactSatoshis).orderBy('o.outputId', 'asc').first();
1902
+ const excluded = [];
1903
+ const candidates = () => excluded.length > 0 ? baseQuery().whereNotIn('o.outputId', excluded) : baseQuery();
1904
+ const selectOutput = async () => {
1905
+ let output;
1906
+ if (exactSatoshis !== undefined) {
1907
+ output = await candidates().where('o.satoshis', exactSatoshis).orderBy('o.outputId', 'asc').first();
1908
+ }
1909
+ output ??= await candidates()
1910
+ .where('o.satoshis', '>=', targetSatoshis)
1911
+ .orderBy('o.satoshis', 'asc')
1912
+ .orderBy('o.outputId', 'asc')
1913
+ .first();
1914
+ output ??= await candidates()
1915
+ .where('o.satoshis', '<', targetSatoshis)
1916
+ .orderBy('o.satoshis', 'desc')
1917
+ .orderBy('o.outputId', 'desc')
1918
+ .first();
1919
+ return output;
1920
+ };
1921
+ let output = await selectOutput();
1922
+ // Under Postgres READ COMMITTED the NOT EXISTS above uses the statement's
1923
+ // snapshot, so an action batch reservation committed while the statement
1924
+ // waited for the row lock is not visible to it. Re-check with a new statement.
1925
+ while (output != null &&
1926
+ this.dbtype === 'Postgres' &&
1927
+ (await this.findReservedActionBatchOutputIds([output.outputId], trx)).length > 0) {
1928
+ excluded.push(output.outputId);
1929
+ output = await selectOutput();
1524
1930
  }
1525
- output ??= await baseQuery()
1526
- .where('o.satoshis', '>=', targetSatoshis)
1527
- .orderBy('o.satoshis', 'asc')
1528
- .orderBy('o.outputId', 'asc')
1529
- .first();
1530
- output ??= await baseQuery()
1531
- .where('o.satoshis', '<', targetSatoshis)
1532
- .orderBy('o.satoshis', 'desc')
1533
- .orderBy('o.outputId', 'desc')
1534
- .first();
1535
1931
  if (output == null)
1536
1932
  return undefined;
1537
1933
  await this.updateOutput(output.outputId, {
@@ -1591,7 +1987,8 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1591
1987
  for (const df of booleanFields) {
1592
1988
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1593
1989
  if (entity[df] !== undefined)
1594
- entity[df] = entity[df] !== 0 && entity[df] != null && entity[df] !== false;
1990
+ entity[df] =
1991
+ entity[df] !== 0 && entity[df] != null && entity[df] !== false;
1595
1992
  }
1596
1993
  }
1597
1994
  this.deserialiseFromKnex(entity);
@@ -1609,165 +2006,122 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1609
2006
  return entities;
1610
2007
  }
1611
2008
  async adminStats(adminIdentityKey) {
1612
- if (this.dbtype !== 'MySQL')
1613
- throw new WERR_errors_1.WERR_NOT_IMPLEMENTED('adminStats, only MySQL is supported');
2009
+ if (this.dbtype !== 'MySQL' && this.dbtype !== 'Postgres')
2010
+ throw new WERR_errors_1.WERR_NOT_IMPLEMENTED('adminStats, only MySQL and Postgres are supported');
1614
2011
  const monitorEvent = (0, utilityHelpers_1.verifyOneOrNone)(await this.findMonitorEvents({
1615
2012
  partial: { event: 'MonitorCallHistory' },
1616
2013
  orderDescending: true,
1617
2014
  paged: { limit: 1 }
1618
2015
  }));
1619
- const monitorStats = (monitorEvent != null) ? JSON.parse(monitorEvent.details) : undefined;
2016
+ const monitorStats = monitorEvent != null ? JSON.parse(monitorEvent.details) : undefined;
1620
2017
  const servicesStats = this.getServices().getServicesCallHistory(true);
1621
- const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
1622
- const oneWeekAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
1623
- const oneMonthAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString();
1624
- const [[{ usersDay, usersMonth, usersWeek, usersTotal, transactionsDay, transactionsMonth, transactionsWeek, transactionsTotal, txCompletedDay, txCompletedMonth, txCompletedWeek, txCompletedTotal, txFailedDay, txFailedMonth, txFailedWeek, txFailedTotal, txAbandonedDay, txAbandonedMonth, txAbandonedWeek, txAbandonedTotal, txUnprocessedDay, txUnprocessedMonth, txUnprocessedWeek, txUnprocessedTotal, txSendingDay, txSendingMonth, txSendingWeek, txSendingTotal, txUnprovenDay, txUnprovenMonth, txUnprovenWeek, txUnprovenTotal, txUnsignedDay, txUnsignedMonth, txUnsignedWeek, txUnsignedTotal, txNosendDay, txNosendMonth, txNosendWeek, txNosendTotal, txNonfinalDay, txNonfinalMonth, txNonfinalWeek, txNonfinalTotal, txUnfailDay, txUnfailMonth, txUnfailWeek, txUnfailTotal, satoshisDefaultDay, satoshisDefaultMonth, satoshisDefaultWeek, satoshisDefaultTotal, satoshisOtherDay, satoshisOtherMonth, satoshisOtherWeek, satoshisOtherTotal, basketsDay, basketsMonth, basketsWeek, basketsTotal, labelsDay, labelsMonth, labelsWeek, labelsTotal, tagsDay, tagsMonth, tagsWeek, tagsTotal }]] = await this.knex.raw(`
1625
- select
1626
- (select count(*) from users where created_at > '${oneDayAgo}') as usersDay,
1627
- (select count(*) from users where created_at > '${oneWeekAgo}') as usersWeek,
1628
- (select count(*) from users where created_at > '${oneMonthAgo}') as usersMonth,
1629
- (select count(*) from users) as usersTotal,
1630
- (select count(*) from transactions where created_at > '${oneDayAgo}') as transactionsDay,
1631
- (select count(*) from transactions where created_at > '${oneWeekAgo}') as transactionsWeek,
1632
- (select count(*) from transactions where created_at > '${oneMonthAgo}') as transactionsMonth,
1633
- (select count(*) from transactions) as transactionsTotal,
1634
- (select count(*) from transactions where status = 'completed' and created_at > '${oneDayAgo}') as txCompletedDay,
1635
- (select count(*) from transactions where status = 'completed' and created_at > '${oneWeekAgo}') as txCompletedWeek,
1636
- (select count(*) from transactions where status = 'completed' and created_at > '${oneMonthAgo}') as txCompletedMonth,
1637
- (select count(*) from transactions where status = 'completed') as txCompletedTotal,
1638
- (select count(*) from transactions where status = 'failed' and not txid is null and created_at > '${oneDayAgo}') as txFailedDay,
1639
- (select count(*) from transactions where status = 'failed' and not txid is null and created_at > '${oneWeekAgo}') as txFailedWeek,
1640
- (select count(*) from transactions where status = 'failed' and not txid is null and created_at > '${oneMonthAgo}') as txFailedMonth,
1641
- (select count(*) from transactions where status = 'failed' and not txid is null) as txFailedTotal,
1642
- (select count(*) from transactions where status = 'failed' and txid is null and created_at > '${oneDayAgo}') as txAbandonedDay,
1643
- (select count(*) from transactions where status = 'failed' and txid is null and created_at > '${oneWeekAgo}') as txAbandonedWeek,
1644
- (select count(*) from transactions where status = 'failed' and txid is null and created_at > '${oneMonthAgo}') as txAbandonedMonth,
1645
- (select count(*) from transactions where status = 'failed' and txid is null) as txAbandonedTotal,
1646
- (select count(*) from transactions where status = 'unprocessed' and created_at > '${oneDayAgo}') as txUnprocessedDay,
1647
- (select count(*) from transactions where status = 'unprocessed' and created_at > '${oneWeekAgo}') as txUnprocessedWeek,
1648
- (select count(*) from transactions where status = 'unprocessed' and created_at > '${oneMonthAgo}') as txUnprocessedMonth,
1649
- (select count(*) from transactions where status = 'unprocessed') as txUnprocessedTotal,
1650
- (select count(*) from transactions where status = 'sending' and created_at > '${oneDayAgo}') as txSendingDay,
1651
- (select count(*) from transactions where status = 'sending' and created_at > '${oneWeekAgo}') as txSendingWeek,
1652
- (select count(*) from transactions where status = 'sending' and created_at > '${oneMonthAgo}') as txSendingMonth,
1653
- (select count(*) from transactions where status = 'sending') as txSendingTotal,
1654
- (select count(*) from transactions where status = 'unproven' and created_at > '${oneDayAgo}') as txUnprovenDay,
1655
- (select count(*) from transactions where status = 'unproven' and created_at > '${oneWeekAgo}') as txUnprovenWeek,
1656
- (select count(*) from transactions where status = 'unproven' and created_at > '${oneMonthAgo}') as txUnprovenMonth,
1657
- (select count(*) from transactions where status = 'unproven') as txUnprovenTotal,
1658
- (select count(*) from transactions where status = 'unsigned' and created_at > '${oneDayAgo}') as txUnsignedDay,
1659
- (select count(*) from transactions where status = 'unsigned' and created_at > '${oneWeekAgo}') as txUnsignedWeek,
1660
- (select count(*) from transactions where status = 'unsigned' and created_at > '${oneMonthAgo}') as txUnsignedMonth,
1661
- (select count(*) from transactions where status = 'unsigned') as txUnsignedTotal,
1662
- (select count(*) from transactions where status = 'nosend' and created_at > '${oneDayAgo}') as txNosendDay,
1663
- (select count(*) from transactions where status = 'nosend' and created_at > '${oneWeekAgo}') as txNosendWeek,
1664
- (select count(*) from transactions where status = 'nosend' and created_at > '${oneMonthAgo}') as txNosendMonth,
1665
- (select count(*) from transactions where status = 'nosend') as txNosendTotal,
1666
- (select count(*) from transactions where status = 'nonfinal' and created_at > '${oneDayAgo}') as txNonfinalDay,
1667
- (select count(*) from transactions where status = 'nonfinal' and created_at > '${oneWeekAgo}') as txNonfinalWeek,
1668
- (select count(*) from transactions where status = 'nonfinal' and created_at > '${oneMonthAgo}') as txNonfinalMonth,
1669
- (select count(*) from transactions where status = 'nonfinal') as txNonfinalTotal,
1670
- (select count(*) from transactions where status = 'unfail' and created_at > '${oneDayAgo}') as txUnfailDay,
1671
- (select count(*) from transactions where status = 'unfail' and created_at > '${oneWeekAgo}') as txUnfailWeek,
1672
- (select count(*) from transactions where status = 'unfail' and created_at > '${oneMonthAgo}') as txUnfailMonth,
1673
- (select count(*) from transactions where status = 'unfail') as txUnfailTotal,
1674
- (select sum(o.satoshis) from outputs o, transactions t where o.transactionId = t.transactionId and t.status = 'completed' and o.spendable = 1 and o.change = 1 and o.created_at > '${oneDayAgo}') as satoshisDefaultDay,
1675
- (select sum(o.satoshis) from outputs o, transactions t where o.transactionId = t.transactionId and t.status = 'completed' and o.spendable = 1 and o.change = 1 and o.created_at > '${oneWeekAgo}') as satoshisDefaultWeek,
1676
- (select sum(o.satoshis) from outputs o, transactions t where o.transactionId = t.transactionId and t.status = 'completed' and o.spendable = 1 and o.change = 1 and o.created_at > '${oneMonthAgo}') as satoshisDefaultMonth,
1677
- (select sum(o.satoshis) from outputs o, transactions t where o.transactionId = t.transactionId and t.status = 'completed' and o.spendable = 1 and o.change = 1) as satoshisDefaultTotal,
1678
- (select sum(o.satoshis) from outputs o, transactions t where o.transactionId = t.transactionId and t.status = 'completed' and o.spendable = 1 and o.change = 0 and not o.basketId is null and o.created_at > '${oneDayAgo}') as satoshisOtherDay,
1679
- (select sum(o.satoshis) from outputs o, transactions t where o.transactionId = t.transactionId and t.status = 'completed' and o.spendable = 1 and o.change = 0 and not o.basketId is null and o.created_at > '${oneWeekAgo}') as satoshisOtherWeek,
1680
- (select sum(o.satoshis) from outputs o, transactions t where o.transactionId = t.transactionId and t.status = 'completed' and o.spendable = 1 and o.change = 0 and not o.basketId is null and o.created_at > '${oneMonthAgo}') as satoshisOtherMonth,
1681
- (select sum(o.satoshis) from outputs o, transactions t where o.transactionId = t.transactionId and t.status = 'completed' and o.spendable = 1 and o.change = 0 and not o.basketId is null) as satoshisOtherTotal,
1682
- (select count(*) from output_baskets where created_at > '${oneDayAgo}') as basketsDay,
1683
- (select count(*) from output_baskets where created_at > '${oneWeekAgo}') as basketsWeek,
1684
- (select count(*) from output_baskets where created_at > '${oneMonthAgo}') as basketsMonth,
1685
- (select count(*) from output_baskets) as basketsTotal,
1686
- (select count(*) from tx_labels where created_at > '${oneDayAgo}') as labelsDay,
1687
- (select count(*) from tx_labels where created_at > '${oneWeekAgo}') as labelsWeek,
1688
- (select count(*) from tx_labels where created_at > '${oneMonthAgo}') as labelsMonth,
1689
- (select count(*) from tx_labels) as labelsTotal,
1690
- (select count(*) from output_tags where created_at > '${oneDayAgo}') as tagsDay,
1691
- (select count(*) from output_tags where created_at > '${oneWeekAgo}') as tagsWeek,
1692
- (select count(*) from output_tags where created_at > '${oneMonthAgo}') as tagsMonth,
1693
- (select count(*) from output_tags) as tagsTotal
1694
- `);
2018
+ const day = 24 * 60 * 60 * 1000;
2019
+ const now = Date.now();
2020
+ const periods = [
2021
+ ['Day', new Date(now - day)],
2022
+ ['Week', new Date(now - 7 * day)],
2023
+ ['Month', new Date(now - 30 * day)],
2024
+ ['Total', undefined]
2025
+ ];
2026
+ const k = this.knex;
2027
+ const count = (table, createdAt = 'created_at') => (since) => {
2028
+ const q = k(table).count('*');
2029
+ if (since != null)
2030
+ void q.where(createdAt, '>', this.validateDateForWhere(since));
2031
+ return q;
2032
+ };
2033
+ const txCount = (status) => (since) => count('transactions')(since).where({ status });
2034
+ const satoshis = (change) => (since) => {
2035
+ const q = k('outputs as o')
2036
+ .join('transactions as t', 'o.transactionId', 't.transactionId')
2037
+ .where({ 't.status': 'completed', 'o.spendable': true, 'o.change': change })
2038
+ .sum('o.satoshis');
2039
+ if (!change)
2040
+ void q.whereNotNull('o.basketId');
2041
+ if (since != null)
2042
+ void q.where('o.created_at', '>', this.validateDateForWhere(since));
2043
+ return q;
2044
+ };
2045
+ const stats = [
2046
+ ['users', count('users')],
2047
+ ['transactions', count('transactions')],
2048
+ ['txCompleted', txCount('completed')],
2049
+ ['txFailed', since => txCount('failed')(since).whereNotNull('txid')],
2050
+ ['txAbandoned', since => txCount('failed')(since).whereNull('txid')],
2051
+ ['txUnprocessed', txCount('unprocessed')],
2052
+ ['txSending', txCount('sending')],
2053
+ ['txUnproven', txCount('unproven')],
2054
+ ['txUnsigned', txCount('unsigned')],
2055
+ ['txNosend', txCount('nosend')],
2056
+ ['txNonfinal', txCount('nonfinal')],
2057
+ ['txUnfail', txCount('unfail')],
2058
+ ['satoshisDefault', satoshis(true)],
2059
+ ['satoshisOther', satoshis(false)],
2060
+ ['baskets', count('output_baskets')],
2061
+ ['labels', count('tx_labels')],
2062
+ ['tags', count('output_tags')]
2063
+ ];
2064
+ // One statement of scalar subqueries; knex quotes the camelCase identifiers per dialect.
2065
+ const columns = {};
2066
+ for (const [name, query] of stats) {
2067
+ for (const [period, since] of periods)
2068
+ columns[`${name}${period}`] = query(since);
2069
+ }
2070
+ const [row] = (await k.select(columns));
2071
+ const values = Object.fromEntries(Object.keys(columns).map(name => [name, Number(row[name] ?? 0)]));
1695
2072
  const r = {
1696
2073
  monitorStats,
1697
2074
  servicesStats,
1698
2075
  requestedBy: adminIdentityKey,
1699
2076
  when: new Date().toISOString(),
1700
- usersDay,
1701
- usersWeek,
1702
- usersMonth,
1703
- usersTotal,
1704
- transactionsDay,
1705
- transactionsWeek,
1706
- transactionsMonth,
1707
- transactionsTotal,
1708
- txCompletedDay,
1709
- txCompletedWeek,
1710
- txCompletedMonth,
1711
- txCompletedTotal,
1712
- txFailedDay,
1713
- txFailedWeek,
1714
- txFailedMonth,
1715
- txFailedTotal,
1716
- txAbandonedDay,
1717
- txAbandonedWeek,
1718
- txAbandonedMonth,
1719
- txAbandonedTotal,
1720
- txUnprocessedDay,
1721
- txUnprocessedWeek,
1722
- txUnprocessedMonth,
1723
- txUnprocessedTotal,
1724
- txSendingDay,
1725
- txSendingWeek,
1726
- txSendingMonth,
1727
- txSendingTotal,
1728
- txUnprovenDay,
1729
- txUnprovenWeek,
1730
- txUnprovenMonth,
1731
- txUnprovenTotal,
1732
- txUnsignedDay,
1733
- txUnsignedWeek,
1734
- txUnsignedMonth,
1735
- txUnsignedTotal,
1736
- txNosendDay,
1737
- txNosendWeek,
1738
- txNosendMonth,
1739
- txNosendTotal,
1740
- txNonfinalDay,
1741
- txNonfinalWeek,
1742
- txNonfinalMonth,
1743
- txNonfinalTotal,
1744
- txUnfailDay,
1745
- txUnfailWeek,
1746
- txUnfailMonth,
1747
- txUnfailTotal,
1748
- satoshisDefaultDay: Number(satoshisDefaultDay),
1749
- satoshisDefaultWeek: Number(satoshisDefaultWeek),
1750
- satoshisDefaultMonth: Number(satoshisDefaultMonth),
1751
- satoshisDefaultTotal: Number(satoshisDefaultTotal),
1752
- satoshisOtherDay: Number(satoshisOtherDay),
1753
- satoshisOtherWeek: Number(satoshisOtherWeek),
1754
- satoshisOtherMonth: Number(satoshisOtherMonth),
1755
- satoshisOtherTotal: Number(satoshisOtherTotal),
1756
- basketsDay,
1757
- basketsWeek,
1758
- basketsMonth,
1759
- basketsTotal,
1760
- labelsDay,
1761
- labelsWeek,
1762
- labelsMonth,
1763
- labelsTotal,
1764
- tagsDay,
1765
- tagsWeek,
1766
- tagsMonth,
1767
- tagsTotal
2077
+ ...values
1768
2078
  };
1769
2079
  return r;
1770
2080
  }
1771
2081
  }
1772
2082
  exports.StorageKnex = StorageKnex;
2083
+ /**
2084
+ * Key columns that give paged queries a deterministic row order. Without an
2085
+ * ORDER BY, Postgres may return the rows of consecutive LIMIT/OFFSET pages in
2086
+ * different orders, so sync chunks could repeat some rows and skip others.
2087
+ */
2088
+ function pagingOrder(table) {
2089
+ return pagingKey(table).map(column => `${table}.${column}`);
2090
+ }
2091
+ function pagingKey(table) {
2092
+ switch (table) {
2093
+ case 'certificate_fields':
2094
+ return ['certificateId', 'fieldName'];
2095
+ case 'certificates':
2096
+ return ['certificateId'];
2097
+ case 'commissions':
2098
+ return ['commissionId'];
2099
+ case 'monitor_events':
2100
+ return ['id'];
2101
+ case 'output_baskets':
2102
+ return ['basketId'];
2103
+ case 'output_tags':
2104
+ return ['outputTagId'];
2105
+ case 'output_tags_map':
2106
+ return ['outputTagId', 'outputId'];
2107
+ case 'outputs':
2108
+ return ['outputId'];
2109
+ case 'proven_tx_reqs':
2110
+ return ['provenTxReqId'];
2111
+ case 'proven_txs':
2112
+ return ['provenTxId'];
2113
+ case 'sync_states':
2114
+ return ['syncStateId'];
2115
+ case 'transactions':
2116
+ return ['transactionId'];
2117
+ case 'tx_labels':
2118
+ return ['txLabelId'];
2119
+ case 'tx_labels_map':
2120
+ return ['txLabelId', 'transactionId'];
2121
+ case 'users':
2122
+ return ['userId'];
2123
+ default:
2124
+ return [];
2125
+ }
2126
+ }
1773
2127
  //# sourceMappingURL=StorageKnex.js.map