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

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 (878) hide show
  1. package/CHANGELOG.md +744 -1
  2. package/LICENSES/Open-BSV-License-4-wallet-pre-2026.txt +28 -0
  3. package/README.md +823 -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 +12996 -4571
  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 +505 -190
  13. package/docs/no-send-expiry.md +167 -0
  14. package/docs/prepared-beef.md +197 -0
  15. package/docs/services.md +4013 -1153
  16. package/docs/setup.md +107 -56
  17. package/docs/storage.md +5781 -1599
  18. package/docs/sync-transfer.md +144 -0
  19. package/docs/wab-shamir.md +5 -1
  20. package/docs/wallet.md +10188 -10904
  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 +14 -0
  26. package/out/src/Setup.d.ts.map +1 -1
  27. package/out/src/Setup.js +6 -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.map +1 -1
  85. package/out/src/monitor/MonitorDaemon.js +64 -16
  86. package/out/src/monitor/MonitorDaemon.js.map +1 -1
  87. package/out/src/monitor/monitorValidation.d.ts +12 -0
  88. package/out/src/monitor/monitorValidation.d.ts.map +1 -0
  89. package/out/src/monitor/monitorValidation.js +133 -0
  90. package/out/src/monitor/monitorValidation.js.map +1 -0
  91. package/out/src/monitor/tasks/TaskArcSSE.d.ts +6 -1
  92. package/out/src/monitor/tasks/TaskArcSSE.d.ts.map +1 -1
  93. package/out/src/monitor/tasks/TaskArcSSE.js +117 -74
  94. package/out/src/monitor/tasks/TaskArcSSE.js.map +1 -1
  95. package/out/src/monitor/tasks/TaskCheckForProofs.d.ts +5 -0
  96. package/out/src/monitor/tasks/TaskCheckForProofs.d.ts.map +1 -1
  97. package/out/src/monitor/tasks/TaskCheckForProofs.js +29 -24
  98. package/out/src/monitor/tasks/TaskCheckForProofs.js.map +1 -1
  99. package/out/src/monitor/tasks/TaskCheckNoSends.d.ts.map +1 -1
  100. package/out/src/monitor/tasks/TaskCheckNoSends.js +11 -3
  101. package/out/src/monitor/tasks/TaskCheckNoSends.js.map +1 -1
  102. package/out/src/monitor/tasks/TaskFailAbandoned.d.ts.map +1 -1
  103. package/out/src/monitor/tasks/TaskFailAbandoned.js +9 -4
  104. package/out/src/monitor/tasks/TaskFailAbandoned.js.map +1 -1
  105. package/out/src/monitor/tasks/TaskNewHeader.d.ts.map +1 -1
  106. package/out/src/monitor/tasks/TaskNewHeader.js +3 -1
  107. package/out/src/monitor/tasks/TaskNewHeader.js.map +1 -1
  108. package/out/src/monitor/tasks/TaskNoSendExpiry.d.ts +19 -0
  109. package/out/src/monitor/tasks/TaskNoSendExpiry.d.ts.map +1 -0
  110. package/out/src/monitor/tasks/TaskNoSendExpiry.js +47 -0
  111. package/out/src/monitor/tasks/TaskNoSendExpiry.js.map +1 -0
  112. package/out/src/monitor/tasks/TaskReconcilePendingTransactions.d.ts +27 -0
  113. package/out/src/monitor/tasks/TaskReconcilePendingTransactions.d.ts.map +1 -0
  114. package/out/src/monitor/tasks/TaskReconcilePendingTransactions.js +242 -0
  115. package/out/src/monitor/tasks/TaskReconcilePendingTransactions.js.map +1 -0
  116. package/out/src/monitor/tasks/TaskReorg.d.ts.map +1 -1
  117. package/out/src/monitor/tasks/TaskReorg.js +4 -4
  118. package/out/src/monitor/tasks/TaskReorg.js.map +1 -1
  119. package/out/src/monitor/tasks/TaskReviewDoubleSpends.d.ts.map +1 -1
  120. package/out/src/monitor/tasks/TaskReviewDoubleSpends.js +31 -9
  121. package/out/src/monitor/tasks/TaskReviewDoubleSpends.js.map +1 -1
  122. package/out/src/monitor/tasks/TaskReviewProvenTxs.d.ts +18 -1
  123. package/out/src/monitor/tasks/TaskReviewProvenTxs.d.ts.map +1 -1
  124. package/out/src/monitor/tasks/TaskReviewProvenTxs.js +99 -21
  125. package/out/src/monitor/tasks/TaskReviewProvenTxs.js.map +1 -1
  126. package/out/src/monitor/tasks/TaskReviewUtxos.d.ts +33 -6
  127. package/out/src/monitor/tasks/TaskReviewUtxos.d.ts.map +1 -1
  128. package/out/src/monitor/tasks/TaskReviewUtxos.js +189 -13
  129. package/out/src/monitor/tasks/TaskReviewUtxos.js.map +1 -1
  130. package/out/src/monitor/tasks/TaskSendWaiting.d.ts.map +1 -1
  131. package/out/src/monitor/tasks/TaskSendWaiting.js +52 -11
  132. package/out/src/monitor/tasks/TaskSendWaiting.js.map +1 -1
  133. package/out/src/monitor/tasks/TaskUnFail.d.ts +1 -0
  134. package/out/src/monitor/tasks/TaskUnFail.d.ts.map +1 -1
  135. package/out/src/monitor/tasks/TaskUnFail.js +26 -8
  136. package/out/src/monitor/tasks/TaskUnFail.js.map +1 -1
  137. package/out/src/monitor/tasks/index.all.d.ts +2 -0
  138. package/out/src/monitor/tasks/index.all.d.ts.map +1 -1
  139. package/out/src/monitor/tasks/index.all.js +2 -0
  140. package/out/src/monitor/tasks/index.all.js.map +1 -1
  141. package/out/src/sdk/ActionBatch.interfaces.d.ts +23 -0
  142. package/out/src/sdk/ActionBatch.interfaces.d.ts.map +1 -1
  143. package/out/src/sdk/PrivilegedKeyManager.d.ts.map +1 -1
  144. package/out/src/sdk/PrivilegedKeyManager.js +3 -2
  145. package/out/src/sdk/PrivilegedKeyManager.js.map +1 -1
  146. package/out/src/sdk/WERR_errors.d.ts +23 -0
  147. package/out/src/sdk/WERR_errors.d.ts.map +1 -1
  148. package/out/src/sdk/WERR_errors.js +51 -7
  149. package/out/src/sdk/WERR_errors.js.map +1 -1
  150. package/out/src/sdk/WalletError.d.ts.map +1 -1
  151. package/out/src/sdk/WalletError.js +7 -21
  152. package/out/src/sdk/WalletError.js.map +1 -1
  153. package/out/src/sdk/WalletErrorFromJson.d.ts.map +1 -1
  154. package/out/src/sdk/WalletErrorFromJson.js +121 -3
  155. package/out/src/sdk/WalletErrorFromJson.js.map +1 -1
  156. package/out/src/sdk/WalletServices.interfaces.d.ts +45 -2
  157. package/out/src/sdk/WalletServices.interfaces.d.ts.map +1 -1
  158. package/out/src/sdk/WalletStorage.interfaces.d.ts +87 -4
  159. package/out/src/sdk/WalletStorage.interfaces.d.ts.map +1 -1
  160. package/out/src/sdk/types.d.ts +3 -2
  161. package/out/src/sdk/types.d.ts.map +1 -1
  162. package/out/src/sdk/types.js +3 -2
  163. package/out/src/sdk/types.js.map +1 -1
  164. package/out/src/services/ServiceCollection.js +2 -2
  165. package/out/src/services/ServiceCollection.js.map +1 -1
  166. package/out/src/services/Services.d.ts +5 -0
  167. package/out/src/services/Services.d.ts.map +1 -1
  168. package/out/src/services/Services.js +346 -120
  169. package/out/src/services/Services.js.map +1 -1
  170. package/out/src/services/chaintracker/BHServiceClient.d.ts +21 -4
  171. package/out/src/services/chaintracker/BHServiceClient.d.ts.map +1 -1
  172. package/out/src/services/chaintracker/BHServiceClient.js +269 -66
  173. package/out/src/services/chaintracker/BHServiceClient.js.map +1 -1
  174. package/out/src/services/chaintracker/ChaintracksChainTracker.d.ts +25 -3
  175. package/out/src/services/chaintracker/ChaintracksChainTracker.d.ts.map +1 -1
  176. package/out/src/services/chaintracker/ChaintracksChainTracker.js +188 -53
  177. package/out/src/services/chaintracker/ChaintracksChainTracker.js.map +1 -1
  178. package/out/src/services/chaintracker/LocalChainTracker.d.ts +122 -0
  179. package/out/src/services/chaintracker/LocalChainTracker.d.ts.map +1 -0
  180. package/out/src/services/chaintracker/LocalChainTracker.js +465 -0
  181. package/out/src/services/chaintracker/LocalChainTracker.js.map +1 -0
  182. package/out/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.d.ts.map +1 -1
  183. package/out/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.js +59 -7
  184. package/out/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.js.map +1 -1
  185. package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.d.ts +48 -0
  186. package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.d.ts.map +1 -0
  187. package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.js +3 -0
  188. package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.js.map +1 -0
  189. package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataValidatorApi.d.ts +70 -0
  190. package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataValidatorApi.d.ts.map +1 -0
  191. package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataValidatorApi.js +21 -0
  192. package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataValidatorApi.js.map +1 -0
  193. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksApi.d.ts +6 -0
  194. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksApi.d.ts.map +1 -1
  195. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.d.ts +53 -0
  196. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.d.ts.map +1 -1
  197. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.d.ts +9 -2
  198. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.d.ts.map +1 -1
  199. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts +9 -0
  200. package/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts.map +1 -1
  201. package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts +28 -3
  202. package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts.map +1 -1
  203. package/out/src/services/chaintracker/chaintracks/Chaintracks.js +282 -64
  204. package/out/src/services/chaintracker/chaintracks/Chaintracks.js.map +1 -1
  205. package/out/src/services/chaintracker/chaintracks/ChaintracksService.d.ts +16 -0
  206. package/out/src/services/chaintracker/chaintracks/ChaintracksService.d.ts.map +1 -1
  207. package/out/src/services/chaintracker/chaintracks/ChaintracksService.js +150 -26
  208. package/out/src/services/chaintracker/chaintracks/ChaintracksService.js.map +1 -1
  209. package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.d.ts +30 -1
  210. package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.d.ts.map +1 -1
  211. package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.js +348 -30
  212. package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.js.map +1 -1
  213. package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.d.ts +32 -1
  214. package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.d.ts.map +1 -1
  215. package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.js +378 -44
  216. package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.js.map +1 -1
  217. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.d.ts.map +1 -1
  218. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.js +28 -3
  219. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.js.map +1 -1
  220. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.d.ts.map +1 -1
  221. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.js +33 -9
  222. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.js.map +1 -1
  223. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.d.ts.map +1 -1
  224. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.js.map +1 -1
  225. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorChaintracks.d.ts.map +1 -1
  226. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorChaintracks.js +4 -2
  227. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorChaintracks.js.map +1 -1
  228. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.d.ts +2 -0
  229. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.d.ts.map +1 -1
  230. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.js +17 -4
  231. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.js.map +1 -1
  232. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.d.ts +2 -0
  233. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.d.ts.map +1 -1
  234. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.js +40 -20
  235. package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.js.map +1 -1
  236. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.d.ts.map +1 -1
  237. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.js +14 -0
  238. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.js.map +1 -1
  239. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.d.ts +6 -0
  240. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.d.ts.map +1 -1
  241. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.js +56 -9
  242. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.js.map +1 -1
  243. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.d.ts.map +1 -1
  244. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.js +6 -3
  245. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.js.map +1 -1
  246. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.d.ts +4 -0
  247. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.d.ts.map +1 -1
  248. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.js +27 -9
  249. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.js.map +1 -1
  250. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.d.ts +8 -0
  251. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.d.ts.map +1 -1
  252. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.js +49 -5
  253. package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.js.map +1 -1
  254. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.d.ts +1 -1
  255. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.d.ts.map +1 -1
  256. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.js +90 -21
  257. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.js.map +1 -1
  258. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.d.ts +3 -1
  259. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.d.ts.map +1 -1
  260. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.js +185 -38
  261. package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.js.map +1 -1
  262. package/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.d.ts.map +1 -1
  263. package/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.js +59 -6
  264. package/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.js.map +1 -1
  265. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.d.ts +2 -0
  266. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.d.ts.map +1 -1
  267. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.js +89 -39
  268. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.js.map +1 -1
  269. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.d.ts +10 -0
  270. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.d.ts.map +1 -1
  271. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.js +230 -28
  272. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.js.map +1 -1
  273. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.d.ts +2 -1
  274. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.d.ts.map +1 -1
  275. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js +265 -96
  276. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js.map +1 -1
  277. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.d.ts +3 -1
  278. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.d.ts.map +1 -1
  279. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js +240 -87
  280. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js.map +1 -1
  281. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts +3 -0
  282. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts.map +1 -1
  283. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js +121 -35
  284. package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js.map +1 -1
  285. package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.d.ts +8 -0
  286. package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.d.ts.map +1 -1
  287. package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.js +6 -3
  288. package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.js.map +1 -1
  289. package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.d.ts.map +1 -1
  290. package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.js.map +1 -1
  291. package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.d.ts.map +1 -1
  292. package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.js.map +1 -1
  293. package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.d.ts.map +1 -1
  294. package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.js.map +1 -1
  295. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.d.ts.map +1 -1
  296. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js +1 -7
  297. package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js.map +1 -1
  298. package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.d.ts.map +1 -1
  299. package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.js +1 -7
  300. package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.js.map +1 -1
  301. package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.d.ts.map +1 -1
  302. package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js +1 -7
  303. package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js.map +1 -1
  304. package/out/src/services/chaintracker/chaintracks/index.all.d.ts +3 -0
  305. package/out/src/services/chaintracker/chaintracks/index.all.d.ts.map +1 -1
  306. package/out/src/services/chaintracker/chaintracks/index.all.js +3 -0
  307. package/out/src/services/chaintracker/chaintracks/index.all.js.map +1 -1
  308. package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts +5 -0
  309. package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts.map +1 -1
  310. package/out/src/services/chaintracker/chaintracks/index.mobile.js +5 -0
  311. package/out/src/services/chaintracker/chaintracks/index.mobile.js.map +1 -1
  312. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.d.ts +51 -0
  313. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.d.ts.map +1 -0
  314. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.js +394 -0
  315. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.js.map +1 -0
  316. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts +45 -1
  317. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts.map +1 -1
  318. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js +733 -166
  319. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js.map +1 -1
  320. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataReader.d.ts.map +1 -1
  321. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataReader.js +17 -1
  322. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataReader.js.map +1 -1
  323. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.d.ts +32 -0
  324. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.d.ts.map +1 -0
  325. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.js +40 -0
  326. package/out/src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.js.map +1 -0
  327. package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.d.ts.map +1 -1
  328. package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.js +99 -30
  329. package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.js.map +1 -1
  330. package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.d.ts +3 -1
  331. package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.d.ts.map +1 -1
  332. package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.js +23 -15
  333. package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.js.map +1 -1
  334. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts +38 -4
  335. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts.map +1 -1
  336. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.js +191 -47
  337. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.js.map +1 -1
  338. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.d.ts +2 -1
  339. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.d.ts.map +1 -1
  340. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.js +57 -11
  341. package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.js.map +1 -1
  342. package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.d.ts +48 -0
  343. package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.d.ts.map +1 -0
  344. package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.js +280 -0
  345. package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.js.map +1 -0
  346. package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.d.ts +30 -0
  347. package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.d.ts.map +1 -0
  348. package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.js +57 -0
  349. package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.js.map +1 -0
  350. package/out/src/services/chaintracker/chaintracks/util/HeightRange.d.ts.map +1 -1
  351. package/out/src/services/chaintracker/chaintracks/util/HeightRange.js.map +1 -1
  352. package/out/src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.d.ts +14 -0
  353. package/out/src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.d.ts.map +1 -0
  354. package/out/src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.js +148 -0
  355. package/out/src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.js.map +1 -0
  356. package/out/src/services/chaintracker/chaintracks/util/NodeBulkFileDataValidator.d.ts +41 -0
  357. package/out/src/services/chaintracker/chaintracks/util/NodeBulkFileDataValidator.d.ts.map +1 -0
  358. package/out/src/services/chaintracker/chaintracks/util/NodeBulkFileDataValidator.js +271 -0
  359. package/out/src/services/chaintracker/chaintracks/util/NodeBulkFileDataValidator.js.map +1 -0
  360. package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.d.ts +3 -0
  361. package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.d.ts.map +1 -1
  362. package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.js +15 -0
  363. package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.js.map +1 -1
  364. package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.d.ts +17 -4
  365. package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.d.ts.map +1 -1
  366. package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.js +362 -105
  367. package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.js.map +1 -1
  368. package/out/src/services/chaintracker/chaintracks/util/safeDiagnostic.d.ts +4 -0
  369. package/out/src/services/chaintracker/chaintracks/util/safeDiagnostic.d.ts.map +1 -0
  370. package/out/src/services/chaintracker/chaintracks/util/safeDiagnostic.js +33 -0
  371. package/out/src/services/chaintracker/chaintracks/util/safeDiagnostic.js.map +1 -0
  372. package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.d.ts.map +1 -1
  373. package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js.map +1 -1
  374. package/out/src/services/chaintracker/index.all.d.ts +1 -0
  375. package/out/src/services/chaintracker/index.all.d.ts.map +1 -1
  376. package/out/src/services/chaintracker/index.all.js +1 -0
  377. package/out/src/services/chaintracker/index.all.js.map +1 -1
  378. package/out/src/services/chaintracker/index.client.d.ts +1 -0
  379. package/out/src/services/chaintracker/index.client.d.ts.map +1 -1
  380. package/out/src/services/chaintracker/index.client.js +1 -0
  381. package/out/src/services/chaintracker/index.client.js.map +1 -1
  382. package/out/src/services/chaintracker/index.mobile.d.ts +1 -0
  383. package/out/src/services/chaintracker/index.mobile.d.ts.map +1 -1
  384. package/out/src/services/chaintracker/index.mobile.js +1 -0
  385. package/out/src/services/chaintracker/index.mobile.js.map +1 -1
  386. package/out/src/services/classifyOutputUtxo.d.ts +25 -0
  387. package/out/src/services/classifyOutputUtxo.d.ts.map +1 -0
  388. package/out/src/services/classifyOutputUtxo.js +96 -0
  389. package/out/src/services/classifyOutputUtxo.js.map +1 -0
  390. package/out/src/services/createDefaultWalletServicesOptions.d.ts +16 -3
  391. package/out/src/services/createDefaultWalletServicesOptions.d.ts.map +1 -1
  392. package/out/src/services/createDefaultWalletServicesOptions.js +38 -8
  393. package/out/src/services/createDefaultWalletServicesOptions.js.map +1 -1
  394. package/out/src/services/fiatRateValidation.d.ts +12 -0
  395. package/out/src/services/fiatRateValidation.d.ts.map +1 -0
  396. package/out/src/services/fiatRateValidation.js +138 -0
  397. package/out/src/services/fiatRateValidation.js.map +1 -0
  398. package/out/src/services/getCanonicalMerklePath.d.ts +15 -0
  399. package/out/src/services/getCanonicalMerklePath.d.ts.map +1 -0
  400. package/out/src/services/getCanonicalMerklePath.js +90 -0
  401. package/out/src/services/getCanonicalMerklePath.js.map +1 -0
  402. package/out/src/services/providers/ARC.d.ts +3 -16
  403. package/out/src/services/providers/ARC.d.ts.map +1 -1
  404. package/out/src/services/providers/ARC.js +36 -37
  405. package/out/src/services/providers/ARC.js.map +1 -1
  406. package/out/src/services/providers/ArcSSEClient.d.ts +38 -23
  407. package/out/src/services/providers/ArcSSEClient.d.ts.map +1 -1
  408. package/out/src/services/providers/ArcSSEClient.js +384 -63
  409. package/out/src/services/providers/ArcSSEClient.js.map +1 -1
  410. package/out/src/services/providers/Arcade.d.ts +11 -1
  411. package/out/src/services/providers/Arcade.d.ts.map +1 -1
  412. package/out/src/services/providers/Arcade.js +111 -33
  413. package/out/src/services/providers/Arcade.js.map +1 -1
  414. package/out/src/services/providers/Bitails.d.ts +3 -0
  415. package/out/src/services/providers/Bitails.d.ts.map +1 -1
  416. package/out/src/services/providers/Bitails.js +79 -12
  417. package/out/src/services/providers/Bitails.js.map +1 -1
  418. package/out/src/services/providers/SdkWhatsOnChain.d.ts +8 -2
  419. package/out/src/services/providers/SdkWhatsOnChain.d.ts.map +1 -1
  420. package/out/src/services/providers/SdkWhatsOnChain.js +83 -10
  421. package/out/src/services/providers/SdkWhatsOnChain.js.map +1 -1
  422. package/out/src/services/providers/WhatsOnChain.d.ts +3 -0
  423. package/out/src/services/providers/WhatsOnChain.d.ts.map +1 -1
  424. package/out/src/services/providers/WhatsOnChain.js +221 -69
  425. package/out/src/services/providers/WhatsOnChain.js.map +1 -1
  426. package/out/src/services/providers/arcProviderConfig.d.ts +27 -0
  427. package/out/src/services/providers/arcProviderConfig.d.ts.map +1 -0
  428. package/out/src/services/providers/arcProviderConfig.js +83 -0
  429. package/out/src/services/providers/arcProviderConfig.js.map +1 -0
  430. package/out/src/services/providers/arcTxDataValidation.d.ts +4 -0
  431. package/out/src/services/providers/arcTxDataValidation.d.ts.map +1 -0
  432. package/out/src/services/providers/arcTxDataValidation.js +92 -0
  433. package/out/src/services/providers/arcTxDataValidation.js.map +1 -0
  434. package/out/src/services/providers/arcadeStatus.d.ts +18 -0
  435. package/out/src/services/providers/arcadeStatus.d.ts.map +1 -0
  436. package/out/src/services/providers/arcadeStatus.js +56 -0
  437. package/out/src/services/providers/arcadeStatus.js.map +1 -0
  438. package/out/src/services/providers/exchangeRates.d.ts +3 -3
  439. package/out/src/services/providers/exchangeRates.d.ts.map +1 -1
  440. package/out/src/services/providers/exchangeRates.js +153 -226
  441. package/out/src/services/providers/exchangeRates.js.map +1 -1
  442. package/out/src/services/providers/getBeefForTxid.d.ts.map +1 -1
  443. package/out/src/services/providers/getBeefForTxid.js.map +1 -1
  444. package/out/src/services/providers/whatsOnChainHelpers.d.ts +2 -2
  445. package/out/src/services/providers/whatsOnChainHelpers.d.ts.map +1 -1
  446. package/out/src/services/providers/whatsOnChainHelpers.js +11 -8
  447. package/out/src/services/providers/whatsOnChainHelpers.js.map +1 -1
  448. package/out/src/services/validateMerklePathResult.d.ts +30 -0
  449. package/out/src/services/validateMerklePathResult.d.ts.map +1 -0
  450. package/out/src/services/validateMerklePathResult.js +272 -0
  451. package/out/src/services/validateMerklePathResult.js.map +1 -0
  452. package/out/src/services/validatePostBeefResult.d.ts +17 -0
  453. package/out/src/services/validatePostBeefResult.d.ts.map +1 -0
  454. package/out/src/services/validatePostBeefResult.js +334 -0
  455. package/out/src/services/validatePostBeefResult.js.map +1 -0
  456. package/out/src/services/validateRawTxResult.d.ts +6 -0
  457. package/out/src/services/validateRawTxResult.d.ts.map +1 -0
  458. package/out/src/services/validateRawTxResult.js +77 -0
  459. package/out/src/services/validateRawTxResult.js.map +1 -0
  460. package/out/src/services/validateScriptHashHistoryResult.d.ts +5 -0
  461. package/out/src/services/validateScriptHashHistoryResult.d.ts.map +1 -0
  462. package/out/src/services/validateScriptHashHistoryResult.js +99 -0
  463. package/out/src/services/validateScriptHashHistoryResult.js.map +1 -0
  464. package/out/src/services/validateStatusForTxidsResult.d.ts +8 -0
  465. package/out/src/services/validateStatusForTxidsResult.d.ts.map +1 -0
  466. package/out/src/services/validateStatusForTxidsResult.js +181 -0
  467. package/out/src/services/validateStatusForTxidsResult.js.map +1 -0
  468. package/out/src/services/validateUtxoStatusResult.d.ts +6 -0
  469. package/out/src/services/validateUtxoStatusResult.d.ts.map +1 -0
  470. package/out/src/services/validateUtxoStatusResult.js +126 -0
  471. package/out/src/services/validateUtxoStatusResult.js.map +1 -0
  472. package/out/src/signer/actionBatch/ActionBatchPlanner.d.ts +3 -2
  473. package/out/src/signer/actionBatch/ActionBatchPlanner.d.ts.map +1 -1
  474. package/out/src/signer/actionBatch/ActionBatchPlanner.js +29 -6
  475. package/out/src/signer/actionBatch/ActionBatchPlanner.js.map +1 -1
  476. package/out/src/signer/actionBatch/ActionBatchWorkspace.d.ts +8 -5
  477. package/out/src/signer/actionBatch/ActionBatchWorkspace.d.ts.map +1 -1
  478. package/out/src/signer/actionBatch/ActionBatchWorkspace.js +186 -73
  479. package/out/src/signer/actionBatch/ActionBatchWorkspace.js.map +1 -1
  480. package/out/src/signer/actionBatch/actionBatchBootstrap.d.ts +2 -2
  481. package/out/src/signer/actionBatch/actionBatchBootstrap.d.ts.map +1 -1
  482. package/out/src/signer/actionBatch/actionBatchBootstrap.js +3 -3
  483. package/out/src/signer/actionBatch/actionBatchBootstrap.js.map +1 -1
  484. package/out/src/signer/methods/acquireDirectCertificate.d.ts +3 -2
  485. package/out/src/signer/methods/acquireDirectCertificate.d.ts.map +1 -1
  486. package/out/src/signer/methods/acquireDirectCertificate.js.map +1 -1
  487. package/out/src/signer/methods/buildSignableTransaction.d.ts +6 -5
  488. package/out/src/signer/methods/buildSignableTransaction.d.ts.map +1 -1
  489. package/out/src/signer/methods/buildSignableTransaction.js +6 -11
  490. package/out/src/signer/methods/buildSignableTransaction.js.map +1 -1
  491. package/out/src/signer/methods/createAction.d.ts +35 -3
  492. package/out/src/signer/methods/createAction.d.ts.map +1 -1
  493. package/out/src/signer/methods/createAction.js +50 -2
  494. package/out/src/signer/methods/createAction.js.map +1 -1
  495. package/out/src/signer/methods/createNoSendExpiryAction.d.ts +7 -0
  496. package/out/src/signer/methods/createNoSendExpiryAction.d.ts.map +1 -0
  497. package/out/src/signer/methods/createNoSendExpiryAction.js +254 -0
  498. package/out/src/signer/methods/createNoSendExpiryAction.js.map +1 -0
  499. package/out/src/signer/methods/internalizeAction.d.ts.map +1 -1
  500. package/out/src/signer/methods/internalizeAction.js +9 -5
  501. package/out/src/signer/methods/internalizeAction.js.map +1 -1
  502. package/out/src/signer/methods/proveCertificate.d.ts +3 -2
  503. package/out/src/signer/methods/proveCertificate.d.ts.map +1 -1
  504. package/out/src/signer/methods/proveCertificate.js.map +1 -1
  505. package/out/src/signer/methods/signAction.d.ts.map +1 -1
  506. package/out/src/signer/methods/signAction.js +20 -3
  507. package/out/src/signer/methods/signAction.js.map +1 -1
  508. package/out/src/signer/methods/verifyUnlockScripts.d.ts.map +1 -1
  509. package/out/src/signer/methods/verifyUnlockScripts.js +12 -17
  510. package/out/src/signer/methods/verifyUnlockScripts.js.map +1 -1
  511. package/out/src/storage/StorageIdb.d.ts +11 -3
  512. package/out/src/storage/StorageIdb.d.ts.map +1 -1
  513. package/out/src/storage/StorageIdb.js +134 -44
  514. package/out/src/storage/StorageIdb.js.map +1 -1
  515. package/out/src/storage/StorageKnex.d.ts +68 -7
  516. package/out/src/storage/StorageKnex.d.ts.map +1 -1
  517. package/out/src/storage/StorageKnex.js +551 -105
  518. package/out/src/storage/StorageKnex.js.map +1 -1
  519. package/out/src/storage/StorageProvider.d.ts +41 -10
  520. package/out/src/storage/StorageProvider.d.ts.map +1 -1
  521. package/out/src/storage/StorageProvider.js +397 -107
  522. package/out/src/storage/StorageProvider.js.map +1 -1
  523. package/out/src/storage/StorageReader.d.ts +9 -3
  524. package/out/src/storage/StorageReader.d.ts.map +1 -1
  525. package/out/src/storage/StorageReader.js +21 -43
  526. package/out/src/storage/StorageReader.js.map +1 -1
  527. package/out/src/storage/StorageReaderWriter.d.ts +4 -0
  528. package/out/src/storage/StorageReaderWriter.d.ts.map +1 -1
  529. package/out/src/storage/StorageReaderWriter.js +68 -38
  530. package/out/src/storage/StorageReaderWriter.js.map +1 -1
  531. package/out/src/storage/StorageSyncReader.d.ts +1 -1
  532. package/out/src/storage/StorageSyncReader.d.ts.map +1 -1
  533. package/out/src/storage/StorageSyncReader.js +3 -36
  534. package/out/src/storage/StorageSyncReader.js.map +1 -1
  535. package/out/src/storage/WalletStorageManager.d.ts +31 -6
  536. package/out/src/storage/WalletStorageManager.d.ts.map +1 -1
  537. package/out/src/storage/WalletStorageManager.js +166 -75
  538. package/out/src/storage/WalletStorageManager.js.map +1 -1
  539. package/out/src/storage/adminServer/adminServer.d.ts +3 -1
  540. package/out/src/storage/adminServer/adminServer.d.ts.map +1 -1
  541. package/out/src/storage/adminServer/adminServer.js +38 -49
  542. package/out/src/storage/adminServer/adminServer.js.map +1 -1
  543. package/out/src/storage/adminServer/adminUi.d.ts.map +1 -1
  544. package/out/src/storage/adminServer/adminUi.js +32 -9
  545. package/out/src/storage/adminServer/adminUi.js.map +1 -1
  546. package/out/src/storage/adminServer/reviewUtxos.d.ts +27 -0
  547. package/out/src/storage/adminServer/reviewUtxos.d.ts.map +1 -0
  548. package/out/src/storage/adminServer/reviewUtxos.js +62 -0
  549. package/out/src/storage/adminServer/reviewUtxos.js.map +1 -0
  550. package/out/src/storage/idbHelpers.d.ts.map +1 -1
  551. package/out/src/storage/idbHelpers.js +14 -2
  552. package/out/src/storage/idbHelpers.js.map +1 -1
  553. package/out/src/storage/index.all.d.ts +3 -0
  554. package/out/src/storage/index.all.d.ts.map +1 -1
  555. package/out/src/storage/index.all.js +3 -0
  556. package/out/src/storage/index.all.js.map +1 -1
  557. package/out/src/storage/index.client.d.ts +1 -0
  558. package/out/src/storage/index.client.d.ts.map +1 -1
  559. package/out/src/storage/index.client.js +1 -0
  560. package/out/src/storage/index.client.js.map +1 -1
  561. package/out/src/storage/index.mobile.d.ts +1 -0
  562. package/out/src/storage/index.mobile.d.ts.map +1 -1
  563. package/out/src/storage/index.mobile.js +1 -0
  564. package/out/src/storage/index.mobile.js.map +1 -1
  565. package/out/src/storage/methods/ListActionsSpecOp.d.ts +2 -2
  566. package/out/src/storage/methods/ListActionsSpecOp.d.ts.map +1 -1
  567. package/out/src/storage/methods/ListActionsSpecOp.js.map +1 -1
  568. package/out/src/storage/methods/ListOutputsSpecOp.d.ts +7 -4
  569. package/out/src/storage/methods/ListOutputsSpecOp.d.ts.map +1 -1
  570. package/out/src/storage/methods/ListOutputsSpecOp.js +5 -44
  571. package/out/src/storage/methods/ListOutputsSpecOp.js.map +1 -1
  572. package/out/src/storage/methods/actionBatch.d.ts +9 -2
  573. package/out/src/storage/methods/actionBatch.d.ts.map +1 -1
  574. package/out/src/storage/methods/actionBatch.js +260 -67
  575. package/out/src/storage/methods/actionBatch.js.map +1 -1
  576. package/out/src/storage/methods/actionBatchBlobs.d.ts +2 -0
  577. package/out/src/storage/methods/actionBatchBlobs.d.ts.map +1 -1
  578. package/out/src/storage/methods/actionBatchBlobs.js +47 -26
  579. package/out/src/storage/methods/actionBatchBlobs.js.map +1 -1
  580. package/out/src/storage/methods/actionBatchValidation.d.ts.map +1 -1
  581. package/out/src/storage/methods/actionBatchValidation.js +22 -30
  582. package/out/src/storage/methods/actionBatchValidation.js.map +1 -1
  583. package/out/src/storage/methods/attemptToPostReqsToNetwork.d.ts +7 -2
  584. package/out/src/storage/methods/attemptToPostReqsToNetwork.d.ts.map +1 -1
  585. package/out/src/storage/methods/attemptToPostReqsToNetwork.js +59 -110
  586. package/out/src/storage/methods/attemptToPostReqsToNetwork.js.map +1 -1
  587. package/out/src/storage/methods/availableManagedChange.d.ts +8 -1
  588. package/out/src/storage/methods/availableManagedChange.d.ts.map +1 -1
  589. package/out/src/storage/methods/availableManagedChange.js.map +1 -1
  590. package/out/src/storage/methods/createAction.d.ts +60 -3
  591. package/out/src/storage/methods/createAction.d.ts.map +1 -1
  592. package/out/src/storage/methods/createAction.js +396 -106
  593. package/out/src/storage/methods/createAction.js.map +1 -1
  594. package/out/src/storage/methods/generateChange.d.ts +21 -5
  595. package/out/src/storage/methods/generateChange.d.ts.map +1 -1
  596. package/out/src/storage/methods/generateChange.js +194 -27
  597. package/out/src/storage/methods/generateChange.js.map +1 -1
  598. package/out/src/storage/methods/getBeefForTransaction.js +5 -7
  599. package/out/src/storage/methods/getBeefForTransaction.js.map +1 -1
  600. package/out/src/storage/methods/getSyncChunk.d.ts.map +1 -1
  601. package/out/src/storage/methods/getSyncChunk.js +42 -11
  602. package/out/src/storage/methods/getSyncChunk.js.map +1 -1
  603. package/out/src/storage/methods/internalizeAction.d.ts +3 -3
  604. package/out/src/storage/methods/internalizeAction.d.ts.map +1 -1
  605. package/out/src/storage/methods/internalizeAction.js +171 -133
  606. package/out/src/storage/methods/internalizeAction.js.map +1 -1
  607. package/out/src/storage/methods/listActionsIdb.d.ts +3 -2
  608. package/out/src/storage/methods/listActionsIdb.d.ts.map +1 -1
  609. package/out/src/storage/methods/listActionsIdb.js +2 -2
  610. package/out/src/storage/methods/listActionsIdb.js.map +1 -1
  611. package/out/src/storage/methods/listActionsKnex.d.ts +3 -2
  612. package/out/src/storage/methods/listActionsKnex.d.ts.map +1 -1
  613. package/out/src/storage/methods/listActionsKnex.js +22 -11
  614. package/out/src/storage/methods/listActionsKnex.js.map +1 -1
  615. package/out/src/storage/methods/listCertificates.d.ts +3 -2
  616. package/out/src/storage/methods/listCertificates.d.ts.map +1 -1
  617. package/out/src/storage/methods/listCertificates.js.map +1 -1
  618. package/out/src/storage/methods/listOutputsIdb.d.ts +3 -2
  619. package/out/src/storage/methods/listOutputsIdb.d.ts.map +1 -1
  620. package/out/src/storage/methods/listOutputsIdb.js +25 -18
  621. package/out/src/storage/methods/listOutputsIdb.js.map +1 -1
  622. package/out/src/storage/methods/listOutputsKnex.d.ts +3 -2
  623. package/out/src/storage/methods/listOutputsKnex.d.ts.map +1 -1
  624. package/out/src/storage/methods/listOutputsKnex.js +33 -31
  625. package/out/src/storage/methods/listOutputsKnex.js.map +1 -1
  626. package/out/src/storage/methods/managedChangePolicy.d.ts +44 -0
  627. package/out/src/storage/methods/managedChangePolicy.d.ts.map +1 -0
  628. package/out/src/storage/methods/managedChangePolicy.js +58 -0
  629. package/out/src/storage/methods/managedChangePolicy.js.map +1 -0
  630. package/out/src/storage/methods/maxPossibleSatoshis.d.ts +13 -0
  631. package/out/src/storage/methods/maxPossibleSatoshis.d.ts.map +1 -0
  632. package/out/src/storage/methods/maxPossibleSatoshis.js +16 -0
  633. package/out/src/storage/methods/maxPossibleSatoshis.js.map +1 -0
  634. package/out/src/storage/methods/noSendExpiry.d.ts +11 -0
  635. package/out/src/storage/methods/noSendExpiry.d.ts.map +1 -0
  636. package/out/src/storage/methods/noSendExpiry.js +369 -0
  637. package/out/src/storage/methods/noSendExpiry.js.map +1 -0
  638. package/out/src/storage/methods/noSendExpiryLifecycle.d.ts +14 -0
  639. package/out/src/storage/methods/noSendExpiryLifecycle.d.ts.map +1 -0
  640. package/out/src/storage/methods/noSendExpiryLifecycle.js +691 -0
  641. package/out/src/storage/methods/noSendExpiryLifecycle.js.map +1 -0
  642. package/out/src/storage/methods/preparedBeef.d.ts +104 -0
  643. package/out/src/storage/methods/preparedBeef.d.ts.map +1 -0
  644. package/out/src/storage/methods/preparedBeef.js +524 -0
  645. package/out/src/storage/methods/preparedBeef.js.map +1 -0
  646. package/out/src/storage/methods/processAction.d.ts.map +1 -1
  647. package/out/src/storage/methods/processAction.js +144 -32
  648. package/out/src/storage/methods/processAction.js.map +1 -1
  649. package/out/src/storage/methods/purgeData.d.ts.map +1 -1
  650. package/out/src/storage/methods/purgeData.js +21 -3
  651. package/out/src/storage/methods/purgeData.js.map +1 -1
  652. package/out/src/storage/methods/reconcileFailedTransactionInputs.d.ts +32 -0
  653. package/out/src/storage/methods/reconcileFailedTransactionInputs.d.ts.map +1 -0
  654. package/out/src/storage/methods/reconcileFailedTransactionInputs.js +142 -0
  655. package/out/src/storage/methods/reconcileFailedTransactionInputs.js.map +1 -0
  656. package/out/src/storage/methods/reviewStatus.d.ts.map +1 -1
  657. package/out/src/storage/methods/reviewStatus.js +7 -4
  658. package/out/src/storage/methods/reviewStatus.js.map +1 -1
  659. package/out/src/storage/methods/reviewStatusIdb.d.ts +1 -1
  660. package/out/src/storage/methods/reviewStatusIdb.d.ts.map +1 -1
  661. package/out/src/storage/methods/reviewStatusIdb.js.map +1 -1
  662. package/out/src/storage/methods/reviewUtxoOutputs.d.ts +38 -0
  663. package/out/src/storage/methods/reviewUtxoOutputs.d.ts.map +1 -0
  664. package/out/src/storage/methods/reviewUtxoOutputs.js +197 -0
  665. package/out/src/storage/methods/reviewUtxoOutputs.js.map +1 -0
  666. package/out/src/storage/methods/validateSyncProof.d.ts +32 -0
  667. package/out/src/storage/methods/validateSyncProof.d.ts.map +1 -0
  668. package/out/src/storage/methods/validateSyncProof.js +139 -0
  669. package/out/src/storage/methods/validateSyncProof.js.map +1 -0
  670. package/out/src/storage/portable/index.d.ts.map +1 -1
  671. package/out/src/storage/portable/index.js +25 -15
  672. package/out/src/storage/portable/index.js.map +1 -1
  673. package/out/src/storage/remoting/BinaryJson.d.ts +11 -0
  674. package/out/src/storage/remoting/BinaryJson.d.ts.map +1 -1
  675. package/out/src/storage/remoting/BinaryJson.js +94 -8
  676. package/out/src/storage/remoting/BinaryJson.js.map +1 -1
  677. package/out/src/storage/remoting/KnexPaymentReplayStore.d.ts.map +1 -1
  678. package/out/src/storage/remoting/KnexPaymentReplayStore.js +1 -0
  679. package/out/src/storage/remoting/KnexPaymentReplayStore.js.map +1 -1
  680. package/out/src/storage/remoting/KnexSessionManager.d.ts +26 -2
  681. package/out/src/storage/remoting/KnexSessionManager.d.ts.map +1 -1
  682. package/out/src/storage/remoting/KnexSessionManager.js +221 -40
  683. package/out/src/storage/remoting/KnexSessionManager.js.map +1 -1
  684. package/out/src/storage/remoting/KnexSyncTransferStore.d.ts +26 -0
  685. package/out/src/storage/remoting/KnexSyncTransferStore.d.ts.map +1 -0
  686. package/out/src/storage/remoting/KnexSyncTransferStore.js +222 -0
  687. package/out/src/storage/remoting/KnexSyncTransferStore.js.map +1 -0
  688. package/out/src/storage/remoting/StorageClient.d.ts +6 -1
  689. package/out/src/storage/remoting/StorageClient.d.ts.map +1 -1
  690. package/out/src/storage/remoting/StorageClient.js +65 -8
  691. package/out/src/storage/remoting/StorageClient.js.map +1 -1
  692. package/out/src/storage/remoting/StorageClientBase.d.ts +57 -10
  693. package/out/src/storage/remoting/StorageClientBase.d.ts.map +1 -1
  694. package/out/src/storage/remoting/StorageClientBase.js +382 -10
  695. package/out/src/storage/remoting/StorageClientBase.js.map +1 -1
  696. package/out/src/storage/remoting/StorageMobile.d.ts +5 -0
  697. package/out/src/storage/remoting/StorageMobile.d.ts.map +1 -1
  698. package/out/src/storage/remoting/StorageMobile.js +13 -11
  699. package/out/src/storage/remoting/StorageMobile.js.map +1 -1
  700. package/out/src/storage/remoting/StorageServer.d.ts +10 -1
  701. package/out/src/storage/remoting/StorageServer.d.ts.map +1 -1
  702. package/out/src/storage/remoting/StorageServer.js +232 -20
  703. package/out/src/storage/remoting/StorageServer.js.map +1 -1
  704. package/out/src/storage/remoting/SyncTransfer.d.ts +29 -0
  705. package/out/src/storage/remoting/SyncTransfer.d.ts.map +1 -0
  706. package/out/src/storage/remoting/SyncTransfer.js +153 -0
  707. package/out/src/storage/remoting/SyncTransfer.js.map +1 -0
  708. package/out/src/storage/remoting/entityValidationHelpers.d.ts.map +1 -1
  709. package/out/src/storage/remoting/entityValidationHelpers.js +35 -0
  710. package/out/src/storage/remoting/entityValidationHelpers.js.map +1 -1
  711. package/out/src/storage/remoting/syncChunkBinary.d.ts +14 -0
  712. package/out/src/storage/remoting/syncChunkBinary.d.ts.map +1 -0
  713. package/out/src/storage/remoting/syncChunkBinary.js +42 -0
  714. package/out/src/storage/remoting/syncChunkBinary.js.map +1 -0
  715. package/out/src/storage/remoting/validateRpcSyncProofs.d.ts +5 -0
  716. package/out/src/storage/remoting/validateRpcSyncProofs.d.ts.map +1 -0
  717. package/out/src/storage/remoting/validateRpcSyncProofs.js +82 -0
  718. package/out/src/storage/remoting/validateRpcSyncProofs.js.map +1 -0
  719. package/out/src/storage/schema/KnexMigrations.d.ts +6 -0
  720. package/out/src/storage/schema/KnexMigrations.d.ts.map +1 -1
  721. package/out/src/storage/schema/KnexMigrations.js +194 -5
  722. package/out/src/storage/schema/KnexMigrations.js.map +1 -1
  723. package/out/src/storage/schema/StorageIdbSchema.d.ts +3 -0
  724. package/out/src/storage/schema/StorageIdbSchema.d.ts.map +1 -1
  725. package/out/src/storage/schema/entities/EntityOutput.d.ts.map +1 -1
  726. package/out/src/storage/schema/entities/EntityOutput.js +24 -4
  727. package/out/src/storage/schema/entities/EntityOutput.js.map +1 -1
  728. package/out/src/storage/schema/entities/EntityOutputBasket.d.ts.map +1 -1
  729. package/out/src/storage/schema/entities/EntityOutputBasket.js +5 -2
  730. package/out/src/storage/schema/entities/EntityOutputBasket.js.map +1 -1
  731. package/out/src/storage/schema/entities/EntityProvenTx.d.ts +4 -1
  732. package/out/src/storage/schema/entities/EntityProvenTx.d.ts.map +1 -1
  733. package/out/src/storage/schema/entities/EntityProvenTx.js +125 -41
  734. package/out/src/storage/schema/entities/EntityProvenTx.js.map +1 -1
  735. package/out/src/storage/schema/entities/EntityProvenTxReq.js +1 -1
  736. package/out/src/storage/schema/entities/EntityProvenTxReq.js.map +1 -1
  737. package/out/src/storage/schema/entities/EntitySyncState.d.ts +4 -2
  738. package/out/src/storage/schema/entities/EntitySyncState.d.ts.map +1 -1
  739. package/out/src/storage/schema/entities/EntitySyncState.js +12 -6
  740. package/out/src/storage/schema/entities/EntitySyncState.js.map +1 -1
  741. package/out/src/storage/schema/entities/EntityTransaction.d.ts +26 -0
  742. package/out/src/storage/schema/entities/EntityTransaction.d.ts.map +1 -1
  743. package/out/src/storage/schema/entities/EntityTransaction.js +221 -21
  744. package/out/src/storage/schema/entities/EntityTransaction.js.map +1 -1
  745. package/out/src/storage/schema/tables/TableCertificate.d.ts +1 -1
  746. package/out/src/storage/schema/tables/TableCertificate.d.ts.map +1 -1
  747. package/out/src/storage/schema/tables/TableCertificateField.d.ts +1 -1
  748. package/out/src/storage/schema/tables/TableCertificateField.d.ts.map +1 -1
  749. package/out/src/storage/schema/tables/TableCommission.d.ts +1 -1
  750. package/out/src/storage/schema/tables/TableCommission.d.ts.map +1 -1
  751. package/out/src/storage/schema/tables/TableMonitorEvent.d.ts +1 -1
  752. package/out/src/storage/schema/tables/TableMonitorEvent.d.ts.map +1 -1
  753. package/out/src/storage/schema/tables/TableOutput.d.ts +1 -1
  754. package/out/src/storage/schema/tables/TableOutput.d.ts.map +1 -1
  755. package/out/src/storage/schema/tables/TableOutputBasket.d.ts +1 -1
  756. package/out/src/storage/schema/tables/TableOutputBasket.d.ts.map +1 -1
  757. package/out/src/storage/schema/tables/TableOutputTag.d.ts +1 -1
  758. package/out/src/storage/schema/tables/TableOutputTag.d.ts.map +1 -1
  759. package/out/src/storage/schema/tables/TableOutputTagMap.d.ts +1 -1
  760. package/out/src/storage/schema/tables/TableOutputTagMap.d.ts.map +1 -1
  761. package/out/src/storage/schema/tables/TablePreparedBeef.interfaces.d.ts +23 -0
  762. package/out/src/storage/schema/tables/TablePreparedBeef.interfaces.d.ts.map +1 -0
  763. package/out/src/storage/schema/tables/TablePreparedBeef.interfaces.js +3 -0
  764. package/out/src/storage/schema/tables/TablePreparedBeef.interfaces.js.map +1 -0
  765. package/out/src/storage/schema/tables/TableProvenTx.d.ts +1 -1
  766. package/out/src/storage/schema/tables/TableProvenTx.d.ts.map +1 -1
  767. package/out/src/storage/schema/tables/TableProvenTxReq.d.ts +1 -1
  768. package/out/src/storage/schema/tables/TableProvenTxReq.d.ts.map +1 -1
  769. package/out/src/storage/schema/tables/TableSettings.d.ts +2 -2
  770. package/out/src/storage/schema/tables/TableSettings.d.ts.map +1 -1
  771. package/out/src/storage/schema/tables/TableSyncState.d.ts +1 -1
  772. package/out/src/storage/schema/tables/TableSyncState.d.ts.map +1 -1
  773. package/out/src/storage/schema/tables/TableTransaction.d.ts +17 -1
  774. package/out/src/storage/schema/tables/TableTransaction.d.ts.map +1 -1
  775. package/out/src/storage/schema/tables/TableTransaction.js +14 -1
  776. package/out/src/storage/schema/tables/TableTransaction.js.map +1 -1
  777. package/out/src/storage/schema/tables/TableTxLabel.d.ts +1 -1
  778. package/out/src/storage/schema/tables/TableTxLabel.d.ts.map +1 -1
  779. package/out/src/storage/schema/tables/TableTxLabelMap.d.ts +1 -1
  780. package/out/src/storage/schema/tables/TableTxLabelMap.d.ts.map +1 -1
  781. package/out/src/storage/schema/tables/TableUser.d.ts +1 -1
  782. package/out/src/storage/schema/tables/TableUser.d.ts.map +1 -1
  783. package/out/src/storage/sync/StorageMySQLDojoReader.d.ts.map +1 -1
  784. package/out/src/storage/sync/StorageMySQLDojoReader.js +8 -7
  785. package/out/src/storage/sync/StorageMySQLDojoReader.js.map +1 -1
  786. package/out/src/storage/sync/SyncPageBudget.d.ts +8 -0
  787. package/out/src/storage/sync/SyncPageBudget.d.ts.map +1 -0
  788. package/out/src/storage/sync/SyncPageBudget.js +24 -0
  789. package/out/src/storage/sync/SyncPageBudget.js.map +1 -0
  790. package/out/src/storage/sync/syncCheckpoint.d.ts +4 -0
  791. package/out/src/storage/sync/syncCheckpoint.d.ts.map +1 -0
  792. package/out/src/storage/sync/syncCheckpoint.js +49 -0
  793. package/out/src/storage/sync/syncCheckpoint.js.map +1 -0
  794. package/out/src/utility/Argon2idBackend.d.ts +36 -0
  795. package/out/src/utility/Argon2idBackend.d.ts.map +1 -0
  796. package/out/src/utility/Argon2idBackend.js +60 -0
  797. package/out/src/utility/Argon2idBackend.js.map +1 -0
  798. package/out/src/utility/actionBatchDigest.d.ts.map +1 -1
  799. package/out/src/utility/actionBatchDigest.js +9 -7
  800. package/out/src/utility/actionBatchDigest.js.map +1 -1
  801. package/out/src/utility/actionBatchPack.d.ts.map +1 -1
  802. package/out/src/utility/actionBatchPack.js +7 -12
  803. package/out/src/utility/actionBatchPack.js.map +1 -1
  804. package/out/src/utility/beefForTxids.d.ts +12 -3
  805. package/out/src/utility/beefForTxids.d.ts.map +1 -1
  806. package/out/src/utility/beefForTxids.js +69 -21
  807. package/out/src/utility/beefForTxids.js.map +1 -1
  808. package/out/src/utility/brc153ReferenceLabels.d.ts +16 -0
  809. package/out/src/utility/brc153ReferenceLabels.d.ts.map +1 -1
  810. package/out/src/utility/brc153ReferenceLabels.js +20 -5
  811. package/out/src/utility/brc153ReferenceLabels.js.map +1 -1
  812. package/out/src/utility/brc177NoSendExpiry.d.ts +34 -0
  813. package/out/src/utility/brc177NoSendExpiry.d.ts.map +1 -0
  814. package/out/src/utility/brc177NoSendExpiry.js +81 -0
  815. package/out/src/utility/brc177NoSendExpiry.js.map +1 -0
  816. package/out/src/utility/canonicalizeAtomicBeef.d.ts +12 -0
  817. package/out/src/utility/canonicalizeAtomicBeef.d.ts.map +1 -0
  818. package/out/src/utility/canonicalizeAtomicBeef.js +23 -0
  819. package/out/src/utility/canonicalizeAtomicBeef.js.map +1 -0
  820. package/out/src/utility/exactActionSpend.d.ts +9 -0
  821. package/out/src/utility/exactActionSpend.d.ts.map +1 -0
  822. package/out/src/utility/exactActionSpend.js +26 -0
  823. package/out/src/utility/exactActionSpend.js.map +1 -0
  824. package/out/src/utility/hashWasm.d.ts +1 -1
  825. package/out/src/utility/hashWasm.d.ts.map +1 -1
  826. package/out/src/utility/hashWasm.js +83 -1
  827. package/out/src/utility/hashWasm.js.map +1 -1
  828. package/out/src/utility/identityUtils.d.ts +44 -4
  829. package/out/src/utility/identityUtils.d.ts.map +1 -1
  830. package/out/src/utility/identityUtils.js +523 -61
  831. package/out/src/utility/identityUtils.js.map +1 -1
  832. package/out/src/utility/index.all.d.ts +2 -0
  833. package/out/src/utility/index.all.d.ts.map +1 -1
  834. package/out/src/utility/index.all.js +2 -0
  835. package/out/src/utility/index.all.js.map +1 -1
  836. package/out/src/utility/index.client.d.ts +2 -0
  837. package/out/src/utility/index.client.d.ts.map +1 -1
  838. package/out/src/utility/index.client.js +2 -0
  839. package/out/src/utility/index.client.js.map +1 -1
  840. package/out/src/utility/parseTxScriptOffsets.d.ts.map +1 -1
  841. package/out/src/utility/parseTxScriptOffsets.js +1 -19
  842. package/out/src/utility/parseTxScriptOffsets.js.map +1 -1
  843. package/out/src/utility/tscProofToMerklePath.d.ts.map +1 -1
  844. package/out/src/utility/tscProofToMerklePath.js +35 -4
  845. package/out/src/utility/tscProofToMerklePath.js.map +1 -1
  846. package/out/src/utility/utilityHelpers.d.ts +1 -1
  847. package/out/src/utility/utilityHelpers.d.ts.map +1 -1
  848. package/out/src/utility/utilityHelpers.js +10 -7
  849. package/out/src/utility/utilityHelpers.js.map +1 -1
  850. package/out/src/utility/utilityHelpers.noBuffer.d.ts.map +1 -1
  851. package/out/src/utility/utilityHelpers.noBuffer.js +6 -6
  852. package/out/src/utility/utilityHelpers.noBuffer.js.map +1 -1
  853. package/out/src/utility/verifyOverlayOutput.d.ts +12 -0
  854. package/out/src/utility/verifyOverlayOutput.d.ts.map +1 -0
  855. package/out/src/utility/verifyOverlayOutput.js +22 -0
  856. package/out/src/utility/verifyOverlayOutput.js.map +1 -0
  857. package/out/src/utility/walletResultGuards.d.ts +14 -0
  858. package/out/src/utility/walletResultGuards.d.ts.map +1 -0
  859. package/out/src/utility/walletResultGuards.js +28 -0
  860. package/out/src/utility/walletResultGuards.js.map +1 -0
  861. package/out/src/wab-client/WABClient.d.ts +4 -17
  862. package/out/src/wab-client/WABClient.d.ts.map +1 -1
  863. package/out/src/wab-client/WABClient.js +35 -12
  864. package/out/src/wab-client/WABClient.js.map +1 -1
  865. package/out/src/wab-client/WABResponseValidation.d.ts +48 -0
  866. package/out/src/wab-client/WABResponseValidation.d.ts.map +1 -0
  867. package/out/src/wab-client/WABResponseValidation.js +321 -0
  868. package/out/src/wab-client/WABResponseValidation.js.map +1 -0
  869. package/out/src/wab-client/WABTransport.d.ts +17 -23
  870. package/out/src/wab-client/WABTransport.d.ts.map +1 -1
  871. package/out/src/wab-client/WABTransport.js +130 -142
  872. package/out/src/wab-client/WABTransport.js.map +1 -1
  873. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.d.ts +8 -0
  874. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.d.ts.map +1 -1
  875. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.js +3 -2
  876. package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.js.map +1 -1
  877. package/package.json +45 -41
  878. package/docs/open-rpc/index.html +0 -46
