@bopen-io/wallet-toolbox 2.6.2-brc153.5 → 2.14.5
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.
- package/CHANGELOG.md +744 -1
- package/LICENSES/Open-BSV-License-4-wallet-pre-2026.txt +28 -0
- package/README.md +823 -14
- package/THIRD_PARTY_NOTICES.md +35 -0
- package/docs/README.md +44 -31
- package/docs/action-batch-planning.md +80 -37
- package/docs/client.md +12996 -4571
- package/docs/identity-verification.md +218 -0
- package/docs/local-first-chaintracks.md +129 -0
- package/docs/managed-change-liquidity.md +258 -0
- package/docs/managed-change-policy.md +14 -1
- package/docs/monitor.md +505 -190
- package/docs/no-send-expiry.md +167 -0
- package/docs/prepared-beef.md +197 -0
- package/docs/services.md +4013 -1153
- package/docs/setup.md +107 -56
- package/docs/storage.md +5781 -1599
- package/docs/sync-transfer.md +144 -0
- package/docs/wab-shamir.md +5 -1
- package/docs/wallet.md +10188 -10904
- package/out/src/CWIStyleWalletManager.d.ts +39 -31
- package/out/src/CWIStyleWalletManager.d.ts.map +1 -1
- package/out/src/CWIStyleWalletManager.js +309 -258
- package/out/src/CWIStyleWalletManager.js.map +1 -1
- package/out/src/Setup.d.ts +14 -0
- package/out/src/Setup.d.ts.map +1 -1
- package/out/src/Setup.js +6 -2
- package/out/src/Setup.js.map +1 -1
- package/out/src/SetupClient.d.ts +3 -0
- package/out/src/SetupClient.d.ts.map +1 -1
- package/out/src/SetupClient.js +1 -0
- package/out/src/SetupClient.js.map +1 -1
- package/out/src/SetupWallet.d.ts +3 -0
- package/out/src/SetupWallet.d.ts.map +1 -1
- package/out/src/ShamirWalletManager.d.ts.map +1 -1
- package/out/src/ShamirWalletManager.js +34 -19
- package/out/src/ShamirWalletManager.js.map +1 -1
- package/out/src/SimpleWalletManager.d.ts.map +1 -1
- package/out/src/SimpleWalletManager.js +7 -6
- package/out/src/SimpleWalletManager.js.map +1 -1
- package/out/src/Wallet.d.ts +54 -14
- package/out/src/Wallet.d.ts.map +1 -1
- package/out/src/Wallet.js +216 -114
- package/out/src/Wallet.js.map +1 -1
- package/out/src/WalletAuthenticationManager.d.ts +32 -0
- package/out/src/WalletAuthenticationManager.d.ts.map +1 -1
- package/out/src/WalletAuthenticationManager.js +531 -78
- package/out/src/WalletAuthenticationManager.js.map +1 -1
- package/out/src/WalletLogger.js +1 -1
- package/out/src/WalletLogger.js.map +1 -1
- package/out/src/WalletPermissionsManager.d.ts +101 -43
- package/out/src/WalletPermissionsManager.d.ts.map +1 -1
- package/out/src/WalletPermissionsManager.js +897 -414
- package/out/src/WalletPermissionsManager.js.map +1 -1
- package/out/src/WalletSettingsManager.d.ts +3 -2
- package/out/src/WalletSettingsManager.d.ts.map +1 -1
- package/out/src/WalletSettingsManager.js +143 -8
- package/out/src/WalletSettingsManager.js.map +1 -1
- package/out/src/entropy/EntropyCollector.d.ts.map +1 -1
- package/out/src/entropy/EntropyCollector.js +3 -2
- package/out/src/entropy/EntropyCollector.js.map +1 -1
- package/out/src/fundWalletP2PKH.d.ts.map +1 -1
- package/out/src/fundWalletP2PKH.js +143 -44
- package/out/src/fundWalletP2PKH.js.map +1 -1
- package/out/src/index.client.d.ts +6 -0
- package/out/src/index.client.d.ts.map +1 -1
- package/out/src/index.client.js +16 -1
- package/out/src/index.client.js.map +1 -1
- package/out/src/index.mobile.d.ts +7 -0
- package/out/src/index.mobile.d.ts.map +1 -1
- package/out/src/index.mobile.js +17 -1
- package/out/src/index.mobile.js.map +1 -1
- package/out/src/mockchain/MockChainTracker.d.ts.map +1 -1
- package/out/src/mockchain/MockChainTracker.js +5 -5
- package/out/src/mockchain/MockChainTracker.js.map +1 -1
- package/out/src/mockchain/MockServices.d.ts +2 -0
- package/out/src/mockchain/MockServices.d.ts.map +1 -1
- package/out/src/mockchain/MockServices.js +54 -14
- package/out/src/mockchain/MockServices.js.map +1 -1
- package/out/src/monitor/Monitor.d.ts +51 -0
- package/out/src/monitor/Monitor.d.ts.map +1 -1
- package/out/src/monitor/Monitor.js +282 -41
- package/out/src/monitor/Monitor.js.map +1 -1
- package/out/src/monitor/MonitorDaemon.d.ts.map +1 -1
- package/out/src/monitor/MonitorDaemon.js +64 -16
- package/out/src/monitor/MonitorDaemon.js.map +1 -1
- package/out/src/monitor/monitorValidation.d.ts +12 -0
- package/out/src/monitor/monitorValidation.d.ts.map +1 -0
- package/out/src/monitor/monitorValidation.js +133 -0
- package/out/src/monitor/monitorValidation.js.map +1 -0
- package/out/src/monitor/tasks/TaskArcSSE.d.ts +6 -1
- package/out/src/monitor/tasks/TaskArcSSE.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskArcSSE.js +117 -74
- package/out/src/monitor/tasks/TaskArcSSE.js.map +1 -1
- package/out/src/monitor/tasks/TaskCheckForProofs.d.ts +5 -0
- package/out/src/monitor/tasks/TaskCheckForProofs.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskCheckForProofs.js +29 -24
- package/out/src/monitor/tasks/TaskCheckForProofs.js.map +1 -1
- package/out/src/monitor/tasks/TaskCheckNoSends.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskCheckNoSends.js +11 -3
- package/out/src/monitor/tasks/TaskCheckNoSends.js.map +1 -1
- package/out/src/monitor/tasks/TaskFailAbandoned.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskFailAbandoned.js +9 -4
- package/out/src/monitor/tasks/TaskFailAbandoned.js.map +1 -1
- package/out/src/monitor/tasks/TaskNewHeader.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskNewHeader.js +3 -1
- package/out/src/monitor/tasks/TaskNewHeader.js.map +1 -1
- package/out/src/monitor/tasks/TaskNoSendExpiry.d.ts +19 -0
- package/out/src/monitor/tasks/TaskNoSendExpiry.d.ts.map +1 -0
- package/out/src/monitor/tasks/TaskNoSendExpiry.js +47 -0
- package/out/src/monitor/tasks/TaskNoSendExpiry.js.map +1 -0
- package/out/src/monitor/tasks/TaskReconcilePendingTransactions.d.ts +27 -0
- package/out/src/monitor/tasks/TaskReconcilePendingTransactions.d.ts.map +1 -0
- package/out/src/monitor/tasks/TaskReconcilePendingTransactions.js +242 -0
- package/out/src/monitor/tasks/TaskReconcilePendingTransactions.js.map +1 -0
- package/out/src/monitor/tasks/TaskReorg.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskReorg.js +4 -4
- package/out/src/monitor/tasks/TaskReorg.js.map +1 -1
- package/out/src/monitor/tasks/TaskReviewDoubleSpends.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskReviewDoubleSpends.js +31 -9
- package/out/src/monitor/tasks/TaskReviewDoubleSpends.js.map +1 -1
- package/out/src/monitor/tasks/TaskReviewProvenTxs.d.ts +18 -1
- package/out/src/monitor/tasks/TaskReviewProvenTxs.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskReviewProvenTxs.js +99 -21
- package/out/src/monitor/tasks/TaskReviewProvenTxs.js.map +1 -1
- package/out/src/monitor/tasks/TaskReviewUtxos.d.ts +33 -6
- package/out/src/monitor/tasks/TaskReviewUtxos.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskReviewUtxos.js +189 -13
- package/out/src/monitor/tasks/TaskReviewUtxos.js.map +1 -1
- package/out/src/monitor/tasks/TaskSendWaiting.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskSendWaiting.js +52 -11
- package/out/src/monitor/tasks/TaskSendWaiting.js.map +1 -1
- package/out/src/monitor/tasks/TaskUnFail.d.ts +1 -0
- package/out/src/monitor/tasks/TaskUnFail.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskUnFail.js +26 -8
- package/out/src/monitor/tasks/TaskUnFail.js.map +1 -1
- package/out/src/monitor/tasks/index.all.d.ts +2 -0
- package/out/src/monitor/tasks/index.all.d.ts.map +1 -1
- package/out/src/monitor/tasks/index.all.js +2 -0
- package/out/src/monitor/tasks/index.all.js.map +1 -1
- package/out/src/sdk/ActionBatch.interfaces.d.ts +23 -0
- package/out/src/sdk/ActionBatch.interfaces.d.ts.map +1 -1
- package/out/src/sdk/PrivilegedKeyManager.d.ts.map +1 -1
- package/out/src/sdk/PrivilegedKeyManager.js +3 -2
- package/out/src/sdk/PrivilegedKeyManager.js.map +1 -1
- package/out/src/sdk/WERR_errors.d.ts +23 -0
- package/out/src/sdk/WERR_errors.d.ts.map +1 -1
- package/out/src/sdk/WERR_errors.js +51 -7
- package/out/src/sdk/WERR_errors.js.map +1 -1
- package/out/src/sdk/WalletError.d.ts.map +1 -1
- package/out/src/sdk/WalletError.js +7 -21
- package/out/src/sdk/WalletError.js.map +1 -1
- package/out/src/sdk/WalletErrorFromJson.d.ts.map +1 -1
- package/out/src/sdk/WalletErrorFromJson.js +121 -3
- package/out/src/sdk/WalletErrorFromJson.js.map +1 -1
- package/out/src/sdk/WalletServices.interfaces.d.ts +45 -2
- package/out/src/sdk/WalletServices.interfaces.d.ts.map +1 -1
- package/out/src/sdk/WalletStorage.interfaces.d.ts +87 -4
- package/out/src/sdk/WalletStorage.interfaces.d.ts.map +1 -1
- package/out/src/sdk/types.d.ts +3 -2
- package/out/src/sdk/types.d.ts.map +1 -1
- package/out/src/sdk/types.js +3 -2
- package/out/src/sdk/types.js.map +1 -1
- package/out/src/services/ServiceCollection.js +2 -2
- package/out/src/services/ServiceCollection.js.map +1 -1
- package/out/src/services/Services.d.ts +5 -0
- package/out/src/services/Services.d.ts.map +1 -1
- package/out/src/services/Services.js +346 -120
- package/out/src/services/Services.js.map +1 -1
- package/out/src/services/chaintracker/BHServiceClient.d.ts +21 -4
- package/out/src/services/chaintracker/BHServiceClient.d.ts.map +1 -1
- package/out/src/services/chaintracker/BHServiceClient.js +269 -66
- package/out/src/services/chaintracker/BHServiceClient.js.map +1 -1
- package/out/src/services/chaintracker/ChaintracksChainTracker.d.ts +25 -3
- package/out/src/services/chaintracker/ChaintracksChainTracker.d.ts.map +1 -1
- package/out/src/services/chaintracker/ChaintracksChainTracker.js +188 -53
- package/out/src/services/chaintracker/ChaintracksChainTracker.js.map +1 -1
- package/out/src/services/chaintracker/LocalChainTracker.d.ts +122 -0
- package/out/src/services/chaintracker/LocalChainTracker.d.ts.map +1 -0
- package/out/src/services/chaintracker/LocalChainTracker.js +465 -0
- package/out/src/services/chaintracker/LocalChainTracker.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.js +59 -7
- package/out/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.d.ts +48 -0
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.js +3 -0
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataCacheApi.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataValidatorApi.d.ts +70 -0
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataValidatorApi.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataValidatorApi.js +21 -0
- package/out/src/services/chaintracker/chaintracks/Api/BulkFileDataValidatorApi.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksApi.d.ts +6 -0
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksApi.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.d.ts +53 -0
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.d.ts +9 -2
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts +9 -0
- package/out/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts +28 -3
- package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Chaintracks.js +282 -64
- package/out/src/services/chaintracker/chaintracks/Chaintracks.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/ChaintracksService.d.ts +16 -0
- package/out/src/services/chaintracker/chaintracks/ChaintracksService.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/ChaintracksService.js +150 -26
- package/out/src/services/chaintracker/chaintracks/ChaintracksService.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.d.ts +30 -1
- package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.js +348 -30
- package/out/src/services/chaintracker/chaintracks/ChaintracksServiceClient.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.d.ts +32 -1
- package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.js +378 -44
- package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.js +28 -3
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.js +33 -9
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorChaintracks.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorChaintracks.js +4 -2
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorChaintracks.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.d.ts +2 -0
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.js +17 -4
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.d.ts +2 -0
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.js +40 -20
- package/out/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.js +14 -0
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.d.ts +6 -0
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.js +56 -9
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.js +6 -3
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.d.ts +4 -0
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.js +27 -9
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.d.ts +8 -0
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.js +49 -5
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.d.ts +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.js +90 -21
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.d.ts +3 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.js +185 -38
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.js +59 -6
- package/out/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.d.ts +2 -0
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.js +89 -39
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.d.ts +10 -0
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.js +230 -28
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.d.ts +2 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js +265 -96
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.d.ts +3 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js +240 -87
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts +3 -0
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js +121 -35
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.d.ts +8 -0
- package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.js +6 -3
- package/out/src/services/chaintracker/chaintracks/configureChaintracksIngestors.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js +1 -7
- package/out/src/services/chaintracker/chaintracks/createIdbChaintracks.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.js +1 -7
- package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js +1 -7
- package/out/src/services/chaintracker/chaintracks/createNoDbChaintracks.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.all.d.ts +3 -0
- package/out/src/services/chaintracker/chaintracks/index.all.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.all.js +3 -0
- package/out/src/services/chaintracker/chaintracks/index.all.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts +5 -0
- package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.mobile.js +5 -0
- package/out/src/services/chaintracker/chaintracks/index.mobile.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.d.ts +51 -0
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.js +394 -0
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataCacheFs.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts +45 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js +733 -166
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataManager.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataReader.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataReader.js +17 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataReader.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.d.ts +32 -0
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.js +40 -0
- package/out/src/services/chaintracker/chaintracks/util/BulkFileDataValidator.worker.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.js +99 -30
- package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.d.ts +3 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.js +23 -15
- package/out/src/services/chaintracker/chaintracks/util/BulkHeaderFile.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts +38 -4
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.js +191 -47
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.d.ts +2 -1
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.js +57 -11
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.d.ts +48 -0
- package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.js +280 -0
- package/out/src/services/chaintracker/chaintracks/util/DurableFileBulkFileDownloadBudget.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.d.ts +30 -0
- package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.js +57 -0
- package/out/src/services/chaintracker/chaintracks/util/FixedWindowBulkFileDownloadBudget.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/HeightRange.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/HeightRange.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.d.ts +14 -0
- package/out/src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.js +148 -0
- package/out/src/services/chaintracker/chaintracks/util/InlineBulkFileDataValidator.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/NodeBulkFileDataValidator.d.ts +41 -0
- package/out/src/services/chaintracker/chaintracks/util/NodeBulkFileDataValidator.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/NodeBulkFileDataValidator.js +271 -0
- package/out/src/services/chaintracker/chaintracks/util/NodeBulkFileDataValidator.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.d.ts +3 -0
- package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.js +15 -0
- package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.d.ts +17 -4
- package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.js +362 -105
- package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/safeDiagnostic.d.ts +4 -0
- package/out/src/services/chaintracker/chaintracks/util/safeDiagnostic.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/safeDiagnostic.js +33 -0
- package/out/src/services/chaintracker/chaintracks/util/safeDiagnostic.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.js.map +1 -1
- package/out/src/services/chaintracker/index.all.d.ts +1 -0
- package/out/src/services/chaintracker/index.all.d.ts.map +1 -1
- package/out/src/services/chaintracker/index.all.js +1 -0
- package/out/src/services/chaintracker/index.all.js.map +1 -1
- package/out/src/services/chaintracker/index.client.d.ts +1 -0
- package/out/src/services/chaintracker/index.client.d.ts.map +1 -1
- package/out/src/services/chaintracker/index.client.js +1 -0
- package/out/src/services/chaintracker/index.client.js.map +1 -1
- package/out/src/services/chaintracker/index.mobile.d.ts +1 -0
- package/out/src/services/chaintracker/index.mobile.d.ts.map +1 -1
- package/out/src/services/chaintracker/index.mobile.js +1 -0
- package/out/src/services/chaintracker/index.mobile.js.map +1 -1
- package/out/src/services/classifyOutputUtxo.d.ts +25 -0
- package/out/src/services/classifyOutputUtxo.d.ts.map +1 -0
- package/out/src/services/classifyOutputUtxo.js +96 -0
- package/out/src/services/classifyOutputUtxo.js.map +1 -0
- package/out/src/services/createDefaultWalletServicesOptions.d.ts +16 -3
- package/out/src/services/createDefaultWalletServicesOptions.d.ts.map +1 -1
- package/out/src/services/createDefaultWalletServicesOptions.js +38 -8
- package/out/src/services/createDefaultWalletServicesOptions.js.map +1 -1
- package/out/src/services/fiatRateValidation.d.ts +12 -0
- package/out/src/services/fiatRateValidation.d.ts.map +1 -0
- package/out/src/services/fiatRateValidation.js +138 -0
- package/out/src/services/fiatRateValidation.js.map +1 -0
- package/out/src/services/getCanonicalMerklePath.d.ts +15 -0
- package/out/src/services/getCanonicalMerklePath.d.ts.map +1 -0
- package/out/src/services/getCanonicalMerklePath.js +90 -0
- package/out/src/services/getCanonicalMerklePath.js.map +1 -0
- package/out/src/services/providers/ARC.d.ts +3 -16
- package/out/src/services/providers/ARC.d.ts.map +1 -1
- package/out/src/services/providers/ARC.js +36 -37
- package/out/src/services/providers/ARC.js.map +1 -1
- package/out/src/services/providers/ArcSSEClient.d.ts +38 -23
- package/out/src/services/providers/ArcSSEClient.d.ts.map +1 -1
- package/out/src/services/providers/ArcSSEClient.js +384 -63
- package/out/src/services/providers/ArcSSEClient.js.map +1 -1
- package/out/src/services/providers/Arcade.d.ts +11 -1
- package/out/src/services/providers/Arcade.d.ts.map +1 -1
- package/out/src/services/providers/Arcade.js +111 -33
- package/out/src/services/providers/Arcade.js.map +1 -1
- package/out/src/services/providers/Bitails.d.ts +3 -0
- package/out/src/services/providers/Bitails.d.ts.map +1 -1
- package/out/src/services/providers/Bitails.js +79 -12
- package/out/src/services/providers/Bitails.js.map +1 -1
- package/out/src/services/providers/SdkWhatsOnChain.d.ts +8 -2
- package/out/src/services/providers/SdkWhatsOnChain.d.ts.map +1 -1
- package/out/src/services/providers/SdkWhatsOnChain.js +83 -10
- package/out/src/services/providers/SdkWhatsOnChain.js.map +1 -1
- package/out/src/services/providers/WhatsOnChain.d.ts +3 -0
- package/out/src/services/providers/WhatsOnChain.d.ts.map +1 -1
- package/out/src/services/providers/WhatsOnChain.js +221 -69
- package/out/src/services/providers/WhatsOnChain.js.map +1 -1
- package/out/src/services/providers/arcProviderConfig.d.ts +27 -0
- package/out/src/services/providers/arcProviderConfig.d.ts.map +1 -0
- package/out/src/services/providers/arcProviderConfig.js +83 -0
- package/out/src/services/providers/arcProviderConfig.js.map +1 -0
- package/out/src/services/providers/arcTxDataValidation.d.ts +4 -0
- package/out/src/services/providers/arcTxDataValidation.d.ts.map +1 -0
- package/out/src/services/providers/arcTxDataValidation.js +92 -0
- package/out/src/services/providers/arcTxDataValidation.js.map +1 -0
- package/out/src/services/providers/arcadeStatus.d.ts +18 -0
- package/out/src/services/providers/arcadeStatus.d.ts.map +1 -0
- package/out/src/services/providers/arcadeStatus.js +56 -0
- package/out/src/services/providers/arcadeStatus.js.map +1 -0
- package/out/src/services/providers/exchangeRates.d.ts +3 -3
- package/out/src/services/providers/exchangeRates.d.ts.map +1 -1
- package/out/src/services/providers/exchangeRates.js +153 -226
- package/out/src/services/providers/exchangeRates.js.map +1 -1
- package/out/src/services/providers/getBeefForTxid.d.ts.map +1 -1
- package/out/src/services/providers/getBeefForTxid.js.map +1 -1
- package/out/src/services/providers/whatsOnChainHelpers.d.ts +2 -2
- package/out/src/services/providers/whatsOnChainHelpers.d.ts.map +1 -1
- package/out/src/services/providers/whatsOnChainHelpers.js +11 -8
- package/out/src/services/providers/whatsOnChainHelpers.js.map +1 -1
- package/out/src/services/validateMerklePathResult.d.ts +30 -0
- package/out/src/services/validateMerklePathResult.d.ts.map +1 -0
- package/out/src/services/validateMerklePathResult.js +272 -0
- package/out/src/services/validateMerklePathResult.js.map +1 -0
- package/out/src/services/validatePostBeefResult.d.ts +17 -0
- package/out/src/services/validatePostBeefResult.d.ts.map +1 -0
- package/out/src/services/validatePostBeefResult.js +334 -0
- package/out/src/services/validatePostBeefResult.js.map +1 -0
- package/out/src/services/validateRawTxResult.d.ts +6 -0
- package/out/src/services/validateRawTxResult.d.ts.map +1 -0
- package/out/src/services/validateRawTxResult.js +77 -0
- package/out/src/services/validateRawTxResult.js.map +1 -0
- package/out/src/services/validateScriptHashHistoryResult.d.ts +5 -0
- package/out/src/services/validateScriptHashHistoryResult.d.ts.map +1 -0
- package/out/src/services/validateScriptHashHistoryResult.js +99 -0
- package/out/src/services/validateScriptHashHistoryResult.js.map +1 -0
- package/out/src/services/validateStatusForTxidsResult.d.ts +8 -0
- package/out/src/services/validateStatusForTxidsResult.d.ts.map +1 -0
- package/out/src/services/validateStatusForTxidsResult.js +181 -0
- package/out/src/services/validateStatusForTxidsResult.js.map +1 -0
- package/out/src/services/validateUtxoStatusResult.d.ts +6 -0
- package/out/src/services/validateUtxoStatusResult.d.ts.map +1 -0
- package/out/src/services/validateUtxoStatusResult.js +126 -0
- package/out/src/services/validateUtxoStatusResult.js.map +1 -0
- package/out/src/signer/actionBatch/ActionBatchPlanner.d.ts +3 -2
- package/out/src/signer/actionBatch/ActionBatchPlanner.d.ts.map +1 -1
- package/out/src/signer/actionBatch/ActionBatchPlanner.js +29 -6
- package/out/src/signer/actionBatch/ActionBatchPlanner.js.map +1 -1
- package/out/src/signer/actionBatch/ActionBatchWorkspace.d.ts +8 -5
- package/out/src/signer/actionBatch/ActionBatchWorkspace.d.ts.map +1 -1
- package/out/src/signer/actionBatch/ActionBatchWorkspace.js +186 -73
- package/out/src/signer/actionBatch/ActionBatchWorkspace.js.map +1 -1
- package/out/src/signer/actionBatch/actionBatchBootstrap.d.ts +2 -2
- package/out/src/signer/actionBatch/actionBatchBootstrap.d.ts.map +1 -1
- package/out/src/signer/actionBatch/actionBatchBootstrap.js +3 -3
- package/out/src/signer/actionBatch/actionBatchBootstrap.js.map +1 -1
- package/out/src/signer/methods/acquireDirectCertificate.d.ts +3 -2
- package/out/src/signer/methods/acquireDirectCertificate.d.ts.map +1 -1
- package/out/src/signer/methods/acquireDirectCertificate.js.map +1 -1
- package/out/src/signer/methods/buildSignableTransaction.d.ts +6 -5
- package/out/src/signer/methods/buildSignableTransaction.d.ts.map +1 -1
- package/out/src/signer/methods/buildSignableTransaction.js +6 -11
- package/out/src/signer/methods/buildSignableTransaction.js.map +1 -1
- package/out/src/signer/methods/createAction.d.ts +4 -3
- package/out/src/signer/methods/createAction.d.ts.map +1 -1
- package/out/src/signer/methods/createAction.js +3 -1
- package/out/src/signer/methods/createAction.js.map +1 -1
- package/out/src/signer/methods/createNoSendExpiryAction.d.ts +7 -0
- package/out/src/signer/methods/createNoSendExpiryAction.d.ts.map +1 -0
- package/out/src/signer/methods/createNoSendExpiryAction.js +254 -0
- package/out/src/signer/methods/createNoSendExpiryAction.js.map +1 -0
- package/out/src/signer/methods/internalizeAction.d.ts.map +1 -1
- package/out/src/signer/methods/internalizeAction.js +9 -5
- package/out/src/signer/methods/internalizeAction.js.map +1 -1
- package/out/src/signer/methods/proveCertificate.d.ts +3 -2
- package/out/src/signer/methods/proveCertificate.d.ts.map +1 -1
- package/out/src/signer/methods/proveCertificate.js.map +1 -1
- package/out/src/signer/methods/signAction.d.ts.map +1 -1
- package/out/src/signer/methods/signAction.js +12 -2
- package/out/src/signer/methods/signAction.js.map +1 -1
- package/out/src/signer/methods/verifyUnlockScripts.d.ts.map +1 -1
- package/out/src/signer/methods/verifyUnlockScripts.js +12 -17
- package/out/src/signer/methods/verifyUnlockScripts.js.map +1 -1
- package/out/src/storage/StorageIdb.d.ts +11 -3
- package/out/src/storage/StorageIdb.d.ts.map +1 -1
- package/out/src/storage/StorageIdb.js +134 -44
- package/out/src/storage/StorageIdb.js.map +1 -1
- package/out/src/storage/StorageKnex.d.ts +68 -7
- package/out/src/storage/StorageKnex.d.ts.map +1 -1
- package/out/src/storage/StorageKnex.js +551 -105
- package/out/src/storage/StorageKnex.js.map +1 -1
- package/out/src/storage/StorageProvider.d.ts +41 -10
- package/out/src/storage/StorageProvider.d.ts.map +1 -1
- package/out/src/storage/StorageProvider.js +397 -107
- package/out/src/storage/StorageProvider.js.map +1 -1
- package/out/src/storage/StorageReader.d.ts +9 -3
- package/out/src/storage/StorageReader.d.ts.map +1 -1
- package/out/src/storage/StorageReader.js +21 -43
- package/out/src/storage/StorageReader.js.map +1 -1
- package/out/src/storage/StorageReaderWriter.d.ts +4 -0
- package/out/src/storage/StorageReaderWriter.d.ts.map +1 -1
- package/out/src/storage/StorageReaderWriter.js +68 -38
- package/out/src/storage/StorageReaderWriter.js.map +1 -1
- package/out/src/storage/StorageSyncReader.d.ts +1 -1
- package/out/src/storage/StorageSyncReader.d.ts.map +1 -1
- package/out/src/storage/StorageSyncReader.js +3 -36
- package/out/src/storage/StorageSyncReader.js.map +1 -1
- package/out/src/storage/WalletStorageManager.d.ts +31 -6
- package/out/src/storage/WalletStorageManager.d.ts.map +1 -1
- package/out/src/storage/WalletStorageManager.js +166 -75
- package/out/src/storage/WalletStorageManager.js.map +1 -1
- package/out/src/storage/adminServer/adminServer.d.ts +3 -1
- package/out/src/storage/adminServer/adminServer.d.ts.map +1 -1
- package/out/src/storage/adminServer/adminServer.js +38 -49
- package/out/src/storage/adminServer/adminServer.js.map +1 -1
- package/out/src/storage/adminServer/adminUi.d.ts.map +1 -1
- package/out/src/storage/adminServer/adminUi.js +32 -9
- package/out/src/storage/adminServer/adminUi.js.map +1 -1
- package/out/src/storage/adminServer/reviewUtxos.d.ts +27 -0
- package/out/src/storage/adminServer/reviewUtxos.d.ts.map +1 -0
- package/out/src/storage/adminServer/reviewUtxos.js +62 -0
- package/out/src/storage/adminServer/reviewUtxos.js.map +1 -0
- package/out/src/storage/idbHelpers.d.ts.map +1 -1
- package/out/src/storage/idbHelpers.js +14 -2
- package/out/src/storage/idbHelpers.js.map +1 -1
- package/out/src/storage/index.all.d.ts +3 -0
- package/out/src/storage/index.all.d.ts.map +1 -1
- package/out/src/storage/index.all.js +3 -0
- package/out/src/storage/index.all.js.map +1 -1
- package/out/src/storage/index.client.d.ts +1 -0
- package/out/src/storage/index.client.d.ts.map +1 -1
- package/out/src/storage/index.client.js +1 -0
- package/out/src/storage/index.client.js.map +1 -1
- package/out/src/storage/index.mobile.d.ts +1 -0
- package/out/src/storage/index.mobile.d.ts.map +1 -1
- package/out/src/storage/index.mobile.js +1 -0
- package/out/src/storage/index.mobile.js.map +1 -1
- package/out/src/storage/methods/ListActionsSpecOp.d.ts +2 -2
- package/out/src/storage/methods/ListActionsSpecOp.d.ts.map +1 -1
- package/out/src/storage/methods/ListActionsSpecOp.js.map +1 -1
- package/out/src/storage/methods/ListOutputsSpecOp.d.ts +7 -4
- package/out/src/storage/methods/ListOutputsSpecOp.d.ts.map +1 -1
- package/out/src/storage/methods/ListOutputsSpecOp.js +5 -44
- package/out/src/storage/methods/ListOutputsSpecOp.js.map +1 -1
- package/out/src/storage/methods/actionBatch.d.ts +9 -2
- package/out/src/storage/methods/actionBatch.d.ts.map +1 -1
- package/out/src/storage/methods/actionBatch.js +260 -67
- package/out/src/storage/methods/actionBatch.js.map +1 -1
- package/out/src/storage/methods/actionBatchBlobs.d.ts +2 -0
- package/out/src/storage/methods/actionBatchBlobs.d.ts.map +1 -1
- package/out/src/storage/methods/actionBatchBlobs.js +47 -26
- package/out/src/storage/methods/actionBatchBlobs.js.map +1 -1
- package/out/src/storage/methods/actionBatchValidation.d.ts.map +1 -1
- package/out/src/storage/methods/actionBatchValidation.js +22 -30
- package/out/src/storage/methods/actionBatchValidation.js.map +1 -1
- package/out/src/storage/methods/attemptToPostReqsToNetwork.d.ts +7 -2
- package/out/src/storage/methods/attemptToPostReqsToNetwork.d.ts.map +1 -1
- package/out/src/storage/methods/attemptToPostReqsToNetwork.js +59 -110
- package/out/src/storage/methods/attemptToPostReqsToNetwork.js.map +1 -1
- package/out/src/storage/methods/availableManagedChange.d.ts +8 -1
- package/out/src/storage/methods/availableManagedChange.d.ts.map +1 -1
- package/out/src/storage/methods/availableManagedChange.js.map +1 -1
- package/out/src/storage/methods/createAction.d.ts +60 -3
- package/out/src/storage/methods/createAction.d.ts.map +1 -1
- package/out/src/storage/methods/createAction.js +390 -105
- package/out/src/storage/methods/createAction.js.map +1 -1
- package/out/src/storage/methods/generateChange.d.ts +15 -5
- package/out/src/storage/methods/generateChange.d.ts.map +1 -1
- package/out/src/storage/methods/generateChange.js +187 -27
- package/out/src/storage/methods/generateChange.js.map +1 -1
- package/out/src/storage/methods/getBeefForTransaction.js +5 -7
- package/out/src/storage/methods/getBeefForTransaction.js.map +1 -1
- package/out/src/storage/methods/getSyncChunk.d.ts.map +1 -1
- package/out/src/storage/methods/getSyncChunk.js +42 -11
- package/out/src/storage/methods/getSyncChunk.js.map +1 -1
- package/out/src/storage/methods/internalizeAction.d.ts +3 -3
- package/out/src/storage/methods/internalizeAction.d.ts.map +1 -1
- package/out/src/storage/methods/internalizeAction.js +171 -133
- package/out/src/storage/methods/internalizeAction.js.map +1 -1
- package/out/src/storage/methods/listActionsIdb.d.ts +3 -2
- package/out/src/storage/methods/listActionsIdb.d.ts.map +1 -1
- package/out/src/storage/methods/listActionsIdb.js +2 -2
- package/out/src/storage/methods/listActionsIdb.js.map +1 -1
- package/out/src/storage/methods/listActionsKnex.d.ts +3 -2
- package/out/src/storage/methods/listActionsKnex.d.ts.map +1 -1
- package/out/src/storage/methods/listActionsKnex.js +22 -11
- package/out/src/storage/methods/listActionsKnex.js.map +1 -1
- package/out/src/storage/methods/listCertificates.d.ts +3 -2
- package/out/src/storage/methods/listCertificates.d.ts.map +1 -1
- package/out/src/storage/methods/listCertificates.js.map +1 -1
- package/out/src/storage/methods/listOutputsIdb.d.ts +3 -2
- package/out/src/storage/methods/listOutputsIdb.d.ts.map +1 -1
- package/out/src/storage/methods/listOutputsIdb.js +25 -18
- package/out/src/storage/methods/listOutputsIdb.js.map +1 -1
- package/out/src/storage/methods/listOutputsKnex.d.ts +3 -2
- package/out/src/storage/methods/listOutputsKnex.d.ts.map +1 -1
- package/out/src/storage/methods/listOutputsKnex.js +32 -30
- package/out/src/storage/methods/listOutputsKnex.js.map +1 -1
- package/out/src/storage/methods/managedChangePolicy.d.ts +44 -0
- package/out/src/storage/methods/managedChangePolicy.d.ts.map +1 -0
- package/out/src/storage/methods/managedChangePolicy.js +58 -0
- package/out/src/storage/methods/managedChangePolicy.js.map +1 -0
- package/out/src/storage/methods/maxPossibleSatoshis.d.ts +13 -0
- package/out/src/storage/methods/maxPossibleSatoshis.d.ts.map +1 -0
- package/out/src/storage/methods/maxPossibleSatoshis.js +16 -0
- package/out/src/storage/methods/maxPossibleSatoshis.js.map +1 -0
- package/out/src/storage/methods/noSendExpiry.d.ts +11 -0
- package/out/src/storage/methods/noSendExpiry.d.ts.map +1 -0
- package/out/src/storage/methods/noSendExpiry.js +359 -0
- package/out/src/storage/methods/noSendExpiry.js.map +1 -0
- package/out/src/storage/methods/noSendExpiryLifecycle.d.ts +14 -0
- package/out/src/storage/methods/noSendExpiryLifecycle.d.ts.map +1 -0
- package/out/src/storage/methods/noSendExpiryLifecycle.js +691 -0
- package/out/src/storage/methods/noSendExpiryLifecycle.js.map +1 -0
- package/out/src/storage/methods/preparedBeef.d.ts +104 -0
- package/out/src/storage/methods/preparedBeef.d.ts.map +1 -0
- package/out/src/storage/methods/preparedBeef.js +524 -0
- package/out/src/storage/methods/preparedBeef.js.map +1 -0
- package/out/src/storage/methods/processAction.d.ts.map +1 -1
- package/out/src/storage/methods/processAction.js +144 -32
- package/out/src/storage/methods/processAction.js.map +1 -1
- package/out/src/storage/methods/purgeData.d.ts.map +1 -1
- package/out/src/storage/methods/purgeData.js +21 -3
- package/out/src/storage/methods/purgeData.js.map +1 -1
- package/out/src/storage/methods/reconcileFailedTransactionInputs.d.ts +32 -0
- package/out/src/storage/methods/reconcileFailedTransactionInputs.d.ts.map +1 -0
- package/out/src/storage/methods/reconcileFailedTransactionInputs.js +142 -0
- package/out/src/storage/methods/reconcileFailedTransactionInputs.js.map +1 -0
- package/out/src/storage/methods/reviewStatus.d.ts.map +1 -1
- package/out/src/storage/methods/reviewStatus.js +7 -4
- package/out/src/storage/methods/reviewStatus.js.map +1 -1
- package/out/src/storage/methods/reviewStatusIdb.d.ts +1 -1
- package/out/src/storage/methods/reviewStatusIdb.d.ts.map +1 -1
- package/out/src/storage/methods/reviewStatusIdb.js.map +1 -1
- package/out/src/storage/methods/reviewUtxoOutputs.d.ts +38 -0
- package/out/src/storage/methods/reviewUtxoOutputs.d.ts.map +1 -0
- package/out/src/storage/methods/reviewUtxoOutputs.js +197 -0
- package/out/src/storage/methods/reviewUtxoOutputs.js.map +1 -0
- package/out/src/storage/methods/validateSyncProof.d.ts +32 -0
- package/out/src/storage/methods/validateSyncProof.d.ts.map +1 -0
- package/out/src/storage/methods/validateSyncProof.js +139 -0
- package/out/src/storage/methods/validateSyncProof.js.map +1 -0
- package/out/src/storage/portable/index.d.ts.map +1 -1
- package/out/src/storage/portable/index.js +25 -15
- package/out/src/storage/portable/index.js.map +1 -1
- package/out/src/storage/remoting/BinaryJson.d.ts +11 -0
- package/out/src/storage/remoting/BinaryJson.d.ts.map +1 -1
- package/out/src/storage/remoting/BinaryJson.js +94 -8
- package/out/src/storage/remoting/BinaryJson.js.map +1 -1
- package/out/src/storage/remoting/KnexPaymentReplayStore.d.ts.map +1 -1
- package/out/src/storage/remoting/KnexPaymentReplayStore.js +1 -0
- package/out/src/storage/remoting/KnexPaymentReplayStore.js.map +1 -1
- package/out/src/storage/remoting/KnexSessionManager.d.ts +26 -2
- package/out/src/storage/remoting/KnexSessionManager.d.ts.map +1 -1
- package/out/src/storage/remoting/KnexSessionManager.js +221 -40
- package/out/src/storage/remoting/KnexSessionManager.js.map +1 -1
- package/out/src/storage/remoting/KnexSyncTransferStore.d.ts +26 -0
- package/out/src/storage/remoting/KnexSyncTransferStore.d.ts.map +1 -0
- package/out/src/storage/remoting/KnexSyncTransferStore.js +222 -0
- package/out/src/storage/remoting/KnexSyncTransferStore.js.map +1 -0
- package/out/src/storage/remoting/StorageClient.d.ts +6 -1
- package/out/src/storage/remoting/StorageClient.d.ts.map +1 -1
- package/out/src/storage/remoting/StorageClient.js +65 -8
- package/out/src/storage/remoting/StorageClient.js.map +1 -1
- package/out/src/storage/remoting/StorageClientBase.d.ts +57 -10
- package/out/src/storage/remoting/StorageClientBase.d.ts.map +1 -1
- package/out/src/storage/remoting/StorageClientBase.js +372 -9
- package/out/src/storage/remoting/StorageClientBase.js.map +1 -1
- package/out/src/storage/remoting/StorageMobile.d.ts +5 -0
- package/out/src/storage/remoting/StorageMobile.d.ts.map +1 -1
- package/out/src/storage/remoting/StorageMobile.js +13 -11
- package/out/src/storage/remoting/StorageMobile.js.map +1 -1
- package/out/src/storage/remoting/StorageServer.d.ts +10 -1
- package/out/src/storage/remoting/StorageServer.d.ts.map +1 -1
- package/out/src/storage/remoting/StorageServer.js +221 -20
- package/out/src/storage/remoting/StorageServer.js.map +1 -1
- package/out/src/storage/remoting/SyncTransfer.d.ts +29 -0
- package/out/src/storage/remoting/SyncTransfer.d.ts.map +1 -0
- package/out/src/storage/remoting/SyncTransfer.js +153 -0
- package/out/src/storage/remoting/SyncTransfer.js.map +1 -0
- package/out/src/storage/remoting/entityValidationHelpers.d.ts.map +1 -1
- package/out/src/storage/remoting/entityValidationHelpers.js +35 -0
- package/out/src/storage/remoting/entityValidationHelpers.js.map +1 -1
- package/out/src/storage/remoting/syncChunkBinary.d.ts +4 -0
- package/out/src/storage/remoting/syncChunkBinary.d.ts.map +1 -0
- package/out/src/storage/remoting/syncChunkBinary.js +38 -0
- package/out/src/storage/remoting/syncChunkBinary.js.map +1 -0
- package/out/src/storage/remoting/validateRpcSyncProofs.d.ts +5 -0
- package/out/src/storage/remoting/validateRpcSyncProofs.d.ts.map +1 -0
- package/out/src/storage/remoting/validateRpcSyncProofs.js +82 -0
- package/out/src/storage/remoting/validateRpcSyncProofs.js.map +1 -0
- package/out/src/storage/schema/KnexMigrations.d.ts +6 -0
- package/out/src/storage/schema/KnexMigrations.d.ts.map +1 -1
- package/out/src/storage/schema/KnexMigrations.js +194 -5
- package/out/src/storage/schema/KnexMigrations.js.map +1 -1
- package/out/src/storage/schema/StorageIdbSchema.d.ts +3 -0
- package/out/src/storage/schema/StorageIdbSchema.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityOutput.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityOutput.js +24 -4
- package/out/src/storage/schema/entities/EntityOutput.js.map +1 -1
- package/out/src/storage/schema/entities/EntityOutputBasket.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityOutputBasket.js +5 -2
- package/out/src/storage/schema/entities/EntityOutputBasket.js.map +1 -1
- package/out/src/storage/schema/entities/EntityProvenTx.d.ts +4 -1
- package/out/src/storage/schema/entities/EntityProvenTx.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityProvenTx.js +125 -41
- package/out/src/storage/schema/entities/EntityProvenTx.js.map +1 -1
- package/out/src/storage/schema/entities/EntityProvenTxReq.js +1 -1
- package/out/src/storage/schema/entities/EntityProvenTxReq.js.map +1 -1
- package/out/src/storage/schema/entities/EntitySyncState.d.ts +4 -2
- package/out/src/storage/schema/entities/EntitySyncState.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntitySyncState.js +12 -6
- package/out/src/storage/schema/entities/EntitySyncState.js.map +1 -1
- package/out/src/storage/schema/entities/EntityTransaction.d.ts +26 -0
- package/out/src/storage/schema/entities/EntityTransaction.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityTransaction.js +221 -21
- package/out/src/storage/schema/entities/EntityTransaction.js.map +1 -1
- package/out/src/storage/schema/tables/TableCertificate.d.ts +1 -1
- package/out/src/storage/schema/tables/TableCertificate.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableCertificateField.d.ts +1 -1
- package/out/src/storage/schema/tables/TableCertificateField.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableCommission.d.ts +1 -1
- package/out/src/storage/schema/tables/TableCommission.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableMonitorEvent.d.ts +1 -1
- package/out/src/storage/schema/tables/TableMonitorEvent.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableOutput.d.ts +1 -1
- package/out/src/storage/schema/tables/TableOutput.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableOutputBasket.d.ts +1 -1
- package/out/src/storage/schema/tables/TableOutputBasket.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableOutputTag.d.ts +1 -1
- package/out/src/storage/schema/tables/TableOutputTag.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableOutputTagMap.d.ts +1 -1
- package/out/src/storage/schema/tables/TableOutputTagMap.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TablePreparedBeef.interfaces.d.ts +23 -0
- package/out/src/storage/schema/tables/TablePreparedBeef.interfaces.d.ts.map +1 -0
- package/out/src/storage/schema/tables/TablePreparedBeef.interfaces.js +3 -0
- package/out/src/storage/schema/tables/TablePreparedBeef.interfaces.js.map +1 -0
- package/out/src/storage/schema/tables/TableProvenTx.d.ts +1 -1
- package/out/src/storage/schema/tables/TableProvenTx.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableProvenTxReq.d.ts +1 -1
- package/out/src/storage/schema/tables/TableProvenTxReq.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableSettings.d.ts +2 -2
- package/out/src/storage/schema/tables/TableSettings.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableSyncState.d.ts +1 -1
- package/out/src/storage/schema/tables/TableSyncState.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableTransaction.d.ts +17 -1
- package/out/src/storage/schema/tables/TableTransaction.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableTransaction.js +14 -1
- package/out/src/storage/schema/tables/TableTransaction.js.map +1 -1
- package/out/src/storage/schema/tables/TableTxLabel.d.ts +1 -1
- package/out/src/storage/schema/tables/TableTxLabel.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableTxLabelMap.d.ts +1 -1
- package/out/src/storage/schema/tables/TableTxLabelMap.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableUser.d.ts +1 -1
- package/out/src/storage/schema/tables/TableUser.d.ts.map +1 -1
- package/out/src/storage/sync/StorageMySQLDojoReader.d.ts.map +1 -1
- package/out/src/storage/sync/StorageMySQLDojoReader.js +8 -7
- package/out/src/storage/sync/StorageMySQLDojoReader.js.map +1 -1
- package/out/src/storage/sync/SyncPageBudget.d.ts +8 -0
- package/out/src/storage/sync/SyncPageBudget.d.ts.map +1 -0
- package/out/src/storage/sync/SyncPageBudget.js +24 -0
- package/out/src/storage/sync/SyncPageBudget.js.map +1 -0
- package/out/src/storage/sync/syncCheckpoint.d.ts +4 -0
- package/out/src/storage/sync/syncCheckpoint.d.ts.map +1 -0
- package/out/src/storage/sync/syncCheckpoint.js +49 -0
- package/out/src/storage/sync/syncCheckpoint.js.map +1 -0
- package/out/src/utility/Argon2idBackend.d.ts +36 -0
- package/out/src/utility/Argon2idBackend.d.ts.map +1 -0
- package/out/src/utility/Argon2idBackend.js +60 -0
- package/out/src/utility/Argon2idBackend.js.map +1 -0
- package/out/src/utility/actionBatchDigest.d.ts.map +1 -1
- package/out/src/utility/actionBatchDigest.js +9 -7
- package/out/src/utility/actionBatchDigest.js.map +1 -1
- package/out/src/utility/actionBatchPack.d.ts.map +1 -1
- package/out/src/utility/actionBatchPack.js +7 -12
- package/out/src/utility/actionBatchPack.js.map +1 -1
- package/out/src/utility/beefForTxids.d.ts +12 -3
- package/out/src/utility/beefForTxids.d.ts.map +1 -1
- package/out/src/utility/beefForTxids.js +69 -21
- package/out/src/utility/beefForTxids.js.map +1 -1
- package/out/src/utility/brc153ReferenceLabels.d.ts +16 -0
- package/out/src/utility/brc153ReferenceLabels.d.ts.map +1 -1
- package/out/src/utility/brc153ReferenceLabels.js +20 -5
- package/out/src/utility/brc153ReferenceLabels.js.map +1 -1
- package/out/src/utility/brc177NoSendExpiry.d.ts +34 -0
- package/out/src/utility/brc177NoSendExpiry.d.ts.map +1 -0
- package/out/src/utility/brc177NoSendExpiry.js +81 -0
- package/out/src/utility/brc177NoSendExpiry.js.map +1 -0
- package/out/src/utility/canonicalizeAtomicBeef.d.ts +12 -0
- package/out/src/utility/canonicalizeAtomicBeef.d.ts.map +1 -0
- package/out/src/utility/canonicalizeAtomicBeef.js +23 -0
- package/out/src/utility/canonicalizeAtomicBeef.js.map +1 -0
- package/out/src/utility/exactActionSpend.d.ts +9 -0
- package/out/src/utility/exactActionSpend.d.ts.map +1 -0
- package/out/src/utility/exactActionSpend.js +26 -0
- package/out/src/utility/exactActionSpend.js.map +1 -0
- package/out/src/utility/hashWasm.d.ts +1 -1
- package/out/src/utility/hashWasm.d.ts.map +1 -1
- package/out/src/utility/hashWasm.js +83 -1
- package/out/src/utility/hashWasm.js.map +1 -1
- package/out/src/utility/identityUtils.d.ts +44 -4
- package/out/src/utility/identityUtils.d.ts.map +1 -1
- package/out/src/utility/identityUtils.js +523 -61
- package/out/src/utility/identityUtils.js.map +1 -1
- package/out/src/utility/index.all.d.ts +2 -0
- package/out/src/utility/index.all.d.ts.map +1 -1
- package/out/src/utility/index.all.js +2 -0
- package/out/src/utility/index.all.js.map +1 -1
- package/out/src/utility/index.client.d.ts +2 -0
- package/out/src/utility/index.client.d.ts.map +1 -1
- package/out/src/utility/index.client.js +2 -0
- package/out/src/utility/index.client.js.map +1 -1
- package/out/src/utility/parseTxScriptOffsets.d.ts.map +1 -1
- package/out/src/utility/parseTxScriptOffsets.js +1 -19
- package/out/src/utility/parseTxScriptOffsets.js.map +1 -1
- package/out/src/utility/tscProofToMerklePath.d.ts.map +1 -1
- package/out/src/utility/tscProofToMerklePath.js +35 -4
- package/out/src/utility/tscProofToMerklePath.js.map +1 -1
- package/out/src/utility/utilityHelpers.d.ts +1 -1
- package/out/src/utility/utilityHelpers.d.ts.map +1 -1
- package/out/src/utility/utilityHelpers.js +10 -7
- package/out/src/utility/utilityHelpers.js.map +1 -1
- package/out/src/utility/utilityHelpers.noBuffer.d.ts.map +1 -1
- package/out/src/utility/utilityHelpers.noBuffer.js +6 -6
- package/out/src/utility/utilityHelpers.noBuffer.js.map +1 -1
- package/out/src/utility/verifyOverlayOutput.d.ts +12 -0
- package/out/src/utility/verifyOverlayOutput.d.ts.map +1 -0
- package/out/src/utility/verifyOverlayOutput.js +22 -0
- package/out/src/utility/verifyOverlayOutput.js.map +1 -0
- package/out/src/utility/walletResultGuards.d.ts +14 -0
- package/out/src/utility/walletResultGuards.d.ts.map +1 -0
- package/out/src/utility/walletResultGuards.js +28 -0
- package/out/src/utility/walletResultGuards.js.map +1 -0
- package/out/src/wab-client/WABClient.d.ts +4 -17
- package/out/src/wab-client/WABClient.d.ts.map +1 -1
- package/out/src/wab-client/WABClient.js +35 -12
- package/out/src/wab-client/WABClient.js.map +1 -1
- package/out/src/wab-client/WABResponseValidation.d.ts +48 -0
- package/out/src/wab-client/WABResponseValidation.d.ts.map +1 -0
- package/out/src/wab-client/WABResponseValidation.js +321 -0
- package/out/src/wab-client/WABResponseValidation.js.map +1 -0
- package/out/src/wab-client/WABTransport.d.ts +17 -23
- package/out/src/wab-client/WABTransport.d.ts.map +1 -1
- package/out/src/wab-client/WABTransport.js +130 -142
- package/out/src/wab-client/WABTransport.js.map +1 -1
- package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.d.ts +8 -0
- package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.d.ts.map +1 -1
- package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.js +3 -2
- package/out/src/wab-client/auth-method-interactors/AuthMethodInteractor.js.map +1 -1
- package/package.json +36 -32
- 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() {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
|
139
|
-
|
|
140
|
-
const proven = (0, utilityHelpers_1.verifyOneOrNone)(
|
|
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
|
-
|
|
144
|
-
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
if (
|
|
153
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 ||
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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 (
|
|
1005
|
+
if (args.certifiers != null && args.certifiers.length > 0)
|
|
686
1006
|
void q.whereIn('certifier', args.certifiers);
|
|
687
|
-
if (
|
|
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 (
|
|
706
|
-
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 ||
|
|
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 ||
|
|
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 ||
|
|
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
|
-
|
|
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]
|
|
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,
|
|
994
|
-
// PRAGMA foreign_keys is silently ignored
|
|
995
|
-
//
|
|
996
|
-
//
|
|
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
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
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
|
-
|
|
1033
|
-
|
|
1034
|
-
const
|
|
1035
|
-
if (
|
|
1036
|
-
|
|
1037
|
-
|
|
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
|
-
|
|
1041
|
-
|
|
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
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
1515
|
-
|
|
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] =
|
|
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 =
|
|
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
|