@bitgo-beta/abstract-utxo 1.1.1-beta.2330 → 1.1.1-beta.2332
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 @@
|
|
|
1
|
+
{"version":3,"file":"sweep.d.ts","sourceRoot":"","sources":["../../../../test/unit/sweep.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
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
|
+
require("mocha");
|
|
37
|
+
const assert = __importStar(require("assert"));
|
|
38
|
+
const nock = require("nock");
|
|
39
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
40
|
+
const util_1 = require("./util");
|
|
41
|
+
nock.disableNetConnect();
|
|
42
|
+
describe('Wallet.sweep', function () {
|
|
43
|
+
const bgUrl = sdk_core_1.common.Environments[util_1.defaultBitGo.getEnv()].uri;
|
|
44
|
+
const coin = (0, util_1.getUtxoCoin)('btc');
|
|
45
|
+
const walletId = '5b34252f1bf349930e34020a00000000';
|
|
46
|
+
const keyIds = ['key-user', 'key-backup', 'key-bitgo'];
|
|
47
|
+
const wallet = (0, util_1.getUtxoWallet)(coin, { id: walletId, coin: coin.getChain(), keys: keyIds });
|
|
48
|
+
const userPrv = (0, util_1.getDefaultWalletKeys)().user.toBase58();
|
|
49
|
+
// Sweep destination is derived from unrelated keys so that the prebuild explanation
|
|
50
|
+
// classifies it as an external output rather than a wallet change output.
|
|
51
|
+
const destinationKeys = (0, util_1.createWasmWalletKeys)('sweep-destination');
|
|
52
|
+
const destination = (0, util_1.getWalletAddress)('btc', destinationKeys.walletKeys);
|
|
53
|
+
// Sweep-shaped prebuild: a single wallet input spending to a single external output.
|
|
54
|
+
// The /sweepWallet response does not carry a `pubs` field.
|
|
55
|
+
const psbt = (0, util_1.constructPsbt)([{ scriptType: 'p2sh', value: BigInt(100000) }], [{ address: destination, value: BigInt(99000) }], 'btc', (0, util_1.getDefaultWasmWalletKeys)().walletKeys);
|
|
56
|
+
const txHex = Buffer.from(psbt.serialize()).toString('hex');
|
|
57
|
+
const txid = '856e0d0f0f0f5f1a455d0f8c4c9a3a4fbd0b0d7a0d9f4e3c2b1a0f9e8d7c6b5a4';
|
|
58
|
+
function nockSweepPrebuild() {
|
|
59
|
+
return nock(bgUrl)
|
|
60
|
+
.post(`/api/v2/${coin.getChain()}/wallet/${walletId}/sweepWallet`)
|
|
61
|
+
.reply(200, { txHex, walletId });
|
|
62
|
+
}
|
|
63
|
+
function nockKeychainFetches() {
|
|
64
|
+
return keyIds.map((id, i) => nock(bgUrl).get(`/api/v2/${coin.getChain()}/key/${id}`).reply(200, { pub: util_1.keychainsBase58[i].pub }));
|
|
65
|
+
}
|
|
66
|
+
function nockSendTransaction() {
|
|
67
|
+
return nock(bgUrl).post(`/api/v2/${coin.getChain()}/wallet/${walletId}/tx/send`).reply(200, { txid, tx: txHex });
|
|
68
|
+
}
|
|
69
|
+
afterEach(function () {
|
|
70
|
+
nock.cleanAll();
|
|
71
|
+
});
|
|
72
|
+
it('explains the sweep prebuild with the wallet pubs and completes the sweep', async function () {
|
|
73
|
+
const sweepScope = nockSweepPrebuild();
|
|
74
|
+
// The wallet keychains are fetched exactly once: the pubs are used both for
|
|
75
|
+
// explaining the prebuild and for signing, so no further key fetch is expected.
|
|
76
|
+
const keyScopes = nockKeychainFetches();
|
|
77
|
+
const sendScope = nockSendTransaction();
|
|
78
|
+
const result = await wallet.sweep({ address: destination, xprv: userPrv });
|
|
79
|
+
assert.strictEqual(result.txid, txid);
|
|
80
|
+
[sweepScope, ...keyScopes, sendScope].forEach((scope) => assert.ok(scope.isDone()));
|
|
81
|
+
});
|
|
82
|
+
it('rejects a sweep prebuild whose outputs do not match the requested destination', async function () {
|
|
83
|
+
const sweepScope = nockSweepPrebuild();
|
|
84
|
+
const keyScopes = nockKeychainFetches();
|
|
85
|
+
const otherAddress = (0, util_1.getWalletAddress)('btc', (0, util_1.createWasmWalletKeys)('other-address').walletKeys);
|
|
86
|
+
await assert.rejects(wallet.sweep({ address: otherAddress, xprv: userPrv }), {
|
|
87
|
+
message: `invalid sweep destination ${destination}, specified ${otherAddress}`,
|
|
88
|
+
});
|
|
89
|
+
[sweepScope, ...keyScopes].forEach((scope) => assert.ok(scope.isDone()));
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dlZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvc3dlZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpQkFBZTtBQUNmLCtDQUFpQztBQUVqQyw2QkFBOEI7QUFDOUIsbURBQThDO0FBRTlDLGlDQVVnQjtBQUVoQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztBQUV6QixRQUFRLENBQUMsY0FBYyxFQUFFO0lBQ3ZCLE1BQU0sS0FBSyxHQUFHLGlCQUFNLENBQUMsWUFBWSxDQUFDLG1CQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFFN0QsTUFBTSxJQUFJLEdBQUcsSUFBQSxrQkFBVyxFQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sUUFBUSxHQUFHLGtDQUFrQyxDQUFDO0lBQ3BELE1BQU0sTUFBTSxHQUFHLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN2RCxNQUFNLE1BQU0sR0FBRyxJQUFBLG9CQUFhLEVBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRTFGLE1BQU0sT0FBTyxHQUFHLElBQUEsMkJBQW9CLEdBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFFdkQsb0ZBQW9GO0lBQ3BGLDBFQUEwRTtJQUMxRSxNQUFNLGVBQWUsR0FBRyxJQUFBLDJCQUFvQixFQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDbEUsTUFBTSxXQUFXLEdBQUcsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXhFLHFGQUFxRjtJQUNyRiwyREFBMkQ7SUFDM0QsTUFBTSxJQUFJ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QUMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO1lBQzNFLE9BQU8sRUFBRSw2QkFBNkIsV0FBVyxlQUFlLFlBQVksRUFBRTtTQUMvRSxDQUFDLENBQUM7UUFFSCxDQUFDLFVBQVUsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ21vY2hhJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcbmltcG9ydCB7IGNvbW1vbiB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuaW1wb3J0IHtcbiAgY29uc3RydWN0UHNidCxcbiAgY3JlYXRlV2FzbVdhbGxldEtleXMsXG4gIGRlZmF1bHRCaXRHbyxcbiAgZ2V0RGVmYXVsdFdhbGxldEtleXMsXG4gIGdldERlZmF1bHRXYXNtV2FsbGV0S2V5cyxcbiAgZ2V0V2FsbGV0QWRkcmVzcyxcbiAga2V5Y2hhaW5zQmFzZTU4LFxuICBnZXRVdHhvQ29pbixcbiAgZ2V0VXR4b1dhbGxldCxcbn0gZnJvbSAnLi91dGlsJztcblxubm9jay5kaXNhYmxlTmV0Q29ubmVjdCgpO1xuXG5kZXNjcmliZSgnV2FsbGV0LnN3ZWVwJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBiZ1VybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbZGVmYXVsdEJpdEdvLmdldEVudigpXS51cmk7XG5cbiAgY29uc3QgY29pbiA9IGdldFV0eG9Db2luKCdidGMnKTtcbiAgY29uc3Qgd2FsbGV0SWQgPSAnNWIzNDI1MmYxYmYzNDk5MzBlMzQwMjBhMDAwMDAwMDAnO1xuICBjb25zdCBrZXlJZHMgPSBbJ2tleS11c2VyJywgJ2tleS1iYWNrdXAnLCAna2V5LWJpdGdvJ107XG4gIGNvbnN0IHdhbGxldCA9IGdldFV0eG9XYWxsZXQoY29pbiwgeyBpZDogd2FsbGV0SWQsIGNvaW46IGNvaW4uZ2V0Q2hhaW4oKSwga2V5czoga2V5SWRzIH0pO1xuXG4gIGNvbnN0IHVzZXJQcnYgPSBnZXREZWZhdWx0V2FsbGV0S2V5cygpLnVzZXIudG9CYXNlNTgoKTtcblxuICAvLyBTd2VlcCBkZXN0aW5hdGlvbiBpcyBkZXJpdmVkIGZyb20gdW5yZWxhdGVkIGtleXMgc28gdGhhdCB0aGUgcHJlYnVpbGQgZXhwbGFuYXRpb25cbiAgLy8gY2xhc3NpZmllcyBpdCBhcyBhbiBleHRlcm5hbCBvdXRwdXQgcmF0aGVyIHRoYW4gYSB3YWxsZXQgY2hhbmdlIG91dHB1dC5cbiAgY29uc3QgZGVzdGluYXRpb25LZXlzID0gY3JlYXRlV2FzbVdhbGxldEtleXMoJ3N3ZWVwLWRlc3RpbmF0aW9uJyk7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gZ2V0V2FsbGV0QWRkcmVzcygnYnRjJywgZGVzdGluYXRpb25LZXlzLndhbGxldEtleXMpO1xuXG4gIC8vIFN3ZWVwLXNoYXBlZCBwcmVidWlsZDogYSBzaW5nbGUgd2FsbGV0IGlucHV0IHNwZW5kaW5nIHRvIGEgc2luZ2xlIGV4dGVybmFsIG91dHB1dC5cbiAgLy8gVGhlIC9zd2VlcFdhbGxldCByZXNwb25zZSBkb2VzIG5vdCBjYXJyeSBhIGBwdWJzYCBmaWVsZC5cbiAgY29uc3QgcHNidCA9IGNvbnN0cnVjdFBzYnQoXG4gICAgW3sgc2NyaXB0VHlwZTogJ3Ayc2gnIGFzIGNvbnN0LCB2YWx1ZTogQmlnSW50KDEwMDAwMCkgfV0sXG4gICAgW3sgYWRkcmVzczogZGVzdGluYXRpb24sIHZhbHVlOiBCaWdJbnQoOTkwMDApIH1dLFxuICAgICdidGMnLFxuICAgIGdldERlZmF1bHRXYXNtV2FsbGV0S2V5cygpLndhbGxldEtleXNcbiAgKTtcbiAgY29uc3QgdHhIZXggPSBCdWZmZXIuZnJvbShwc2J0LnNlcmlhbGl6ZSgpKS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IHR4aWQgPSAnODU2ZTBkMGYwZjBmNWYxYTQ1NWQwZjhjNGM5YTNhNGZiZDBiMGQ3YTBkOWY0ZTNjMmIxYTBmOWU4ZDdjNmI1YTQnO1xuXG4gIGZ1bmN0aW9uIG5vY2tTd2VlcFByZWJ1aWxkKCk6IG5vY2suU2NvcGUge1xuICAgIHJldHVybiBub2NrKGJnVXJsKVxuICAgICAgLnBvc3QoYC9hcGkvdjIvJHtjb2luLmdldENoYWluKCl9L3dhbGxldC8ke3dhbGxldElkfS9zd2VlcFdhbGxldGApXG4gICAgICAucmVwbHkoMjAwLCB7IHR4SGV4LCB3YWxsZXRJZCB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vY2tLZXljaGFpbkZldGNoZXMoKTogbm9jay5TY29wZVtdIHtcbiAgICByZXR1cm4ga2V5SWRzLm1hcCgoaWQsIGkpID0+XG4gICAgICBub2NrKGJnVXJsKS5nZXQoYC9hcGkvdjIvJHtjb2luLmdldENoYWluKCl9L2tleS8ke2lkfWApLnJlcGx5KDIwMCwgeyBwdWI6IGtleWNoYWluc0Jhc2U1OFtpXS5wdWIgfSlcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gbm9ja1NlbmRUcmFuc2FjdGlvbigpOiBub2NrLlNjb3BlIHtcbiAgICByZXR1cm4gbm9jayhiZ1VybCkucG9zdChgL2FwaS92Mi8ke2NvaW4uZ2V0Q2hhaW4oKX0vd2FsbGV0LyR7d2FsbGV0SWR9L3R4L3NlbmRgKS5yZXBseSgyMDAsIHsgdHhpZCwgdHg6IHR4SGV4IH0pO1xuICB9XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBub2NrLmNsZWFuQWxsKCk7XG4gIH0pO1xuXG4gIGl0KCdleHBsYWlucyB0aGUgc3dlZXAgcHJlYnVpbGQgd2l0aCB0aGUgd2FsbGV0IHB1YnMgYW5kIGNvbXBsZXRlcyB0aGUgc3dlZXAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc3dlZXBTY29wZSA9IG5vY2tTd2VlcFByZWJ1aWxkKCk7XG4gICAgLy8gVGhlIHdhbGxldCBrZXljaGFpbnMgYXJlIGZldGNoZWQgZXhhY3RseSBvbmNlOiB0aGUgcHVicyBhcmUgdXNlZCBib3RoIGZvclxuICAgIC8vIGV4cGxhaW5pbmcgdGhlIHByZWJ1aWxkIGFuZCBmb3Igc2lnbmluZywgc28gbm8gZnVydGhlciBrZXkgZmV0Y2ggaXMgZXhwZWN0ZWQuXG4gICAgY29uc3Qga2V5U2NvcGVzID0gbm9ja0tleWNoYWluRmV0Y2hlcygpO1xuICAgIGNvbnN0IHNlbmRTY29wZSA9IG5vY2tTZW5kVHJhbnNhY3Rpb24oKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5zd2VlcCh7IGFkZHJlc3M6IGRlc3RpbmF0aW9uLCB4cHJ2OiB1c2VyUHJ2IH0pO1xuXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdC50eGlkLCB0eGlkKTtcbiAgICBbc3dlZXBTY29wZSwgLi4ua2V5U2NvcGVzLCBzZW5kU2NvcGVdLmZvckVhY2goKHNjb3BlKSA9PiBhc3NlcnQub2soc2NvcGUuaXNEb25lKCkpKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgYSBzd2VlcCBwcmVidWlsZCB3aG9zZSBvdXRwdXRzIGRvIG5vdCBtYXRjaCB0aGUgcmVxdWVzdGVkIGRlc3RpbmF0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHN3ZWVwU2NvcGUgPSBub2NrU3dlZXBQcmVidWlsZCgpO1xuICAgIGNvbnN0IGtleVNjb3BlcyA9IG5vY2tLZXljaGFpbkZldGNoZXMoKTtcbiAgICBjb25zdCBvdGhlckFkZHJlc3MgPSBnZXRXYWxsZXRBZGRyZXNzKCdidGMnLCBjcmVhdGVXYXNtV2FsbGV0S2V5cygnb3RoZXItYWRkcmVzcycpLndhbGxldEtleXMpO1xuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMod2FsbGV0LnN3ZWVwKHsgYWRkcmVzczogb3RoZXJBZGRyZXNzLCB4cHJ2OiB1c2VyUHJ2IH0pLCB7XG4gICAgICBtZXNzYWdlOiBgaW52YWxpZCBzd2VlcCBkZXN0aW5hdGlvbiAke2Rlc3RpbmF0aW9ufSwgc3BlY2lmaWVkICR7b3RoZXJBZGRyZXNzfWAsXG4gICAgfSk7XG5cbiAgICBbc3dlZXBTY29wZSwgLi4ua2V5U2NvcGVzXS5mb3JFYWNoKChzY29wZSkgPT4gYXNzZXJ0Lm9rKHNjb3BlLmlzRG9uZSgpKSk7XG4gIH0pO1xufSk7XG4iXX0=
|