@bitgo/abstract-utxo 11.1.0 → 11.2.0

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 (41) hide show
  1. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -1
  2. package/dist/cjs/src/abstractUtxoCoin.js +9 -4
  3. package/dist/cjs/src/address/fixedScript.d.ts.map +1 -1
  4. package/dist/cjs/src/address/fixedScript.js +4 -1
  5. package/dist/cjs/src/transaction/decode.d.ts +13 -1
  6. package/dist/cjs/src/transaction/decode.d.ts.map +1 -1
  7. package/dist/cjs/src/transaction/decode.js +19 -1
  8. package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -1
  9. package/dist/cjs/src/transaction/descriptor/parse.js +3 -9
  10. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -1
  11. package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +3 -4
  12. package/dist/cjs/src/transaction/explainTransaction.d.ts +2 -2
  13. package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -1
  14. package/dist/cjs/src/transaction/explainTransaction.js +12 -10
  15. package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -1
  16. package/dist/cjs/src/transaction/signTransaction.js +8 -11
  17. package/dist/cjs/test/unit/address.js +27 -1
  18. package/dist/cjs/test/unit/transaction/descriptor/signTransactionE2E.d.ts +2 -0
  19. package/dist/cjs/test/unit/transaction/descriptor/signTransactionE2E.d.ts.map +1 -0
  20. package/dist/cjs/test/unit/transaction/descriptor/signTransactionE2E.js +100 -0
  21. package/dist/cjs/test/unit/transaction/descriptor/signTransactionGuard.d.ts +2 -0
  22. package/dist/cjs/test/unit/transaction/descriptor/signTransactionGuard.d.ts.map +1 -0
  23. package/dist/cjs/test/unit/transaction/descriptor/signTransactionGuard.js +84 -0
  24. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  25. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -1
  26. package/dist/esm/abstractUtxoCoin.js +10 -5
  27. package/dist/esm/address/fixedScript.d.ts.map +1 -1
  28. package/dist/esm/address/fixedScript.js +4 -1
  29. package/dist/esm/transaction/decode.d.ts +13 -1
  30. package/dist/esm/transaction/decode.d.ts.map +1 -1
  31. package/dist/esm/transaction/decode.js +19 -2
  32. package/dist/esm/transaction/descriptor/parse.d.ts.map +1 -1
  33. package/dist/esm/transaction/descriptor/parse.js +3 -9
  34. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts.map +1 -1
  35. package/dist/esm/transaction/descriptor/verifyTransaction.js +3 -4
  36. package/dist/esm/transaction/explainTransaction.d.ts +2 -2
  37. package/dist/esm/transaction/explainTransaction.d.ts.map +1 -1
  38. package/dist/esm/transaction/explainTransaction.js +13 -11
  39. package/dist/esm/transaction/signTransaction.d.ts.map +1 -1
  40. package/dist/esm/transaction/signTransaction.js +10 -13
  41. package/package.json +8 -8
