@bsv/wallet-toolbox 2.1.25 → 3.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/CREATEACTION_BLOCKERS.md +391 -0
- package/docs/CUTOVER_RUNBOOK.md +95 -0
- package/docs/REQUIREMENTS_COMPLIANCE.md +157 -0
- package/docs/ROLLOUT_PLAN.md +273 -0
- package/docs/SESSION_HANDOFF.md +298 -0
- package/docs/STORAGE_METHOD_WIRING.md +176 -0
- package/docs/client.md +3765 -1325
- package/docs/monitor.md +255 -33
- package/docs/services.md +304 -280
- package/docs/setup.md +24 -24
- package/docs/storage.md +2783 -251
- package/docs/v3-upgrade/index.html +911 -0
- package/docs/wallet.md +4956 -9455
- package/out/src/Wallet.d.ts.map +1 -1
- package/out/src/Wallet.js.map +1 -1
- package/out/src/WalletLogger.d.ts.map +1 -1
- package/out/src/WalletLogger.js.map +1 -1
- package/out/src/__tests/CWIStyleWalletManager.test.js.map +1 -1
- package/out/src/__tests/WalletPermissionsManager.fixtures.d.ts.map +1 -1
- package/out/src/__tests/WalletPermissionsManager.fixtures.js.map +1 -1
- package/out/src/entropy/EntropyCollector.d.ts.map +1 -1
- package/out/src/entropy/EntropyCollector.js.map +1 -1
- package/out/src/monitor/LeasedMonitorTask.d.ts +43 -0
- package/out/src/monitor/LeasedMonitorTask.d.ts.map +1 -0
- package/out/src/monitor/LeasedMonitorTask.js +89 -0
- package/out/src/monitor/LeasedMonitorTask.js.map +1 -0
- package/out/src/monitor/Monitor.d.ts +7 -0
- package/out/src/monitor/Monitor.d.ts.map +1 -1
- package/out/src/monitor/Monitor.js +7 -0
- 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.map +1 -1
- package/out/src/monitor/V7LeasedTask.d.ts +43 -0
- package/out/src/monitor/V7LeasedTask.d.ts.map +1 -0
- package/out/src/monitor/V7LeasedTask.js +89 -0
- package/out/src/monitor/V7LeasedTask.js.map +1 -0
- package/out/src/monitor/index.all.d.ts +1 -0
- package/out/src/monitor/index.all.d.ts.map +1 -1
- package/out/src/monitor/index.all.js +1 -0
- package/out/src/monitor/index.all.js.map +1 -1
- package/out/src/monitor/tasks/TaskCheckForProofs.d.ts +2 -0
- package/out/src/monitor/tasks/TaskCheckForProofs.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskCheckForProofs.js +55 -0
- package/out/src/monitor/tasks/TaskCheckForProofs.js.map +1 -1
- package/out/src/monitor/tasks/TaskSendWaiting.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskSendWaiting.js.map +1 -1
- package/out/src/sdk/WalletStorage.interfaces.d.ts +59 -59
- package/out/src/sdk/WalletStorage.interfaces.d.ts.map +1 -1
- package/out/src/sdk/types.d.ts +32 -0
- package/out/src/sdk/types.d.ts.map +1 -1
- package/out/src/sdk/types.js +50 -1
- package/out/src/sdk/types.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.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.map +1 -1
- package/out/src/services/chaintracker/chaintracks/createKnexChaintracks.d.ts.map +1 -1
- 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.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/BulkFilesReader.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFs.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/__tests/SingleWriterMultiReaderLock.test.js.map +1 -1
- package/out/src/storage/StorageIdb.d.ts.map +1 -1
- package/out/src/storage/StorageIdb.js +10 -5
- package/out/src/storage/StorageIdb.js.map +1 -1
- package/out/src/storage/StorageKnex.d.ts +133 -3
- package/out/src/storage/StorageKnex.d.ts.map +1 -1
- package/out/src/storage/StorageKnex.js +691 -94
- package/out/src/storage/StorageKnex.js.map +1 -1
- package/out/src/storage/StorageProvider.d.ts +114 -1
- package/out/src/storage/StorageProvider.d.ts.map +1 -1
- package/out/src/storage/StorageProvider.js +164 -4
- package/out/src/storage/StorageProvider.js.map +1 -1
- package/out/src/storage/WalletStorageManager.d.ts.map +1 -1
- package/out/src/storage/WalletStorageManager.js.map +1 -1
- package/out/src/storage/idbHelpers.d.ts +5 -0
- package/out/src/storage/idbHelpers.d.ts.map +1 -1
- package/out/src/storage/idbHelpers.js +42 -0
- package/out/src/storage/idbHelpers.js.map +1 -1
- package/out/src/storage/methods/attemptToPostReqsToNetwork.d.ts.map +1 -1
- package/out/src/storage/methods/attemptToPostReqsToNetwork.js +116 -4
- package/out/src/storage/methods/attemptToPostReqsToNetwork.js.map +1 -1
- package/out/src/storage/methods/createAction.d.ts.map +1 -1
- package/out/src/storage/methods/createAction.js +22 -5
- package/out/src/storage/methods/createAction.js.map +1 -1
- package/out/src/storage/methods/internalizeAction.d.ts.map +1 -1
- package/out/src/storage/methods/internalizeAction.js +172 -5
- package/out/src/storage/methods/internalizeAction.js.map +1 -1
- package/out/src/storage/methods/listActionsKnex.d.ts +49 -0
- package/out/src/storage/methods/listActionsKnex.d.ts.map +1 -1
- package/out/src/storage/methods/listActionsKnex.js +179 -69
- package/out/src/storage/methods/listActionsKnex.js.map +1 -1
- package/out/src/storage/methods/listOutputsKnex.d.ts.map +1 -1
- package/out/src/storage/methods/listOutputsKnex.js +51 -4
- package/out/src/storage/methods/listOutputsKnex.js.map +1 -1
- package/out/src/storage/methods/processAction.d.ts.map +1 -1
- package/out/src/storage/methods/processAction.js +82 -14
- 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 +22 -14
- package/out/src/storage/methods/purgeData.js.map +1 -1
- package/out/src/storage/methods/reviewStatus.d.ts.map +1 -1
- package/out/src/storage/methods/reviewStatus.js +18 -9
- package/out/src/storage/methods/reviewStatus.js.map +1 -1
- package/out/src/storage/schema/KnexMigrations.d.ts.map +1 -1
- package/out/src/storage/schema/KnexMigrations.js +134 -0
- package/out/src/storage/schema/KnexMigrations.js.map +1 -1
- package/out/src/storage/schema/StorageIdbSchema.d.ts +43 -2
- package/out/src/storage/schema/StorageIdbSchema.d.ts.map +1 -1
- package/out/src/storage/schema/__tests/backfill.runner.test.d.ts +2 -0
- package/out/src/storage/schema/__tests/backfill.runner.test.d.ts.map +1 -0
- package/out/src/storage/schema/__tests/backfill.runner.test.js +148 -0
- package/out/src/storage/schema/__tests/backfill.runner.test.js.map +1 -0
- package/out/src/storage/schema/__tests/backfill.test.d.ts +2 -0
- package/out/src/storage/schema/__tests/backfill.test.d.ts.map +1 -0
- package/out/src/storage/schema/__tests/backfill.test.js +96 -0
- package/out/src/storage/schema/__tests/backfill.test.js.map +1 -0
- package/out/src/storage/schema/__tests/processingFsm.test.d.ts +2 -0
- package/out/src/storage/schema/__tests/processingFsm.test.d.ts.map +1 -0
- package/out/src/storage/schema/__tests/processingFsm.test.js +42 -0
- package/out/src/storage/schema/__tests/processingFsm.test.js.map +1 -0
- package/out/src/storage/schema/__tests/processingFsmLegacyMapping.test.d.ts +2 -0
- package/out/src/storage/schema/__tests/processingFsmLegacyMapping.test.d.ts.map +1 -0
- package/out/src/storage/schema/__tests/processingFsmLegacyMapping.test.js +82 -0
- package/out/src/storage/schema/__tests/processingFsmLegacyMapping.test.js.map +1 -0
- package/out/src/storage/schema/__tests/spendabilityRule.test.d.ts +2 -0
- package/out/src/storage/schema/__tests/spendabilityRule.test.d.ts.map +1 -0
- package/out/src/storage/schema/__tests/spendabilityRule.test.js +29 -0
- package/out/src/storage/schema/__tests/spendabilityRule.test.js.map +1 -0
- package/out/src/storage/schema/__tests/v7FsmLegacyMapping.test.d.ts +2 -0
- package/out/src/storage/schema/__tests/v7FsmLegacyMapping.test.d.ts.map +1 -0
- package/out/src/storage/schema/__tests/v7FsmLegacyMapping.test.js +77 -0
- package/out/src/storage/schema/__tests/v7FsmLegacyMapping.test.js.map +1 -0
- package/out/src/storage/schema/backfill.d.ts +35 -0
- package/out/src/storage/schema/backfill.d.ts.map +1 -0
- package/out/src/storage/schema/backfill.idb.d.ts +32 -0
- package/out/src/storage/schema/backfill.idb.d.ts.map +1 -0
- package/out/src/storage/schema/backfill.idb.js +95 -0
- package/out/src/storage/schema/backfill.idb.js.map +1 -0
- package/out/src/storage/schema/backfill.js +150 -0
- package/out/src/storage/schema/backfill.js.map +1 -0
- package/out/src/storage/schema/backfill.knex.d.ts +32 -0
- package/out/src/storage/schema/backfill.knex.d.ts.map +1 -0
- package/out/src/storage/schema/backfill.knex.js +240 -0
- package/out/src/storage/schema/backfill.knex.js.map +1 -0
- package/out/src/storage/schema/backfill.runner.d.ts +63 -0
- package/out/src/storage/schema/backfill.runner.d.ts.map +1 -0
- package/out/src/storage/schema/backfill.runner.js +64 -0
- package/out/src/storage/schema/backfill.runner.js.map +1 -0
- package/out/src/storage/schema/coinbaseMaturityBackfill.d.ts +25 -0
- package/out/src/storage/schema/coinbaseMaturityBackfill.d.ts.map +1 -0
- package/out/src/storage/schema/coinbaseMaturityBackfill.js +75 -0
- package/out/src/storage/schema/coinbaseMaturityBackfill.js.map +1 -0
- package/out/src/storage/schema/monitorLease.d.ts +57 -0
- package/out/src/storage/schema/monitorLease.d.ts.map +1 -0
- package/out/src/storage/schema/monitorLease.js +101 -0
- package/out/src/storage/schema/monitorLease.js.map +1 -0
- package/out/src/storage/schema/processingFsm.d.ts +27 -0
- package/out/src/storage/schema/processingFsm.d.ts.map +1 -0
- package/out/src/storage/schema/processingFsm.js +132 -0
- package/out/src/storage/schema/processingFsm.js.map +1 -0
- package/out/src/storage/schema/schemaCutover.d.ts +34 -0
- package/out/src/storage/schema/schemaCutover.d.ts.map +1 -0
- package/out/src/storage/schema/schemaCutover.js +230 -0
- package/out/src/storage/schema/schemaCutover.js.map +1 -0
- package/out/src/storage/schema/schemaCutoverIdb.d.ts +26 -0
- package/out/src/storage/schema/schemaCutoverIdb.d.ts.map +1 -0
- package/out/src/storage/schema/schemaCutoverIdb.js +90 -0
- package/out/src/storage/schema/schemaCutoverIdb.js.map +1 -0
- package/out/src/storage/schema/spendabilityRefresh.d.ts +49 -0
- package/out/src/storage/schema/spendabilityRefresh.d.ts.map +1 -0
- package/out/src/storage/schema/spendabilityRefresh.js +120 -0
- package/out/src/storage/schema/spendabilityRefresh.js.map +1 -0
- package/out/src/storage/schema/spendabilityRule.d.ts +45 -0
- package/out/src/storage/schema/spendabilityRule.d.ts.map +1 -0
- package/out/src/storage/schema/spendabilityRule.js +52 -0
- package/out/src/storage/schema/spendabilityRule.js.map +1 -0
- package/out/src/storage/schema/tables/TableAction.d.ts +3 -3
- package/out/src/storage/schema/tables/TableAction.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableChainTip.d.ts +1 -1
- package/out/src/storage/schema/tables/TableMonitorLease.d.ts +1 -1
- package/out/src/storage/schema/tables/TableOutput.d.ts +7 -0
- package/out/src/storage/schema/tables/TableOutput.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableOutput.js.map +1 -1
- package/out/src/storage/schema/tables/TableTransactionNew.d.ts +50 -0
- package/out/src/storage/schema/tables/TableTransactionNew.d.ts.map +1 -0
- package/out/src/storage/schema/tables/TableTransactionNew.js +3 -0
- package/out/src/storage/schema/tables/TableTransactionNew.js.map +1 -0
- package/out/src/storage/schema/tables/TableTxAudit.d.ts +1 -1
- package/out/src/storage/schema/tables/index.d.ts +5 -0
- package/out/src/storage/schema/tables/index.d.ts.map +1 -1
- package/out/src/storage/schema/tables/index.js +5 -0
- package/out/src/storage/schema/tables/index.js.map +1 -1
- package/out/src/storage/schema/transactionCrud.d.ts +41 -0
- package/out/src/storage/schema/transactionCrud.d.ts.map +1 -0
- package/out/src/storage/schema/transactionCrud.js +205 -0
- package/out/src/storage/schema/transactionCrud.js.map +1 -0
- package/out/src/storage/schema/transactionService.d.ts +315 -0
- package/out/src/storage/schema/transactionService.d.ts.map +1 -0
- package/out/src/storage/schema/transactionService.js +783 -0
- package/out/src/storage/schema/transactionService.js.map +1 -0
- package/out/src/storage/schema/txAudit.d.ts +33 -0
- package/out/src/storage/schema/txAudit.d.ts.map +1 -0
- package/out/src/storage/schema/txAudit.js +64 -0
- package/out/src/storage/schema/txAudit.js.map +1 -0
- package/out/src/storage/schema/v7Backfill.d.ts.map +1 -1
- package/out/src/storage/schema/v7Backfill.js +4 -1
- package/out/src/storage/schema/v7Backfill.js.map +1 -1
- package/out/src/storage/schema/v7Backfill.runner.d.ts.map +1 -1
- package/out/src/storage/schema/v7Backfill.runner.js +3 -1
- package/out/src/storage/schema/v7Backfill.runner.js.map +1 -1
- package/out/src/storage/schema/v7CoinbaseMaturityBackfill.d.ts +25 -0
- package/out/src/storage/schema/v7CoinbaseMaturityBackfill.d.ts.map +1 -0
- package/out/src/storage/schema/v7CoinbaseMaturityBackfill.js +75 -0
- package/out/src/storage/schema/v7CoinbaseMaturityBackfill.js.map +1 -0
- package/out/src/storage/schema/v7Crud.d.ts +5 -3
- package/out/src/storage/schema/v7Crud.d.ts.map +1 -1
- package/out/src/storage/schema/v7Crud.js +11 -9
- package/out/src/storage/schema/v7Crud.js.map +1 -1
- package/out/src/storage/schema/v7Cutover.d.ts +34 -0
- package/out/src/storage/schema/v7Cutover.d.ts.map +1 -0
- package/out/src/storage/schema/v7Cutover.js +223 -0
- package/out/src/storage/schema/v7Cutover.js.map +1 -0
- package/out/src/storage/schema/v7CutoverIdb.d.ts +26 -0
- package/out/src/storage/schema/v7CutoverIdb.d.ts.map +1 -0
- package/out/src/storage/schema/v7CutoverIdb.js +90 -0
- package/out/src/storage/schema/v7CutoverIdb.js.map +1 -0
- package/out/src/storage/schema/v7Fsm.d.ts.map +1 -1
- package/out/src/storage/schema/v7Fsm.js +22 -6
- package/out/src/storage/schema/v7Fsm.js.map +1 -1
- package/out/src/storage/schema/v7Service.d.ts +305 -0
- package/out/src/storage/schema/v7Service.d.ts.map +1 -0
- package/out/src/storage/schema/v7Service.js +757 -0
- package/out/src/storage/schema/v7Service.js.map +1 -0
- package/out/src/storage/schema/v7SpendabilityRefresh.d.ts +49 -0
- package/out/src/storage/schema/v7SpendabilityRefresh.d.ts.map +1 -0
- package/out/src/storage/schema/v7SpendabilityRefresh.js +111 -0
- package/out/src/storage/schema/v7SpendabilityRefresh.js.map +1 -0
- package/out/src/storage/storageProviderHelpers.js +1 -1
- package/out/src/storage/storageProviderHelpers.js.map +1 -1
- package/out/src/utility/Format.js.map +1 -1
- package/package.json +7 -4
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KnexBackfillDriver = void 0;
|
|
4
|
+
exports.runKnexBackfill = runKnexBackfill;
|
|
5
|
+
const backfill_runner_1 = require("./backfill.runner");
|
|
6
|
+
const STREAM_BATCH = 500;
|
|
7
|
+
/**
|
|
8
|
+
* Knex driver for the the backfill.
|
|
9
|
+
*
|
|
10
|
+
* Reads from the legacy `proven_tx_reqs`, `proven_txs`, and `transactions`
|
|
11
|
+
* tables, writes into the new `transactions_new` and `actions` tables, and
|
|
12
|
+
* re-points `tx_labels_map` rows to the new `actionId`.
|
|
13
|
+
*
|
|
14
|
+
* All work is performed against the `knex` (or transaction) handle passed in.
|
|
15
|
+
* The caller is responsible for opening a transaction around the orchestrator
|
|
16
|
+
* call when atomicity is desired.
|
|
17
|
+
*/
|
|
18
|
+
class KnexBackfillDriver {
|
|
19
|
+
constructor(knex) {
|
|
20
|
+
this.knex = knex;
|
|
21
|
+
}
|
|
22
|
+
async *streamLegacyReqs() {
|
|
23
|
+
var _a, _b, _c;
|
|
24
|
+
let lastId = 0;
|
|
25
|
+
/* eslint-disable-next-line no-constant-condition */
|
|
26
|
+
while (true) {
|
|
27
|
+
const rows = await this.knex('proven_tx_reqs as r')
|
|
28
|
+
.leftJoin('proven_txs as p', 'r.provenTxId', 'p.provenTxId')
|
|
29
|
+
.select('r.*', this.knex.ref('p.height').as('p_height'), this.knex.ref('p.index').as('p_index'), this.knex.ref('p.merklePath').as('p_merklePath'), this.knex.ref('p.blockHash').as('p_blockHash'), this.knex.ref('p.merkleRoot').as('p_merkleRoot'), this.knex.ref('p.rawTx').as('p_rawTx'), this.knex.ref('p.created_at').as('p_created_at'), this.knex.ref('p.updated_at').as('p_updated_at'), this.knex.ref('p.txid').as('p_txid'))
|
|
30
|
+
.where('r.provenTxReqId', '>', lastId)
|
|
31
|
+
.orderBy('r.provenTxReqId')
|
|
32
|
+
.limit(STREAM_BATCH);
|
|
33
|
+
if (rows.length === 0)
|
|
34
|
+
return;
|
|
35
|
+
for (const row of rows) {
|
|
36
|
+
lastId = row.provenTxReqId;
|
|
37
|
+
const req = {
|
|
38
|
+
created_at: row.created_at,
|
|
39
|
+
updated_at: row.updated_at,
|
|
40
|
+
provenTxReqId: row.provenTxReqId,
|
|
41
|
+
provenTxId: row.provenTxId,
|
|
42
|
+
status: row.status,
|
|
43
|
+
attempts: row.attempts,
|
|
44
|
+
notified: row.notified,
|
|
45
|
+
txid: row.txid,
|
|
46
|
+
batch: row.batch,
|
|
47
|
+
history: row.history,
|
|
48
|
+
notify: row.notify,
|
|
49
|
+
rawTx: (_a = toBytes(row.rawTx)) !== null && _a !== void 0 ? _a : [],
|
|
50
|
+
inputBEEF: toBytes(row.inputBEEF),
|
|
51
|
+
wasBroadcast: row.wasBroadcast,
|
|
52
|
+
rebroadcastAttempts: row.rebroadcastAttempts
|
|
53
|
+
};
|
|
54
|
+
let proven;
|
|
55
|
+
if (row.p_txid != null) {
|
|
56
|
+
proven = {
|
|
57
|
+
created_at: row.p_created_at,
|
|
58
|
+
updated_at: row.p_updated_at,
|
|
59
|
+
provenTxId: row.provenTxId,
|
|
60
|
+
txid: row.p_txid,
|
|
61
|
+
height: row.p_height,
|
|
62
|
+
index: row.p_index,
|
|
63
|
+
merklePath: (_b = toBytes(row.p_merklePath)) !== null && _b !== void 0 ? _b : [],
|
|
64
|
+
rawTx: (_c = toBytes(row.p_rawTx)) !== null && _c !== void 0 ? _c : [],
|
|
65
|
+
blockHash: row.p_blockHash,
|
|
66
|
+
merkleRoot: row.p_merkleRoot
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
yield { req, proven };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async *streamLegacyTransactions() {
|
|
74
|
+
let lastId = 0;
|
|
75
|
+
/* eslint-disable-next-line no-constant-condition */
|
|
76
|
+
while (true) {
|
|
77
|
+
const rows = await this.knex('transactions')
|
|
78
|
+
.where('transactionId', '>', lastId)
|
|
79
|
+
.orderBy('transactionId')
|
|
80
|
+
.limit(STREAM_BATCH)
|
|
81
|
+
.select('*');
|
|
82
|
+
if (rows.length === 0)
|
|
83
|
+
return;
|
|
84
|
+
for (const row of rows) {
|
|
85
|
+
lastId = row.transactionId;
|
|
86
|
+
yield {
|
|
87
|
+
created_at: row.created_at,
|
|
88
|
+
updated_at: row.updated_at,
|
|
89
|
+
transactionId: row.transactionId,
|
|
90
|
+
userId: row.userId,
|
|
91
|
+
provenTxId: row.provenTxId,
|
|
92
|
+
status: row.status,
|
|
93
|
+
reference: row.reference,
|
|
94
|
+
isOutgoing: !!row.isOutgoing,
|
|
95
|
+
satoshis: row.satoshis,
|
|
96
|
+
description: row.description,
|
|
97
|
+
version: row.version,
|
|
98
|
+
lockTime: row.lockTime,
|
|
99
|
+
txid: row.txid,
|
|
100
|
+
inputBEEF: toBytes(row.inputBEEF),
|
|
101
|
+
rawTx: toBytes(row.rawTx)
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async upsertTransactionNew(row) {
|
|
107
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
|
|
108
|
+
const existing = await this.knex('transactions_new').where({ txid: row.txid }).first('transactionId');
|
|
109
|
+
if (existing != null) {
|
|
110
|
+
await this.knex('transactions_new')
|
|
111
|
+
.where({ transactionId: existing.transactionId })
|
|
112
|
+
.update({
|
|
113
|
+
processing: row.processing,
|
|
114
|
+
processing_changed_at: row.processingChangedAt,
|
|
115
|
+
next_action_at: (_a = row.nextActionAt) !== null && _a !== void 0 ? _a : null,
|
|
116
|
+
attempts: row.attempts,
|
|
117
|
+
rebroadcast_cycles: row.rebroadcastCycles,
|
|
118
|
+
was_broadcast: row.wasBroadcast,
|
|
119
|
+
batch: (_b = row.batch) !== null && _b !== void 0 ? _b : null,
|
|
120
|
+
raw_tx: toBuf(row.rawTx),
|
|
121
|
+
input_beef: toBuf(row.inputBeef),
|
|
122
|
+
height: (_c = row.height) !== null && _c !== void 0 ? _c : null,
|
|
123
|
+
merkle_index: (_d = row.merkleIndex) !== null && _d !== void 0 ? _d : null,
|
|
124
|
+
merkle_path: toBuf(row.merklePath),
|
|
125
|
+
merkle_root: (_e = row.merkleRoot) !== null && _e !== void 0 ? _e : null,
|
|
126
|
+
block_hash: (_f = row.blockHash) !== null && _f !== void 0 ? _f : null,
|
|
127
|
+
is_coinbase: row.isCoinbase,
|
|
128
|
+
updated_at: row.updated_at
|
|
129
|
+
});
|
|
130
|
+
return existing.transactionId;
|
|
131
|
+
}
|
|
132
|
+
const [insertedId] = await this.knex('transactions_new').insert({
|
|
133
|
+
txid: row.txid,
|
|
134
|
+
processing: row.processing,
|
|
135
|
+
processing_changed_at: row.processingChangedAt,
|
|
136
|
+
next_action_at: (_g = row.nextActionAt) !== null && _g !== void 0 ? _g : null,
|
|
137
|
+
attempts: row.attempts,
|
|
138
|
+
rebroadcast_cycles: row.rebroadcastCycles,
|
|
139
|
+
was_broadcast: row.wasBroadcast,
|
|
140
|
+
idempotency_key: (_h = row.idempotencyKey) !== null && _h !== void 0 ? _h : null,
|
|
141
|
+
batch: (_j = row.batch) !== null && _j !== void 0 ? _j : null,
|
|
142
|
+
raw_tx: toBuf(row.rawTx),
|
|
143
|
+
input_beef: toBuf(row.inputBeef),
|
|
144
|
+
height: (_k = row.height) !== null && _k !== void 0 ? _k : null,
|
|
145
|
+
merkle_index: (_l = row.merkleIndex) !== null && _l !== void 0 ? _l : null,
|
|
146
|
+
merkle_path: toBuf(row.merklePath),
|
|
147
|
+
merkle_root: (_m = row.merkleRoot) !== null && _m !== void 0 ? _m : null,
|
|
148
|
+
block_hash: (_o = row.blockHash) !== null && _o !== void 0 ? _o : null,
|
|
149
|
+
is_coinbase: row.isCoinbase,
|
|
150
|
+
last_provider: (_p = row.lastProvider) !== null && _p !== void 0 ? _p : null,
|
|
151
|
+
last_provider_status: (_q = row.lastProviderStatus) !== null && _q !== void 0 ? _q : null,
|
|
152
|
+
frozen_reason: (_r = row.frozenReason) !== null && _r !== void 0 ? _r : null,
|
|
153
|
+
row_version: row.rowVersion,
|
|
154
|
+
created_at: row.created_at,
|
|
155
|
+
updated_at: row.updated_at
|
|
156
|
+
});
|
|
157
|
+
if (typeof insertedId === 'number' && insertedId > 0)
|
|
158
|
+
return insertedId;
|
|
159
|
+
const row2 = await this.knex('transactions_new').where({ txid: row.txid }).first('transactionId');
|
|
160
|
+
return row2.transactionId;
|
|
161
|
+
}
|
|
162
|
+
async upsertAction(row) {
|
|
163
|
+
var _a, _b;
|
|
164
|
+
const existing = await this.knex('actions')
|
|
165
|
+
.where({ userId: row.userId, transactionId: row.transactionId })
|
|
166
|
+
.first('actionId');
|
|
167
|
+
if (existing != null) {
|
|
168
|
+
await this.knex('actions')
|
|
169
|
+
.where({ actionId: existing.actionId })
|
|
170
|
+
.update({
|
|
171
|
+
reference: row.reference,
|
|
172
|
+
description: row.description,
|
|
173
|
+
isOutgoing: row.isOutgoing,
|
|
174
|
+
satoshis_delta: row.satoshisDelta,
|
|
175
|
+
user_nosend: row.userNosend,
|
|
176
|
+
hidden: row.hidden,
|
|
177
|
+
user_aborted: row.userAborted,
|
|
178
|
+
notify_json: (_a = row.notifyJson) !== null && _a !== void 0 ? _a : null,
|
|
179
|
+
updated_at: row.updated_at
|
|
180
|
+
});
|
|
181
|
+
return existing.actionId;
|
|
182
|
+
}
|
|
183
|
+
const [insertedId] = await this.knex('actions').insert({
|
|
184
|
+
userId: row.userId,
|
|
185
|
+
transactionId: row.transactionId,
|
|
186
|
+
reference: row.reference,
|
|
187
|
+
description: row.description,
|
|
188
|
+
isOutgoing: row.isOutgoing,
|
|
189
|
+
satoshis_delta: row.satoshisDelta,
|
|
190
|
+
user_nosend: row.userNosend,
|
|
191
|
+
hidden: row.hidden,
|
|
192
|
+
user_aborted: row.userAborted,
|
|
193
|
+
notify_json: (_b = row.notifyJson) !== null && _b !== void 0 ? _b : null,
|
|
194
|
+
row_version: row.rowVersion,
|
|
195
|
+
created_at: row.created_at,
|
|
196
|
+
updated_at: row.updated_at
|
|
197
|
+
});
|
|
198
|
+
if (typeof insertedId === 'number' && insertedId > 0)
|
|
199
|
+
return insertedId;
|
|
200
|
+
const row2 = await this.knex('actions')
|
|
201
|
+
.where({ userId: row.userId, transactionId: row.transactionId })
|
|
202
|
+
.first('actionId');
|
|
203
|
+
return row2.actionId;
|
|
204
|
+
}
|
|
205
|
+
async repointTxLabelMap(legacyTransactionId, actionId) {
|
|
206
|
+
if (legacyTransactionId === actionId)
|
|
207
|
+
return;
|
|
208
|
+
await this.knex('tx_labels_map')
|
|
209
|
+
.where({ transactionId: legacyTransactionId })
|
|
210
|
+
.update({ transactionId: actionId });
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
exports.KnexBackfillDriver = KnexBackfillDriver;
|
|
214
|
+
/**
|
|
215
|
+
* Convenience entry point. Opens a Knex transaction and runs the orchestrator
|
|
216
|
+
* inside it so that the entire backfill either succeeds or rolls back.
|
|
217
|
+
*/
|
|
218
|
+
async function runKnexBackfill(knex, now = new Date()) {
|
|
219
|
+
return await knex.transaction(async (trx) => {
|
|
220
|
+
const driver = new KnexBackfillDriver(trx);
|
|
221
|
+
return await (0, backfill_runner_1.runBackfill)(driver, now);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
function toBytes(v) {
|
|
225
|
+
if (v == null)
|
|
226
|
+
return undefined;
|
|
227
|
+
if (Array.isArray(v))
|
|
228
|
+
return v;
|
|
229
|
+
if (Buffer.isBuffer(v))
|
|
230
|
+
return Array.from(v.values());
|
|
231
|
+
if (v instanceof Uint8Array)
|
|
232
|
+
return Array.from(v.values());
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
function toBuf(v) {
|
|
236
|
+
if (v == null)
|
|
237
|
+
return null;
|
|
238
|
+
return Buffer.from(v);
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=backfill.knex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfill.knex.js","sourceRoot":"","sources":["../../../../src/storage/schema/backfill.knex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { TableAction, TableProvenTx, TableProvenTxReq, TableTransaction, TableTransactionNew } from './tables';
|
|
2
|
+
/**
|
|
3
|
+
* Storage-agnostic driver used by the the backfill orchestrator.
|
|
4
|
+
*
|
|
5
|
+
* Implementations must be idempotent — calling each method twice with the same
|
|
6
|
+
* input must not produce duplicate rows. The orchestrator is responsible for
|
|
7
|
+
* iteration order and chunking; the driver only performs writes.
|
|
8
|
+
*/
|
|
9
|
+
export interface BackfillDriver {
|
|
10
|
+
/** Stream legacy `proven_tx_reqs` rows joined with their `proven_txs` row when available. */
|
|
11
|
+
streamLegacyReqs: () => AsyncIterable<{
|
|
12
|
+
req: TableProvenTxReq;
|
|
13
|
+
proven?: TableProvenTx;
|
|
14
|
+
}>;
|
|
15
|
+
/** Stream legacy `transactions` rows ordered by transactionId ascending. */
|
|
16
|
+
streamLegacyTransactions: () => AsyncIterable<TableTransaction>;
|
|
17
|
+
/**
|
|
18
|
+
* Upsert a new `transactions` row by `txid`. Returns the resolved
|
|
19
|
+
* `transactionId` (PK of `transactions_new`).
|
|
20
|
+
*/
|
|
21
|
+
upsertTransactionNew: (row: Omit<TableTransactionNew, 'transactionId'>) => Promise<number>;
|
|
22
|
+
/**
|
|
23
|
+
* Upsert a new `actions` row by `(userId, transactionId)`. Returns the
|
|
24
|
+
* resolved `actionId`.
|
|
25
|
+
*/
|
|
26
|
+
upsertAction: (row: Omit<TableAction, 'actionId'>) => Promise<number>;
|
|
27
|
+
/**
|
|
28
|
+
* Re-point a single legacy `tx_labels_map` row whose `transactionId` refers
|
|
29
|
+
* to the old `transactions` PK so that it points to the new `actions.actionId`.
|
|
30
|
+
*
|
|
31
|
+
* Implementations may choose to rewrite the entire mapping in bulk and treat
|
|
32
|
+
* this method as a no-op; the orchestrator will still call it once per pair.
|
|
33
|
+
*/
|
|
34
|
+
repointTxLabelMap: (legacyTransactionId: number, actionId: number) => Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
export interface BackfillStats {
|
|
37
|
+
reqsBackfilled: number;
|
|
38
|
+
legacyTxOnlyBackfilled: number;
|
|
39
|
+
actionsBackfilled: number;
|
|
40
|
+
labelMapsRepointed: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Orchestrates §3 Steps 2-5 of the spec (PROD_REQ_V7_TS.md).
|
|
44
|
+
*
|
|
45
|
+
* Strategy:
|
|
46
|
+
* 1. Walk every `proven_tx_reqs` row (joined with its proof) and upsert a row
|
|
47
|
+
* in `transactions_new`. Build a `txid -> transactionId` map.
|
|
48
|
+
* 2. Walk every legacy `transactions` row.
|
|
49
|
+
* - If the row has a txid AND it is not in the map, upsert a tx-only new-schema
|
|
50
|
+
* row (locally-created actions that never reached the broadcast queue).
|
|
51
|
+
* - Compute the new-schema `transactionId` for this legacy row. Rows without a
|
|
52
|
+
* txid (unsigned, unprocessed) are skipped — they have no canonical new-schema
|
|
53
|
+
* representation yet and are surfaced as gaps in the stats.
|
|
54
|
+
* 3. Upsert an `actions` row per legacy `transactions` row that has a new-schema
|
|
55
|
+
* transactionId.
|
|
56
|
+
* 4. Re-point `tx_labels_map.transactionId` from legacy PK to new `actionId`.
|
|
57
|
+
*
|
|
58
|
+
* The driver is invoked one row at a time so that the entire pass can run as
|
|
59
|
+
* a single Knex transaction or a single IDB readwrite transaction without
|
|
60
|
+
* holding the full row set in memory.
|
|
61
|
+
*/
|
|
62
|
+
export declare function runBackfill(driver: BackfillDriver, now?: Date): Promise<BackfillStats>;
|
|
63
|
+
//# sourceMappingURL=backfill.runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfill.runner.d.ts","sourceRoot":"","sources":["../../../../src/storage/schema/backfill.runner.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,UAAU,CAAA;AAEjB;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,6FAA6F;IAC7F,gBAAgB,EAAE,MAAM,aAAa,CAAC;QAAE,GAAG,EAAE,gBAAgB,CAAC;QAAC,MAAM,CAAC,EAAE,aAAa,CAAA;KAAE,CAAC,CAAA;IACxF,4EAA4E;IAC5E,wBAAwB,EAAE,MAAM,aAAa,CAAC,gBAAgB,CAAC,CAAA;IAC/D;;;OAGG;IACH,oBAAoB,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,mBAAmB,EAAE,eAAe,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAC1F;;;OAGG;IACH,YAAY,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACrE;;;;;;OAMG;IACH,iBAAiB,EAAE,CAAC,mBAAmB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACpF;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAA;IACtB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,WAAW,CAAE,MAAM,EAAE,cAAc,EAAE,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CA2CzG"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runBackfill = runBackfill;
|
|
4
|
+
const backfill_1 = require("./backfill");
|
|
5
|
+
/**
|
|
6
|
+
* Orchestrates §3 Steps 2-5 of the spec (PROD_REQ_V7_TS.md).
|
|
7
|
+
*
|
|
8
|
+
* Strategy:
|
|
9
|
+
* 1. Walk every `proven_tx_reqs` row (joined with its proof) and upsert a row
|
|
10
|
+
* in `transactions_new`. Build a `txid -> transactionId` map.
|
|
11
|
+
* 2. Walk every legacy `transactions` row.
|
|
12
|
+
* - If the row has a txid AND it is not in the map, upsert a tx-only new-schema
|
|
13
|
+
* row (locally-created actions that never reached the broadcast queue).
|
|
14
|
+
* - Compute the new-schema `transactionId` for this legacy row. Rows without a
|
|
15
|
+
* txid (unsigned, unprocessed) are skipped — they have no canonical new-schema
|
|
16
|
+
* representation yet and are surfaced as gaps in the stats.
|
|
17
|
+
* 3. Upsert an `actions` row per legacy `transactions` row that has a new-schema
|
|
18
|
+
* transactionId.
|
|
19
|
+
* 4. Re-point `tx_labels_map.transactionId` from legacy PK to new `actionId`.
|
|
20
|
+
*
|
|
21
|
+
* The driver is invoked one row at a time so that the entire pass can run as
|
|
22
|
+
* a single Knex transaction or a single IDB readwrite transaction without
|
|
23
|
+
* holding the full row set in memory.
|
|
24
|
+
*/
|
|
25
|
+
async function runBackfill(driver, now = new Date()) {
|
|
26
|
+
const stats = {
|
|
27
|
+
reqsBackfilled: 0,
|
|
28
|
+
legacyTxOnlyBackfilled: 0,
|
|
29
|
+
actionsBackfilled: 0,
|
|
30
|
+
labelMapsRepointed: 0
|
|
31
|
+
};
|
|
32
|
+
const txidToNewId = new Map();
|
|
33
|
+
for await (const { req, proven } of driver.streamLegacyReqs()) {
|
|
34
|
+
const newRow = (0, backfill_1.buildTransactionNewRow)(req, proven, now);
|
|
35
|
+
const id = await driver.upsertTransactionNew(newRow);
|
|
36
|
+
txidToNewId.set(newRow.txid, id);
|
|
37
|
+
stats.reqsBackfilled += 1;
|
|
38
|
+
}
|
|
39
|
+
for await (const legacy of driver.streamLegacyTransactions()) {
|
|
40
|
+
let newId;
|
|
41
|
+
if (legacy.txid != null) {
|
|
42
|
+
newId = txidToNewId.get(legacy.txid);
|
|
43
|
+
if (newId === undefined) {
|
|
44
|
+
const newRow = (0, backfill_1.buildTransactionNewRowFromLegacyTx)(legacy, now);
|
|
45
|
+
if (newRow !== undefined) {
|
|
46
|
+
newId = await driver.upsertTransactionNew(newRow);
|
|
47
|
+
// Use newRow.txid (not legacy.txid) as the map key so that empty-string
|
|
48
|
+
// legacy txids each get a unique placeholder key and don't collide.
|
|
49
|
+
txidToNewId.set(newRow.txid, newId);
|
|
50
|
+
stats.legacyTxOnlyBackfilled += 1;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (newId === undefined)
|
|
55
|
+
continue;
|
|
56
|
+
const actionRow = (0, backfill_1.buildActionRow)(legacy, newId, now);
|
|
57
|
+
const actionId = await driver.upsertAction(actionRow);
|
|
58
|
+
stats.actionsBackfilled += 1;
|
|
59
|
+
await driver.repointTxLabelMap(legacy.transactionId, actionId);
|
|
60
|
+
stats.labelMapsRepointed += 1;
|
|
61
|
+
}
|
|
62
|
+
return stats;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=backfill.runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfill.runner.js","sourceRoot":"","sources":["../../../../src/storage/schema/backfill.runner.ts"],"names":[],"mappings":";;AAoEA,kCA2CC;AA/GD,yCAAuG;AAgDvG;;;;;;;;;;;;;;;;;;;GAmBG;AACI,KAAK,UAAU,WAAW,CAAE,MAAsB,EAAE,MAAY,IAAI,IAAI,EAAE;IAC/E,MAAM,KAAK,GAAkB;QAC3B,cAAc,EAAE,CAAC;QACjB,sBAAsB,EAAE,CAAC;QACzB,iBAAiB,EAAE,CAAC;QACpB,kBAAkB,EAAE,CAAC;KACtB,CAAA;IAED,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAA;IAE7C,IAAI,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,MAAM,CAAC,gBAAgB,EAAE,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAA,iCAAsB,EAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;QACvD,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAA;QACpD,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QAChC,KAAK,CAAC,cAAc,IAAI,CAAC,CAAA;IAC3B,CAAC;IAED,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,MAAM,CAAC,wBAAwB,EAAE,EAAE,CAAC;QAC7D,IAAI,KAAyB,CAAA;QAC7B,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACpC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,MAAM,GAAG,IAAA,6CAAkC,EAAC,MAAM,EAAE,GAAG,CAAC,CAAA;gBAC9D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,KAAK,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAA;oBACjD,wEAAwE;oBACxE,oEAAoE;oBACpE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;oBACnC,KAAK,CAAC,sBAAsB,IAAI,CAAC,CAAA;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAQ;QAEjC,MAAM,SAAS,GAAG,IAAA,yBAAc,EAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;QACpD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;QACrD,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAA;QAE5B,MAAM,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAA;QAC9D,KAAK,CAAC,kBAAkB,IAAI,CAAC,CAAA;IAC/B,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
export interface BackfillCoinbaseMaturityArgs {
|
|
3
|
+
/** Maximum number of rows examined per batch. Default 500. */
|
|
4
|
+
batchSize?: number;
|
|
5
|
+
/** Override clock for `updated_at` writes. Default `new Date()`. */
|
|
6
|
+
now?: Date;
|
|
7
|
+
}
|
|
8
|
+
export interface BackfillCoinbaseMaturityStats {
|
|
9
|
+
/** Rows visited by the scan, including any that could not be updated. */
|
|
10
|
+
examined: number;
|
|
11
|
+
/** Rows whose `matures_at_height` was written by this run. */
|
|
12
|
+
updated: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Stream every output joined with `transactions` where the owning transaction
|
|
16
|
+
* is a coinbase, `outputs.matures_at_height` is NULL, and the transaction has
|
|
17
|
+
* a non-null block height. For each candidate compute
|
|
18
|
+
* `maturesAtHeight = height + 100` and write it back in a batched UPDATE.
|
|
19
|
+
*
|
|
20
|
+
* Returns `{ examined, updated }` for telemetry. The two counts diverge only
|
|
21
|
+
* when concurrent writers update the same rows mid-scan; in steady state on
|
|
22
|
+
* a quiescent DB they are equal.
|
|
23
|
+
*/
|
|
24
|
+
export declare function backfillCoinbaseMaturity(knex: Knex, args?: BackfillCoinbaseMaturityArgs): Promise<BackfillCoinbaseMaturityStats>;
|
|
25
|
+
//# sourceMappingURL=coinbaseMaturityBackfill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coinbaseMaturityBackfill.d.ts","sourceRoot":"","sources":["../../../../src/storage/schema/coinbaseMaturityBackfill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAiC3B,MAAM,WAAW,4BAA4B;IAC3C,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oEAAoE;IACpE,GAAG,CAAC,EAAE,IAAI,CAAA;CACX;AAED,MAAM,WAAW,6BAA6B;IAC5C,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAA;IAChB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,IAAI,EACV,IAAI,GAAE,4BAAiC,GACtC,OAAO,CAAC,6BAA6B,CAAC,CAkCxC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.backfillCoinbaseMaturity = backfillCoinbaseMaturity;
|
|
4
|
+
/**
|
|
5
|
+
* §4 spendability backfill — populate `outputs.matures_at_height` for
|
|
6
|
+
* legacy coinbase outputs that were inserted before the new-schema column existed
|
|
7
|
+
* (migration `2026-05-13-001`).
|
|
8
|
+
*
|
|
9
|
+
* The §4 rule treats coinbase outputs whose `matures_at_height` is NULL as
|
|
10
|
+
* not-yet-mature, so any coinbase output inserted prior to the migration is
|
|
11
|
+
* permanently un-spendable until backfilled. This helper computes the BSV
|
|
12
|
+
* coinbase maturity height as `transactions.height + 100` and writes it via
|
|
13
|
+
* batched UPDATEs.
|
|
14
|
+
*
|
|
15
|
+
* Only rows where:
|
|
16
|
+
* - `transactions.is_coinbase = true`
|
|
17
|
+
* - `outputs.matures_at_height IS NULL`
|
|
18
|
+
* - `transactions.height IS NOT NULL`
|
|
19
|
+
* are touched. Non-coinbase outputs and outputs whose owning transaction has
|
|
20
|
+
* no recorded block height are left alone.
|
|
21
|
+
*
|
|
22
|
+
* Idempotent: re-running after a successful backfill examines the same set
|
|
23
|
+
* of rows from a fresh scan and finds none with a NULL maturity, so the
|
|
24
|
+
* second invocation reports `updated: 0`.
|
|
25
|
+
*
|
|
26
|
+
* Note on column naming: the database column is snake_case
|
|
27
|
+
* (`outputs.matures_at_height`) but is exposed in API surfaces as
|
|
28
|
+
* `maturesAtHeight`. This module references the DB column name directly
|
|
29
|
+
* because Knex passes column literals straight through to SQL.
|
|
30
|
+
*/
|
|
31
|
+
const DEFAULT_BATCH_SIZE = 500;
|
|
32
|
+
const BSV_COINBASE_MATURITY = 100;
|
|
33
|
+
/**
|
|
34
|
+
* Stream every output joined with `transactions` where the owning transaction
|
|
35
|
+
* is a coinbase, `outputs.matures_at_height` is NULL, and the transaction has
|
|
36
|
+
* a non-null block height. For each candidate compute
|
|
37
|
+
* `maturesAtHeight = height + 100` and write it back in a batched UPDATE.
|
|
38
|
+
*
|
|
39
|
+
* Returns `{ examined, updated }` for telemetry. The two counts diverge only
|
|
40
|
+
* when concurrent writers update the same rows mid-scan; in steady state on
|
|
41
|
+
* a quiescent DB they are equal.
|
|
42
|
+
*/
|
|
43
|
+
async function backfillCoinbaseMaturity(knex, args = {}) {
|
|
44
|
+
var _a, _b;
|
|
45
|
+
const batchSize = (_a = args.batchSize) !== null && _a !== void 0 ? _a : DEFAULT_BATCH_SIZE;
|
|
46
|
+
const now = (_b = args.now) !== null && _b !== void 0 ? _b : new Date();
|
|
47
|
+
const stats = { examined: 0, updated: 0 };
|
|
48
|
+
let lastOutputId = 0;
|
|
49
|
+
/* eslint-disable-next-line no-constant-condition */
|
|
50
|
+
while (true) {
|
|
51
|
+
const rows = await knex('outputs as o')
|
|
52
|
+
.join('transactions as t', 't.transactionId', 'o.transactionId')
|
|
53
|
+
.where('t.is_coinbase', true)
|
|
54
|
+
.whereNull('o.matures_at_height')
|
|
55
|
+
.whereNotNull('t.height')
|
|
56
|
+
.andWhere('o.outputId', '>', lastOutputId)
|
|
57
|
+
.orderBy('o.outputId')
|
|
58
|
+
.limit(batchSize)
|
|
59
|
+
.select(knex.ref('o.outputId').as('outputId'), knex.ref('t.height').as('height'));
|
|
60
|
+
if (rows.length === 0)
|
|
61
|
+
return stats;
|
|
62
|
+
for (const row of rows) {
|
|
63
|
+
lastOutputId = row.outputId;
|
|
64
|
+
stats.examined += 1;
|
|
65
|
+
const maturesAtHeight = row.height + BSV_COINBASE_MATURITY;
|
|
66
|
+
const written = await knex('outputs')
|
|
67
|
+
.where({ outputId: row.outputId })
|
|
68
|
+
.whereNull('matures_at_height')
|
|
69
|
+
.update({ matures_at_height: maturesAtHeight, updated_at: now });
|
|
70
|
+
if (written > 0)
|
|
71
|
+
stats.updated += 1;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=coinbaseMaturityBackfill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coinbaseMaturityBackfill.js","sourceRoot":"","sources":["../../../../src/storage/schema/coinbaseMaturityBackfill.ts"],"names":[],"mappings":";;AAyDA,4DAqCC;AA5FD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,MAAM,kBAAkB,GAAG,GAAG,CAAA;AAC9B,MAAM,qBAAqB,GAAG,GAAG,CAAA;AAgBjC;;;;;;;;;GASG;AACI,KAAK,UAAU,wBAAwB,CAC5C,IAAU,EACV,OAAqC,EAAE;;IAEvC,MAAM,SAAS,GAAG,MAAA,IAAI,CAAC,SAAS,mCAAI,kBAAkB,CAAA;IACtD,MAAM,GAAG,GAAG,MAAA,IAAI,CAAC,GAAG,mCAAI,IAAI,IAAI,EAAE,CAAA;IAClC,MAAM,KAAK,GAAkC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAA;IAExE,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,oDAAoD;IACpD,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,IAAI,GAAgD,MAAM,IAAI,CAAC,cAAc,CAAC;aACjF,IAAI,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,CAAC;aAC/D,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC;aAC5B,SAAS,CAAC,qBAAqB,CAAC;aAChC,YAAY,CAAC,UAAU,CAAC;aACxB,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE,YAAY,CAAC;aACzC,OAAO,CAAC,YAAY,CAAC;aACrB,KAAK,CAAC,SAAS,CAAC;aAChB,MAAM,CACL,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EACrC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAClC,CAAA;QAEH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QAEnC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,YAAY,GAAG,GAAG,CAAC,QAAQ,CAAA;YAC3B,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAA;YACnB,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,GAAG,qBAAqB,CAAA;YAC1D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC;iBAClC,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;iBACjC,SAAS,CAAC,mBAAmB,CAAC;iBAC9B,MAAM,CAAC,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAA;YAClE,IAAI,OAAO,GAAG,CAAC;gBAAE,KAAK,CAAC,OAAO,IAAI,CAAC,CAAA;QACrC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
import { TableMonitorLease } from './tables';
|
|
3
|
+
/**
|
|
4
|
+
* monitor lease primitive.
|
|
5
|
+
*
|
|
6
|
+
* A `monitor_lease` row records the owner that may currently execute a named
|
|
7
|
+
* task. Acquisition is opportunistic: a Monitor calls `tryClaimLease()` to
|
|
8
|
+
* insert or take over a stale row; if it succeeds it owns the task until
|
|
9
|
+
* `expiresAt`. While running it calls `renewLease()` to extend the deadline.
|
|
10
|
+
* On clean shutdown it calls `releaseLease()`.
|
|
11
|
+
*
|
|
12
|
+
* The Knex driver expresses claim + takeover as a single conditional UPDATE
|
|
13
|
+
* so that two contending Monitors cannot both believe they own the task — at
|
|
14
|
+
* most one row write will succeed per (task, expiry) pair.
|
|
15
|
+
*/
|
|
16
|
+
export interface MonitorLeaseClaim {
|
|
17
|
+
taskName: string;
|
|
18
|
+
ownerId: string;
|
|
19
|
+
ttlMs: number;
|
|
20
|
+
note?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface MonitorLeaseRenew {
|
|
23
|
+
taskName: string;
|
|
24
|
+
ownerId: string;
|
|
25
|
+
ttlMs: number;
|
|
26
|
+
note?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface MonitorLeaseRelease {
|
|
29
|
+
taskName: string;
|
|
30
|
+
ownerId: string;
|
|
31
|
+
}
|
|
32
|
+
export interface MonitorLeaseResult {
|
|
33
|
+
acquired: boolean;
|
|
34
|
+
lease?: TableMonitorLease;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Try to claim a lease on `taskName`. Succeeds iff:
|
|
38
|
+
* - no row exists for the task, OR
|
|
39
|
+
* - the existing row has `expiresAt <= now`, OR
|
|
40
|
+
* - the existing row's `ownerId` already equals the requested owner.
|
|
41
|
+
*
|
|
42
|
+
* On success the row is upserted with `expiresAt = now + ttlMs` and
|
|
43
|
+
* `renewCount = renewCount + 1` (0 for fresh rows).
|
|
44
|
+
*/
|
|
45
|
+
export declare function tryClaimLease(knex: Knex, claim: MonitorLeaseClaim, now?: Date): Promise<MonitorLeaseResult>;
|
|
46
|
+
/**
|
|
47
|
+
* Extend the current owner's lease. Fails (returns `acquired: false`) when the
|
|
48
|
+
* row does not exist, is owned by someone else, or has already expired.
|
|
49
|
+
*/
|
|
50
|
+
export declare function renewLease(knex: Knex, renew: MonitorLeaseRenew, now?: Date): Promise<MonitorLeaseResult>;
|
|
51
|
+
/**
|
|
52
|
+
* Release the lease (no-op when not owned by the caller).
|
|
53
|
+
* The row is deleted so subsequent claimants do not see an inherited
|
|
54
|
+
* `renew_count`.
|
|
55
|
+
*/
|
|
56
|
+
export declare function releaseLease(knex: Knex, release: MonitorLeaseRelease): Promise<boolean>;
|
|
57
|
+
//# sourceMappingURL=monitorLease.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitorLease.d.ts","sourceRoot":"","sources":["../../../../src/storage/schema/monitorLease.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAE5C;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,iBAAiB,CAAA;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,iBAAiB,EACxB,GAAG,GAAE,IAAiB,GACrB,OAAO,CAAC,kBAAkB,CAAC,CAmC7B;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,iBAAiB,EACxB,GAAG,GAAE,IAAiB,GACrB,OAAO,CAAC,kBAAkB,CAAC,CAkB7B;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAK9F"}
|