@@ -11,12 +11,17 @@ 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");
14
15
  // Keep bulk statements below conservative SQLite/MySQL bind-parameter
15
16
  // ceilings. The surrounding transaction still makes a complete pack atomic.
16
17
  const ACTION_BATCH_BLOB_SQL_CHUNK = 500;
17
18
  const OUTPUT_INSERT_SQL_CHUNK = 500;
18
19
  class StorageKnex extends StorageProvider_1.StorageProvider {
19
20
  knex;
21
+ preparedBeefPolicy;
22
+ preparedBeefCoordinator;
23
+ preparedBeefReadSuspensions = new Set();
24
+ nextPreparedBeefReadSuspension = 0;
20
25
  querySpans = new Map();
21
26
  onQuery = (query) => {
22
27
  if (!this.telemetry.enabled || query.__knexQueryUid == null)
@@ -42,6 +47,9 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
42
47
  if (options.knex == null)
43
48
  throw new WERR_errors_1.WERR_INVALID_PARAMETER('options.knex', 'valid');
44
49
  this.knex = options.knex;
50
+ parsePostgresInt8AsNumber(this.knex);
51
+ this.preparedBeefPolicy = (0, preparedBeef_1.validatePreparedBeefPolicy)(options.preparedBeef);
52
+ this.preparedBeefCoordinator = new preparedBeef_1.PreparedBeefCoordinator(this);
45
53
  if (this.telemetry.enabled) {
46
54
  this.knex.on('query', this.onQuery);
47
55
  this.knex.on('query-response', this.onQueryResponse);
@@ -67,10 +75,26 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
67
75
  this.querySpans.delete(query.__knexQueryUid);
68
76
  span.end(error == null ? {} : { status: 'error', error });
69
77
  }
70
- supportsActionBatchPersistence() { return true; }
71
- requiresActionBatchCleanupBeforeCreateAction() { return false; }
72
- async readSettings() {
73
- return this.validateEntity((0, utilityHelpers_1.verifyOne)(await this.toDb()('settings')));
78
+ supportsActionBatchPersistence() {
79
+ return true;
80
+ }
81
+ supportsNoSendExpiryPersistence() {
82
+ return true;
83
+ }
84
+ requiresActionBatchCleanupBeforeCreateAction() {
85
+ return false;
86
+ }
87
+ async makeAvailable() {
88
+ const settings = await super.makeAvailable();
89
+ this.startPreparedBeefBackfill();
90
+ return settings;
91
+ }
92
+ setServices(services) {
93
+ super.setServices(services);
94
+ this.startPreparedBeefBackfill();
95
+ }
96
+ async readSettings(trx) {
97
+ return this.validateEntity((0, utilityHelpers_1.verifyOne)(await this.toDb(trx)('settings')));
74
98
  }
75
99
  async getProvenOrRawTx(txid, trx) {
76
100
  const k = this.toDb(trx);
@@ -87,7 +111,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
87
111
  .select('rawTx', 'inputBEEF'));
88
112
  if (reqRawTx != null) {
89
113
  r.rawTx = Array.from(reqRawTx.rawTx);
90
- r.inputBEEF = Array.from(reqRawTx.inputBEEF);
114
+ r.inputBEEF = reqRawTx.inputBEEF == null ? undefined : Array.from(reqRawTx.inputBEEF);
91
115
  }
92
116
  }
93
117
  return r;
@@ -124,33 +148,235 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
124
148
  }
125
149
  return results;
126
150
  }
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)})`;
151
+ async findPreparedBeefs(userId, rootTxids, trx) {
152
+ const unique = [...new Set(rootTxids)];
153
+ if (unique.length === 0)
154
+ return [];
155
+ let query = this.toDb(trx)('prepared_beefs')
156
+ .where({ userId, state: 'ready', formatVersion: preparedBeef_1.PREPARED_BEEF_FORMAT_VERSION })
157
+ .whereIn('rootTxid', unique);
158
+ // Enforce the per-row byte limit in SQL so a corrupt metadata value cannot
159
+ // make Knex transfer an oversized blob before JavaScript validates it.
160
+ query = query.whereRaw('length(??) <= ?', ['beef', this.preparedBeefPolicy.maxArtifactBytes]);
161
+ const rows = await query;
162
+ return this.validateEntities(rows);
163
+ }
164
+ /**
165
+ * Metadata-only foreground preflight for fragmented actions. SQL computes
166
+ * the actual blob lengths; BEEF bytes are not transferred to the process.
167
+ */
168
+ async readPreparedBeefLookupByteLength(userId, rootTxids) {
169
+ const unique = [...new Set(rootTxids)];
170
+ if (unique.length === 0)
171
+ return 0;
172
+ const row = (await this.knex('prepared_beefs')
173
+ .where({ userId, state: 'ready', formatVersion: preparedBeef_1.PREPARED_BEEF_FORMAT_VERSION })
174
+ .whereIn('rootTxid', unique)
175
+ .first({ byteLength: this.knex.raw('coalesce(sum(length(??)), 0)', ['beef']) }));
176
+ return Number(row?.byteLength ?? 0);
177
+ }
178
+ async readPreparedBeefProofEpoch(trx) {
179
+ const row = await this.toDb(trx)('prepared_beef_metadata')
180
+ .where({ preparedBeefMetadataId: 1 })
181
+ .first('proofEpoch');
182
+ if (row == null || !Number.isSafeInteger(Number(row.proofEpoch))) {
183
+ throw new WERR_errors_1.WERR_INTERNAL('prepared BEEF proof epoch is unavailable');
184
+ }
185
+ return Number(row.proofEpoch);
186
+ }
187
+ /**
188
+ * Cheap worker preflight. It prevents a large tenant-controlled no-send BEEF
189
+ * from being loaded and parsed merely to discover that COOK will reject it.
190
+ */
191
+ async readPreparedBeefSourceByteLength(rootTxid) {
192
+ const byteLength = (...columns) => this.knex.raw(columns.map(() => 'coalesce(length(??), 0)').join(' + '), columns);
193
+ const proven = (await this.knex('proven_txs')
194
+ .where({ txid: rootTxid })
195
+ .first({ byteLength: byteLength('rawTx', 'merklePath') }));
196
+ if (proven != null)
197
+ return Number(proven.byteLength);
198
+ const request = (await this.knex('proven_tx_reqs')
199
+ .where({ txid: rootTxid })
200
+ .whereIn('status', ['unsent', 'unmined', 'unconfirmed', 'sending', 'nosend', 'completed'])
201
+ .first({ byteLength: byteLength('rawTx', 'inputBEEF') }));
202
+ return request == null ? undefined : Number(request.byteLength);
203
+ }
204
+ async upsertPreparedBeef(artifact, expectedProofEpoch) {
205
+ return await this.transaction(async (trx) => {
206
+ let epochQuery = this.toDb(trx)('prepared_beef_metadata').where({
207
+ preparedBeefMetadataId: 1
208
+ });
209
+ // Serialize a worker commit with proof invalidation across MySQL and
210
+ // Postgres server processes. SQLite serializes the subsequent write transaction.
211
+ if (this.dbtype === 'MySQL' || this.dbtype === 'Postgres')
212
+ epochQuery = epochQuery.forUpdate();
213
+ const metadata = await epochQuery.first('proofEpoch');
214
+ if (metadata == null || Number(metadata.proofEpoch) !== expectedProofEpoch)
215
+ return false;
216
+ const row = await this.validateEntityForInsert(artifact, trx);
217
+ if (row.preparedBeefId === 0)
218
+ delete row.preparedBeefId;
219
+ const update = {
220
+ beef: row.beef,
221
+ checksum: row.checksum,
222
+ formatVersion: row.formatVersion,
223
+ state: row.state,
224
+ txCount: row.txCount,
225
+ bumpCount: row.bumpCount,
226
+ byteLength: row.byteLength,
227
+ updated_at: row.updated_at
228
+ };
229
+ await this.toDb(trx)('prepared_beefs')
230
+ .insert(row)
231
+ .onConflict(['userId', 'rootTxid'])
232
+ .merge(update);
233
+ return true;
234
+ });
235
+ }
236
+ async findPreparedBeefBackfillRoots(limit, formatVersion) {
237
+ const rows = (await this.knex('outputs as o')
238
+ .join('transactions as t', function () {
239
+ this.on('t.transactionId', '=', 'o.transactionId').andOn('t.userId', '=', 'o.userId');
240
+ })
241
+ .leftJoin('prepared_beefs as pb', function () {
242
+ this.on('pb.userId', '=', 'o.userId')
243
+ .andOn('pb.rootTxid', '=', 'o.txid')
244
+ .andOnVal('pb.formatVersion', '=', formatVersion);
245
+ })
246
+ .where('o.spendable', true)
247
+ .whereNull('o.spentBy')
248
+ .where('o.change', true)
249
+ .where('o.providedBy', 'storage')
250
+ .where('o.purpose', 'change')
251
+ .where('o.type', 'P2PKH')
252
+ .whereNotNull('o.derivationPrefix')
253
+ .whereNotNull('o.derivationSuffix')
254
+ .whereNotNull('o.txid')
255
+ // Backfill only settled roots. Pending roots receive one organic
256
+ // processAction attempt and can be retried after a canonical read; a
257
+ // perpetual backfill loop must not poll an unconfirmed ancestry chain.
258
+ .where('t.status', 'completed')
259
+ .whereNotNull('t.provenTxId')
260
+ .whereNull('pb.preparedBeefId')
261
+ .select('o.userId', 'o.txid as rootTxid')
262
+ .groupBy('o.userId', 'o.txid')
263
+ // ?? quotes identifiers: Postgres lowercases unquoted names, so camelCase columns must be quoted.
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
+ }));
285
+ }
286
+ async lookupPreparedBeefs(userId, rootTxids, parent) {
287
+ return await (0, preparedBeef_1.lookupPreparedBeefs)(this, userId, rootTxids, parent);
288
+ }
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();
131
334
  }
132
- normaliseKnexRawResult(rs) {
133
- if (this.dbtype === 'MySQL')
134
- return rs[0];
135
- return rs;
335
+ rawTxSliceExpression(offset, length, dbtype) {
336
+ const sql = dbtype === 'MySQL' ? 'substring(?? from ? for ?)' : 'substr(??, ?, ?)';
337
+ return this.knex.raw(sql, ['rawTx', offset + 1, length]);
136
338
  }
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));
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,16 @@ 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
+ // ?? quotes identifiers: Postgres lowercases unquoted names, so camelCase columns must be quoted.
391
+ .whereRaw('?? = ?? and ?? = ?', [
392
+ 'proven_txs.provenTxId',
393
+ 'transactions.provenTxId',
394
+ 'transactions.userId',
395
+ args.userId
396
+ ]));
165
397
  });
166
398
  if (args.paged != null) {
399
+ q = q.orderBy(pagingOrder('proven_txs'));
167
400
  q = q.limit(args.paged.limit);
168
401
  q = q.offset(args.paged.offset ?? 0);
169
402
  }
@@ -182,9 +415,11 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
182
415
  void this.whereExists(k
183
416
  .select('*')
184
417
  .from('transactions')
185
- .whereRaw(`proven_tx_reqs.txid = transactions.txid and transactions.userId = ${args.userId}`));
418
+ // ?? quotes identifiers: Postgres lowercases unquoted names, so camelCase columns must be quoted.
419
+ .whereRaw('proven_tx_reqs.txid = transactions.txid and ?? = ?', ['transactions.userId', args.userId]));
186
420
  });
187
421
  if (args.paged != null) {
422
+ q = q.orderBy(pagingOrder('proven_tx_reqs'));
188
423
  q = q.limit(args.paged.limit);
189
424
  q = q.offset(args.paged.offset ?? 0);
190
425
  }
@@ -202,10 +437,17 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
202
437
  let q = k('tx_labels_map').whereExists(k
203
438
  .select('*')
204
439
  .from('tx_labels')
205
- .whereRaw(`tx_labels.txLabelId = tx_labels_map.txLabelId and tx_labels.userId = ${args.userId}`));
440
+ // ?? quotes identifiers: Postgres lowercases unquoted names, so camelCase columns must be quoted.
441
+ .whereRaw('?? = ?? and ?? = ?', [
442
+ 'tx_labels.txLabelId',
443
+ 'tx_labels_map.txLabelId',
444
+ 'tx_labels.userId',
445
+ args.userId
446
+ ]));
206
447
  if (args.since != null)
207
448
  q = q.where('updated_at', '>=', this.validateDateForWhere(args.since));
208
449
  if (args.paged != null) {
450
+ q = q.orderBy(pagingOrder('tx_labels_map'));
209
451
  q = q.limit(args.paged.limit);
210
452
  q = q.offset(args.paged.offset ?? 0);
211
453
  }
@@ -221,10 +463,17 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
221
463
  let q = k('output_tags_map').whereExists(k
222
464
  .select('*')
223
465
  .from('output_tags')
224
- .whereRaw(`output_tags.outputTagId = output_tags_map.outputTagId and output_tags.userId = ${args.userId}`));
466
+ // ?? quotes identifiers: Postgres lowercases unquoted names, so camelCase columns must be quoted.
467
+ .whereRaw('?? = ?? and ?? = ?', [
468
+ 'output_tags.outputTagId',
469
+ 'output_tags_map.outputTagId',
470
+ 'output_tags.userId',
471
+ args.userId
472
+ ]));
225
473
  if (args.since != null)
226
474
  q = q.where('updated_at', '>=', this.validateDateForWhere(args.since));
227
475
  if (args.paged != null) {
476
+ q = q.orderBy(pagingOrder('output_tags_map'));
228
477
  q = q.limit(args.paged.limit);
229
478
  q = q.offset(args.paged.offset ?? 0);
230
479
  }
@@ -235,6 +484,45 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
235
484
  const rs = await q;
236
485
  return this.validateEntities(rs, undefined, ['isDeleted']);
237
486
  }
487
+ async countSyncQuery(query) {
488
+ const row = await query.count({ count: '*' }).first();
489
+ return Number(row?.count ?? 0);
490
+ }
491
+ async getSyncChunkTotals(args, userId) {
492
+ const since = args.since;
493
+ const [provenTxs, outputBaskets, outputTags, txLabels, transactions, outputs, txLabelMaps, outputTagMaps, certificates, certificateFields, commissions, provenTxReqs] = await Promise.all([
494
+ this.countSyncQuery(this.getProvenTxsForUserQuery({ userId, since })),
495
+ this.countOutputBaskets({ partial: { userId }, since }),
496
+ this.countOutputTags({ partial: { userId }, since }),
497
+ this.countTxLabels({ partial: { userId }, since }),
498
+ this.countTransactions({ partial: { userId }, since, noRawTx: true }),
499
+ this.countOutputs({ partial: { userId }, since, noScript: true }),
500
+ this.countSyncQuery(this.getTxLabelMapsForUserQuery({ userId, since })),
501
+ this.countSyncQuery(this.getOutputTagMapsForUserQuery({ userId, since })),
502
+ this.countCertificates({ partial: { userId }, since }),
503
+ this.countCertificateFields({ partial: { userId }, since }),
504
+ this.countCommissions({ partial: { userId }, since }),
505
+ this.countSyncQuery(this.getProvenTxReqsForUserQuery({ userId, since }))
506
+ ]);
507
+ const records = {
508
+ provenTxs,
509
+ outputBaskets,
510
+ outputTags,
511
+ txLabels,
512
+ transactions,
513
+ outputs,
514
+ txLabelMaps,
515
+ outputTagMaps,
516
+ certificates,
517
+ certificateFields,
518
+ commissions,
519
+ provenTxReqs
520
+ };
521
+ return {
522
+ totalRecords: Object.values(records).reduce((total, count) => total + count, 0),
523
+ records
524
+ };
525
+ }
238
526
  async listActions(auth, vargs) {
239
527
  if (auth.userId == null)
240
528
  throw new WERR_errors_1.WERR_UNAUTHORIZED();
@@ -245,11 +533,36 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
245
533
  throw new WERR_errors_1.WERR_UNAUTHORIZED();
246
534
  return await (0, listOutputsKnex_1.listOutputs)(this, auth, vargs);
247
535
  }
536
+ /**
537
+ * Insert one row and return its auto-increment primary key. MySQL and SQLite
538
+ * report the id as the insert result; Postgres requires a RETURNING clause.
539
+ */
540
+ async insertReturningId(table, idColumn, row, trx) {
541
+ if (this.dbtype !== 'Postgres') {
542
+ const [id] = await this.toDb(trx)(table).insert(row);
543
+ return id;
544
+ }
545
+ return await this.inSavepoint(trx, async (db) => {
546
+ const [r] = await db(table).insert(row).returning(idColumn);
547
+ return r[idColumn];
548
+ });
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);
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);
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);
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);
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);
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);
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,32 @@ 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
+ try {
1368
+ const config = {
1369
+ migrationSource: new KnexMigrations_1.KnexMigrations(this.chain, storageName, storageIdentityKey, 1024),
1370
+ // Keep DDL and its migration journal entry in the same transaction.
1371
+ disableTransactions: false
1372
+ };
1373
+ await this.knex.migrate.latest(config);
1374
+ return await this.knex.migrate.currentVersion(config);
1375
+ }
1376
+ finally {
1377
+ // Leaving foreign-key enforcement disabled after a failed migration would
1378
+ // weaken every subsequent write on this connection.
1379
+ if (isSQLite)
1380
+ await this.knex.raw('PRAGMA foreign_keys = ON;');
1009
1381
  }
1010
- return version;
1011
1382
  }
1012
1383
  async dropAllData() {
1013
1384
  // Only using migrations to migrate down, don't need valid properties for settings table.
@@ -1029,24 +1400,22 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1029
1400
  if (isSQLite) {
1030
1401
  await this.knex.raw('PRAGMA foreign_keys = OFF;');
1031
1402
  }
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
- }
1403
+ try {
1404
+ for (let i = 0; i < count; i++) {
1405
+ const version = await this.knex.migrate.currentVersion(config);
1406
+ if (version === 'none')
1407
+ return;
1408
+ const result = await this.knex.migrate.down(config);
1409
+ if (result == null)
1410
+ throw new WERR_errors_1.WERR_INTERNAL('database migration rollback returned no result');
1039
1411
  }
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;
1412
+ if ((await this.knex.migrate.currentVersion(config)) !== 'none') {
1413
+ throw new WERR_errors_1.WERR_INTERNAL('database migration rollback did not reach the empty schema');
1045
1414
  }
1046
1415
  }
1047
- // Re-enable foreign key checks for SQLite
1048
- if (isSQLite) {
1049
- await this.knex.raw('PRAGMA foreign_keys = ON;');
1416
+ finally {
1417
+ if (isSQLite)
1418
+ await this.knex.raw('PRAGMA foreign_keys = ON;');
1050
1419
  }
1051
1420
  }
1052
1421
  async transaction(scope, trx) {
@@ -1064,7 +1433,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1064
1433
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1065
1434
  toDb(trx) {
1066
1435
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1067
- const db = (trx == null) ? this.knex : trx;
1436
+ const db = trx == null ? this.knex : trx;
1068
1437
  this.whenLastAccess = new Date();
1069
1438
  return db;
1070
1439
  }
@@ -1088,7 +1457,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1088
1457
  * @param trx
1089
1458
  */
1090
1459
  async verifyReadyForDatabaseAccess(trx) {
1091
- this._settings ??= await this.readSettings();
1460
+ this._settings ??= await this.readSettings(trx);
1092
1461
  // Always run the PRAGMA for SQLite to ensure foreign key constraints are enabled.
1093
1462
  // This is necessary because PRAGMA foreign_keys is a per-connection setting,
1094
1463
  // and connection pools may create new connections that don't have it set.
@@ -1236,7 +1605,8 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1236
1605
  void this.select(1)
1237
1606
  .from('action_batch_outputs as abo')
1238
1607
  .join('action_batches as ab', 'abo.actionBatchId', 'ab.actionBatchId')
1239
- .whereRaw('abo.outputId = o.outputId')
1608
+ // ?? quotes identifiers: Postgres lowercases unquoted names, so camelCase columns must be quoted.
1609
+ .whereRaw('?? = ??', ['abo.outputId', 'o.outputId'])
1240
1610
  .whereIn('ab.status', ['active', 'prepared'])
1241
1611
  .where('ab.expiresAt', '>', now)
1242
1612
  .where('ab.hardExpiresAt', '>', now);
@@ -1270,7 +1640,8 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1270
1640
  void this.select(1)
1271
1641
  .from('action_batch_outputs as abo')
1272
1642
  .join('action_batches as ab', 'abo.actionBatchId', 'ab.actionBatchId')
1273
- .whereRaw('abo.outputId = o.outputId')
1643
+ // ?? quotes identifiers: Postgres lowercases unquoted names, so camelCase columns must be quoted.
1644
+ .whereRaw('?? = ??', ['abo.outputId', 'o.outputId'])
1274
1645
  .whereIn('ab.status', ['active', 'prepared'])
1275
1646
  .where('ab.expiresAt', '>', now)
1276
1647
  .where('ab.hardExpiresAt', '>', now);
@@ -1304,13 +1675,14 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1304
1675
  void this.select(1)
1305
1676
  .from('action_batch_outputs as abo')
1306
1677
  .join('action_batches as ab', 'abo.actionBatchId', 'ab.actionBatchId')
1307
- .whereRaw('abo.outputId = o.outputId')
1678
+ // ?? quotes identifiers: Postgres lowercases unquoted names, so camelCase columns must be quoted.
1679
+ .whereRaw('?? = ??', ['abo.outputId', 'o.outputId'])
1308
1680
  .whereIn('ab.status', ['active', 'prepared'])
1309
1681
  .where('ab.expiresAt', '>', now)
1310
1682
  .where('ab.hardExpiresAt', '>', now);
1311
1683
  })
1312
1684
  .whereIn('t.status', statuses)
1313
- .select('o.outputId', 'o.transactionId', 'o.satoshis', 'o.txid', 'o.vout');
1685
+ .select('o.outputId', 'o.transactionId', 'o.satoshis', 'o.txid', 'o.vout', 't.status as transactionStatus');
1314
1686
  }
1315
1687
  async findOutputsByIds(outputIds, trx) {
1316
1688
  const byId = {};
@@ -1481,7 +1853,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1481
1853
  .whereIn('t.status', status)
1482
1854
  .sum({ totalSatoshis: 'o.satoshis' })
1483
1855
  .first();
1484
- const total = (row != null) ? row.totalSatoshis : undefined;
1856
+ const total = row != null ? row.totalSatoshis : undefined;
1485
1857
  return Number(total ?? 0);
1486
1858
  }
1487
1859
  /**
@@ -1493,6 +1865,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1493
1865
  const status = ['completed', 'unproven'];
1494
1866
  if (!excludeSending)
1495
1867
  status.push('sending');
1868
+ let reservedConcurrently = false;
1496
1869
  const r = await this.knex.transaction(async (trx) => {
1497
1870
  const baseQuery = () => trx('outputs as o')
1498
1871
  .join('transactions as t', 'o.transactionId', 't.transactionId')
@@ -1511,9 +1884,8 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1511
1884
  .whereNot('o.derivationSuffix', '')
1512
1885
  .whereNull('o.spentBy')
1513
1886
  .whereNotExists(function () {
1514
- void this.select(1)
1515
- .from('action_batch_outputs as abo')
1516
- .whereRaw('abo.outputId = o.outputId');
1887
+ // ?? quotes identifiers: Postgres lowercases unquoted names, so camelCase columns must be quoted.
1888
+ void this.select(1).from('action_batch_outputs as abo').whereRaw('?? = ??', ['abo.outputId', 'o.outputId']);
1517
1889
  })
1518
1890
  .whereIn('t.status', status)
1519
1891
  .select('o.*')
@@ -1534,6 +1906,14 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1534
1906
  .first();
1535
1907
  if (output == null)
1536
1908
  return undefined;
1909
+ // Under Postgres READ COMMITTED the NOT EXISTS above uses the statement's
1910
+ // snapshot, so an action batch reservation committed while the statement
1911
+ // waited for the row lock is not visible to it. Retry in a new transaction.
1912
+ if (this.dbtype === 'Postgres' &&
1913
+ (await this.findReservedActionBatchOutputIds([output.outputId], trx)).length > 0) {
1914
+ reservedConcurrently = true;
1915
+ return undefined;
1916
+ }
1537
1917
  await this.updateOutput(output.outputId, {
1538
1918
  spendable: false,
1539
1919
  spentBy: transactionId
@@ -1545,6 +1925,8 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1545
1925
  output.spentBy = transactionId;
1546
1926
  return output;
1547
1927
  });
1928
+ if (reservedConcurrently)
1929
+ return await this.allocateChangeInput(userId, basketId, targetSatoshis, exactSatoshis, excludeSending, transactionId);
1548
1930
  return r;
1549
1931
  }
1550
1932
  async markChangeInputsSpent(outputIds, transactionId, trx) {
@@ -1591,7 +1973,8 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1591
1973
  for (const df of booleanFields) {
1592
1974
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1593
1975
  if (entity[df] !== undefined)
1594
- entity[df] = entity[df] !== 0 && entity[df] != null && entity[df] !== false;
1976
+ entity[df] =
1977
+ entity[df] !== 0 && entity[df] != null && entity[df] !== false;
1595
1978
  }
1596
1979
  }
1597
1980
  this.deserialiseFromKnex(entity);
@@ -1616,7 +1999,7 @@ class StorageKnex extends StorageProvider_1.StorageProvider {
1616
1999
  orderDescending: true,
1617
2000
  paged: { limit: 1 }
1618
2001
  }));
1619
- const monitorStats = (monitorEvent != null) ? JSON.parse(monitorEvent.details) : undefined;
2002
+ const monitorStats = monitorEvent != null ? JSON.parse(monitorEvent.details) : undefined;
1620
2003
  const servicesStats = this.getServices().getServicesCallHistory(true);
1621
2004
  const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
1622
2005
  const oneWeekAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
@@ -1770,4 +2153,67 @@ select
1770
2153
  }
1771
2154
  }
1772
2155
  exports.StorageKnex = StorageKnex;
2156
+ /**
2157
+ * Key columns that give paged queries a deterministic row order. Without an
2158
+ * ORDER BY, Postgres may return the rows of consecutive LIMIT/OFFSET pages in
2159
+ * different orders, so sync chunks could repeat some rows and skip others.
2160
+ */
2161
+ function pagingOrder(table) {
2162
+ return pagingKey(table).map(column => `${table}.${column}`);
2163
+ }
2164
+ function pagingKey(table) {
2165
+ switch (table) {
2166
+ case 'certificate_fields':
2167
+ return ['certificateId', 'fieldName'];
2168
+ case 'certificates':
2169
+ return ['certificateId'];
2170
+ case 'commissions':
2171
+ return ['commissionId'];
2172
+ case 'monitor_events':
2173
+ return ['id'];
2174
+ case 'output_baskets':
2175
+ return ['basketId'];
2176
+ case 'output_tags':
2177
+ return ['outputTagId'];
2178
+ case 'output_tags_map':
2179
+ return ['outputTagId', 'outputId'];
2180
+ case 'outputs':
2181
+ return ['outputId'];
2182
+ case 'proven_tx_reqs':
2183
+ return ['provenTxReqId'];
2184
+ case 'proven_txs':
2185
+ return ['provenTxId'];
2186
+ case 'sync_states':
2187
+ return ['syncStateId'];
2188
+ case 'transactions':
2189
+ return ['transactionId'];
2190
+ case 'tx_labels':
2191
+ return ['txLabelId'];
2192
+ case 'tx_labels_map':
2193
+ return ['txLabelId', 'transactionId'];
2194
+ case 'users':
2195
+ return ['userId'];
2196
+ default:
2197
+ return [];
2198
+ }
2199
+ }
2200
+ const pgInt8Parsed = Symbol('pgInt8Parsed');
2201
+ /**
2202
+ * node-postgres returns int8 values (bigint columns such as satoshis, `count(*)`)
2203
+ * as strings. Set a parser on each connection this knex acquires so they come
2204
+ * back as numbers, as with mysql2 and better-sqlite3. The process-wide `pg.types`
2205
+ * defaults are left unchanged.
2206
+ */
2207
+ function parsePostgresInt8AsNumber(knex) {
2208
+ const client = knex.client;
2209
+ if (client?.dialect !== 'postgresql' || client[pgInt8Parsed] === true)
2210
+ return;
2211
+ client[pgInt8Parsed] = true;
2212
+ const acquireConnection = client.acquireConnection.bind(client);
2213
+ client.acquireConnection = async () => {
2214
+ const connection = await acquireConnection();
2215
+ connection.setTypeParser(20, (value) => Number.parseInt(value, 10));
2216
+ return connection;
2217
+ };
2218
+ }
1773
2219
  //# sourceMappingURL=StorageKnex.js.map