@bsv/wallet-toolbox 2.6.5 → 2.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +77 -8
- package/README.md +72 -18
- package/docs/action-batch-planning.md +80 -37
- package/docs/managed-change-liquidity.md +251 -0
- package/out/src/Setup.d.ts +9 -0
- package/out/src/Setup.d.ts.map +1 -1
- package/out/src/Setup.js +2 -0
- 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/Wallet.d.ts +4 -3
- package/out/src/Wallet.d.ts.map +1 -1
- package/out/src/Wallet.js +4 -3
- package/out/src/Wallet.js.map +1 -1
- package/out/src/WalletPermissionsManager.d.ts.map +1 -1
- package/out/src/WalletPermissionsManager.js +5 -8
- package/out/src/WalletPermissionsManager.js.map +1 -1
- package/out/src/mockchain/MockServices.d.ts.map +1 -1
- package/out/src/mockchain/MockServices.js +2 -6
- package/out/src/mockchain/MockServices.js.map +1 -1
- package/out/src/monitor/Monitor.d.ts.map +1 -1
- package/out/src/monitor/Monitor.js +5 -4
- package/out/src/monitor/Monitor.js.map +1 -1
- package/out/src/monitor/tasks/TaskArcSSE.d.ts +4 -1
- package/out/src/monitor/tasks/TaskArcSSE.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskArcSSE.js +92 -65
- package/out/src/monitor/tasks/TaskArcSSE.js.map +1 -1
- 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 +236 -0
- package/out/src/monitor/tasks/TaskReconcilePendingTransactions.js.map +1 -0
- package/out/src/monitor/tasks/TaskReviewDoubleSpends.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskReviewDoubleSpends.js +15 -3
- package/out/src/monitor/tasks/TaskReviewDoubleSpends.js.map +1 -1
- package/out/src/monitor/tasks/TaskReviewUtxos.d.ts +29 -2
- package/out/src/monitor/tasks/TaskReviewUtxos.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskReviewUtxos.js +155 -7
- package/out/src/monitor/tasks/TaskReviewUtxos.js.map +1 -1
- package/out/src/monitor/tasks/index.all.d.ts +1 -0
- package/out/src/monitor/tasks/index.all.d.ts.map +1 -1
- package/out/src/monitor/tasks/index.all.js +1 -0
- package/out/src/monitor/tasks/index.all.js.map +1 -1
- package/out/src/sdk/ActionBatch.interfaces.d.ts +19 -0
- package/out/src/sdk/ActionBatch.interfaces.d.ts.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 +44 -1
- 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 +9 -1
- package/out/src/sdk/WalletErrorFromJson.js.map +1 -1
- package/out/src/sdk/WalletServices.interfaces.d.ts +14 -1
- package/out/src/sdk/WalletServices.interfaces.d.ts.map +1 -1
- package/out/src/sdk/WalletStorage.interfaces.d.ts +3 -1
- 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/Services.d.ts.map +1 -1
- package/out/src/services/Services.js +73 -15
- package/out/src/services/Services.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 +87 -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/providers/ArcSSEClient.d.ts +13 -4
- package/out/src/services/providers/ArcSSEClient.d.ts.map +1 -1
- package/out/src/services/providers/ArcSSEClient.js +30 -7
- package/out/src/services/providers/ArcSSEClient.js.map +1 -1
- package/out/src/services/providers/Arcade.d.ts +10 -1
- package/out/src/services/providers/Arcade.d.ts.map +1 -1
- package/out/src/services/providers/Arcade.js +63 -0
- package/out/src/services/providers/Arcade.js.map +1 -1
- 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/signer/actionBatch/ActionBatchPlanner.d.ts.map +1 -1
- package/out/src/signer/actionBatch/ActionBatchPlanner.js +25 -3
- package/out/src/signer/actionBatch/ActionBatchPlanner.js.map +1 -1
- package/out/src/signer/actionBatch/ActionBatchWorkspace.d.ts +2 -0
- package/out/src/signer/actionBatch/ActionBatchWorkspace.d.ts.map +1 -1
- package/out/src/signer/actionBatch/ActionBatchWorkspace.js +135 -16
- package/out/src/signer/actionBatch/ActionBatchWorkspace.js.map +1 -1
- package/out/src/storage/StorageIdb.d.ts +2 -0
- package/out/src/storage/StorageIdb.d.ts.map +1 -1
- package/out/src/storage/StorageIdb.js +24 -1
- package/out/src/storage/StorageIdb.js.map +1 -1
- package/out/src/storage/StorageKnex.d.ts +1 -1
- package/out/src/storage/StorageKnex.d.ts.map +1 -1
- package/out/src/storage/StorageKnex.js +4 -4
- package/out/src/storage/StorageKnex.js.map +1 -1
- package/out/src/storage/StorageProvider.d.ts +18 -2
- package/out/src/storage/StorageProvider.d.ts.map +1 -1
- package/out/src/storage/StorageProvider.js +45 -14
- package/out/src/storage/StorageProvider.js.map +1 -1
- package/out/src/storage/StorageReaderWriter.d.ts.map +1 -1
- package/out/src/storage/StorageReaderWriter.js +3 -2
- package/out/src/storage/StorageReaderWriter.js.map +1 -1
- package/out/src/storage/WalletStorageManager.d.ts +12 -0
- package/out/src/storage/WalletStorageManager.d.ts.map +1 -1
- package/out/src/storage/WalletStorageManager.js +22 -2
- package/out/src/storage/WalletStorageManager.js.map +1 -1
- package/out/src/storage/adminServer/adminServer.d.ts +2 -0
- package/out/src/storage/adminServer/adminServer.d.ts.map +1 -1
- package/out/src/storage/adminServer/adminServer.js +25 -8
- 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/index.all.d.ts +1 -0
- package/out/src/storage/index.all.d.ts.map +1 -1
- package/out/src/storage/index.all.js +1 -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/ListOutputsSpecOp.d.ts.map +1 -1
- package/out/src/storage/methods/ListOutputsSpecOp.js +4 -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 +258 -66
- package/out/src/storage/methods/actionBatch.js.map +1 -1
- package/out/src/storage/methods/actionBatchBlobs.js +7 -4
- package/out/src/storage/methods/actionBatchBlobs.js.map +1 -1
- package/out/src/storage/methods/attemptToPostReqsToNetwork.d.ts.map +1 -1
- package/out/src/storage/methods/attemptToPostReqsToNetwork.js +2 -66
- 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.map +1 -1
- package/out/src/storage/methods/createAction.js +176 -58
- package/out/src/storage/methods/createAction.js.map +1 -1
- package/out/src/storage/methods/generateChange.d.ts +13 -1
- package/out/src/storage/methods/generateChange.d.ts.map +1 -1
- package/out/src/storage/methods/generateChange.js +169 -12
- package/out/src/storage/methods/generateChange.js.map +1 -1
- package/out/src/storage/methods/listActionsIdb.d.ts.map +1 -1
- package/out/src/storage/methods/listActionsIdb.js +4 -0
- package/out/src/storage/methods/listActionsIdb.js.map +1 -1
- package/out/src/storage/methods/listActionsKnex.d.ts.map +1 -1
- package/out/src/storage/methods/listActionsKnex.js +4 -0
- package/out/src/storage/methods/listActionsKnex.js.map +1 -1
- package/out/src/storage/methods/listOutputsIdb.d.ts.map +1 -1
- package/out/src/storage/methods/listOutputsIdb.js +2 -1
- package/out/src/storage/methods/listOutputsIdb.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/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/reviewUtxoOutputs.d.ts +37 -0
- package/out/src/storage/methods/reviewUtxoOutputs.d.ts.map +1 -0
- package/out/src/storage/methods/reviewUtxoOutputs.js +150 -0
- package/out/src/storage/methods/reviewUtxoOutputs.js.map +1 -0
- package/out/src/storage/portable/index.d.ts.map +1 -1
- package/out/src/storage/portable/index.js +4 -2
- package/out/src/storage/portable/index.js.map +1 -1
- package/out/src/storage/remoting/StorageClientBase.d.ts +2 -1
- package/out/src/storage/remoting/StorageClientBase.d.ts.map +1 -1
- package/out/src/storage/remoting/StorageClientBase.js +3 -0
- package/out/src/storage/remoting/StorageClientBase.js.map +1 -1
- package/out/src/storage/remoting/StorageServer.d.ts.map +1 -1
- package/out/src/storage/remoting/StorageServer.js +4 -1
- package/out/src/storage/remoting/StorageServer.js.map +1 -1
- package/out/src/storage/schema/KnexMigrations.d.ts +1 -0
- package/out/src/storage/schema/KnexMigrations.d.ts.map +1 -1
- package/out/src/storage/schema/KnexMigrations.js +29 -3
- package/out/src/storage/schema/KnexMigrations.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/utility/brc153ReferenceLabels.d.ts +21 -0
- package/out/src/utility/brc153ReferenceLabels.d.ts.map +1 -0
- package/out/src/utility/brc153ReferenceLabels.js +45 -0
- package/out/src/utility/brc153ReferenceLabels.js.map +1 -0
- package/out/src/utility/index.all.d.ts +1 -0
- package/out/src/utility/index.all.d.ts.map +1 -1
- package/out/src/utility/index.all.js +1 -0
- package/out/src/utility/index.all.js.map +1 -1
- package/out/src/utility/index.client.d.ts +1 -0
- package/out/src/utility/index.client.d.ts.map +1 -1
- package/out/src/utility/index.client.js +1 -0
- package/out/src/utility/index.client.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 +2 -1
- package/out/src/utility/utilityHelpers.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_MANAGED_CHANGE_PENDING_COMPARISON_INPUTS = exports.DEFAULT_MANAGED_CHANGE_MIGRATION_INPUTS_PER_ACTION = exports.DEFAULT_MANAGED_CHANGE_MAX_OUTPUTS_PER_ACTION = exports.DEFAULT_MANAGED_CHANGE_MINIMUM_SATOSHIS = exports.DEFAULT_MANAGED_CHANGE_TARGET_UTXOS = exports.LEGACY_MANAGED_CHANGE_MINIMUM_SATOSHIS = void 0;
|
|
4
|
+
exports.isLegacyManagedChangeBasketDefault = isLegacyManagedChangeBasketDefault;
|
|
5
|
+
exports.upgradeLegacyManagedChangeBasketDefault = upgradeLegacyManagedChangeBasketDefault;
|
|
6
|
+
exports.defaultManagedChangePolicy = defaultManagedChangePolicy;
|
|
7
|
+
exports.validateManagedChangePolicy = validateManagedChangePolicy;
|
|
8
|
+
const WERR_errors_1 = require("../../sdk/WERR_errors");
|
|
9
|
+
/** Historical default retained only to identify untouched wallet baskets. */
|
|
10
|
+
exports.LEGACY_MANAGED_CHANGE_MINIMUM_SATOSHIS = 32;
|
|
11
|
+
/**
|
|
12
|
+
* Default liquidity policy for wallet-managed change.
|
|
13
|
+
*
|
|
14
|
+
* The preferred minimum is deliberately much larger than the dust threshold.
|
|
15
|
+
* Dust answers "can this output ever be spent economically?"; this value
|
|
16
|
+
* answers "is this output useful as an independently selectable liquidity
|
|
17
|
+
* unit at contemporary fee rates?".
|
|
18
|
+
*/
|
|
19
|
+
exports.DEFAULT_MANAGED_CHANGE_TARGET_UTXOS = 144;
|
|
20
|
+
exports.DEFAULT_MANAGED_CHANGE_MINIMUM_SATOSHIS = 5_000;
|
|
21
|
+
exports.DEFAULT_MANAGED_CHANGE_MAX_OUTPUTS_PER_ACTION = 8;
|
|
22
|
+
exports.DEFAULT_MANAGED_CHANGE_MIGRATION_INPUTS_PER_ACTION = 4;
|
|
23
|
+
exports.DEFAULT_MANAGED_CHANGE_PENDING_COMPARISON_INPUTS = 16;
|
|
24
|
+
/** True only for the exact historical default that is safe to auto-upgrade. */
|
|
25
|
+
function isLegacyManagedChangeBasketDefault(basket) {
|
|
26
|
+
return basket.name === 'default' &&
|
|
27
|
+
basket.numberOfDesiredUTXOs === exports.DEFAULT_MANAGED_CHANGE_TARGET_UTXOS &&
|
|
28
|
+
basket.minimumDesiredUTXOValue === exports.LEGACY_MANAGED_CHANGE_MINIMUM_SATOSHIS;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Normalize a legacy default while retaining every other field and every
|
|
32
|
+
* operator-selected non-default value. Used by migrations, sync, and restore.
|
|
33
|
+
*/
|
|
34
|
+
function upgradeLegacyManagedChangeBasketDefault(basket) {
|
|
35
|
+
if (!isLegacyManagedChangeBasketDefault(basket))
|
|
36
|
+
return basket;
|
|
37
|
+
return { ...basket, minimumDesiredUTXOValue: exports.DEFAULT_MANAGED_CHANGE_MINIMUM_SATOSHIS };
|
|
38
|
+
}
|
|
39
|
+
function defaultManagedChangePolicy() {
|
|
40
|
+
return {
|
|
41
|
+
maxOutputsPerAction: exports.DEFAULT_MANAGED_CHANGE_MAX_OUTPUTS_PER_ACTION,
|
|
42
|
+
migrationInputsPerAction: exports.DEFAULT_MANAGED_CHANGE_MIGRATION_INPUTS_PER_ACTION,
|
|
43
|
+
pendingComparisonInputs: exports.DEFAULT_MANAGED_CHANGE_PENDING_COMPARISON_INPUTS
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function validateManagedChangePolicy(options) {
|
|
47
|
+
const policy = { ...defaultManagedChangePolicy(), ...options };
|
|
48
|
+
const validateLimit = (value, name, minimum) => {
|
|
49
|
+
if (value !== -1 && (!Number.isSafeInteger(value) || value < minimum)) {
|
|
50
|
+
throw new WERR_errors_1.WERR_INVALID_PARAMETER(`managedChangePolicy.${name}`, `${minimum === 0 ? 'a non-negative' : 'a positive'} safe integer or -1 for unlimited`);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
validateLimit(policy.maxOutputsPerAction, 'maxOutputsPerAction', 1);
|
|
54
|
+
validateLimit(policy.migrationInputsPerAction, 'migrationInputsPerAction', 0);
|
|
55
|
+
validateLimit(policy.pendingComparisonInputs, 'pendingComparisonInputs', 1);
|
|
56
|
+
return policy;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=managedChangePolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managedChangePolicy.js","sourceRoot":"","sources":["../../../../src/storage/methods/managedChangePolicy.ts"],"names":[],"mappings":";;;;;;;AAAA,uDAA8D;AAE9D,6EAA6E;AAChE,QAAA,sCAAsC,GAAG,EAAE,CAAA;AAExD;;;;;;;GAOG;AACU,QAAA,mCAAmC,GAAG,GAAG,CAAA;AACzC,QAAA,uCAAuC,GAAG,KAAK,CAAA;AAC/C,QAAA,6CAA6C,GAAG,CAAC,CAAA;AACjD,QAAA,kDAAkD,GAAG,CAAC,CAAA;AACtD,QAAA,gDAAgD,GAAG,EAAE,CAAA;AAwBlE,+EAA+E;AAC/E,4CACE,MAAmC;IAEnC,OAAO,MAAM,CAAC,IAAI,KAAK,SAAS;QAC9B,MAAM,CAAC,oBAAoB,KAAK,QAAA,mCAAmC;QACnE,MAAM,CAAC,uBAAuB,KAAK,QAAA,sCAAsC,CAAA;AAC7E,CAAC;AAED;;;GAGG;AACH,iDACE,MAAS;IAET,IAAI,CAAC,kCAAkC,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAA;IAC9D,OAAO,EAAE,GAAG,MAAM,EAAE,uBAAuB,EAAE,QAAA,uCAAuC,EAAE,CAAA;AACxF,CAAC;AAED;IACE,OAAO;QACL,mBAAmB,EAAE,QAAA,6CAA6C;QAClE,wBAAwB,EAAE,QAAA,kDAAkD;QAC5E,uBAAuB,EAAE,QAAA,gDAAgD;KAC1E,CAAA;AACH,CAAC;AAED,qCACE,OAAoC;IAEpC,MAAM,MAAM,GAAG,EAAE,GAAG,0BAA0B,EAAE,EAAE,GAAG,OAAO,EAAE,CAAA;IAC9D,MAAM,aAAa,GAAG,CAAC,KAAa,EAAE,IAA+B,EAAE,OAAe,EAAQ,EAAE;QAC9F,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,oCAAsB,CAC9B,uBAAuB,IAAI,EAAE,EAC7B,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,mCAAmC,CACtF,CAAA;QACH,CAAC;IACH,CAAC,CAAA;IACD,aAAa,CAAC,MAAM,CAAC,mBAAmB,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAA;IACnE,aAAa,CAAC,MAAM,CAAC,wBAAwB,EAAE,0BAA0B,EAAE,CAAC,CAAC,CAAA;IAC7E,aAAa,CAAC,MAAM,CAAC,uBAAuB,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAA;IAC3E,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { WalletLoggerInterface } from '@bsv/sdk';
|
|
2
|
+
import * as sdk from '../../sdk';
|
|
3
|
+
import { StorageProvider } from '../StorageProvider';
|
|
4
|
+
import { EntityProvenTxReq } from '../schema/entities';
|
|
5
|
+
export interface FailedInputReconciliationResult {
|
|
6
|
+
checked: number;
|
|
7
|
+
staleConfirmed: number;
|
|
8
|
+
staleOutpoints: string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Conservatively quarantine every locally-owned input of a transaction after
|
|
12
|
+
* Arcade supplies explicit missing-input/conflict evidence. This path is
|
|
13
|
+
* deliberately independent of explorer or UTXO providers: a positive
|
|
14
|
+
* broadcaster verdict is enough to stop the failed transaction from feeding
|
|
15
|
+
* the same inputs into another action. A later validated mined proof remains
|
|
16
|
+
* able to repair the transaction through the ordinary proof recovery path.
|
|
17
|
+
*/
|
|
18
|
+
export declare function quarantineReqInputs(req: EntityProvenTxReq, storage: StorageProvider, trx?: sdk.TrxToken, logger?: WalletLoggerInterface): Promise<FailedInputReconciliationResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Keep only inputs created by a locally terminal parent unavailable after the
|
|
21
|
+
* failed-child transition releases its allocations. Other inputs may still be
|
|
22
|
+
* valid UTXOs and must remain reusable.
|
|
23
|
+
*/
|
|
24
|
+
export declare function quarantineReqInputsFromFailedParents(req: EntityProvenTxReq, failedParentTxids: string[], storage: StorageProvider, trx?: sdk.TrxToken, logger?: WalletLoggerInterface): Promise<FailedInputReconciliationResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Ask the configured UTXO-provider collection to classify the request's local
|
|
27
|
+
* inputs and mark only positively confirmed spent outputs unavailable.
|
|
28
|
+
* Provider errors and a collection with no providers are inconclusive and
|
|
29
|
+
* never count as spent.
|
|
30
|
+
*/
|
|
31
|
+
export declare function markConfirmedStaleReqInputs(req: EntityProvenTxReq, storage: StorageProvider, services: sdk.WalletServices, trx?: sdk.TrxToken, logger?: WalletLoggerInterface): Promise<FailedInputReconciliationResult>;
|
|
32
|
+
//# sourceMappingURL=reconcileFailedTransactionInputs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcileFailedTransactionInputs.d.ts","sourceRoot":"","sources":["../../../../src/storage/methods/reconcileFailedTransactionInputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAC7D,OAAO,KAAK,GAAG,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAStD,MAAM,WAAW,+BAA+B;IAC9C,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AA4DD;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,eAAe,EACxB,GAAG,CAAC,EAAE,GAAG,CAAC,QAAQ,EAClB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,+BAA+B,CAAC,CAS1C;AAED;;;;GAIG;AACH,wBAAsB,oCAAoC,CACxD,GAAG,EAAE,iBAAiB,EACtB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,OAAO,EAAE,eAAe,EACxB,GAAG,CAAC,EAAE,GAAG,CAAC,QAAQ,EAClB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,+BAA+B,CAAC,CAY1C;AAED;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,GAAG,CAAC,cAAc,EAC5B,GAAG,CAAC,EAAE,GAAG,CAAC,QAAQ,EAClB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,+BAA+B,CAAC,CAuD1C"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.quarantineReqInputs = quarantineReqInputs;
|
|
4
|
+
exports.quarantineReqInputsFromFailedParents = quarantineReqInputsFromFailedParents;
|
|
5
|
+
exports.markConfirmedStaleReqInputs = markConfirmedStaleReqInputs;
|
|
6
|
+
const sdk_1 = require("@bsv/sdk");
|
|
7
|
+
const utilityHelpers_1 = require("../../utility/utilityHelpers");
|
|
8
|
+
const classifyOutputUtxo_1 = require("../../services/classifyOutputUtxo");
|
|
9
|
+
async function quarantineLocalInputs(localInputs, storage, trx) {
|
|
10
|
+
const staleOutpoints = new Set();
|
|
11
|
+
for (const { output, outpoint } of localInputs) {
|
|
12
|
+
await storage.updateOutput((0, utilityHelpers_1.verifyId)(output.outputId), { spendable: false }, trx);
|
|
13
|
+
staleOutpoints.add(`${outpoint.txid}.${outpoint.vout}`);
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
checked: localInputs.length,
|
|
17
|
+
staleConfirmed: localInputs.length,
|
|
18
|
+
staleOutpoints: [...staleOutpoints]
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
async function findLocalInputs(req, storage, trx) {
|
|
22
|
+
const tx = sdk_1.Transaction.fromBinary(req.rawTx);
|
|
23
|
+
const outpoints = tx.inputs
|
|
24
|
+
.map(input => ({ txid: input.sourceTXID ?? '', vout: input.sourceOutputIndex ?? 0 }))
|
|
25
|
+
.filter(outpoint => outpoint.txid !== '');
|
|
26
|
+
if (outpoints.length === 0)
|
|
27
|
+
return [];
|
|
28
|
+
// A transaction can be internalized by multiple users while the request's
|
|
29
|
+
// notification list is racing. Resolve every local copy by txid so no user's
|
|
30
|
+
// basket retains the same confirmed-stale outpoint.
|
|
31
|
+
const transactions = await storage.findTransactions({
|
|
32
|
+
partial: { txid: req.txid },
|
|
33
|
+
noRawTx: true,
|
|
34
|
+
trx
|
|
35
|
+
});
|
|
36
|
+
const userIds = [...new Set(transactions.map(transaction => transaction.userId))];
|
|
37
|
+
const localInputs = [];
|
|
38
|
+
const localKeys = new Set();
|
|
39
|
+
for (const userId of userIds) {
|
|
40
|
+
const byOutpoint = await storage.findOutputsByOutpoints(userId, outpoints, trx);
|
|
41
|
+
for (const outpoint of outpoints) {
|
|
42
|
+
const output = byOutpoint[`${outpoint.txid}.${outpoint.vout}`];
|
|
43
|
+
const localKey = `${userId}:${outpoint.txid}.${outpoint.vout}`;
|
|
44
|
+
if (output != null && !localKeys.has(localKey)) {
|
|
45
|
+
localKeys.add(localKey);
|
|
46
|
+
localInputs.push({ output, outpoint });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return localInputs;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Conservatively quarantine every locally-owned input of a transaction after
|
|
54
|
+
* Arcade supplies explicit missing-input/conflict evidence. This path is
|
|
55
|
+
* deliberately independent of explorer or UTXO providers: a positive
|
|
56
|
+
* broadcaster verdict is enough to stop the failed transaction from feeding
|
|
57
|
+
* the same inputs into another action. A later validated mined proof remains
|
|
58
|
+
* able to repair the transaction through the ordinary proof recovery path.
|
|
59
|
+
*/
|
|
60
|
+
async function quarantineReqInputs(req, storage, trx, logger) {
|
|
61
|
+
const localInputs = await findLocalInputs(req, storage, trx);
|
|
62
|
+
const result = await quarantineLocalInputs(localInputs, storage, trx);
|
|
63
|
+
if (result.staleConfirmed > 0) {
|
|
64
|
+
logger?.log(`quarantineReqInputs: ${result.staleConfirmed} local input copy/copies quarantined for txid=${req.txid}`);
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Keep only inputs created by a locally terminal parent unavailable after the
|
|
70
|
+
* failed-child transition releases its allocations. Other inputs may still be
|
|
71
|
+
* valid UTXOs and must remain reusable.
|
|
72
|
+
*/
|
|
73
|
+
async function quarantineReqInputsFromFailedParents(req, failedParentTxids, storage, trx, logger) {
|
|
74
|
+
const failedParents = new Set(failedParentTxids);
|
|
75
|
+
const localInputs = (await findLocalInputs(req, storage, trx)).filter(({ outpoint }) => failedParents.has(outpoint.txid));
|
|
76
|
+
const result = await quarantineLocalInputs(localInputs, storage, trx);
|
|
77
|
+
if (result.staleConfirmed > 0) {
|
|
78
|
+
logger?.log(`quarantineReqInputsFromFailedParents: ${result.staleConfirmed} local parent output copy/copies quarantined for txid=${req.txid}`);
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Ask the configured UTXO-provider collection to classify the request's local
|
|
84
|
+
* inputs and mark only positively confirmed spent outputs unavailable.
|
|
85
|
+
* Provider errors and a collection with no providers are inconclusive and
|
|
86
|
+
* never count as spent.
|
|
87
|
+
*/
|
|
88
|
+
async function markConfirmedStaleReqInputs(req, storage, services, trx, logger) {
|
|
89
|
+
const result = { checked: 0, staleConfirmed: 0, staleOutpoints: [] };
|
|
90
|
+
const localInputs = await findLocalInputs(req, storage, trx);
|
|
91
|
+
const verdicts = new Map();
|
|
92
|
+
const uniqueInputs = new Map();
|
|
93
|
+
for (const localInput of localInputs) {
|
|
94
|
+
const key = `${localInput.outpoint.txid}.${localInput.outpoint.vout}`;
|
|
95
|
+
if (!uniqueInputs.has(key))
|
|
96
|
+
uniqueInputs.set(key, localInput);
|
|
97
|
+
}
|
|
98
|
+
await (0, classifyOutputUtxo_1.mapWithConcurrency)([...uniqueInputs.values()], classifyOutputUtxo_1.UTXO_PROVIDER_MAX_CONCURRENCY, async ({ output, outpoint }) => {
|
|
99
|
+
const key = `${outpoint.txid}.${outpoint.vout}`;
|
|
100
|
+
if (output.lockingScript == null) {
|
|
101
|
+
try {
|
|
102
|
+
await storage.validateOutputScript(output, trx);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
verdicts.set(key, 'inconclusive');
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (output.lockingScript == null) {
|
|
110
|
+
verdicts.set(key, 'inconclusive');
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const classification = await (0, classifyOutputUtxo_1.classifyOutputUtxo)(services, output);
|
|
114
|
+
let verdict;
|
|
115
|
+
if (classification.verdict === 'unknown')
|
|
116
|
+
verdict = 'inconclusive';
|
|
117
|
+
else if (classification.verdict === 'unspent')
|
|
118
|
+
verdict = 'utxo';
|
|
119
|
+
else
|
|
120
|
+
verdict = 'stale';
|
|
121
|
+
verdicts.set(key, verdict);
|
|
122
|
+
});
|
|
123
|
+
const staleOutpoints = new Set();
|
|
124
|
+
for (const { output, outpoint } of localInputs) {
|
|
125
|
+
const key = `${outpoint.txid}.${outpoint.vout}`;
|
|
126
|
+
const verdict = verdicts.get(key);
|
|
127
|
+
if (verdict == null || verdict === 'inconclusive')
|
|
128
|
+
continue;
|
|
129
|
+
result.checked++;
|
|
130
|
+
if (verdict === 'stale') {
|
|
131
|
+
await storage.updateOutput((0, utilityHelpers_1.verifyId)(output.outputId), { spendable: false }, trx);
|
|
132
|
+
result.staleConfirmed++;
|
|
133
|
+
staleOutpoints.add(key);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
result.staleOutpoints = [...staleOutpoints];
|
|
137
|
+
if (result.staleConfirmed > 0) {
|
|
138
|
+
logger?.log(`markConfirmedStaleReqInputs: ${result.staleConfirmed} of ${result.checked} local input copy/copies confirmed spent for txid=${req.txid}`);
|
|
139
|
+
}
|
|
140
|
+
return result;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=reconcileFailedTransactionInputs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcileFailedTransactionInputs.js","sourceRoot":"","sources":["../../../../src/storage/methods/reconcileFailedTransactionInputs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { AuthId } from '../../sdk/WalletStorage.interfaces';
|
|
2
|
+
import { type OutputUtxoClassification } from '../../services/classifyOutputUtxo';
|
|
3
|
+
import { StorageProvider } from '../StorageProvider';
|
|
4
|
+
import { TableOutput } from '../schema/tables/TableOutput';
|
|
5
|
+
export declare const UTXO_REVIEW_PROVIDER_TIMEOUT_MSECS = 5000;
|
|
6
|
+
export type UtxoReviewReleaseMode = 'none' | 'atomic' | 'conclusive';
|
|
7
|
+
export interface UtxoReviewClassification {
|
|
8
|
+
output: TableOutput;
|
|
9
|
+
status: OutputUtxoClassification;
|
|
10
|
+
}
|
|
11
|
+
export interface UtxoReviewDiagnostics {
|
|
12
|
+
checked: number;
|
|
13
|
+
confirmedUnspent: number;
|
|
14
|
+
confirmedSpent: number;
|
|
15
|
+
unknown: number;
|
|
16
|
+
confirmedSpentSatoshis: number;
|
|
17
|
+
released: number;
|
|
18
|
+
releasedSatoshis: number;
|
|
19
|
+
providers: string[];
|
|
20
|
+
providerCount: number;
|
|
21
|
+
providersTruncated: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface ReviewUtxoOutputsResult {
|
|
24
|
+
classifications: UtxoReviewClassification[];
|
|
25
|
+
confirmedSpentOutputs: TableOutput[];
|
|
26
|
+
unknownOutputs: TableOutput[];
|
|
27
|
+
diagnostics: UtxoReviewDiagnostics;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Classify a bounded set of wallet outputs without treating provider failure as
|
|
31
|
+
* proof that an output was spent. Read-only reviews always return their
|
|
32
|
+
* conclusive and unknown partitions. Atomic release requires every verdict to
|
|
33
|
+
* be conclusive; the operator-only conclusive mode releases the positively
|
|
34
|
+
* spent subset while retaining and reporting unknowns.
|
|
35
|
+
*/
|
|
36
|
+
export declare function reviewUtxoOutputs(storage: StorageProvider, auth: AuthId, outputs: TableOutput[], releaseMode?: UtxoReviewReleaseMode): Promise<ReviewUtxoOutputsResult>;
|
|
37
|
+
//# sourceMappingURL=reviewUtxoOutputs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewUtxoOutputs.d.ts","sourceRoot":"","sources":["../../../../src/storage/methods/reviewUtxoOutputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAA;AAE3D,OAAO,EAGL,KAAK,wBAAwB,EAE9B,MAAM,mCAAmC,CAAA;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAI1D,eAAO,MAAM,kCAAkC,OAAQ,CAAA;AAEvD,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,QAAQ,GAAG,YAAY,CAAA;AAEpE,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,WAAW,CAAA;IACnB,MAAM,EAAE,wBAAwB,CAAA;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,gBAAgB,EAAE,MAAM,CAAA;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,sBAAsB,EAAE,MAAM,CAAA;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,kBAAkB,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,wBAAwB,EAAE,CAAA;IAC3C,qBAAqB,EAAE,WAAW,EAAE,CAAA;IACpC,cAAc,EAAE,WAAW,EAAE,CAAA;IAC7B,WAAW,EAAE,qBAAqB,CAAA;CACnC;AA8HD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EAAE,EACtB,WAAW,GAAE,qBAA8B,GAC1C,OAAO,CAAC,uBAAuB,CAAC,CAoClC"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UTXO_REVIEW_PROVIDER_TIMEOUT_MSECS = void 0;
|
|
4
|
+
exports.reviewUtxoOutputs = reviewUtxoOutputs;
|
|
5
|
+
const WERR_errors_1 = require("../../sdk/WERR_errors");
|
|
6
|
+
const classifyOutputUtxo_1 = require("../../services/classifyOutputUtxo");
|
|
7
|
+
const utilityHelpers_1 = require("../../utility/utilityHelpers");
|
|
8
|
+
const MAX_AUDIT_PROVIDERS = 8;
|
|
9
|
+
const MAX_PROVIDER_NAME_LENGTH = 128;
|
|
10
|
+
exports.UTXO_REVIEW_PROVIDER_TIMEOUT_MSECS = 5_000;
|
|
11
|
+
function diagnosticsFor(classifications, releasedOutputIds) {
|
|
12
|
+
const allProviders = [
|
|
13
|
+
...new Set(classifications.map(result => result.status.provider.slice(0, MAX_PROVIDER_NAME_LENGTH)))
|
|
14
|
+
];
|
|
15
|
+
const providers = allProviders.slice(0, MAX_AUDIT_PROVIDERS);
|
|
16
|
+
const confirmedSpent = classifications.filter(result => result.status.verdict === 'spent');
|
|
17
|
+
const released = confirmedSpent.filter(result => releasedOutputIds.has(result.output.outputId));
|
|
18
|
+
return {
|
|
19
|
+
checked: classifications.length,
|
|
20
|
+
confirmedUnspent: classifications.filter(result => result.status.verdict === 'unspent').length,
|
|
21
|
+
confirmedSpent: confirmedSpent.length,
|
|
22
|
+
unknown: classifications.filter(result => result.status.verdict === 'unknown').length,
|
|
23
|
+
confirmedSpentSatoshis: confirmedSpent.reduce((sum, result) => sum + result.output.satoshis, 0),
|
|
24
|
+
released: released.length,
|
|
25
|
+
releasedSatoshis: released.reduce((sum, result) => sum + result.output.satoshis, 0),
|
|
26
|
+
providers,
|
|
27
|
+
providerCount: allProviders.length,
|
|
28
|
+
providersTruncated: allProviders.length > providers.length
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function auditDetails(diagnostics, userId, releaseMode, reason) {
|
|
32
|
+
return JSON.stringify({
|
|
33
|
+
operation: 'specOpInvalidChange',
|
|
34
|
+
reason,
|
|
35
|
+
releaseMode,
|
|
36
|
+
userId,
|
|
37
|
+
...diagnostics
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async function classifyCandidates(storage, outputs) {
|
|
41
|
+
const services = storage.getServices();
|
|
42
|
+
const candidates = outputs.filter(output => output.basketId != null);
|
|
43
|
+
return await (0, classifyOutputUtxo_1.mapWithConcurrency)(candidates, classifyOutputUtxo_1.UTXO_PROVIDER_MAX_CONCURRENCY, async (output) => {
|
|
44
|
+
try {
|
|
45
|
+
await storage.validateOutputScript(output);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return {
|
|
49
|
+
output,
|
|
50
|
+
status: {
|
|
51
|
+
verdict: 'unknown',
|
|
52
|
+
provider: '<script-validation-error>',
|
|
53
|
+
error
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
let timeout;
|
|
58
|
+
const providerCall = (0, classifyOutputUtxo_1.classifyOutputUtxo)(services, output);
|
|
59
|
+
const timedClassification = new Promise(resolve => {
|
|
60
|
+
timeout = setTimeout(() => resolve({
|
|
61
|
+
verdict: 'unknown',
|
|
62
|
+
provider: '<review-timeout>',
|
|
63
|
+
error: new Error(`UTXO classification exceeded ${exports.UTXO_REVIEW_PROVIDER_TIMEOUT_MSECS}ms`)
|
|
64
|
+
}), exports.UTXO_REVIEW_PROVIDER_TIMEOUT_MSECS);
|
|
65
|
+
});
|
|
66
|
+
try {
|
|
67
|
+
return {
|
|
68
|
+
output,
|
|
69
|
+
status: await Promise.race([providerCall, timedClassification])
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
if (timeout != null)
|
|
74
|
+
clearTimeout(timeout);
|
|
75
|
+
void providerCall.catch(() => undefined);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
async function releaseConfirmedSpent(storage, auth, classifications, releaseMode) {
|
|
80
|
+
const confirmedSpent = classifications.filter(result => result.status.verdict === 'spent');
|
|
81
|
+
const releasedOutputIds = new Set();
|
|
82
|
+
await storage.transaction(async (trx) => {
|
|
83
|
+
for (const { output } of confirmedSpent) {
|
|
84
|
+
const current = await storage.findOutputById(output.outputId, trx, true);
|
|
85
|
+
if (current == null || current.userId !== auth.userId) {
|
|
86
|
+
throw new WERR_errors_1.WERR_INVALID_PARAMETER('outputId', `owned by user ${auth.userId}`);
|
|
87
|
+
}
|
|
88
|
+
if (current.spendable !== true || current.spentBy != null) {
|
|
89
|
+
throw new WERR_errors_1.WERR_INVALID_OPERATION(`Output ${output.outputId} changed state during UTXO review; no outputs were changed.`);
|
|
90
|
+
}
|
|
91
|
+
const updated = await storage.updateOutput((0, utilityHelpers_1.verifyId)(output.outputId), { spendable: false }, trx);
|
|
92
|
+
if (updated !== 1) {
|
|
93
|
+
throw new WERR_errors_1.WERR_INVALID_PARAMETER('outputId', `updated exactly once: ${output.outputId}`);
|
|
94
|
+
}
|
|
95
|
+
releasedOutputIds.add(output.outputId);
|
|
96
|
+
}
|
|
97
|
+
const now = new Date();
|
|
98
|
+
const diagnostics = diagnosticsFor(classifications, releasedOutputIds);
|
|
99
|
+
await storage.insertMonitorEvent({
|
|
100
|
+
created_at: now,
|
|
101
|
+
updated_at: now,
|
|
102
|
+
id: 0,
|
|
103
|
+
event: releaseMode === 'atomic' ? 'InvalidChangeRelease' : 'InvalidChangeConclusiveRelease',
|
|
104
|
+
details: auditDetails(diagnostics, auth.userId, releaseMode, 'provider-confirmed-spent')
|
|
105
|
+
}, trx);
|
|
106
|
+
});
|
|
107
|
+
return releasedOutputIds;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Classify a bounded set of wallet outputs without treating provider failure as
|
|
111
|
+
* proof that an output was spent. Read-only reviews always return their
|
|
112
|
+
* conclusive and unknown partitions. Atomic release requires every verdict to
|
|
113
|
+
* be conclusive; the operator-only conclusive mode releases the positively
|
|
114
|
+
* spent subset while retaining and reporting unknowns.
|
|
115
|
+
*/
|
|
116
|
+
async function reviewUtxoOutputs(storage, auth, outputs, releaseMode = 'none') {
|
|
117
|
+
const classifications = await classifyCandidates(storage, outputs);
|
|
118
|
+
const confirmedSpentOutputs = classifications
|
|
119
|
+
.filter(result => result.status.verdict === 'spent')
|
|
120
|
+
.map(result => result.output);
|
|
121
|
+
const unknownOutputs = classifications
|
|
122
|
+
.filter(result => result.status.verdict === 'unknown')
|
|
123
|
+
.map(result => result.output);
|
|
124
|
+
if (releaseMode === 'atomic' && unknownOutputs.length > 0) {
|
|
125
|
+
const diagnostics = diagnosticsFor(classifications, new Set());
|
|
126
|
+
const now = new Date();
|
|
127
|
+
await storage.insertMonitorEvent({
|
|
128
|
+
created_at: now,
|
|
129
|
+
updated_at: now,
|
|
130
|
+
id: 0,
|
|
131
|
+
event: 'InvalidChangeReleaseBlocked',
|
|
132
|
+
details: auditDetails(diagnostics, auth.userId, releaseMode, 'inconclusive-provider-result')
|
|
133
|
+
});
|
|
134
|
+
throw new WERR_errors_1.WERR_UTXO_REVIEW_INCONCLUSIVE(diagnostics.checked, diagnostics.confirmedSpent, diagnostics.unknown);
|
|
135
|
+
}
|
|
136
|
+
const releasedOutputIds = releaseMode === 'none'
|
|
137
|
+
? new Set()
|
|
138
|
+
: await releaseConfirmedSpent(storage, auth, classifications, releaseMode);
|
|
139
|
+
for (const output of confirmedSpentOutputs) {
|
|
140
|
+
if (releasedOutputIds.has(output.outputId))
|
|
141
|
+
output.spendable = false;
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
classifications,
|
|
145
|
+
confirmedSpentOutputs,
|
|
146
|
+
unknownOutputs,
|
|
147
|
+
diagnostics: diagnosticsFor(classifications, releasedOutputIds)
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=reviewUtxoOutputs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewUtxoOutputs.js","sourceRoot":"","sources":["../../../../src/storage/methods/reviewUtxoOutputs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/storage/portable/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/storage/portable/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ const AESGCM_1 = require("@bsv/sdk/primitives/AESGCM");
|
|
|
16
16
|
const hashWasm_1 = require("../../utility/hashWasm");
|
|
17
17
|
const EntityBase_1 = require("../schema/entities/EntityBase");
|
|
18
18
|
const utilityHelpers_1 = require("../../utility/utilityHelpers");
|
|
19
|
+
const managedChangePolicy_1 = require("../methods/managedChangePolicy");
|
|
19
20
|
const BRC38_TITLE = 'User Wallet Data Format';
|
|
20
21
|
const BRC39_MAGIC = [0x57, 0x44, 0x41, 0x54]; // WDAT
|
|
21
22
|
const BRC39_HEADER_LENGTH = 33;
|
|
@@ -326,8 +327,9 @@ async function restoreBRC38(storage, data) {
|
|
|
326
327
|
await storage.insertUser({ ...data.user }, trx);
|
|
327
328
|
for (const row of data.provenTxs)
|
|
328
329
|
await storage.insertProvenTx({ ...row }, trx);
|
|
329
|
-
for (const row of data.outputBaskets)
|
|
330
|
-
await storage.insertOutputBasket({ ...row }, trx);
|
|
330
|
+
for (const row of data.outputBaskets) {
|
|
331
|
+
await storage.insertOutputBasket((0, managedChangePolicy_1.upgradeLegacyManagedChangeBasketDefault)({ ...row }), trx);
|
|
332
|
+
}
|
|
331
333
|
for (const row of data.outputTags)
|
|
332
334
|
await storage.insertOutputTag({ ...row }, trx);
|
|
333
335
|
for (const row of data.txLabels)
|