@@ -0,0 +1,100 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ require("mocha");
40
+ const assert_1 = __importDefault(require("assert"));
41
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
42
+ const testutils = __importStar(require("@bitgo/wasm-utxo/testutils"));
43
+ const utxoCoins_1 = require("../../util/utxoCoins");
44
+ const nockBitGo_1 = require("../../util/nockBitGo");
45
+ const { getDescriptorMap, mockPsbtDefaultWithDescriptorTemplate } = testutils.descriptor;
46
+ const { getKeyTriple } = testutils;
47
+ // End-to-end coverage for descriptor wallet signing through the
48
+ // top-level coin.signTransaction entry point (T1-3401). Locks in the
49
+ // wasm-utxo decode path that T1-3400 broke.
50
+ describe('signTransaction E2E: descriptor wallet (wasm-utxo backend)', function () {
51
+ it('produces a signed PSBT with valid user signatures on every input', async function () {
52
+ const coin = (0, utxoCoins_1.getUtxoCoin)('btc');
53
+ // mockPsbtDefaultWithDescriptorTemplate uses getDefaultXPubs('a') —
54
+ // i.e. getKeyTriple('a') — so we sign with the same triple.
55
+ const keychain = getKeyTriple('a');
56
+ const userKey = keychain[0];
57
+ const descriptorMap = getDescriptorMap('Wsh2Of3', keychain);
58
+ const unsignedPsbt = mockPsbtDefaultWithDescriptorTemplate('Wsh2Of3');
59
+ const psbtHex = Buffer.from(unsignedPsbt.serialize()).toString('hex');
60
+ const keyIds = ['kU', 'kB', 'kG'];
61
+ const wallet = {
62
+ coinSpecific: () => ({
63
+ descriptors: [...descriptorMap.entries()].map(([name, descriptor]) => ({
64
+ name,
65
+ value: descriptor.toString(),
66
+ })),
67
+ }),
68
+ keyIds: () => keyIds,
69
+ };
70
+ // Mock the keychain fetch — fetchKeychains pulls each key by id.
71
+ keyIds.forEach((id, i) => {
72
+ (0, nockBitGo_1.nockBitGo)().get(`/api/v2/${coin.getChain()}/key/${id}`).reply(200, { pub: keychain[i].neutered().toBase58() });
73
+ });
74
+ // decodeWith: 'wasm-utxo' is explicit to lock in the BitGoPsbt
75
+ // decode path that T1-3400 broke; this is also the production
76
+ // default after 1702a08009.
77
+ const result = await coin.signTransaction({
78
+ txPrebuild: { txHex: psbtHex, decodeWith: 'wasm-utxo' },
79
+ prv: userKey.toBase58(),
80
+ wallet,
81
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
82
+ });
83
+ assert_1.default.ok('txHex' in result, 'expected signTransaction to return { txHex }');
84
+ const signedPsbt = wasm_utxo_1.Psbt.deserialize(Buffer.from(result.txHex, 'hex'));
85
+ const inputs = signedPsbt.getInputs();
86
+ assert_1.default.ok(inputs.length > 0, 'expected at least one input');
87
+ inputs.forEach((_input, vin) => {
88
+ assert_1.default.ok(signedPsbt.hasPartialSignatures(vin), `input ${vin} has no partial signatures`);
89
+ const sigs = signedPsbt.getPartialSignatures(vin);
90
+ assert_1.default.ok(sigs.length > 0, `input ${vin} returned empty partial signatures`);
91
+ // Pubkeys in partial sigs are the descriptor-derived child keys, not
92
+ // the user master pubkey; assert that each sig validates at its claimed
93
+ // pubkey, which is the strongest "signing actually worked" check.
94
+ for (const sig of sigs) {
95
+ assert_1.default.ok(signedPsbt.validateSignatureAtInput(vin, sig.pubkey), `input ${vin} has an invalid signature for pubkey ${Buffer.from(sig.pubkey).toString('hex')}`);
96
+ }
97
+ });
98
+ });
99
+ });
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnblRyYW5zYWN0aW9uRTJFLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uL2Rlc2NyaXB0b3Ivc2lnblRyYW5zYWN0aW9uRTJFLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaUJBQWU7QUFDZixvREFBNEI7QUFFNUIsZ0RBQXdDO0FBQ3hDLHNFQUF3RDtBQUd4RCxvREFBbUQ7QUFDbkQsb0RBQWlEO0FBRWpELE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxxQ0FBcUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUM7QUFDekYsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLFNBQVMsQ0FBQztBQUVuQyxnRUFBZ0U7QUFDaEUscUVBQXFFO0FBQ3JFLDRDQUE0QztBQUM1QyxRQUFRLENBQUMsNERBQTRELEVBQUU7SUFDckUsRUFBRSxDQUFDLGtFQUFrRSxFQUFFLEtBQUs7UUFDMUUsTUFBTSxJQUFJLEdBQUcsSUFBQSx1QkFBVyxFQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLG9FQUFvRTtRQUNwRSw0REFBNEQ7UUFDNUQsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QixNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFNUQsTUFBTSxZQUFZLEdBQUcscUNBQXFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdEUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sTUFBTSxHQUFHO1lBQ2IsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQ25CLFdBQVcsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ3JFLElBQUk7b0JBQ0osS0FBSyxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUU7aUJBQzdCLENBQUMsQ0FBQzthQUNKLENBQUM7WUFDRixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTTtTQUNJLENBQUM7UUFFM0IsaUVBQWlFO1FBQ2pFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdkIsSUFBQSxxQkFBUyxHQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pILENBQUMsQ0FBQyxDQUFDO1FBRUgsK0RBQStEO1FBQy9ELDhEQUE4RDtRQUM5RCw0QkFBNEI7UUFDNUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3hDLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRTtZQUN2RCxHQUFHLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRTtZQUN2QixNQUFNO1lBQ04sOERBQThEO1NBQ3hELENBQUMsQ0FBQztRQUVWLGdCQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxNQUFNLEVBQUUsOENBQThDLENBQUMsQ0FBQztRQUM3RSxNQUFNLFVBQVUsR0FBRyxnQkFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUV0RSxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdEMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUM1RCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzdCLGdCQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsNEJBQTRCLENBQUMsQ0FBQztZQUMxRixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEQsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLG9DQUFvQyxDQUFDLENBQUM7WUFDN0UscUVBQXFFO1lBQ3JFLHdFQUF3RTtZQUN4RSxrRUFBa0U7WUFDbEUsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsZ0JBQU0sQ0FBQyxFQUFFLENBQ1AsVUFBVSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQ3BELFNBQVMsR0FBRyx3Q0FBd0MsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQzlGLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdtb2NoYSc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IFBzYnQgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCAqIGFzIHRlc3R1dGlscyBmcm9tICdAYml0Z28vd2FzbS11dHhvL3Rlc3R1dGlscyc7XG5cbmltcG9ydCB0eXBlIHsgVXR4b1dhbGxldCB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy93YWxsZXQnO1xuaW1wb3J0IHsgZ2V0VXR4b0NvaW4gfSBmcm9tICcuLi8uLi91dGlsL3V0eG9Db2lucyc7XG5pbXBvcnQgeyBub2NrQml0R28gfSBmcm9tICcuLi8uLi91dGlsL25vY2tCaXRHbyc7XG5cbmNvbnN0IHsgZ2V0RGVzY3JpcHRvck1hcCwgbW9ja1BzYnREZWZhdWx0V2l0aERlc2NyaXB0b3JUZW1wbGF0ZSB9ID0gdGVzdHV0aWxzLmRlc2NyaXB0b3I7XG5jb25zdCB7IGdldEtleVRyaXBsZSB9ID0gdGVzdHV0aWxzO1xuXG4vLyBFbmQtdG8tZW5kIGNvdmVyYWdlIGZvciBkZXNjcmlwdG9yIHdhbGxldCBzaWduaW5nIHRocm91Z2ggdGhlXG4vLyB0b3AtbGV2ZWwgY29pbi5zaWduVHJhbnNhY3Rpb24gZW50cnkgcG9pbnQgKFQxLTM0MDEpLiBMb2NrcyBpbiB0aGVcbi8vIHdhc20tdXR4byBkZWNvZGUgcGF0aCB0aGF0IFQxLTM0MDAgYnJva2UuXG5kZXNjcmliZSgnc2lnblRyYW5zYWN0aW9uIEUyRTogZGVzY3JpcHRvciB3YWxsZXQgKHdhc20tdXR4byBiYWNrZW5kKScsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Byb2R1Y2VzIGEgc2lnbmVkIFBTQlQgd2l0aCB2YWxpZCB1c2VyIHNpZ25hdHVyZXMgb24gZXZlcnkgaW5wdXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY29pbiA9IGdldFV0eG9Db2luKCdidGMnKTtcbiAgICAvLyBtb2NrUHNidERlZmF1bHRXaXRoRGVzY3JpcHRvclRlbXBsYXRlIHVzZXMgZ2V0RGVmYXVsdFhQdWJzKCdhJykg4oCUXG4gICAgLy8gaS5lLiBnZXRLZXlUcmlwbGUoJ2EnKSDigJQgc28gd2Ugc2lnbiB3aXRoIHRoZSBzYW1lIHRyaXBsZS5cbiAgICBjb25zdCBrZXljaGFpbiA9IGdldEtleVRyaXBsZSgnYScpO1xuICAgIGNvbnN0IHVzZXJLZXkgPSBrZXljaGFpblswXTtcbiAgICBjb25zdCBkZXNjcmlwdG9yTWFwID0gZ2V0RGVzY3JpcHRvck1hcCgnV3NoMk9mMycsIGtleWNoYWluKTtcblxuICAgIGNvbnN0IHVuc2lnbmVkUHNidCA9IG1vY2tQc2J0RGVmYXVsdFdpdGhEZXNjcmlwdG9yVGVtcGxhdGUoJ1dzaDJPZjMnKTtcbiAgICBjb25zdCBwc2J0SGV4ID0gQnVmZmVyLmZyb20odW5zaWduZWRQc2J0LnNlcmlhbGl6ZSgpKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBjb25zdCBrZXlJZHMgPSBbJ2tVJywgJ2tCJywgJ2tHJ107XG4gICAgY29uc3Qgd2FsbGV0ID0ge1xuICAgICAgY29pblNwZWNpZmljOiAoKSA9PiAoe1xuICAgICAgICBkZXNjcmlwdG9yczogWy4uLmRlc2NyaXB0b3JNYXAuZW50cmllcygpXS5tYXAoKFtuYW1lLCBkZXNjcmlwdG9yXSkgPT4gKHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHZhbHVlOiBkZXNjcmlwdG9yLnRvU3RyaW5nKCksXG4gICAgICAgIH0pKSxcbiAgICAgIH0pLFxuICAgICAga2V5SWRzOiAoKSA9PiBrZXlJZHMsXG4gICAgfSBhcyB1bmtub3duIGFzIFV0eG9XYWxsZXQ7XG5cbiAgICAvLyBNb2NrIHRoZSBrZXljaGFpbiBmZXRjaCDigJQgZmV0Y2hLZXljaGFpbnMgcHVsbHMgZWFjaCBrZXkgYnkgaWQuXG4gICAga2V5SWRzLmZvckVhY2goKGlkLCBpKSA9PiB7XG4gICAgICBub2NrQml0R28oKS5nZXQoYC9hcGkvdjIvJHtjb2luLmdldENoYWluKCl9L2tleS8ke2lkfWApLnJlcGx5KDIwMCwgeyBwdWI6IGtleWNoYWluW2ldLm5ldXRlcmVkKCkudG9CYXNlNTgoKSB9KTtcbiAgICB9KTtcblxuICAgIC8vIGRlY29kZVdpdGg6ICd3YXNtLXV0eG8nIGlzIGV4cGxpY2l0IHRvIGxvY2sgaW4gdGhlIEJpdEdvUHNidFxuICAgIC8vIGRlY29kZSBwYXRoIHRoYXQgVDEtMzQwMCBicm9rZTsgdGhpcyBpcyBhbHNvIHRoZSBwcm9kdWN0aW9uXG4gICAgLy8gZGVmYXVsdCBhZnRlciAxNzAyYTA4MDA5LlxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4uc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXg6IHBzYnRIZXgsIGRlY29kZVdpdGg6ICd3YXNtLXV0eG8nIH0sXG4gICAgICBwcnY6IHVzZXJLZXkudG9CYXNlNTgoKSxcbiAgICAgIHdhbGxldCxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgfSBhcyBhbnkpO1xuXG4gICAgYXNzZXJ0Lm9rKCd0eEhleCcgaW4gcmVzdWx0LCAnZXhwZWN0ZWQgc2lnblRyYW5zYWN0aW9uIHRvIHJldHVybiB7IHR4SGV4IH0nKTtcbiAgICBjb25zdCBzaWduZWRQc2J0ID0gUHNidC5kZXNlcmlhbGl6ZShCdWZmZXIuZnJvbShyZXN1bHQudHhIZXgsICdoZXgnKSk7XG5cbiAgICBjb25zdCBpbnB1dHMgPSBzaWduZWRQc2J0LmdldElucHV0cygpO1xuICAgIGFzc2VydC5vayhpbnB1dHMubGVuZ3RoID4gMCwgJ2V4cGVjdGVkIGF0IGxlYXN0IG9uZSBpbnB1dCcpO1xuICAgIGlucHV0cy5mb3JFYWNoKChfaW5wdXQsIHZpbikgPT4ge1xuICAgICAgYXNzZXJ0Lm9rKHNpZ25lZFBzYnQuaGFzUGFydGlhbFNpZ25hdHVyZXModmluKSwgYGlucHV0ICR7dmlufSBoYXMgbm8gcGFydGlhbCBzaWduYXR1cmVzYCk7XG4gICAgICBjb25zdCBzaWdzID0gc2lnbmVkUHNidC5nZXRQYXJ0aWFsU2lnbmF0dXJlcyh2aW4pO1xuICAgICAgYXNzZXJ0Lm9rKHNpZ3MubGVuZ3RoID4gMCwgYGlucHV0ICR7dmlufSByZXR1cm5lZCBlbXB0eSBwYXJ0aWFsIHNpZ25hdHVyZXNgKTtcbiAgICAgIC8vIFB1YmtleXMgaW4gcGFydGlhbCBzaWdzIGFyZSB0aGUgZGVzY3JpcHRvci1kZXJpdmVkIGNoaWxkIGtleXMsIG5vdFxuICAgICAgLy8gdGhlIHVzZXIgbWFzdGVyIHB1YmtleTsgYXNzZXJ0IHRoYXQgZWFjaCBzaWcgdmFsaWRhdGVzIGF0IGl0cyBjbGFpbWVkXG4gICAgICAvLyBwdWJrZXksIHdoaWNoIGlzIHRoZSBzdHJvbmdlc3QgXCJzaWduaW5nIGFjdHVhbGx5IHdvcmtlZFwiIGNoZWNrLlxuICAgICAgZm9yIChjb25zdCBzaWcgb2Ygc2lncykge1xuICAgICAgICBhc3NlcnQub2soXG4gICAgICAgICAgc2lnbmVkUHNidC52YWxpZGF0ZVNpZ25hdHVyZUF0SW5wdXQodmluLCBzaWcucHVia2V5KSxcbiAgICAgICAgICBgaW5wdXQgJHt2aW59IGhhcyBhbiBpbnZhbGlkIHNpZ25hdHVyZSBmb3IgcHVia2V5ICR7QnVmZmVyLmZyb20oc2lnLnB1YmtleSkudG9TdHJpbmcoJ2hleCcpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import 'mocha';
2
+ //# sourceMappingURL=signTransactionGuard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signTransactionGuard.d.ts","sourceRoot":"","sources":["../../../../../../test/unit/transaction/descriptor/signTransactionGuard.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,CAAC"}
@@ -0,0 +1,84 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ require("mocha");
40
+ const assert_1 = __importDefault(require("assert"));
41
+ const testutils = __importStar(require("@bitgo/wasm-utxo/testutils"));
42
+ const signTransaction_1 = require("../../../../src/transaction/signTransaction");
43
+ const utxoCoins_1 = require("../../util/utxoCoins");
44
+ const keychains_1 = require("../../util/keychains");
45
+ const { getDescriptorMap, mockPsbtDefaultWithDescriptorTemplate } = testutils.descriptor;
46
+ // Regression test for T1-3400. The descriptor sign guard previously
47
+ // only accepted utxo-lib PSBTs (UtxoLibPsbt) and Uint8Array, throwing
48
+ // `descriptor wallets require PSBT format transactions` when the
49
+ // decoded prebuild was a wasm-utxo BitGoPsbt — the default after
50
+ // defaultSdkBackend flipped to 'wasm-utxo' for all coins.
51
+ describe('signTransaction: descriptor wallet with BitGoPsbt prebuild (T1-3400)', function () {
52
+ it('does not reject BitGoPsbt with the descriptor PSBT guard', async function () {
53
+ const coin = (0, utxoCoins_1.getUtxoCoin)('btc');
54
+ const descriptorMap = getDescriptorMap('Wsh2Of3');
55
+ const psbt = mockPsbtDefaultWithDescriptorTemplate('Wsh2Of3');
56
+ const psbtHex = Buffer.from(psbt.serialize()).toString('hex');
57
+ const wallet = {
58
+ coinSpecific: () => ({
59
+ descriptors: [...descriptorMap.entries()].map(([name, descriptor]) => ({
60
+ name,
61
+ value: descriptor.toString(),
62
+ })),
63
+ }),
64
+ keyIds: () => ['k0', 'k1', 'k2'],
65
+ };
66
+ const userPrv = (0, keychains_1.getDefaultWalletKeys)().user.toBase58();
67
+ let caught;
68
+ try {
69
+ // decodeWith: 'wasm-utxo' forces decodeTransactionFromPrebuild to
70
+ // return fixedScriptWallet.BitGoPsbt (the path that used to trip
71
+ // the guard).
72
+ await (0, signTransaction_1.signTransaction)(coin, utxoCoins_1.defaultBitGo, {
73
+ txPrebuild: { txHex: psbtHex, decodeWith: 'wasm-utxo' },
74
+ prv: userPrv,
75
+ wallet,
76
+ });
77
+ }
78
+ catch (e) {
79
+ caught = e;
80
+ }
81
+ assert_1.default.ok(!caught || !/descriptor wallets require PSBT format transactions/.test(caught.message), `descriptor sign guard incorrectly rejected BitGoPsbt: ${caught?.message}`);
82
+ });
83
+ });
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnblRyYW5zYWN0aW9uR3VhcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24vZGVzY3JpcHRvci9zaWduVHJhbnNhY3Rpb25HdWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlCQUFlO0FBQ2Ysb0RBQTRCO0FBRTVCLHNFQUF3RDtBQUV4RCxpRkFBOEU7QUFFOUUsb0RBQWlFO0FBQ2pFLG9EQUE0RDtBQUU1RCxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUscUNBQXFDLEVBQUUsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDO0FBRXpGLG9FQUFvRTtBQUNwRSxzRUFBc0U7QUFDdEUsaUVBQWlFO0FBQ2pFLGlFQUFpRTtBQUNqRSwwREFBMEQ7QUFDMUQsUUFBUSxDQUFDLHNFQUFzRSxFQUFFO0lBQy9FLEVBQUUsQ0FBQywwREFBMEQsRUFBRSxLQUFLO1FBQ2xFLE1BQU0sSUFBSSxHQUFHLElBQUEsdUJBQVcsRUFBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRCxNQUFNLElBQUksR0FBRyxxQ0FBcUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5RCxNQUFNLE1BQU0sR0FBRztZQUNiLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUNuQixXQUFXLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNyRSxJQUFJO29CQUNKLEtBQUssRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFO2lCQUM3QixDQUFDLENBQUM7YUFDSixDQUFDO1lBQ0YsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7U0FDUixDQUFDO1FBRTNCLE1BQU0sT0FBTyxHQUFHLElBQUEsZ0NBQW9CLEdBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFdkQsSUFBSSxNQUF5QixDQUFDO1FBQzlCLElBQUksQ0FBQztZQUNILGtFQUFrRTtZQUNsRSxpRUFBaUU7WUFDakUsY0FBYztZQUNkLE1BQU0sSUFBQSxpQ0FBZSxFQUFDLElBQUksRUFBRSx3QkFBWSxFQUFFO2dCQUN4QyxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUU7Z0JBQ3ZELEdBQUcsRUFBRSxPQUFPO2dCQUNaLE1BQU07YUFDQSxDQUFDLENBQUM7UUFDWixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sR0FBRyxDQUFVLENBQUM7UUFDdEIsQ0FBQztRQUVELGdCQUFNLENBQUMsRUFBRSxDQUNQLENBQUMsTUFBTSxJQUFJLENBQUMscURBQXFELENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFDdEYseURBQXlELE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FDM0UsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ21vY2hhJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0ICogYXMgdGVzdHV0aWxzIGZyb20gJ0BiaXRnby93YXNtLXV0eG8vdGVzdHV0aWxzJztcblxuaW1wb3J0IHsgc2lnblRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL3NpZ25UcmFuc2FjdGlvbic7XG5pbXBvcnQgdHlwZSB7IFV0eG9XYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvd2FsbGV0JztcbmltcG9ydCB7IGRlZmF1bHRCaXRHbywgZ2V0VXR4b0NvaW4gfSBmcm9tICcuLi8uLi91dGlsL3V0eG9Db2lucyc7XG5pbXBvcnQgeyBnZXREZWZhdWx0V2FsbGV0S2V5cyB9IGZyb20gJy4uLy4uL3V0aWwva2V5Y2hhaW5zJztcblxuY29uc3QgeyBnZXREZXNjcmlwdG9yTWFwLCBtb2NrUHNidERlZmF1bHRXaXRoRGVzY3JpcHRvclRlbXBsYXRlIH0gPSB0ZXN0dXRpbHMuZGVzY3JpcHRvcjtcblxuLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBUMS0zNDAwLiBUaGUgZGVzY3JpcHRvciBzaWduIGd1YXJkIHByZXZpb3VzbHlcbi8vIG9ubHkgYWNjZXB0ZWQgdXR4by1saWIgUFNCVHMgKFV0eG9MaWJQc2J0KSBhbmQgVWludDhBcnJheSwgdGhyb3dpbmdcbi8vIGBkZXNjcmlwdG9yIHdhbGxldHMgcmVxdWlyZSBQU0JUIGZvcm1hdCB0cmFuc2FjdGlvbnNgIHdoZW4gdGhlXG4vLyBkZWNvZGVkIHByZWJ1aWxkIHdhcyBhIHdhc20tdXR4byBCaXRHb1BzYnQg4oCUIHRoZSBkZWZhdWx0IGFmdGVyXG4vLyBkZWZhdWx0U2RrQmFja2VuZCBmbGlwcGVkIHRvICd3YXNtLXV0eG8nIGZvciBhbGwgY29pbnMuXG5kZXNjcmliZSgnc2lnblRyYW5zYWN0aW9uOiBkZXNjcmlwdG9yIHdhbGxldCB3aXRoIEJpdEdvUHNidCBwcmVidWlsZCAoVDEtMzQwMCknLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdkb2VzIG5vdCByZWplY3QgQml0R29Qc2J0IHdpdGggdGhlIGRlc2NyaXB0b3IgUFNCVCBndWFyZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb2luID0gZ2V0VXR4b0NvaW4oJ2J0YycpO1xuICAgIGNvbnN0IGRlc2NyaXB0b3JNYXAgPSBnZXREZXNjcmlwdG9yTWFwKCdXc2gyT2YzJyk7XG4gICAgY29uc3QgcHNidCA9IG1vY2tQc2J0RGVmYXVsdFdpdGhEZXNjcmlwdG9yVGVtcGxhdGUoJ1dzaDJPZjMnKTtcbiAgICBjb25zdCBwc2J0SGV4ID0gQnVmZmVyLmZyb20ocHNidC5zZXJpYWxpemUoKSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgY29uc3Qgd2FsbGV0ID0ge1xuICAgICAgY29pblNwZWNpZmljOiAoKSA9PiAoe1xuICAgICAgICBkZXNjcmlwdG9yczogWy4uLmRlc2NyaXB0b3JNYXAuZW50cmllcygpXS5tYXAoKFtuYW1lLCBkZXNjcmlwdG9yXSkgPT4gKHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHZhbHVlOiBkZXNjcmlwdG9yLnRvU3RyaW5nKCksXG4gICAgICAgIH0pKSxcbiAgICAgIH0pLFxuICAgICAga2V5SWRzOiAoKSA9PiBbJ2swJywgJ2sxJywgJ2syJ10sXG4gICAgfSBhcyB1bmtub3duIGFzIFV0eG9XYWxsZXQ7XG5cbiAgICBjb25zdCB1c2VyUHJ2ID0gZ2V0RGVmYXVsdFdhbGxldEtleXMoKS51c2VyLnRvQmFzZTU4KCk7XG5cbiAgICBsZXQgY2F1Z2h0OiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgLy8gZGVjb2RlV2l0aDogJ3dhc20tdXR4bycgZm9yY2VzIGRlY29kZVRyYW5zYWN0aW9uRnJvbVByZWJ1aWxkIHRvXG4gICAgICAvLyByZXR1cm4gZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0ICh0aGUgcGF0aCB0aGF0IHVzZWQgdG8gdHJpcFxuICAgICAgLy8gdGhlIGd1YXJkKS5cbiAgICAgIGF3YWl0IHNpZ25UcmFuc2FjdGlvbihjb2luLCBkZWZhdWx0Qml0R28sIHtcbiAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleDogcHNidEhleCwgZGVjb2RlV2l0aDogJ3dhc20tdXR4bycgfSxcbiAgICAgICAgcHJ2OiB1c2VyUHJ2LFxuICAgICAgICB3YWxsZXQsXG4gICAgICB9IGFzIGFueSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY2F1Z2h0ID0gZSBhcyBFcnJvcjtcbiAgICB9XG5cbiAgICBhc3NlcnQub2soXG4gICAgICAhY2F1Z2h0IHx8ICEvZGVzY3JpcHRvciB3YWxsZXRzIHJlcXVpcmUgUFNCVCBmb3JtYXQgdHJhbnNhY3Rpb25zLy50ZXN0KGNhdWdodC5tZXNzYWdlKSxcbiAgICAgIGBkZXNjcmlwdG9yIHNpZ24gZ3VhcmQgaW5jb3JyZWN0bHkgcmVqZWN0ZWQgQml0R29Qc2J0OiAke2NhdWdodD8ubWVzc2FnZX1gXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==