@bsv/wallet-toolbox-client 1.2.4 → 1.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/out/src/Setup.d.ts +329 -0
  2. package/out/src/Setup.d.ts.map +1 -0
  3. package/out/src/Setup.js +394 -0
  4. package/out/src/Setup.js.map +1 -0
  5. package/out/src/index.all.d.ts +19 -0
  6. package/out/src/index.all.d.ts.map +1 -0
  7. package/out/src/index.all.js +58 -0
  8. package/out/src/index.all.js.map +1 -0
  9. package/out/src/monitor/Monitor.d.ts.map +1 -1
  10. package/out/src/monitor/Monitor.js +3 -0
  11. package/out/src/monitor/Monitor.js.map +1 -1
  12. package/out/src/monitor/MonitorDaemon.d.ts +30 -0
  13. package/out/src/monitor/MonitorDaemon.d.ts.map +1 -0
  14. package/out/src/monitor/MonitorDaemon.js +134 -0
  15. package/out/src/monitor/MonitorDaemon.js.map +1 -0
  16. package/out/src/monitor/tasks/TaskUnFail.d.ts +40 -0
  17. package/out/src/monitor/tasks/TaskUnFail.d.ts.map +1 -0
  18. package/out/src/monitor/tasks/TaskUnFail.js +145 -0
  19. package/out/src/monitor/tasks/TaskUnFail.js.map +1 -0
  20. package/out/src/sdk/types.d.ts +3 -1
  21. package/out/src/sdk/types.d.ts.map +1 -1
  22. package/out/src/sdk/types.js.map +1 -1
  23. package/out/src/services/providers/echangeRates.d.ts.map +1 -1
  24. package/out/src/services/providers/echangeRates.js +6 -6
  25. package/out/src/services/providers/echangeRates.js.map +1 -1
  26. package/out/src/storage/StorageKnex.d.ts +176 -0
  27. package/out/src/storage/StorageKnex.d.ts.map +1 -0
  28. package/out/src/storage/StorageKnex.js +1017 -0
  29. package/out/src/storage/StorageKnex.js.map +1 -0
  30. package/out/src/storage/StorageProvider.js +2 -2
  31. package/out/src/storage/StorageProvider.js.map +1 -1
  32. package/out/src/storage/index.all.d.ts +11 -0
  33. package/out/src/storage/index.all.d.ts.map +1 -0
  34. package/out/src/storage/index.all.js +50 -0
  35. package/out/src/storage/index.all.js.map +1 -0
  36. package/out/src/storage/methods/listActions.d.ts +5 -0
  37. package/out/src/storage/methods/listActions.d.ts.map +1 -0
  38. package/out/src/storage/methods/listActions.js +162 -0
  39. package/out/src/storage/methods/listActions.js.map +1 -0
  40. package/out/src/storage/methods/listOutputs.d.ts +5 -0
  41. package/out/src/storage/methods/listOutputs.d.ts.map +1 -0
  42. package/out/src/storage/methods/listOutputs.js +300 -0
  43. package/out/src/storage/methods/listOutputs.js.map +1 -0
  44. package/out/src/storage/methods/purgeData.d.ts +4 -0
  45. package/out/src/storage/methods/purgeData.d.ts.map +1 -0
  46. package/out/src/storage/methods/purgeData.js +207 -0
  47. package/out/src/storage/methods/purgeData.js.map +1 -0
  48. package/out/src/storage/methods/reviewStatus.d.ts +9 -0
  49. package/out/src/storage/methods/reviewStatus.d.ts.map +1 -0
  50. package/out/src/storage/methods/reviewStatus.js +73 -0
  51. package/out/src/storage/methods/reviewStatus.js.map +1 -0
  52. package/out/src/storage/remoting/StorageServer.d.ts +39 -0
  53. package/out/src/storage/remoting/StorageServer.d.ts.map +1 -0
  54. package/out/src/storage/remoting/StorageServer.js +220 -0
  55. package/out/src/storage/remoting/StorageServer.js.map +1 -0
  56. package/out/src/storage/schema/KnexMigrations.d.ts +39 -0
  57. package/out/src/storage/schema/KnexMigrations.d.ts.map +1 -0
  58. package/out/src/storage/schema/KnexMigrations.js +395 -0
  59. package/out/src/storage/schema/KnexMigrations.js.map +1 -0
  60. package/out/src/storage/sync/StorageMySQLDojoReader.d.ts +71 -0
  61. package/out/src/storage/sync/StorageMySQLDojoReader.d.ts.map +1 -0
  62. package/out/src/storage/sync/StorageMySQLDojoReader.js +609 -0
  63. package/out/src/storage/sync/StorageMySQLDojoReader.js.map +1 -0
  64. package/out/src/storage/sync/index.d.ts +2 -0
  65. package/out/src/storage/sync/index.d.ts.map +1 -0
  66. package/out/src/storage/sync/index.js +18 -0
  67. package/out/src/storage/sync/index.js.map +1 -0
  68. package/out/src/utility/index.all.d.ts +7 -0
  69. package/out/src/utility/index.all.d.ts.map +1 -0
  70. package/out/src/utility/index.all.js +23 -0
  71. package/out/src/utility/index.all.js.map +1 -0
  72. package/out/src/utility/utilityHelpers.buffer.d.ts +18 -0
  73. package/out/src/utility/utilityHelpers.buffer.d.ts.map +1 -0
  74. package/out/src/utility/utilityHelpers.buffer.js +45 -0
  75. package/out/src/utility/utilityHelpers.buffer.js.map +1 -0
  76. package/package.json +2 -3
