@bsv/wallet-toolbox 1.2.35 → 1.2.37

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.
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const src_1 = require("../../../src");
37
+ const TestUtilsWalletStorage_1 = require("../../utils/TestUtilsWalletStorage");
38
+ const sdk_1 = require("../../../src/sdk");
39
+ const dotenv = __importStar(require("dotenv"));
40
+ dotenv.config();
41
+ const chain = 'main';
42
+ const options = {
43
+ setActiveClient: true,
44
+ useMySQLConnectionForClient: true,
45
+ useTestIdentityKey: false,
46
+ useIdentityKey2: false
47
+ };
48
+ describe('operations1 tests', () => {
49
+ jest.setTimeout(99999999);
50
+ test('0 review and release all production invalid change utxos', async () => {
51
+ const { env, storage } = await createMainReviewSetup();
52
+ const users = await storage.findUsers({ partial: {} });
53
+ const withInvalid = {};
54
+ const vargs = {
55
+ basket: sdk_1.specOpInvalidChange,
56
+ tags: ['release'],
57
+ tagQueryMode: 'all',
58
+ includeLockingScripts: false,
59
+ includeTransactions: false,
60
+ includeCustomInstructions: false,
61
+ includeTags: false,
62
+ includeLabels: false,
63
+ limit: 0,
64
+ offset: 0,
65
+ seekPermission: false,
66
+ knownTxids: []
67
+ };
68
+ let log = '';
69
+ for (const user of users) {
70
+ const { userId } = user;
71
+ const auth = { userId, identityKey: '' };
72
+ let r = await storage.listOutputs(auth, vargs);
73
+ if (r.totalOutputs > 0) {
74
+ const total = r.outputs.reduce((s, o) => (s += o.satoshis), 0);
75
+ log += `userId ${userId}: ${r.totalOutputs} unspendable utxos, total ${total}, ${user.identityKey}\n`;
76
+ for (const o of r.outputs) {
77
+ log += ` ${o.outpoint} ${o.satoshis}\n`;
78
+ }
79
+ withInvalid[userId] = { user, outputs: r.outputs, total };
80
+ }
81
+ }
82
+ console.log(log || 'Found zero invalid change outputs.');
83
+ await storage.destroy();
84
+ });
85
+ test('6 review and unfail false doubleSpends', async () => {
86
+ const { env, storage, services } = await createMainReviewSetup();
87
+ let offset = 2200;
88
+ const limit = 100;
89
+ let allUnfails = [];
90
+ for (;;) {
91
+ let log = '';
92
+ const unfails = [];
93
+ const reqs = await storage.findProvenTxReqs({ partial: { status: 'doubleSpend' }, paged: { limit, offset } });
94
+ for (const req of reqs) {
95
+ const gsr = await services.getStatusForTxids([req.txid]);
96
+ if (gsr.results[0].status !== 'unknown') {
97
+ log += `unfail ${req.provenTxReqId} ${req.txid}\n`;
98
+ unfails.push(req.provenTxReqId);
99
+ }
100
+ }
101
+ console.log(`DoubleSpends OFFSET: ${offset} ${unfails.length} unfails\n${log}`);
102
+ allUnfails = allUnfails.concat(unfails);
103
+ if (reqs.length < limit)
104
+ break;
105
+ offset += reqs.length;
106
+ }
107
+ for (const id of allUnfails) {
108
+ await storage.updateProvenTxReq(id, { status: 'unfail' });
109
+ }
110
+ await storage.destroy();
111
+ });
112
+ test('7 review and unfail false invalids', async () => {
113
+ const { env, storage, services } = await createMainReviewSetup();
114
+ let offset = 400;
115
+ const limit = 100;
116
+ let allUnfails = [];
117
+ for (;;) {
118
+ let log = '';
119
+ const unfails = [];
120
+ const reqs = await storage.findProvenTxReqs({ partial: { status: 'invalid' }, paged: { limit, offset } });
121
+ for (const req of reqs) {
122
+ if (!req.txid || !req.rawTx)
123
+ continue;
124
+ const gsr = await services.getStatusForTxids([req.txid]);
125
+ if (gsr.results[0].status !== 'unknown') {
126
+ log += `unfail ${req.provenTxReqId} ${req.txid}\n`;
127
+ unfails.push(req.provenTxReqId);
128
+ }
129
+ }
130
+ console.log(`Failed OFFSET: ${offset} ${unfails.length} unfails\n${log}`);
131
+ allUnfails = allUnfails.concat(unfails);
132
+ if (reqs.length < limit)
133
+ break;
134
+ offset += reqs.length;
135
+ }
136
+ for (const id of allUnfails) {
137
+ await storage.updateProvenTxReq(id, { status: 'unfail' });
138
+ }
139
+ await storage.destroy();
140
+ });
141
+ test.skip('8 re-internalize failed WUI exports', async () => {
142
+ const { env, storage, services } = await createMainReviewSetup();
143
+ const user0 = (0, src_1.verifyOne)(await storage.findUsers({ partial: { userId: 2 } }));
144
+ const users = await storage.findUsers({ partial: { userId: 141 } }); // 111, 141
145
+ for (const user of users) {
146
+ const { userId, identityKey } = user;
147
+ const [outputs] = await storage.knex.raw(`
148
+ SELECT f.* FROM outputs as f where f.userId = 2 and not f.customInstructions is null
149
+ and JSON_EXTRACT(f.customInstructions, '$.payee') = '${identityKey}'
150
+ and not exists(select * from outputs as r where r.userId = ${userId} and r.txid = f.txid)
151
+ `);
152
+ if (outputs.length > 0)
153
+ console.log(`userId ${userId} ${identityKey} ${outputs.length} outputs`);
154
+ for (const output of outputs) {
155
+ const req = (0, src_1.verifyOneOrNone)(await storage.findProvenTxReqs({ partial: { txid: output.txid, status: 'completed' } }));
156
+ const { type, derivationPrefix, derivationSuffix, payee } = JSON.parse(output.customInstructions);
157
+ if (req && type === 'BRC29' && derivationPrefix && derivationSuffix) {
158
+ const beef = await storage.getBeefForTransaction(req.txid, {});
159
+ // {"type":"BRC29","derivationPrefix":"LDFooHSsXzw=","derivationSuffix":"4f4ixKv+6SY=","payee":"0352caa755d5b6279e15e47e096db908e7c4a73a31775e7e8720bdd4cf2d44873a"}
160
+ await storage.internalizeAction({ userId, identityKey: user.identityKey }, {
161
+ tx: beef.toBinaryAtomic(req.txid),
162
+ outputs: [
163
+ {
164
+ outputIndex: 0,
165
+ protocol: 'wallet payment',
166
+ paymentRemittance: {
167
+ derivationPrefix: derivationPrefix,
168
+ derivationSuffix: derivationSuffix,
169
+ senderIdentityKey: user0.identityKey
170
+ }
171
+ }
172
+ ],
173
+ description: 'Internalizing export funds tx into foreign wallet'
174
+ });
175
+ console.log('internalize', userId, output.txid);
176
+ }
177
+ }
178
+ }
179
+ /*
180
+ */
181
+ await storage.destroy();
182
+ });
183
+ });
184
+ async function createMainReviewSetup() {
185
+ const env = TestUtilsWalletStorage_1._tu.getEnv('main');
186
+ const knex = src_1.Setup.createMySQLKnex(process.env.MAIN_CLOUD_MYSQL_CONNECTION);
187
+ const storage = new src_1.StorageKnex({
188
+ chain: env.chain,
189
+ knex: knex,
190
+ commissionSatoshis: 0,
191
+ commissionPubKeyHex: undefined,
192
+ feeModel: { model: 'sat/kb', value: 1 }
193
+ });
194
+ const servicesOptions = src_1.Services.createDefaultOptions(env.chain);
195
+ if (env.whatsonchainApiKey)
196
+ servicesOptions.whatsOnChainApiKey = env.whatsonchainApiKey;
197
+ const services = new src_1.Services(servicesOptions);
198
+ storage.setServices(services);
199
+ await storage.makeAvailable();
200
+ return { env, storage, services };
201
+ }
202
+ //# sourceMappingURL=opers1.man.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opers1.man.test.js","sourceRoot":"","sources":["../../../../test/Wallet/support/opers1.man.test.ts"],"names":[],"mappings":"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"}