@bsv/wallet-toolbox 2.7.0 → 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 +9 -0
- package/README.md +9 -5
- package/out/src/monitor/tasks/TaskReconcilePendingTransactions.d.ts +2 -0
- package/out/src/monitor/tasks/TaskReconcilePendingTransactions.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskReconcilePendingTransactions.js +66 -11
- package/out/src/monitor/tasks/TaskReconcilePendingTransactions.js.map +1 -1
- package/out/src/storage/methods/reconcileFailedTransactionInputs.d.ts +6 -0
- package/out/src/storage/methods/reconcileFailedTransactionInputs.d.ts.map +1 -1
- package/out/src/storage/methods/reconcileFailedTransactionInputs.js +28 -10
- package/out/src/storage/methods/reconcileFailedTransactionInputs.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,15 @@ attention to changes that materially alter behavior or extend functionality.
|
|
|
6
6
|
|
|
7
7
|
## wallet-toolbox (unreleased)
|
|
8
8
|
|
|
9
|
+
- Age proactive pending-transaction review from immutable request creation
|
|
10
|
+
time, so repeated proof polling cannot keep a rejected transaction below the
|
|
11
|
+
reconciliation threshold forever. A descendant of a locally terminal parent
|
|
12
|
+
now fails from that durable storage evidence; failed-parent outputs remain
|
|
13
|
+
quarantined while unrelated inputs are released for reuse. The shared change
|
|
14
|
+
adds about 1.1 kB to the Vite browser artifact and 3.8 kB to Hermes bytecode;
|
|
15
|
+
the reviewed raw ceilings advance to 1,585,000 and 3,322,000 bytes while all
|
|
16
|
+
compressed ceilings remain unchanged; the esbuild raw ceiling advances to
|
|
17
|
+
1,238,000 bytes.
|
|
9
18
|
- Keep mainnet and testnet ChainTracks usable from browser and webview wallets:
|
|
10
19
|
browser runtimes temporarily select the CORS-enabled legacy service while
|
|
11
20
|
Node runtimes retain Arcade/go-chaintracks v2. `Services.getHeight` now falls
|
package/README.md
CHANGED
|
@@ -91,11 +91,15 @@ WhatsOnChain or another UTXO explorer.
|
|
|
91
91
|
|
|
92
92
|
Arcade is also registered as a transaction-status provider, so monitor review
|
|
93
93
|
continues on networks without WhatsOnChain. A scheduled bounded pass revisits
|
|
94
|
-
|
|
95
|
-
have arrived while SSE was
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
94
|
+
pending requests after their immutable creation-age threshold and applies
|
|
95
|
+
durable Arcade lifecycle verdicts that may have arrived while SSE was
|
|
96
|
+
disconnected, including `SEEN_IN_ORPHAN_MEMPOOL`. Routine proof checks may
|
|
97
|
+
refresh diagnostic timestamps without postponing that review. A descendant of
|
|
98
|
+
a locally terminal parent is also failed from that storage evidence; the failed
|
|
99
|
+
parent output remains quarantined while unrelated inputs are released for
|
|
100
|
+
reuse. Mined/known evidence takes precedence over a stale rejection. Provider
|
|
101
|
+
absence and provider errors are treated as inconclusive, never as proof that an
|
|
102
|
+
output was spent.
|
|
99
103
|
After an input conflict has been recorded, a later cached accepted/seen label
|
|
100
104
|
cannot restore the failed transaction; recovery requires a mined status and a
|
|
101
105
|
Merkle proof validated by the configured chain tracker. Arcade SSE events are
|
|
@@ -21,5 +21,7 @@ export declare class TaskReconcilePendingTransactions extends WalletMonitorTask
|
|
|
21
21
|
runTask(): Promise<string>;
|
|
22
22
|
private findReqsToReview;
|
|
23
23
|
private applyTerminalVerdict;
|
|
24
|
+
private findFailedLocalParentTxids;
|
|
25
|
+
private failedParentVerdict;
|
|
24
26
|
}
|
|
25
27
|
//# sourceMappingURL=TaskReconcilePendingTransactions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskReconcilePendingTransactions.d.ts","sourceRoot":"","sources":["../../../../src/monitor/tasks/TaskReconcilePendingTransactions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TaskReconcilePendingTransactions.d.ts","sourceRoot":"","sources":["../../../../src/monitor/tasks/TaskReconcilePendingTransactions.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAqBvD;;;;;GAKG;AACH,qBAAa,gCAAiC,SAAQ,iBAAiB;IAO5D,YAAY;IACZ,WAAW;IACX,aAAa;IACb,iBAAiB;IAT1B,MAAM,CAAC,QAAQ,CAAC,QAAQ,kCAAiC;IAEzD,gBAAgB,EAAE,MAAM,CAAA;IAExB,YACE,OAAO,EAAE,OAAO,EACT,YAAY,SAAyB,EACrC,WAAW,SAAM,EACjB,aAAa,SAAK,EAClB,iBAAiB,SAAoB,EAI7C;IAED,OAAO,CAAC,kBAAkB,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,OAAO,CAAA;KAAE,CAIpD;YAEa,aAAa;IAiCrB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAgE/B;YAEa,gBAAgB;YAqBhB,oBAAoB;YAuEpB,0BAA0B;IAsBxC,OAAO,CAAC,mBAAmB;CAY5B"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TaskReconcilePendingTransactions = void 0;
|
|
4
|
+
const sdk_1 = require("@bsv/sdk");
|
|
4
5
|
const entities_1 = require("../../storage/schema/entities");
|
|
5
6
|
const reconcileFailedTransactionInputs_1 = require("../../storage/methods/reconcileFailedTransactionInputs");
|
|
6
7
|
const Monitor_1 = require("../Monitor");
|
|
@@ -63,9 +64,12 @@ class TaskReconcilePendingTransactions extends WalletMonitorTask_1.WalletMonitor
|
|
|
63
64
|
}
|
|
64
65
|
async runTask() {
|
|
65
66
|
const checkpoint = await this.getCheckpoint();
|
|
66
|
-
|
|
67
|
+
// Proof checks and lifecycle events legitimately refresh updated_at while a
|
|
68
|
+
// request remains pending. Use the immutable creation time so that routine
|
|
69
|
+
// monitoring cannot postpone reconciliation forever.
|
|
70
|
+
const createdBefore = new Date(Date.now() - this.minAgeMinutes * 60 * 1000);
|
|
67
71
|
const reqs = await this.findReqsToReview(checkpoint);
|
|
68
|
-
const eligible = reqs.filter(req => req.
|
|
72
|
+
const eligible = reqs.filter(req => req.created_at <= createdBefore);
|
|
69
73
|
const provider = eligible.length === 0 ? undefined : await this.monitor.services.getStatusForTxids(eligible.map(req => req.txid));
|
|
70
74
|
const results = new Map(provider?.results.map(result => [result.txid, result]) ?? []);
|
|
71
75
|
let reconciled = 0;
|
|
@@ -74,21 +78,21 @@ class TaskReconcilePendingTransactions extends WalletMonitorTask_1.WalletMonitor
|
|
|
74
78
|
const retained = [];
|
|
75
79
|
for (const req of reqs) {
|
|
76
80
|
const result = results.get(req.txid);
|
|
77
|
-
if (req.
|
|
81
|
+
if (req.created_at > createdBefore) {
|
|
78
82
|
retained.push(req);
|
|
79
83
|
continue;
|
|
80
84
|
}
|
|
81
|
-
const applied = await this.applyTerminalVerdict(req, result, provider.name);
|
|
85
|
+
const applied = await this.applyTerminalVerdict(req, provider?.status === 'success' ? result : undefined, provider?.status === 'success' ? provider.name : undefined, createdBefore);
|
|
82
86
|
if (!applied) {
|
|
83
87
|
retained.push(req);
|
|
84
88
|
continue;
|
|
85
89
|
}
|
|
86
90
|
reconciled++;
|
|
87
|
-
if (result.inputConflict === true)
|
|
91
|
+
if (applied.result.inputConflict === true)
|
|
88
92
|
inputConflicts++;
|
|
89
93
|
reviewLog +=
|
|
90
|
-
`reconciled ${req.provenTxReqId} ${req.txid} ${result.providerStatus ?? 'terminal'} ` +
|
|
91
|
-
`=> ${result.inputConflict === true ? 'doubleSpend' : 'invalid'}\n`;
|
|
94
|
+
`reconciled ${req.provenTxReqId} ${req.txid} ${applied.result.providerStatus ?? 'terminal'} ` +
|
|
95
|
+
`=> ${applied.result.inputConflict === true ? 'doubleSpend' : 'invalid'}\n`;
|
|
92
96
|
}
|
|
93
97
|
const fullPage = reqs.length >= this.reviewLimit;
|
|
94
98
|
this.triggerNextMsecs = fullPage ? this.triggerQuickMsecs : this.triggerMsecs;
|
|
@@ -134,14 +138,25 @@ class TaskReconcilePendingTransactions extends WalletMonitorTask_1.WalletMonitor
|
|
|
134
138
|
reqs.sourceOffset = offset;
|
|
135
139
|
return reqs;
|
|
136
140
|
}
|
|
137
|
-
async applyTerminalVerdict(reqApi,
|
|
138
|
-
let applied
|
|
141
|
+
async applyTerminalVerdict(reqApi, providerResult, providerName, createdBefore) {
|
|
142
|
+
let applied;
|
|
139
143
|
await this.storage.runAsStorageProvider(async (sp) => {
|
|
140
144
|
await sp.transaction(async (trx) => {
|
|
141
145
|
const req = new entities_1.EntityProvenTxReq(reqApi);
|
|
142
146
|
await req.refreshFromStorage(sp, trx);
|
|
143
147
|
if (!REVIEW_STATUSES.includes(req.status))
|
|
144
148
|
return;
|
|
149
|
+
if (req.created_at > createdBefore)
|
|
150
|
+
return;
|
|
151
|
+
const failedParentTxids = await this.findFailedLocalParentTxids(req, sp, trx);
|
|
152
|
+
const result = providerResult?.terminal === true
|
|
153
|
+
? providerResult
|
|
154
|
+
: providerResult?.status === 'known' || providerResult?.status === 'mined'
|
|
155
|
+
? undefined
|
|
156
|
+
: this.failedParentVerdict(req.txid, failedParentTxids);
|
|
157
|
+
if (result == null)
|
|
158
|
+
return;
|
|
159
|
+
const provider = providerResult?.terminal === true ? (providerName ?? 'transaction-status-provider') : 'local-storage';
|
|
145
160
|
req.status = result.inputConflict === true ? 'doubleSpend' : 'invalid';
|
|
146
161
|
req.addHistoryNote({
|
|
147
162
|
when: new Date().toISOString(),
|
|
@@ -168,14 +183,54 @@ class TaskReconcilePendingTransactions extends WalletMonitorTask_1.WalletMonitor
|
|
|
168
183
|
});
|
|
169
184
|
await req.updateStorageDynamicProperties(sp, trx);
|
|
170
185
|
}
|
|
171
|
-
|
|
186
|
+
else if (failedParentTxids.length > 0) {
|
|
187
|
+
const quarantined = await (0, reconcileFailedTransactionInputs_1.quarantineReqInputsFromFailedParents)(req, failedParentTxids, sp, trx);
|
|
188
|
+
req.addHistoryNote({
|
|
189
|
+
when: new Date().toISOString(),
|
|
190
|
+
what: 'proactiveFailedParentQuarantine',
|
|
191
|
+
checked: quarantined.checked,
|
|
192
|
+
confirmed: quarantined.staleConfirmed,
|
|
193
|
+
parentTxids: failedParentTxids.join(','),
|
|
194
|
+
...(quarantined.staleOutpoints.length > 0 ? { outpoints: quarantined.staleOutpoints.join(',') } : {})
|
|
195
|
+
});
|
|
196
|
+
await req.updateStorageDynamicProperties(sp, trx);
|
|
197
|
+
}
|
|
198
|
+
applied = { result };
|
|
172
199
|
});
|
|
173
200
|
});
|
|
174
201
|
if (applied) {
|
|
175
|
-
this.monitor.callOnTransactionStatusChanged(reqApi.txid, result.providerStatus ?? 'REJECTED');
|
|
202
|
+
this.monitor.callOnTransactionStatusChanged(reqApi.txid, applied.result.providerStatus ?? 'REJECTED');
|
|
176
203
|
}
|
|
177
204
|
return applied;
|
|
178
205
|
}
|
|
206
|
+
async findFailedLocalParentTxids(req, storage, trx) {
|
|
207
|
+
const parentTxids = [
|
|
208
|
+
...new Set(sdk_1.Transaction.fromBinary(req.rawTx)
|
|
209
|
+
.inputs.map(input => input.sourceTXID)
|
|
210
|
+
.filter((txid) => txid != null && txid !== ''))
|
|
211
|
+
];
|
|
212
|
+
const failed = [];
|
|
213
|
+
for (const txid of parentTxids) {
|
|
214
|
+
const parentReqs = await storage.findProvenTxReqs({ partial: { txid }, trx });
|
|
215
|
+
if (parentReqs.some(parent => parent.status === 'invalid' || parent.status === 'doubleSpend')) {
|
|
216
|
+
failed.push(txid);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return failed;
|
|
220
|
+
}
|
|
221
|
+
failedParentVerdict(txid, failedParentTxids) {
|
|
222
|
+
if (failedParentTxids.length === 0)
|
|
223
|
+
return undefined;
|
|
224
|
+
return {
|
|
225
|
+
txid,
|
|
226
|
+
status: 'unknown',
|
|
227
|
+
depth: undefined,
|
|
228
|
+
terminal: true,
|
|
229
|
+
inputConflict: false,
|
|
230
|
+
providerStatus: 'LOCAL_PARENT_FAILED',
|
|
231
|
+
description: `Local parent request is terminal: ${failedParentTxids.join(',')}`.slice(0, 512)
|
|
232
|
+
};
|
|
233
|
+
}
|
|
179
234
|
}
|
|
180
235
|
exports.TaskReconcilePendingTransactions = TaskReconcilePendingTransactions;
|
|
181
236
|
//# sourceMappingURL=TaskReconcilePendingTransactions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskReconcilePendingTransactions.js","sourceRoot":"","sources":["../../../../src/monitor/tasks/TaskReconcilePendingTransactions.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"TaskReconcilePendingTransactions.js","sourceRoot":"","sources":["../../../../src/monitor/tasks/TaskReconcilePendingTransactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,12 @@ export interface FailedInputReconciliationResult {
|
|
|
16
16
|
* able to repair the transaction through the ordinary proof recovery path.
|
|
17
17
|
*/
|
|
18
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>;
|
|
19
25
|
/**
|
|
20
26
|
* Ask the configured UTXO-provider collection to classify the request's local
|
|
21
27
|
* inputs and mark only positively confirmed spent outputs unavailable.
|
|
@@ -1 +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;
|
|
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"}
|
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.quarantineReqInputs = quarantineReqInputs;
|
|
4
|
+
exports.quarantineReqInputsFromFailedParents = quarantineReqInputsFromFailedParents;
|
|
4
5
|
exports.markConfirmedStaleReqInputs = markConfirmedStaleReqInputs;
|
|
5
6
|
const sdk_1 = require("@bsv/sdk");
|
|
6
7
|
const utilityHelpers_1 = require("../../utility/utilityHelpers");
|
|
7
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
|
+
}
|
|
8
21
|
async function findLocalInputs(req, storage, trx) {
|
|
9
22
|
const tx = sdk_1.Transaction.fromBinary(req.rawTx);
|
|
10
23
|
const outpoints = tx.inputs
|
|
@@ -46,21 +59,26 @@ async function findLocalInputs(req, storage, trx) {
|
|
|
46
59
|
*/
|
|
47
60
|
async function quarantineReqInputs(req, storage, trx, logger) {
|
|
48
61
|
const localInputs = await findLocalInputs(req, storage, trx);
|
|
49
|
-
const
|
|
50
|
-
for (const { output, outpoint } of localInputs) {
|
|
51
|
-
await storage.updateOutput((0, utilityHelpers_1.verifyId)(output.outputId), { spendable: false }, trx);
|
|
52
|
-
staleOutpoints.add(`${outpoint.txid}.${outpoint.vout}`);
|
|
53
|
-
}
|
|
54
|
-
const result = {
|
|
55
|
-
checked: localInputs.length,
|
|
56
|
-
staleConfirmed: localInputs.length,
|
|
57
|
-
staleOutpoints: [...staleOutpoints]
|
|
58
|
-
};
|
|
62
|
+
const result = await quarantineLocalInputs(localInputs, storage, trx);
|
|
59
63
|
if (result.staleConfirmed > 0) {
|
|
60
64
|
logger?.log(`quarantineReqInputs: ${result.staleConfirmed} local input copy/copies quarantined for txid=${req.txid}`);
|
|
61
65
|
}
|
|
62
66
|
return result;
|
|
63
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
|
+
}
|
|
64
82
|
/**
|
|
65
83
|
* Ask the configured UTXO-provider collection to classify the request's local
|
|
66
84
|
* inputs and mark only positively confirmed spent outputs unavailable.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconcileFailedTransactionInputs.js","sourceRoot":"","sources":["../../../../src/storage/methods/reconcileFailedTransactionInputs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reconcileFailedTransactionInputs.js","sourceRoot":"","sources":["../../../../src/storage/methods/reconcileFailedTransactionInputs.ts"],"names":[],"mappings":"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"}
|