@@ -0,0 +1,300 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listOutputs = listOutputs;
4
+ const sdk_1 = require("@bsv/sdk");
5
+ const index_client_1 = require("../../index.client");
6
+ const basketToSpecOp = {
7
+ [index_client_1.sdk.specOpWalletBalance]: {
8
+ name: 'totalOutputsIsWalletBalance',
9
+ useBasket: 'default',
10
+ ignoreLimit: true,
11
+ resultFromOutputs: async (s, auth, vargs, specOpTags, outputs) => {
12
+ let totalOutputs = 0;
13
+ for (const o of outputs)
14
+ totalOutputs += o.satoshis;
15
+ return { totalOutputs, outputs: [] };
16
+ }
17
+ },
18
+ [index_client_1.sdk.specOpInvalidChange]: {
19
+ name: 'invalidChangeOutputs',
20
+ useBasket: 'default',
21
+ ignoreLimit: true,
22
+ includeOutputScripts: true,
23
+ tagsToIntercept: ['release'],
24
+ filterOutputs: async (s, auth, vargs, specOpTags, outputs) => {
25
+ var _a;
26
+ const filteredOutputs = [];
27
+ for (const o of outputs) {
28
+ await s.validateOutputScript(o);
29
+ let ok = false;
30
+ let r;
31
+ if (o.lockingScript && o.lockingScript.length > 0) {
32
+ r = await s.getServices().getUtxoStatus((0, index_client_1.asString)(o.lockingScript), 'script');
33
+ if (r.status === 'success' && r.isUtxo && ((_a = r.details) === null || _a === void 0 ? void 0 : _a.length) > 0) {
34
+ if (r.details.some(d => d.txid === o.txid && d.satoshis === o.satoshis && d.index === o.vout)) {
35
+ ok = true;
36
+ }
37
+ else {
38
+ ok = undefined;
39
+ }
40
+ }
41
+ else {
42
+ ok = false;
43
+ }
44
+ }
45
+ else {
46
+ ok = undefined;
47
+ }
48
+ if (ok === false) {
49
+ filteredOutputs.push(o);
50
+ }
51
+ }
52
+ if (specOpTags.indexOf('release') >= 0) {
53
+ for (const o of filteredOutputs) {
54
+ await s.updateOutput(o.outputId, { spendable: false });
55
+ }
56
+ }
57
+ return filteredOutputs;
58
+ }
59
+ },
60
+ [index_client_1.sdk.specOpSetWalletChangeParams]: {
61
+ name: 'setWalletChangeParams',
62
+ tagsParamsCount: 2,
63
+ resultFromTags: async (s, auth, vargs, specOpTags) => {
64
+ if (specOpTags.length !== 2)
65
+ throw new index_client_1.sdk.WERR_INVALID_PARAMETER('numberOfDesiredUTXOs and minimumDesiredUTXOValue', 'valid');
66
+ const numberOfDesiredUTXOs = (0, index_client_1.verifyInteger)(Number(specOpTags[0]));
67
+ const minimumDesiredUTXOValue = (0, index_client_1.verifyInteger)(Number(specOpTags[1]));
68
+ const basket = (0, index_client_1.verifyOne)(await s.findOutputBaskets({
69
+ partial: { userId: (0, index_client_1.verifyId)(auth.userId), name: 'default' }
70
+ }));
71
+ await s.updateOutputBasket(basket.basketId, {
72
+ numberOfDesiredUTXOs,
73
+ minimumDesiredUTXOValue
74
+ });
75
+ return { totalOutputs: 0, outputs: [] };
76
+ }
77
+ }
78
+ };
79
+ async function listOutputs(dsk, auth, vargs, originator) {
80
+ const trx = undefined;
81
+ const userId = (0, index_client_1.verifyId)(auth.userId);
82
+ const limit = vargs.limit;
83
+ const offset = vargs.offset;
84
+ const k = dsk.toDb(trx);
85
+ const r = {
86
+ totalOutputs: 0,
87
+ outputs: []
88
+ };
89
+ /*
90
+ ListOutputsArgs {
91
+ basket: BasketStringUnder300Bytes
92
+
93
+ tags?: OutputTagStringUnder300Bytes[]
94
+ tagQueryMode?: 'all' | 'any' // default any
95
+
96
+ limit?: PositiveIntegerDefault10Max10000
97
+ offset?: PositiveIntegerOrZero
98
+ }
99
+ */
100
+ let specOp = undefined;
101
+ let basketId = undefined;
102
+ const basketsById = {};
103
+ if (vargs.basket) {
104
+ let b = vargs.basket;
105
+ specOp = basketToSpecOp[b];
106
+ b = specOp ? (specOp.useBasket ? specOp.useBasket : '') : b;
107
+ if (b) {
108
+ const baskets = await dsk.findOutputBaskets({
109
+ partial: { userId, name: b },
110
+ trx
111
+ });
112
+ if (baskets.length !== 1) {
113
+ // If basket does not exist, result is no outputs.
114
+ return r;
115
+ }
116
+ const basket = baskets[0];
117
+ basketId = basket.basketId;
118
+ basketsById[basketId] = basket;
119
+ }
120
+ }
121
+ let tagIds = [];
122
+ let tags = [...vargs.tags];
123
+ const specOpTags = [];
124
+ if (specOp && specOp.tagsParamsCount) {
125
+ specOpTags.push(...tags.splice(0, Math.min(tags.length, specOp.tagsParamsCount)));
126
+ }
127
+ if (specOp && specOp.tagsToIntercept) {
128
+ // Pull out tags used by current specOp
129
+ const ts = tags;
130
+ tags = [];
131
+ for (const t of ts) {
132
+ if (specOp.tagsToIntercept.length === 0 || specOp.tagsToIntercept.indexOf(t) >= 0) {
133
+ specOpTags.push(t);
134
+ }
135
+ else {
136
+ tags.push(t);
137
+ }
138
+ }
139
+ }
140
+ if (specOp && specOp.resultFromTags) {
141
+ const r = await specOp.resultFromTags(dsk, auth, vargs, specOpTags);
142
+ return r;
143
+ }
144
+ if (tags && tags.length > 0) {
145
+ const q = k('output_tags')
146
+ .where({
147
+ userId: userId,
148
+ isDeleted: false
149
+ })
150
+ .whereNotNull('outputTagId')
151
+ .whereIn('tag', vargs.tags)
152
+ .select('outputTagId');
153
+ const r = await q;
154
+ tagIds = r.map(r => r.outputTagId);
155
+ }
156
+ const isQueryModeAll = vargs.tagQueryMode === 'all';
157
+ if (isQueryModeAll && tagIds.length < vargs.tags.length)
158
+ return r;
159
+ const columns = [
160
+ 'outputId',
161
+ 'transactionId',
162
+ 'basketId',
163
+ 'spendable',
164
+ 'txid',
165
+ 'vout',
166
+ 'satoshis',
167
+ 'lockingScript',
168
+ 'customInstructions',
169
+ 'outputDescription',
170
+ 'spendingDescription',
171
+ 'scriptLength',
172
+ 'scriptOffset'
173
+ ];
174
+ const noTags = tagIds.length === 0;
175
+ const includeSpent = false;
176
+ const txStatusOk = `(select status as tstatus from transactions where transactions.transactionId = outputs.transactionId) in ('completed', 'unproven', 'nosend')`;
177
+ const txStatusOkCteq = `(select status as tstatus from transactions where transactions.transactionId = o.transactionId) in ('completed', 'unproven', 'nosend')`;
178
+ const makeWithTagsQueries = () => {
179
+ let cteqOptions = '';
180
+ if (basketId)
181
+ cteqOptions += ` AND o.basketId = ${basketId}`;
182
+ if (!includeSpent)
183
+ cteqOptions += ` AND o.spendable`;
184
+ const cteq = k.raw(`
185
+ SELECT ${columns.map(c => 'o.' + c).join(',')},
186
+ (SELECT COUNT(*)
187
+ FROM output_tags_map AS m
188
+ WHERE m.OutputId = o.OutputId
189
+ AND m.outputTagId IN (${tagIds.join(',')})
190
+ ) AS tc
191
+ FROM outputs AS o
192
+ WHERE o.userId = ${userId} ${cteqOptions} AND ${txStatusOkCteq}
193
+ `);
194
+ const q = k.with('otc', cteq);
195
+ q.from('otc');
196
+ if (isQueryModeAll)
197
+ q.where('tc', tagIds.length);
198
+ else
199
+ q.where('tc', '>', 0);
200
+ const qcount = q.clone();
201
+ q.select(columns);
202
+ qcount.count('outputId as total');
203
+ return { q, qcount };
204
+ };
205
+ const makeWithoutTagsQueries = () => {
206
+ const where = { userId };
207
+ if (basketId)
208
+ where.basketId = basketId;
209
+ if (!includeSpent)
210
+ where.spendable = true;
211
+ const q = k('outputs').where(where).whereRaw(txStatusOk);
212
+ const qcount = q.clone().count('outputId as total');
213
+ return { q, qcount };
214
+ };
215
+ const { q, qcount } = noTags ? makeWithoutTagsQueries() : makeWithTagsQueries();
216
+ // Sort order when limit and offset are possible must be ascending for determinism.
217
+ if (!specOp || !specOp.ignoreLimit)
218
+ q.limit(limit).offset(offset);
219
+ q.orderBy('outputId', 'asc');
220
+ let outputs = await q;
221
+ if (specOp) {
222
+ if (specOp.filterOutputs)
223
+ outputs = await specOp.filterOutputs(dsk, auth, vargs, specOpTags, outputs);
224
+ if (specOp.resultFromOutputs) {
225
+ const r = await specOp.resultFromOutputs(dsk, auth, vargs, specOpTags, outputs);
226
+ return r;
227
+ }
228
+ }
229
+ if (!limit || outputs.length < limit)
230
+ r.totalOutputs = outputs.length;
231
+ else {
232
+ const total = (0, index_client_1.verifyOne)(await qcount)['total'];
233
+ r.totalOutputs = Number(total);
234
+ }
235
+ /*
236
+ ListOutputsArgs {
237
+ include?: 'locking scripts' | 'entire transactions'
238
+ includeCustomInstructions?: BooleanDefaultFalse
239
+ includeTags?: BooleanDefaultFalse
240
+ includeLabels?: BooleanDefaultFalse
241
+ }
242
+
243
+ ListOutputsResult {
244
+ totalOutputs: PositiveIntegerOrZero
245
+ BEEF?: BEEF
246
+ outputs: Array<WalletOutput>
247
+ }
248
+
249
+ WalletOutput {
250
+ satoshis: SatoshiValue
251
+ spendable: boolean
252
+ outpoint: OutpointString
253
+
254
+ customInstructions?: string
255
+ lockingScript?: HexString
256
+ tags?: OutputTagStringUnder300Bytes[]
257
+ labels?: LabelStringUnder300Bytes[]
258
+ }
259
+ */
260
+ const labelsByTxid = {};
261
+ const beef = new sdk_1.Beef();
262
+ for (const o of outputs) {
263
+ const wo = {
264
+ satoshis: Number(o.satoshis),
265
+ spendable: !!o.spendable,
266
+ outpoint: `${o.txid}.${o.vout}`
267
+ };
268
+ r.outputs.push(wo);
269
+ //if (vargs.includeBasket && o.basketId) {
270
+ // if (!basketsById[o.basketId]) {
271
+ // basketsById[o.basketId] = verifyTruthy(await dsk.findOutputBasketId(o.basketId!, trx))
272
+ // }
273
+ // wo.basket = basketsById[o.basketId].name
274
+ //}
275
+ if (vargs.includeCustomInstructions && o.customInstructions)
276
+ wo.customInstructions = o.customInstructions;
277
+ if (vargs.includeLabels && o.txid) {
278
+ if (labelsByTxid[o.txid] === undefined) {
279
+ labelsByTxid[o.txid] = (await dsk.getLabelsForTransactionId(o.transactionId, trx)).map(l => l.label);
280
+ }
281
+ wo.labels = labelsByTxid[o.txid];
282
+ }
283
+ if (vargs.includeTags) {
284
+ wo.tags = (await dsk.getTagsForOutputId(o.outputId, trx)).map(t => t.tag);
285
+ }
286
+ if (vargs.includeLockingScripts) {
287
+ await dsk.validateOutputScript(o, trx);
288
+ if (o.lockingScript)
289
+ wo.lockingScript = (0, index_client_1.asString)(o.lockingScript);
290
+ }
291
+ if (vargs.includeTransactions && !beef.findTxid(o.txid)) {
292
+ await dsk.getValidBeefForKnownTxid(o.txid, beef, undefined, vargs.knownTxids, trx);
293
+ }
294
+ }
295
+ if (vargs.includeTransactions) {
296
+ r.BEEF = beef.toBinary();
297
+ }
298
+ return r;
299
+ }
300
+ //# sourceMappingURL=listOutputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listOutputs.js","sourceRoot":"","sources":["../../../../../src/storage/methods/listOutputs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { sdk } from '../../index.client';
2
+ import { StorageKnex } from '../StorageKnex';
3
+ export declare function purgeData(storage: StorageKnex, params: sdk.PurgeParams, trx?: sdk.TrxToken): Promise<sdk.PurgeResults>;
4
+ //# sourceMappingURL=purgeData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purgeData.d.ts","sourceRoot":"","sources":["../../../../../src/storage/methods/purgeData.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,wBAAsB,SAAS,CAC7B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,GAAG,CAAC,WAAW,EACvB,GAAG,CAAC,EAAE,GAAG,CAAC,QAAQ,GACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAkO3B"}
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.purgeData = purgeData;
4
+ const sdk_1 = require("@bsv/sdk");
5
+ const index_client_1 = require("../../index.client");
6
+ async function purgeData(storage, params, trx) {
7
+ const r = { count: 0, log: '' };
8
+ const defaultAge = 1000 * 60 * 60 * 24 * 14;
9
+ const runPurgeQuery = async (pq) => {
10
+ try {
11
+ pq.sql = pq.q.toString();
12
+ const count = await pq.q;
13
+ if (count > 0) {
14
+ r.count += count;
15
+ r.log += `${count} ${pq.log}\n`;
16
+ }
17
+ }
18
+ catch (eu) {
19
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
20
+ const e = index_client_1.sdk.WalletError.fromUnknown(eu);
21
+ throw eu;
22
+ }
23
+ };
24
+ if (params.purgeCompleted) {
25
+ const age = params.purgeCompletedAge || defaultAge;
26
+ const before = toSqlWhereDate(new Date(Date.now() - age));
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
+ const qs = [];
29
+ // select * from transactions where updated_at < '2024-08-20' and status = 'completed' and not provenTxId is null and (not truncatedExternalInputs is null or not beef is null or not rawTx is null)
30
+ qs.push({
31
+ log: 'conpleted transactions purged of transient data',
32
+ q: storage
33
+ .toDb(trx)('transactions')
34
+ .update({
35
+ inputBEEF: null,
36
+ rawTx: null
37
+ })
38
+ .where('updated_at', '<', before)
39
+ .where('status', 'completed')
40
+ .whereNotNull('provenTxId')
41
+ .where(function () {
42
+ this.orWhereNotNull('inputBEEF');
43
+ this.orWhereNotNull('rawTx');
44
+ })
45
+ });
46
+ const completedReqs = await storage
47
+ .toDb(trx)('proven_tx_reqs')
48
+ .select('provenTxReqId')
49
+ .where('updated_at', '<', before)
50
+ .where('status', 'completed')
51
+ .whereNotNull('provenTxId')
52
+ .where('notified', 1);
53
+ const completedReqIds = completedReqs.map(o => o.provenTxReqId);
54
+ if (completedReqIds.length > 0) {
55
+ qs.push({
56
+ log: 'completed proven_tx_reqs deleted',
57
+ q: storage.toDb(trx)('proven_tx_reqs').whereIn('provenTxReqId', completedReqIds).delete()
58
+ });
59
+ }
60
+ for (const q of qs)
61
+ await runPurgeQuery(q);
62
+ }
63
+ if (params.purgeFailed) {
64
+ const age = params.purgeFailedAge || defaultAge;
65
+ const before = toSqlWhereDate(new Date(Date.now() - age));
66
+ const qs = [];
67
+ const failedTxsQ = storage
68
+ .toDb(trx)('transactions')
69
+ .select('transactionId')
70
+ .where('updated_at', '<', before)
71
+ .where('status', 'failed');
72
+ const txs = await failedTxsQ;
73
+ const failedTxIds = txs.map(tx => tx.transactionId);
74
+ await deleteTransactions(failedTxIds, qs, 'failed', true);
75
+ const invalidReqs = await storage
76
+ .toDb(trx)('proven_tx_reqs')
77
+ .select('provenTxReqId')
78
+ .where('updated_at', '<', before)
79
+ .where('status', 'invalid');
80
+ const invalidReqIds = invalidReqs.map(o => o.provenTxReqId);
81
+ if (invalidReqIds.length > 0)
82
+ qs.push({
83
+ log: 'invalid proven_tx_reqs deleted',
84
+ q: storage.toDb(trx)('proven_tx_reqs').whereIn('provenTxReqId', invalidReqIds).delete()
85
+ });
86
+ const doubleSpendReqs = await storage
87
+ .toDb(trx)('proven_tx_reqs')
88
+ .select('provenTxReqId')
89
+ .where('updated_at', '<', before)
90
+ .where('status', 'doubleSpend');
91
+ const doubleSpendReqIds = doubleSpendReqs.map(o => o.provenTxReqId);
92
+ if (doubleSpendReqIds.length > 0)
93
+ qs.push({
94
+ log: 'doubleSpend proven_tx_reqs deleted',
95
+ q: storage.toDb(trx)('proven_tx_reqs').whereIn('provenTxReqId', doubleSpendReqIds).delete()
96
+ });
97
+ for (const q of qs)
98
+ await runPurgeQuery(q);
99
+ }
100
+ if (params.purgeSpent) {
101
+ const age = params.purgeSpentAge || defaultAge;
102
+ const before = toSqlWhereDate(new Date(Date.now() - age));
103
+ const beef = new sdk_1.Beef();
104
+ const utxos = await storage.findOutputs({
105
+ partial: { spendable: true },
106
+ txStatus: ['sending', 'unproven', 'completed', 'nosend']
107
+ });
108
+ for (const utxo of utxos) {
109
+ // Figure out all the txids required to prove the validity of this utxo and merge proofs into beef.
110
+ const options = {
111
+ mergeToBeef: beef,
112
+ ignoreServices: true
113
+ };
114
+ if (utxo.txid)
115
+ await storage.getBeefForTransaction(utxo.txid, options);
116
+ }
117
+ const proofTxids = {};
118
+ for (const btx of beef.txs)
119
+ proofTxids[btx.txid] = true;
120
+ let qs = [];
121
+ const spentTxsQ = storage
122
+ .toDb(trx)('transactions')
123
+ .where('updated_at', '<', before)
124
+ .where('status', 'completed')
125
+ .whereRaw(`not exists(select outputId from outputs as o where o.transactionId = transactions.transactionId and o.spendable = 1)`);
126
+ const txs = await spentTxsQ;
127
+ // Save any spent txid still needed to prove a utxo:
128
+ const nptxs = txs.filter(t => !proofTxids[t.txid || '']);
129
+ let spentTxIds = nptxs.map(tx => tx.transactionId);
130
+ if (spentTxIds.length > 0) {
131
+ const update = {
132
+ spentBy: null
133
+ };
134
+ qs.push({
135
+ log: 'spent outputs no longer tracked by spentBy',
136
+ q: storage
137
+ .toDb(trx)('outputs')
138
+ .update(storage.validatePartialForUpdate(update, undefined, ['spendable']))
139
+ .where('spendable', false)
140
+ .whereIn('spentBy', spentTxIds)
141
+ });
142
+ await deleteTransactions(spentTxIds, qs, 'spent', false);
143
+ for (const q of qs)
144
+ await runPurgeQuery(q);
145
+ }
146
+ }
147
+ // Delete proven_txs no longer referenced by remaining transactions.
148
+ const qs = [];
149
+ qs.push({
150
+ log: 'orphan proven_txs deleted',
151
+ q: storage
152
+ .toDb(trx)('proven_txs')
153
+ .whereRaw(`not exists(select * from transactions as t where t.txid = proven_txs.txid or t.provenTxId = proven_txs.provenTxId)`)
154
+ .whereRaw(`not exists(select * from proven_tx_reqs as r where r.txid = proven_txs.txid or r.provenTxId = proven_txs.provenTxId)`)
155
+ .delete()
156
+ });
157
+ for (const q of qs)
158
+ await runPurgeQuery(q);
159
+ return r;
160
+ async function deleteTransactions(transactionIds, qs, reason, markNotSpentBy) {
161
+ if (transactionIds.length > 0) {
162
+ const outputs = await storage
163
+ .toDb(trx)('outputs')
164
+ .select('outputId')
165
+ .whereIn('transactionId', transactionIds);
166
+ const outputIds = outputs.map(o => o.outputId);
167
+ if (outputIds.length > 0) {
168
+ qs.push({
169
+ log: `${reason} output_tags_map deleted`,
170
+ q: storage.toDb(trx)('output_tags_map').whereIn('outputId', outputIds).delete()
171
+ });
172
+ qs.push({
173
+ log: `${reason} outputs deleted`,
174
+ q: storage.toDb(trx)('outputs').whereIn('outputId', outputIds).delete()
175
+ });
176
+ }
177
+ qs.push({
178
+ log: `${reason} tx_labels_map deleted`,
179
+ q: storage.toDb(trx)('tx_labels_map').whereIn('transactionId', transactionIds).delete()
180
+ });
181
+ qs.push({
182
+ log: `${reason} commissions deleted`,
183
+ q: storage.toDb(trx)('commissions').whereIn('transactionId', transactionIds).delete()
184
+ });
185
+ if (markNotSpentBy) {
186
+ qs.push({
187
+ log: 'unspent outputs updated to spendable',
188
+ q: storage
189
+ .toDb(trx)('outputs')
190
+ .update({ spendable: true, spentBy: null })
191
+ .whereIn('spentBy', transactionIds)
192
+ });
193
+ }
194
+ qs.push({
195
+ log: `${reason} transactions deleted`,
196
+ q: storage.toDb(trx)('transactions').whereIn('transactionId', transactionIds).delete()
197
+ });
198
+ }
199
+ }
200
+ }
201
+ function toSqlWhereDate(d) {
202
+ let s = d.toISOString();
203
+ s = s.replace('T', ' ');
204
+ s = s.replace('Z', '');
205
+ return s;
206
+ }
207
+ //# sourceMappingURL=purgeData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purgeData.js","sourceRoot":"","sources":["../../../../../src/storage/methods/purgeData.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { sdk } from '../../index.client';
2
+ import { StorageKnex } from '../StorageKnex';
3
+ export declare function reviewStatus(storage: StorageKnex, args: {
4
+ agedLimit: Date;
5
+ trx?: sdk.TrxToken;
6
+ }): Promise<{
7
+ log: string;
8
+ }>;
9
+ //# sourceMappingURL=reviewStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewStatus.d.ts","sourceRoot":"","sources":["../../../../../src/storage/methods/reviewStatus.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,wBAAsB,YAAY,CAChC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE;IAAE,SAAS,EAAE,IAAI,CAAC;IAAC,GAAG,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAA;CAAE,GAC5C,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAyE1B"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reviewStatus = reviewStatus;
4
+ const index_client_1 = require("../../index.client");
5
+ async function reviewStatus(storage, args) {
6
+ const r = { log: '' };
7
+ const runReviewStatusQuery = async (pq) => {
8
+ try {
9
+ pq.sql = pq.q.toString();
10
+ const count = await pq.q;
11
+ if (count > 0) {
12
+ r.log += `${count} ${pq.log}\n`;
13
+ }
14
+ }
15
+ catch (eu) {
16
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
17
+ const e = index_client_1.sdk.WalletError.fromUnknown(eu);
18
+ throw eu;
19
+ }
20
+ };
21
+ const k = storage.toDb(args.trx);
22
+ const qs = [];
23
+ qs.push({
24
+ log: `transactions updated to status of 'failed' where provenTxReq with matching txid is 'invalid'`,
25
+ /*
26
+ UPDATE transactions SET status = 'failed'
27
+ WHERE exists(select 1 from proven_tx_reqs as r where transactions.txid = r.txid and r.status = 'invalid')
28
+ */
29
+ q: k('transactions')
30
+ .update({ status: 'failed' })
31
+ .whereNot({ status: 'failed' })
32
+ .whereExists(function () {
33
+ this.select(k.raw(1))
34
+ .from('proven_tx_reqs as r')
35
+ .whereRaw(`transactions.txid = r.txid and r.status = 'invalid'`);
36
+ })
37
+ });
38
+ qs.push({
39
+ log: `outputs updated to spendable where spentBy is a transaction with status 'failed'`,
40
+ /*
41
+ UPDATE outputs SET spentBy = null, spendable = 1
42
+ where exists(select 1 from transactions as t where outputs.spentBy = t.transactionId and t.status = 'failed')
43
+ */
44
+ q: k('outputs')
45
+ .update({ spentBy: null, spendable: true })
46
+ .whereExists(function () {
47
+ this.select(k.raw(1))
48
+ .from('transactions as t')
49
+ .whereRaw(`outputs.spentBy = t.transactionId and t.status = 'failed'`);
50
+ })
51
+ });
52
+ qs.push({
53
+ log: `transactions updated with provenTxId and status of 'completed' where provenTx with matching txid exists`,
54
+ /*
55
+ UPDATE transactions SET status = 'completed', provenTxId = p.provenTxId
56
+ FROM proven_txs p
57
+ WHERE transactions.txid = p.txid AND transactions.provenTxId IS NULL
58
+ */
59
+ q: k('transactions')
60
+ .update({
61
+ status: 'completed',
62
+ provenTxId: k.raw('(SELECT provenTxId FROM proven_txs AS p WHERE transactions.txid = p.txid)')
63
+ })
64
+ .whereNull('provenTxId')
65
+ .whereExists(function () {
66
+ this.select(k.raw(1)).from('proven_txs as p').whereRaw('transactions.txid = p.txid');
67
+ })
68
+ });
69
+ for (const q of qs)
70
+ await runReviewStatusQuery(q);
71
+ return r;
72
+ }
73
+ //# sourceMappingURL=reviewStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewStatus.js","sourceRoot":"","sources":["../../../../../src/storage/methods/reviewStatus.ts"],"names":[],"mappings":";;AAMA,oCA4EC;AA/ED,qDAAwC;AAGjC,KAAK,UAAU,YAAY,CAChC,OAAoB,EACpB,IAA6C;IAE7C,MAAM,CAAC,GAAoB,EAAE,GAAG,EAAE,EAAE,EAAE,CAAA;IAEtC,MAAM,oBAAoB,GAAG,KAAK,EAAoB,EAAqB,EAAiB,EAAE;QAC5F,IAAI,CAAC;YACH,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;YACxB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,CAAC,CAAA;YACxB,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;YACjC,CAAC;QACH,CAAC;QAAC,OAAO,EAAW,EAAE,CAAC;YACrB,6DAA6D;YAC7D,MAAM,CAAC,GAAG,kBAAG,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;YACzC,MAAM,EAAE,CAAA;QACV,CAAC;IACH,CAAC,CAAA;IAED,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEhC,MAAM,EAAE,GAAwB,EAAE,CAAA;IAElC,EAAE,CAAC,IAAI,CAAC;QACN,GAAG,EAAE,8FAA8F;QACnG;;;cAGM;QACN,CAAC,EAAE,CAAC,CAAmB,cAAc,CAAC;aACnC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;aAC5B,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;aAC9B,WAAW,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAClB,IAAI,CAAC,qBAAqB,CAAC;iBAC3B,QAAQ,CAAC,qDAAqD,CAAC,CAAA;QACpE,CAAC,CAAC;KACL,CAAC,CAAA;IAEF,EAAE,CAAC,IAAI,CAAC;QACN,GAAG,EAAE,kFAAkF;QACvF;;;cAGM;QACN,CAAC,EAAE,CAAC,CAAc,SAAS,CAAC;aACzB,MAAM,CAAC,EAAE,OAAO,EAAE,IAA4B,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;aAClE,WAAW,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAClB,IAAI,CAAC,mBAAmB,CAAC;iBACzB,QAAQ,CAAC,2DAA2D,CAAC,CAAA;QAC1E,CAAC,CAAC;KACL,CAAC,CAAA;IAEF,EAAE,CAAC,IAAI,CAAC;QACN,GAAG,EAAE,yGAAyG;QAC9G;;;;cAIM;QACN,CAAC,EAAE,CAAC,CAAmB,cAAc,CAAC;aACnC,MAAM,CAAC;YACN,MAAM,EAAE,WAAW;YACnB,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,2EAA2E,CAAC;SAC/F,CAAC;aACD,SAAS,CAAC,YAAY,CAAC;aACvB,WAAW,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAA;QACtF,CAAC,CAAC;KACL,CAAC,CAAA;IAEF,KAAK,MAAM,CAAC,IAAI,EAAE;QAAE,MAAM,oBAAoB,CAAC,CAAC,CAAC,CAAA;IAEjD,OAAO,CAAC,CAAA;AACV,CAAC"}