@bitgo-beta/unspents 0.13.2-beta.9 → 0.13.2-beta.900

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 (65) hide show
  1. package/.mocharc.js +1 -1
  2. package/CHANGELOG.md +541 -0
  3. package/bin/generate_tables.ts +94 -0
  4. package/dist/bin/generate_tables.d.ts +2 -0
  5. package/dist/bin/generate_tables.d.ts.map +1 -0
  6. package/dist/bin/generate_tables.js +107 -0
  7. package/dist/{codes.d.ts → src/codes.d.ts} +11 -10
  8. package/dist/src/codes.d.ts.map +1 -0
  9. package/dist/src/codes.js +182 -0
  10. package/dist/{dimensions.d.ts → src/dimensions.d.ts} +10 -11
  11. package/dist/src/dimensions.d.ts.map +1 -0
  12. package/dist/src/dimensions.js +500 -0
  13. package/dist/{index.d.ts → src/index.d.ts} +1 -0
  14. package/dist/src/index.d.ts.map +1 -0
  15. package/dist/src/index.js +44 -0
  16. package/dist/{inputWeights.d.ts → src/inputWeights.d.ts} +4 -3
  17. package/dist/src/inputWeights.d.ts.map +1 -0
  18. package/dist/src/inputWeights.js +97 -0
  19. package/dist/{scriptSizes.d.ts → src/scriptSizes.d.ts} +1 -0
  20. package/dist/src/scriptSizes.d.ts.map +1 -0
  21. package/dist/src/scriptSizes.js +50 -0
  22. package/dist/{types.d.ts → src/types.d.ts} +1 -0
  23. package/dist/src/types.d.ts.map +1 -0
  24. package/dist/src/types.js +39 -0
  25. package/dist/{virtualSizes.d.ts → src/virtualSizes.d.ts} +13 -12
  26. package/dist/src/virtualSizes.d.ts.map +1 -0
  27. package/dist/src/virtualSizes.js +114 -0
  28. package/dist/src/zcash.d.ts +9 -0
  29. package/dist/src/zcash.d.ts.map +1 -0
  30. package/dist/src/zcash.js +22 -0
  31. package/dist/test/chain.d.ts +2 -0
  32. package/dist/test/chain.d.ts.map +1 -0
  33. package/dist/test/chain.js +92 -0
  34. package/dist/test/dimensions.d.ts +2 -0
  35. package/dist/test/dimensions.d.ts.map +1 -0
  36. package/dist/test/dimensions.js +235 -0
  37. package/dist/test/signedTx/inputWeights.d.ts +2 -0
  38. package/dist/test/signedTx/inputWeights.d.ts.map +1 -0
  39. package/dist/test/signedTx/inputWeights.js +127 -0
  40. package/dist/test/signedTx/txCombinations.d.ts +3 -0
  41. package/dist/test/signedTx/txCombinations.d.ts.map +1 -0
  42. package/dist/test/signedTx/txCombinations.js +130 -0
  43. package/dist/test/signedTx/txGen.d.ts +74 -0
  44. package/dist/test/signedTx/txGen.d.ts.map +1 -0
  45. package/dist/test/signedTx/txGen.js +233 -0
  46. package/dist/test/testutils.d.ts +36 -0
  47. package/dist/test/testutils.d.ts.map +1 -0
  48. package/dist/test/testutils.js +190 -0
  49. package/dist/test/virtualSizes.d.ts +2 -0
  50. package/dist/test/virtualSizes.d.ts.map +1 -0
  51. package/dist/test/virtualSizes.js +18 -0
  52. package/dist/test/zcash.d.ts +2 -0
  53. package/dist/test/zcash.d.ts.map +1 -0
  54. package/dist/test/zcash.js +60 -0
  55. package/dist/tsconfig.build.tsbuildinfo +1 -0
  56. package/dist/tsconfig.tsbuildinfo +1 -0
  57. package/docs/input-costs.md +14 -0
  58. package/package.json +7 -7
  59. package/dist/codes.js +0 -168
  60. package/dist/dimensions.js +0 -490
  61. package/dist/index.js +0 -30
  62. package/dist/inputWeights.js +0 -97
  63. package/dist/scriptSizes.js +0 -51
  64. package/dist/types.js +0 -25
  65. package/dist/virtualSizes.js +0 -114
@@ -0,0 +1,74 @@
1
+ import * as utxolib from '@bitgo-beta/utxo-lib';
2
+ import { BIP32Interface } from '@bitgo-beta/utxo-lib';
3
+ import 'lodash.combinations';
4
+ import { Dimensions } from '../../src';
5
+ import { InputScriptType, TestUnspentType } from '../testutils';
6
+ interface IUnspent {
7
+ scriptPubKey: Buffer;
8
+ redeemScript?: Buffer;
9
+ witnessScript?: Buffer;
10
+ value: number;
11
+ inputType: utxolib.bitgo.outputScripts.ScriptType;
12
+ }
13
+ /**
14
+ *
15
+ * @param keys - Pubkeys to use for generating the address.
16
+ * If unspentType is one of UnspentTypePubKeyHash is used, the first key will be used.
17
+ * @param unspentType {String} - one of UnspentTypeScript2of3 or UnspentTypePubKeyHash
18
+ * @return {String} address
19
+ */
20
+ export declare const createScriptPubKey: (keys: BIP32Interface[], unspentType: TestUnspentType) => Buffer;
21
+ declare class TxCombo {
22
+ walletKeys: BIP32Interface[];
23
+ inputTypes: string[];
24
+ outputTypes: TestUnspentType[];
25
+ expectedDims: Readonly<Dimensions>;
26
+ signKeys?: BIP32Interface[] | undefined;
27
+ inputValue: number;
28
+ unspents: IUnspent[];
29
+ inputTx: any;
30
+ constructor(walletKeys: BIP32Interface[], inputTypes: string[], outputTypes: TestUnspentType[], expectedDims?: Readonly<Dimensions>, signKeys?: BIP32Interface[] | undefined, inputValue?: number);
31
+ getBuilderWithUnsignedTx(): utxolib.bitgo.UtxoTransactionBuilder;
32
+ getUnsignedTx(): utxolib.bitgo.UtxoTransaction;
33
+ getSignedTx(): utxolib.Transaction;
34
+ }
35
+ declare const runCombinations: ({ inputTypes, maxNInputs, outputTypes, maxNOutputs, }: {
36
+ inputTypes: InputScriptType[];
37
+ maxNInputs: number;
38
+ outputTypes: TestUnspentType[];
39
+ maxNOutputs: number;
40
+ }, callback: (inputCombo: InputScriptType[], outputCombo: TestUnspentType[]) => void) => void;
41
+ declare class Histogram {
42
+ map: Map<number, number>;
43
+ total: number;
44
+ constructor(map?: Map<number, number>);
45
+ add(size: number): void;
46
+ asSortedArray(): number[][];
47
+ asFullSortedArray(): number[][];
48
+ getPercentile(p: number): number;
49
+ toString(): string;
50
+ }
51
+ /**
52
+ *
53
+ * Calls `callback` with a variety of signed txs, based on input parameters
54
+ * Callback arguments are
55
+ * inputType, inputCount, outputType, txs
56
+ * where `txs` implements `forEach()`
57
+ *
58
+ * @param inputTypes - input types to test
59
+ * @param nInputKeyTriplets - number of different input key triples to cycle through
60
+ * @param outputTypes - output types to test
61
+ * @param nOutputKeyTriplets - number of different output key triplets to cycle through
62
+ * @param callback
63
+ */
64
+ declare const runSignedTransactions: ({ inputTypes, nInputKeyTriplets, outputTypes, nOutputKeyTriplets, }: {
65
+ inputTypes: Array<{
66
+ inputType: string;
67
+ count: number;
68
+ }>;
69
+ nInputKeyTriplets: number;
70
+ outputTypes: TestUnspentType[];
71
+ nOutputKeyTriplets: number;
72
+ }, callback: (inputType: string, inputCount: number, outputType: TestUnspentType, txs: any) => void) => void;
73
+ export { TxCombo, Histogram, runCombinations, runSignedTransactions };
74
+ //# sourceMappingURL=txGen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"txGen.d.ts","sourceRoot":"","sources":["../../../test/signedTx/txGen.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAS,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EACL,eAAe,EACf,eAAe,EAKhB,MAAM,cAAc,CAAC;AAEtB,UAAU,QAAQ;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC;CACnD;AAoBD;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,SAAU,cAAc,EAAE,eAAe,eAAe,KAAG,MAoBzF,CAAC;AAqCF,cAAM,OAAO;IAKF,UAAU,EAAE,cAAc,EAAE;IAC5B,UAAU,EAAE,MAAM,EAAE;IACpB,WAAW,EAAE,eAAe,EAAE;IAC9B,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC;IAClC,QAAQ,CAAC,EAAE,cAAc,EAAE;IAC3B,UAAU,EAAE,MAAM;IATpB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,OAAO,EAAE,GAAG,CAAC;gBAGX,UAAU,EAAE,cAAc,EAAE,EAC5B,UAAU,EAAE,MAAM,EAAE,EACpB,WAAW,EAAE,eAAe,EAAE,EAC9B,YAAY,GAAE,QAAQ,CAAC,UAAU,CAAmB,EACpD,QAAQ,CAAC,EAAE,cAAc,EAAE,YAAA,EAC3B,UAAU,GAAE,MAAW;IAYzB,wBAAwB,IAAI,OAAO,CAAC,KAAK,CAAC,sBAAsB;IAShE,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC,eAAe;IAI9C,WAAW,IAAI,OAAO,CAAC,WAAW;CAO1C;AAED,QAAA,MAAM,eAAe,0DAMhB;IACD,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB,YACS,CAAC,UAAU,EAAE,eAAe,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,IAAI,KAChF,IAgBF,CAAC;AAEF,cAAM,SAAS;IAGM,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAFpC,KAAK,SAAK;gBAEE,GAAG,GAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAa;IAEhD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKvB,aAAa,IAAI,MAAM,EAAE,EAAE;IAI3B,iBAAiB,IAAI,MAAM,EAAE,EAAE;IAI/B,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAgBhC,QAAQ,IAAI,MAAM;CAI1B;AAOD;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,qBAAqB,wEAMtB;IACD,UAAU,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;CAC5B,YACS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,KAC/F,IAyCF,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/ban-ts-comment */
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.runSignedTransactions = exports.runCombinations = exports.Histogram = exports.TxCombo = exports.createScriptPubKey = void 0;
41
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
42
+ const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
43
+ const lodash_1 = __importDefault(require("lodash"));
44
+ require("lodash.combinations");
45
+ const src_1 = require("../../src");
46
+ const testutils_1 = require("../testutils");
47
+ function createUnspent(pubkeys, inputType, value) {
48
+ let spendableScript;
49
+ const scriptType = inputType === 'taprootKeyPathSpend' ? 'p2trMusig2' : inputType;
50
+ if (scriptType === testutils_1.UnspentTypeP2shP2pk) {
51
+ spendableScript = utxolib.bitgo.outputScripts.createOutputScriptP2shP2pk(pubkeys[0]);
52
+ }
53
+ else if (utxolib.bitgo.outputScripts.isScriptType2Of3(scriptType)) {
54
+ spendableScript = utxolib.bitgo.outputScripts.createOutputScript2of3(pubkeys, scriptType);
55
+ }
56
+ else {
57
+ throw new Error(`unexpected inputType ${scriptType}`);
58
+ }
59
+ return {
60
+ ...spendableScript,
61
+ value,
62
+ inputType: scriptType,
63
+ };
64
+ }
65
+ /**
66
+ *
67
+ * @param keys - Pubkeys to use for generating the address.
68
+ * If unspentType is one of UnspentTypePubKeyHash is used, the first key will be used.
69
+ * @param unspentType {String} - one of UnspentTypeScript2of3 or UnspentTypePubKeyHash
70
+ * @return {String} address
71
+ */
72
+ const createScriptPubKey = (keys, unspentType) => {
73
+ const pubkeys = keys.map((key) => key.publicKey);
74
+ if (typeof unspentType === 'string' && unspentType in testutils_1.UnspentTypeScript2of3) {
75
+ return createUnspent(pubkeys, unspentType, 0).scriptPubKey;
76
+ }
77
+ const pkHash = utxolib.crypto.hash160(pubkeys[0]);
78
+ switch (unspentType) {
79
+ case testutils_1.UnspentTypePubKeyHash.p2pkh:
80
+ return utxolib.payments.p2pkh({ hash: pkHash }).output;
81
+ case testutils_1.UnspentTypePubKeyHash.p2wpkh:
82
+ return utxolib.payments.p2wpkh({ hash: pkHash }).output;
83
+ }
84
+ if (unspentType instanceof testutils_1.UnspentTypeOpReturn) {
85
+ const payload = Buffer.alloc(unspentType.size).fill(pubkeys[0]);
86
+ return utxolib.script.compile([0x6a, payload]);
87
+ }
88
+ throw new Error(`unsupported output type ${unspentType}`);
89
+ };
90
+ exports.createScriptPubKey = createScriptPubKey;
91
+ const createInputTx = (unspents, inputValue) => {
92
+ const txInputBuilder = new utxolib.bitgo.UtxoTransactionBuilder(utxolib.networks.bitcoin);
93
+ txInputBuilder.addInput(Array(32).fill('01').join(''), 0);
94
+ unspents.forEach(({ scriptPubKey }) => txInputBuilder.addOutput(scriptPubKey, inputValue));
95
+ return txInputBuilder.buildIncomplete();
96
+ };
97
+ function signInput(txBuilder, index, walletKeys, unspent, signKeys = unspent.inputType === 'p2shP2pk' ? [walletKeys[0]] : [walletKeys[0], walletKeys[2]]) {
98
+ signKeys.forEach((keyPair) => {
99
+ if (unspent.inputType === 'p2shP2pk') {
100
+ utxolib.bitgo.signInputP2shP2pk(txBuilder, index, keyPair);
101
+ }
102
+ else {
103
+ if (signKeys.length !== 2) {
104
+ throw new Error(`invalid signKeys length`);
105
+ }
106
+ const cosigner = keyPair === signKeys[0] ? signKeys[1] : signKeys[0];
107
+ utxolib.bitgo.signInput2Of3(txBuilder, index, unspent.inputType, walletKeys.map((k) => k.publicKey), keyPair, cosigner.publicKey, unspent.value);
108
+ }
109
+ });
110
+ }
111
+ class TxCombo {
112
+ constructor(walletKeys, inputTypes, outputTypes, expectedDims = src_1.Dimensions.ZERO, signKeys, inputValue = 10) {
113
+ this.walletKeys = walletKeys;
114
+ this.inputTypes = inputTypes;
115
+ this.outputTypes = outputTypes;
116
+ this.expectedDims = expectedDims;
117
+ this.signKeys = signKeys;
118
+ this.inputValue = inputValue;
119
+ this.unspents = inputTypes.map((inputType) => createUnspent(walletKeys.map((key) => key.publicKey), inputType, this.inputValue));
120
+ this.inputTx = createInputTx(this.unspents, inputValue);
121
+ }
122
+ getBuilderWithUnsignedTx() {
123
+ const txBuilder = utxolib.bitgo.createTransactionBuilderForNetwork(utxolib.networks.bitcoin);
124
+ this.inputTx.outs.forEach(({}, i) => txBuilder.addInput(this.inputTx, i));
125
+ this.outputTypes.forEach((unspentType) => txBuilder.addOutput((0, exports.createScriptPubKey)(this.walletKeys, unspentType), this.inputValue));
126
+ return txBuilder;
127
+ }
128
+ getUnsignedTx() {
129
+ return this.getBuilderWithUnsignedTx().buildIncomplete();
130
+ }
131
+ getSignedTx() {
132
+ const txBuilder = this.getBuilderWithUnsignedTx();
133
+ this.unspents.forEach((unspent, i) => {
134
+ signInput(txBuilder, i, this.walletKeys, unspent, this.signKeys);
135
+ });
136
+ return txBuilder.build();
137
+ }
138
+ }
139
+ exports.TxCombo = TxCombo;
140
+ const runCombinations = ({ inputTypes, maxNInputs, outputTypes, maxNOutputs, }, callback) => {
141
+ // Create combinations of different input and output types. Length between 1 and 3.
142
+ const inputCombinations = lodash_1.default.flatten(
143
+ // @ts-ignore
144
+ [...Array(maxNInputs)].map((__, i) => lodash_1.default.combinations(inputTypes, i + 1)));
145
+ const outputCombinations = lodash_1.default.flatten(
146
+ // @ts-ignore
147
+ [...Array(maxNOutputs)].map((__, i) => lodash_1.default.combinations(outputTypes, i + 1)));
148
+ inputCombinations.forEach((inputTypeCombo) => outputCombinations.forEach((outputTypeCombo) => {
149
+ callback(inputTypeCombo, outputTypeCombo);
150
+ }));
151
+ };
152
+ exports.runCombinations = runCombinations;
153
+ class Histogram {
154
+ constructor(map = new Map()) {
155
+ this.map = map;
156
+ this.total = 0;
157
+ }
158
+ add(size) {
159
+ this.map.set(size, (this.map.get(size) || 0) + 1);
160
+ this.total++;
161
+ }
162
+ asSortedArray() {
163
+ return [...this.map.entries()].sort(([a], [b]) => a - b);
164
+ }
165
+ asFullSortedArray() {
166
+ return lodash_1.default.range(this.getPercentile(0), this.getPercentile(1)).map((v) => [v, this.map.get(v) || 0]);
167
+ }
168
+ getPercentile(p) {
169
+ if (0 > p || p > 1) {
170
+ throw new Error(`p must be between 0 and 1`);
171
+ }
172
+ let sum = 0;
173
+ for (const [k, v] of this.asSortedArray()) {
174
+ sum += v;
175
+ if (sum / this.total >= p) {
176
+ return k;
177
+ }
178
+ }
179
+ throw new Error('could not find percentile');
180
+ }
181
+ toString() {
182
+ const keys = [...this.map.keys()].sort((a, b) => a - b);
183
+ return `[${keys.map((k) => `[${k}, ${this.map.get(k)}]`).join(' ')}]`;
184
+ }
185
+ }
186
+ exports.Histogram = Histogram;
187
+ const getKeyTriplets = (prefix, count) => [...Array(count)].map((v, i) => [1, 2, 3].map((j) => utxo_lib_1.bip32.fromSeed(Buffer.alloc(16, `${prefix}/${i}/${j}`), utxolib.networks.bitcoin)));
188
+ /**
189
+ *
190
+ * Calls `callback` with a variety of signed txs, based on input parameters
191
+ * Callback arguments are
192
+ * inputType, inputCount, outputType, txs
193
+ * where `txs` implements `forEach()`
194
+ *
195
+ * @param inputTypes - input types to test
196
+ * @param nInputKeyTriplets - number of different input key triples to cycle through
197
+ * @param outputTypes - output types to test
198
+ * @param nOutputKeyTriplets - number of different output key triplets to cycle through
199
+ * @param callback
200
+ */
201
+ const runSignedTransactions = ({ inputTypes, nInputKeyTriplets, outputTypes, nOutputKeyTriplets, }, callback) => {
202
+ const inputKeyTriplets = getKeyTriplets('test/input/', nInputKeyTriplets);
203
+ const outputKeyTriplets = getKeyTriplets('test/output/', nOutputKeyTriplets);
204
+ const outputValue = 1e8;
205
+ inputTypes.forEach(({ inputType, count: inputCount }) => {
206
+ const inputTxs = inputKeyTriplets.map((inputKeys) => {
207
+ const unspents = [...Array(inputCount)].map(() => createUnspent(inputKeys.map((key) => key.publicKey), inputType, outputValue));
208
+ const inputTx = createInputTx(unspents, outputValue);
209
+ return { inputKeys, unspents, inputTx };
210
+ });
211
+ outputTypes.forEach((outputType) => {
212
+ const outputs = outputKeyTriplets.map((outputKeys) => (0, exports.createScriptPubKey)(outputKeys, outputType));
213
+ const txs = {
214
+ forEach(cb) {
215
+ inputTxs.forEach(({ inputKeys, unspents, inputTx }) => {
216
+ outputs.forEach((scriptPubKey) => {
217
+ const txBuilder = utxolib.bitgo.createTransactionBuilderForNetwork(utxolib.networks.bitcoin);
218
+ inputTx.outs.forEach((v, i) => txBuilder.addInput(inputTx, i));
219
+ txBuilder.addOutput(scriptPubKey, outputValue);
220
+ unspents.forEach((unspent, i) => {
221
+ signInput(txBuilder, i, inputKeys, unspent);
222
+ });
223
+ cb(txBuilder.build());
224
+ });
225
+ });
226
+ },
227
+ };
228
+ callback(inputType, inputCount, outputType, txs);
229
+ });
230
+ });
231
+ };
232
+ exports.runSignedTransactions = runSignedTransactions;
233
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhHZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3NpZ25lZFR4L3R4R2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxzREFBc0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUV0RCw4REFBZ0Q7QUFDaEQsbURBQTZEO0FBQzdELG9EQUF1QjtBQUN2QiwrQkFBNkI7QUFDN0IsbUNBQXVDO0FBQ3ZDLDRDQU9zQjtBQVV0QixTQUFTLGFBQWEsQ0FBQyxPQUFpQixFQUFFLFNBQWlCLEVBQUUsS0FBYTtJQUN4RSxJQUFJLGVBQWUsQ0FBQztJQUNwQixNQUFNLFVBQVUsR0FBRyxTQUFTLEtBQUsscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2xGLElBQUksVUFBVSxLQUFLLCtCQUFtQixFQUFFLENBQUM7UUFDdkMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7U0FBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDcEUsZUFBZSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM1RixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELE9BQU87UUFDTCxHQUFHLGVBQWU7UUFDbEIsS0FBSztRQUNMLFNBQVMsRUFBRSxVQUFVO0tBQ3RCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0ksTUFBTSxrQkFBa0IsR0FBRyxDQUFDLElBQXNCLEVB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LENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7NEJBQzdGLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDNUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7NEJBQy9DLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0NBQzlCLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQzs0QkFDOUMsQ0FBQyxDQUFDLENBQUM7NEJBRUgsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO3dCQUN4QixDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2FBQ0YsQ0FBQztZQUVGLFFBQVEsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRTRDLHNEQUFxQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudCAqL1xuXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGJpcDMyLCBCSVAzMkludGVyZmFjZSB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgJ2xvZGFzaC5jb21iaW5hdGlvbnMnO1xuaW1wb3J0IHsgRGltZW5zaW9ucyB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQge1xuICBJbnB1dFNjcmlwdFR5cGUsXG4gIFRlc3RVbnNwZW50VHlwZSxcbiAgVW5zcGVudFR5cGVPcFJldHVybixcbiAgVW5zcGVudFR5cGVQMnNoUDJwayxcbiAgVW5zcGVudFR5cGVQdWJLZXlIYXNoLFxuICBVbnNwZW50VHlwZVNjcmlwdDJvZjMsXG59IGZyb20gJy4uL3Rlc3R1dGlscyc7XG5cbmludGVyZmFjZSBJVW5zcGVudCB7XG4gIHNjcmlwdFB1YktleTogQnVmZmVyO1xuICByZWRlZW1TY3JpcHQ/OiBCdWZmZXI7XG4gIHdpdG5lc3NTY3JpcHQ/OiBCdWZmZXI7XG4gIHZhbHVlOiBudW1iZXI7XG4gIGlucHV0VHlwZTogdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLlNjcmlwdFR5cGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVVuc3BlbnQocHVia2V5czogQnVmZmVyW10sIGlucHV0VHlwZTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKTogSVVuc3BlbnQge1xuICBsZXQgc3BlbmRhYmxlU2NyaXB0O1xuICBjb25zdCBzY3JpcHRUeXBlID0gaW5wdXRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcgPyAncDJ0ck11c2lnMicgOiBpbnB1dFR5cGU7XG4gIGlmIChzY3JpcHRUeXBlID09PSBVbnNwZW50VHlwZVAyc2hQMnBrKSB7XG4gICAgc3BlbmRhYmxlU2NyaXB0ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdFAyc2hQMnBrKHB1YmtleXNbMF0pO1xuICB9IGVsc2UgaWYgKHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5pc1NjcmlwdFR5cGUyT2YzKHNjcmlwdFR5cGUpKSB7XG4gICAgc3BlbmRhYmxlU2NyaXB0ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMocHVia2V5cywgc2NyaXB0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIGlucHV0VHlwZSAke3NjcmlwdFR5cGV9YCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnNwZW5kYWJsZVNjcmlwdCxcbiAgICB2YWx1ZSxcbiAgICBpbnB1dFR5cGU6IHNjcmlwdFR5cGUsXG4gIH07XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBrZXlzIC0gUHVia2V5cyB0byB1c2UgZm9yIGdlbmVyYXRpbmcgdGhlIGFkZHJlc3MuXG4gKiAgICAgICAgICAgICAgIElmIHVuc3BlbnRUeXBlIGlzIG9uZSBvZiBVbnNwZW50VHlwZVB1YktleUhhc2ggaXMgdXNlZCwgdGhlIGZpcnN0IGtleSB3aWxsIGJlIHVzZWQuXG4gKiBAcGFyYW0gdW5zcGVudFR5cGUge1N0cmluZ30gLSBvbmUgb2YgVW5zcGVudFR5cGVTY3JpcHQyb2YzIG9yIFVuc3BlbnRUeXBlUHViS2V5SGFzaFxuICogQHJldHVybiB7U3RyaW5nfSBhZGRyZXNzXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVTY3JpcHRQdWJLZXkgPSAoa2V5czogQklQMzJJbnRlcmZhY2VbXSwgdW5zcGVudFR5cGU6IFRlc3RVbnNwZW50VHlwZSk6IEJ1ZmZlciA9PiB7XG4gIGNvbnN0IHB1YmtleXMgPSBrZXlzLm1hcCgoa2V5KSA9PiBrZXkucHVibGljS2V5KTtcbiAgaWYgKHR5cGVvZiB1bnNwZW50VHlwZSA9PT0gJ3N0cmluZycgJiYgdW5zcGVudFR5cGUgaW4gVW5zcGVudFR5cGVTY3JpcHQyb2YzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVVuc3BlbnQocHVia2V5cywgdW5zcGVudFR5cGUsIDApLnNjcmlwdFB1YktleTtcbiAgfVxuXG4gIGNvbnN0IHBrSGFzaCA9IHV0eG9saWIuY3J5cHRvLmhhc2gxNjAocHVia2V5c1swXSk7XG4gIHN3aXRjaCAodW5zcGVudFR5cGUpIHtcbiAgICBjYXNlIFVuc3BlbnRUeXBlUHViS2V5SGFzaC5wMnBraDpcbiAgICAgIHJldHVybiB1dHhvbGliLnBheW1lbnRzLnAycGtoKHsgaGFzaDogcGtIYXNoIH0pLm91dHB1dCE7XG4gICAgY2FzZSBVbnNwZW50VHlwZVB1YktleUhhc2gucDJ3cGtoOlxuICAgICAgcmV0dXJuIHV0eG9saWIucGF5bWVudHMucDJ3cGtoKHsgaGFzaDogcGtIYXNoIH0pLm91dHB1dCE7XG4gIH1cblxuICBpZiAodW5zcGVudFR5cGUgaW5zdGFuY2VvZiBVbnNwZW50VHlwZU9wUmV0dXJuKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5hbGxvYyh1bnNwZW50VHlwZS5zaXplKS5maWxsKHB1YmtleXNbMF0pO1xuICAgIHJldHVybiB1dHhvbGliLnNjcmlwdC5jb21waWxlKFsweDZhLCBwYXlsb2FkXSk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIG91dHB1dCB0eXBlICR7dW5zcGVudFR5cGV9YCk7XG59O1xuXG5jb25zdCBjcmVhdGVJbnB1dFR4ID0gKHVuc3BlbnRzOiBhbnlbXSwgaW5wdXRWYWx1ZTogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IHR4SW5wdXRCdWlsZGVyID0gbmV3IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uQnVpbGRlcih1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICB0eElucHV0QnVpbGRlci5hZGRJbnB1dChBcnJheSgzMikuZmlsbCgnMDEnKS5qb2luKCcnKSwgMCk7XG4gIHVuc3BlbnRzLmZvckVhY2goKHsgc2NyaXB0UHViS2V5IH0pID0+IHR4SW5wdXRCdWlsZGVyLmFkZE91dHB1dChzY3JpcHRQdWJLZXksIGlucHV0VmFsdWUpKTtcbiAgcmV0dXJuIHR4SW5wdXRCdWlsZGVyLmJ1aWxkSW5jb21wbGV0ZSgpO1xufTtcblxuZnVuY3Rpb24gc2lnbklucHV0KFxuICB0eEJ1aWxkZXI6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uQnVpbGRlcixcbiAgaW5kZXg6IG51bWJlcixcbiAgd2FsbGV0S2V5czogQklQMzJJbnRlcmZhY2VbXSxcbiAgdW5zcGVudDogSVVuc3BlbnQsXG4gIHNpZ25LZXlzOiBCSVAzMkludGVyZmFjZVtdID0gdW5zcGVudC5pbnB1dFR5cGUgPT09ICdwMnNoUDJwaycgPyBbd2FsbGV0S2V5c1swXV0gOiBbd2FsbGV0S2V5c1swXSwgd2FsbGV0S2V5c1syXV1cbikge1xuICBzaWduS2V5cy5mb3JFYWNoKChrZXlQYWlyKSA9PiB7XG4gICAgaWYgKHVuc3BlbnQuaW5wdXRUeXBlID09PSAncDJzaFAycGsnKSB7XG4gICAgICB1dHhvbGliLmJpdGdvLnNpZ25JbnB1dFAyc2hQMnBrKHR4QnVpbGRlciwgaW5kZXgsIGtleVBhaXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2lnbktleXMubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBzaWduS2V5cyBsZW5ndGhgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvc2lnbmVyID0ga2V5UGFpciA9PT0gc2lnbktleXNbMF0gPyBzaWduS2V5c1sxXSA6IHNpZ25LZXlzWzBdO1xuICAgICAgdXR4b2xpYi5iaXRnby5zaWduSW5wdXQyT2YzKFxuICAgICAgICB0eEJ1aWxkZXIsXG4gICAgICAgIGluZGV4LFxuICAgICAgICB1bnNwZW50LmlucHV0VHlwZSxcbiAgICAgICAgd2FsbGV0S2V5cy5tYXAoKGspID0+IGsucHVibGljS2V5KSBhcyB1dHhvbGliLmJpdGdvLlRyaXBsZTxCdWZmZXI+LFxuICAgICAgICBrZXlQYWlyLFxuICAgICAgICBjb3NpZ25lci5wdWJsaWNLZXksXG4gICAgICAgIHVuc3BlbnQudmFsdWVcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn1cblxuY2xhc3MgVHhDb21ibyB7XG4gIHB1YmxpYyB1bnNwZW50czogSVVuc3BlbnRbXTtcbiAgcHVibGljIGlucHV0VHg6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgd2FsbGV0S2V5czogQklQMzJJbnRlcmZhY2VbXSxcbiAgICBwdWJsaWMgaW5wdXRUeXBlczogc3RyaW5nW10sXG4gICAgcHVibGljIG91dHB1dFR5cGVzOiBUZXN0VW5zcGVudFR5cGVbXSxcbiAgICBwdWJsaWMgZXhwZWN0ZWREaW1zOiBSZWFkb25seTxEaW1lbnNpb25zPiA9IERpbWVuc2lvbnMuWkVSTyxcbiAgICBwdWJsaWMgc2lnbktleXM/OiBCSVAzMkludGVyZmFjZVtdLFxuICAgIHB1YmxpYyBpbnB1dFZhbHVlOiBudW1iZXIgPSAxMFxuICApIHtcbiAgICB0aGlzLnVuc3BlbnRzID0gaW5wdXRUeXBlcy5tYXAoKGlucHV0VHlwZSkgPT5cbiAgICAgIGNyZWF0ZVVuc3BlbnQoXG4gICAgICAgIHdhbGxldEtleXMubWFwKChrZXkpID0+IGtleS5wdWJsaWNLZXkpLFxuICAgICAgICBpbnB1dFR5cGUsXG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5pbnB1dFR4ID0gY3JlYXRlSW5wdXRUeCh0aGlzLnVuc3BlbnRzLCBpbnB1dFZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRCdWlsZGVyV2l0aFVuc2lnbmVkVHgoKTogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uQnVpbGRlckZvck5ldHdvcmsodXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKTtcbiAgICB0aGlzLmlucHV0VHgub3V0cy5mb3JFYWNoKCh7fSwgaTogbnVtYmVyKSA9PiB0eEJ1aWxkZXIuYWRkSW5wdXQodGhpcy5pbnB1dFR4LCBpKSk7XG4gICAgdGhpcy5vdXRwdXRUeXBlcy5mb3JFYWNoKCh1bnNwZW50VHlwZSkgPT5cbiAgICAgIHR4QnVpbGRlci5hZGRPdXRwdXQoY3JlYXRlU2NyaXB0UHViS2V5KHRoaXMud2FsbGV0S2V5cywgdW5zcGVudFR5cGUpLCB0aGlzLmlucHV0VmFsdWUpXG4gICAgKTtcbiAgICByZXR1cm4gdHhCdWlsZGVyO1xuICB9XG5cbiAgcHVibGljIGdldFVuc2lnbmVkVHgoKTogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLmdldEJ1aWxkZXJXaXRoVW5zaWduZWRUeCgpLmJ1aWxkSW5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGdldFNpZ25lZFR4KCk6IHV0eG9saWIuVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IHRoaXMuZ2V0QnVpbGRlcldpdGhVbnNpZ25lZFR4KCk7XG4gICAgdGhpcy51bnNwZW50cy5mb3JFYWNoKCh1bnNwZW50LCBpKSA9PiB7XG4gICAgICBzaWduSW5wdXQodHhCdWlsZGVyLCBpLCB0aGlzLndhbGxldEtleXMsIHVuc3BlbnQsIHRoaXMuc2lnbktleXMpO1xuICAgIH0pO1xuICAgIHJldHVybiB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgfVxufVxuXG5jb25zdCBydW5Db21iaW5hdGlvbnMgPSAoXG4gIHtcbiAgICBpbnB1dFR5cGVzLFxuICAgIG1heE5JbnB1dHMsXG4gICAgb3V0cHV0VHlwZXMsXG4gICAgbWF4Tk91dHB1dHMsXG4gIH06IHtcbiAgICBpbnB1dFR5cGVzOiBJbnB1dFNjcmlwdFR5cGVbXTtcbiAgICBtYXhOSW5wdXRzOiBudW1iZXI7XG4gICAgb3V0cHV0VHlwZXM6IFRlc3RVbnNwZW50VHlwZVtdO1xuICAgIG1heE5PdXRwdXRzOiBudW1iZXI7XG4gIH0sXG4gIGNhbGxiYWNrOiAoaW5wdXRDb21ibzogSW5wdXRTY3JpcHRUeXBlW10sIG91dHB1dENvbWJvOiBUZXN0VW5zcGVudFR5cGVbXSkgPT4gdm9pZFxuKTogdm9pZCA9PiB7XG4gIC8vIENyZWF0ZSBjb21iaW5hdGlvbnMgb2YgZGlmZmVyZW50IGlucHV0IGFuZCBvdXRwdXQgdHlwZXMuIExlbmd0aCBiZXR3ZWVuIDEgYW5kIDMuXG4gIGNvbnN0IGlucHV0Q29tYmluYXRpb25zID0gXy5mbGF0dGVuKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBbLi4uQXJyYXkobWF4TklucHV0cyldLm1hcCgoX18sIGkpID0+IF8uY29tYmluYXRpb25zKGlucHV0VHlwZXMsIGkgKyAxKSlcbiAgKTtcbiAgY29uc3Qgb3V0cHV0Q29tYmluYXRpb25zID0gXy5mbGF0dGVuKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBbLi4uQXJyYXkobWF4Tk91dHB1dHMpXS5tYXAoKF9fLCBpKSA9PiBfLmNvbWJpbmF0aW9ucyhvdXRwdXRUeXBlcywgaSArIDEpKVxuICApO1xuXG4gIGlucHV0Q29tYmluYXRpb25zLmZvckVhY2goKGlucHV0VHlwZUNvbWJvKSA9PlxuICAgIG91dHB1dENvbWJpbmF0aW9ucy5mb3JFYWNoKChvdXRwdXRUeXBlQ29tYm8pID0+IHtcbiAgICAgIGNhbGxiYWNrKGlucHV0VHlwZUNvbWJvLCBvdXRwdXRUeXBlQ29tYm8pO1xuICAgIH0pXG4gICk7XG59O1xuXG5jbGFzcyBIaXN0b2dyYW0ge1xuICBwdWJsaWMgdG90YWwgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtYXA6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwKCkpIHt9XG5cbiAgcHVibGljIGFkZChzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5zZXQoc2l6ZSwgKHRoaXMubWFwLmdldChzaXplKSB8fCAwKSArIDEpO1xuICAgIHRoaXMudG90YWwrKztcbiAgfVxuXG4gIHB1YmxpYyBhc1NvcnRlZEFycmF5KCk6IG51bWJlcltdW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5tYXAuZW50cmllcygpXS5zb3J0KChbYV0sIFtiXSkgPT4gYSAtIGIpO1xuICB9XG5cbiAgcHVibGljIGFzRnVsbFNvcnRlZEFycmF5KCk6IG51bWJlcltdW10ge1xuICAgIHJldHVybiBfLnJhbmdlKHRoaXMuZ2V0UGVyY2VudGlsZSgwKSwgdGhpcy5nZXRQZXJjZW50aWxlKDEpKS5tYXAoKHYpID0+IFt2LCB0aGlzLm1hcC5nZXQodikgfHwgMF0pO1xuICB9XG5cbiAgcHVibGljIGdldFBlcmNlbnRpbGUocDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoMCA+IHAgfHwgcCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMWApO1xuICAgIH1cblxuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIHRoaXMuYXNTb3J0ZWRBcnJheSgpKSB7XG4gICAgICBzdW0gKz0gdjtcbiAgICAgIGlmIChzdW0gLyB0aGlzLnRvdGFsID49IHApIHtcbiAgICAgICAgcmV0dXJuIGs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCBwZXJjZW50aWxlJyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBrZXlzID0gWy4uLnRoaXMubWFwLmtleXMoKV0uc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgIHJldHVybiBgWyR7a2V5cy5tYXAoKGspID0+IGBbJHtrfSwgJHt0aGlzLm1hcC5nZXQoayl9XWApLmpvaW4oJyAnKX1dYDtcbiAgfVxufVxuXG5jb25zdCBnZXRLZXlUcmlwbGV0cyA9IChwcmVmaXg6IHN0cmluZywgY291bnQ6IG51bWJlcikgPT5cbiAgWy4uLkFycmF5KGNvdW50KV0ubWFwKCh2LCBpKSA9PlxuICAgIFsxLCAyLCAzXS5tYXAoKGopID0+IGJpcDMyLmZyb21TZWVkKEJ1ZmZlci5hbGxvYygxNiwgYCR7cHJlZml4fS8ke2l9LyR7an1gKSwgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKSlcbiAgKTtcblxuLyoqXG4gKlxuICogQ2FsbHMgYGNhbGxiYWNrYCB3aXRoIGEgdmFyaWV0eSBvZiBzaWduZWQgdHhzLCBiYXNlZCBvbiBpbnB1dCBwYXJhbWV0ZXJzXG4gKiBDYWxsYmFjayBhcmd1bWVudHMgYXJlXG4gKiAgIGlucHV0VHlwZSwgaW5wdXRDb3VudCwgb3V0cHV0VHlwZSwgdHhzXG4gKiAgd2hlcmUgYHR4c2AgaW1wbGVtZW50cyBgZm9yRWFjaCgpYFxuICpcbiAqIEBwYXJhbSBpbnB1dFR5cGVzIC0gaW5wdXQgdHlwZXMgdG8gdGVzdFxuICogQHBhcmFtIG5JbnB1dEtleVRyaXBsZXRzIC0gbnVtYmVyIG9mIGRpZmZlcmVudCBpbnB1dCBrZXkgdHJpcGxlcyB0byBjeWNsZSB0aHJvdWdoXG4gKiBAcGFyYW0gb3V0cHV0VHlwZXMgLSBvdXRwdXQgdHlwZXMgdG8gdGVzdFxuICogQHBhcmFtIG5PdXRwdXRLZXlUcmlwbGV0cyAtIG51bWJlciBvZiBkaWZmZXJlbnQgb3V0cHV0IGtleSB0cmlwbGV0cyB0byBjeWNsZSB0aHJvdWdoXG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqL1xuY29uc3QgcnVuU2lnbmVkVHJhbnNhY3Rpb25zID0gKFxuICB7XG4gICAgaW5wdXRUeXBlcyxcbiAgICBuSW5wdXRLZXlUcmlwbGV0cyxcbiAgICBvdXRwdXRUeXBlcyxcbiAgICBuT3V0cHV0S2V5VHJpcGxldHMsXG4gIH06IHtcbiAgICBpbnB1dFR5cGVzOiBBcnJheTx7IGlucHV0VHlwZTogc3RyaW5nOyBjb3VudDogbnVtYmVyIH0+O1xuICAgIG5JbnB1dEtleVRyaXBsZXRzOiBudW1iZXI7XG4gICAgb3V0cHV0VHlwZXM6IFRlc3RVbnNwZW50VHlwZVtdO1xuICAgIG5PdXRwdXRLZXlUcmlwbGV0czogbnVtYmVyO1xuICB9LFxuICBjYWxsYmFjazogKGlucHV0VHlwZTogc3RyaW5nLCBpbnB1dENvdW50OiBudW1iZXIsIG91dHB1dFR5cGU6IFRlc3RVbnNwZW50VHlwZSwgdHhzOiBhbnkpID0+IHZvaWRcbik6IHZvaWQgPT4ge1xuICBjb25zdCBpbnB1dEtleVRyaXBsZXRzID0gZ2V0S2V5VHJpcGxldHMoJ3Rlc3QvaW5wdXQvJywgbklucHV0S2V5VHJpcGxldHMpO1xuICBjb25zdCBvdXRwdXRLZXlUcmlwbGV0cyA9IGdldEtleVRyaXBsZXRzKCd0ZXN0L291dHB1dC8nLCBuT3V0cHV0S2V5VHJpcGxldHMpO1xuICBjb25zdCBvdXRwdXRWYWx1ZSA9IDFlODtcblxuICBpbnB1dFR5cGVzLmZvckVhY2goKHsgaW5wdXRUeXBlLCBjb3VudDogaW5wdXRDb3VudCB9KSA9PiB7XG4gICAgY29uc3QgaW5wdXRUeHMgPSBpbnB1dEtleVRyaXBsZXRzLm1hcCgoaW5wdXRLZXlzKSA9PiB7XG4gICAgICBjb25zdCB1bnNwZW50cyA9IFsuLi5BcnJheShpbnB1dENvdW50KV0ubWFwKCgpID0+XG4gICAgICAgIGNyZWF0ZVVuc3BlbnQoXG4gICAgICAgICAgaW5wdXRLZXlzLm1hcCgoa2V5KSA9PiBrZXkucHVibGljS2V5KSxcbiAgICAgICAgICBpbnB1dFR5cGUsXG4gICAgICAgICAgb3V0cHV0VmFsdWVcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlucHV0VHggPSBjcmVhdGVJbnB1dFR4KHVuc3BlbnRzLCBvdXRwdXRWYWx1ZSk7XG4gICAgICByZXR1cm4geyBpbnB1dEtleXMsIHVuc3BlbnRzLCBpbnB1dFR4IH07XG4gICAgfSk7XG5cbiAgICBvdXRwdXRUeXBlcy5mb3JFYWNoKChvdXRwdXRUeXBlKSA9PiB7XG4gICAgICBjb25zdCBvdXRwdXRzID0gb3V0cHV0S2V5VHJpcGxldHMubWFwKChvdXRwdXRLZXlzKSA9PiBjcmVhdGVTY3JpcHRQdWJLZXkob3V0cHV0S2V5cywgb3V0cHV0VHlwZSkpO1xuXG4gICAgICBjb25zdCB0eHMgPSB7XG4gICAgICAgIGZvckVhY2goY2I6ICh0eDogdXR4b2xpYi5UcmFuc2FjdGlvbikgPT4gdm9pZCkge1xuICAgICAgICAgIGlucHV0VHhzLmZvckVhY2goKHsgaW5wdXRLZXlzLCB1bnNwZW50cywgaW5wdXRUeCB9KSA9PiB7XG4gICAgICAgICAgICBvdXRwdXRzLmZvckVhY2goKHNjcmlwdFB1YktleSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uQnVpbGRlckZvck5ldHdvcmsodXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKTtcbiAgICAgICAgICAgICAgaW5wdXRUeC5vdXRzLmZvckVhY2goKHY6IGFueSwgaTogbnVtYmVyKSA9PiB0eEJ1aWxkZXIuYWRkSW5wdXQoaW5wdXRUeCwgaSkpO1xuICAgICAgICAgICAgICB0eEJ1aWxkZXIuYWRkT3V0cHV0KHNjcmlwdFB1YktleSwgb3V0cHV0VmFsdWUpO1xuICAgICAgICAgICAgICB1bnNwZW50cy5mb3JFYWNoKCh1bnNwZW50LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgc2lnbklucHV0KHR4QnVpbGRlciwgaSwgaW5wdXRLZXlzLCB1bnNwZW50KTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY2IodHhCdWlsZGVyLmJ1aWxkKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjYWxsYmFjayhpbnB1dFR5cGUsIGlucHV0Q291bnQsIG91dHB1dFR5cGUsIHR4cyk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuZXhwb3J0IHsgVHhDb21ibywgSGlzdG9ncmFtLCBydW5Db21iaW5hdGlvbnMsIHJ1blNpZ25lZFRyYW5zYWN0aW9ucyB9O1xuIl19
@@ -0,0 +1,36 @@
1
+ import * as unspents from '../src';
2
+ import * as utxolib from '@bitgo-beta/utxo-lib';
3
+ export declare const UnspentTypeP2shP2pk = "p2shP2pk";
4
+ export declare const UnspentTypeScript2of3: {
5
+ p2sh: string;
6
+ p2shP2wsh: string;
7
+ p2wsh: string;
8
+ p2tr: string;
9
+ p2trMusig2: string;
10
+ taprootKeyPathSpend: string;
11
+ };
12
+ export declare const UnspentTypePubKeyHash: {
13
+ p2pkh: 'p2pkh';
14
+ p2wpkh: 'p2wpkh';
15
+ };
16
+ export type TestUnspentType = string | UnspentTypeOpReturn;
17
+ export declare class UnspentTypeOpReturn {
18
+ size: number;
19
+ constructor(size: number);
20
+ toString(): string;
21
+ }
22
+ export type InputScriptType = utxolib.bitgo.outputScripts.ScriptType | 'taprootKeyPathSpend';
23
+ export declare function getInputScriptTypes(): InputScriptType[];
24
+ /**
25
+ * Return the input dimensions based on unspent type
26
+ * @param unspentType - one of UnspentTypeScript2of3
27
+ * @return Dimensions
28
+ */
29
+ export declare const getInputDimensionsForUnspentType: (unspentType: TestUnspentType) => unspents.Dimensions;
30
+ export declare const getOutputDimensionsForUnspentType: (unspentType: TestUnspentType) => unspents.Dimensions;
31
+ export declare function constructPsbt(keys: utxolib.bitgo.RootWalletKeys, inputTypes: InputScriptType[], outputTypes: TestUnspentType[], signatureStatus: 'unsigned' | 'halfsigned' | 'fullysigned', signers?: {
32
+ signerName: utxolib.bitgo.KeyName;
33
+ cosignerName: utxolib.bitgo.KeyName;
34
+ }): utxolib.bitgo.UtxoPsbt<utxolib.bitgo.UtxoTransaction<bigint>>;
35
+ export declare function getSignedTransaction(keys: utxolib.bitgo.RootWalletKeys, signerName: utxolib.bitgo.KeyName, cosignerName: utxolib.bitgo.KeyName, inputTypes: InputScriptType[], outputTypes: TestUnspentType[]): utxolib.bitgo.UtxoTransaction;
36
+ //# sourceMappingURL=testutils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testutils.d.ts","sourceRoot":"","sources":["../../test/testutils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAYhD,eAAO,MAAM,mBAAmB,aAAa,CAAC;AAG9C,eAAO,MAAM,qBAAqB,EAAE;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;CACyD,CAAC;AAExF,eAAO,MAAM,qBAAqB,EAAE;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,QAAQ,CAAC;CACY,CAAC;AAEhC,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,mBAAmB,CAAC;AAE3D,qBAAa,mBAAmB;IACX,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;IAExB,QAAQ,IAAI,MAAM;CAG1B;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU,GAAG,qBAAqB,CAAC;AAE7F,wBAAgB,mBAAmB,IAAI,eAAe,EAAE,CAEvD;AAED;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,gBAAiB,eAAe,KAAG,QAAQ,CAAC,UAiBxF,CAAC;AAEF,eAAO,MAAM,iCAAiC,gBAAiB,eAAe,KAAG,QAAQ,CAAC,UAuBzF,CAAC;AAkBF,wBAAgB,aAAa,CAC3B,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,cAAc,EAClC,UAAU,EAAE,eAAe,EAAE,EAC7B,WAAW,EAAE,eAAe,EAAE,EAC9B,eAAe,EAAE,UAAU,GAAG,YAAY,GAAG,aAAa,EAC1D,OAAO,CAAC,EAAE;IAAE,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAA;CAAE,GACnF,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAwD/D;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,cAAc,EAClC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,EACjC,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,EACnC,UAAU,EAAE,eAAe,EAAE,EAC7B,WAAW,EAAE,eAAe,EAAE,GAC7B,OAAO,CAAC,KAAK,CAAC,eAAe,CAI/B"}
@@ -0,0 +1,190 @@
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
+ exports.getOutputDimensionsForUnspentType = exports.getInputDimensionsForUnspentType = exports.UnspentTypeOpReturn = exports.UnspentTypePubKeyHash = exports.UnspentTypeScript2of3 = exports.UnspentTypeP2shP2pk = void 0;
40
+ exports.getInputScriptTypes = getInputScriptTypes;
41
+ exports.constructPsbt = constructPsbt;
42
+ exports.getSignedTransaction = getSignedTransaction;
43
+ const unspents = __importStar(require("../src"));
44
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
45
+ const assert_1 = __importDefault(require("assert"));
46
+ const txGen_1 = require("./signedTx/txGen");
47
+ /**
48
+ * makeEnum('a', 'b') returns `{ a: 'a', b: 'b' }`
49
+ *
50
+ * @param args
51
+ * @return map with string keys and symbol values
52
+ */
53
+ const makeEnum = (...args) => args.reduce((obj, key) => Object.assign(obj, { [key]: key }), {});
54
+ exports.UnspentTypeP2shP2pk = 'p2shP2pk';
55
+ // p2trMusig2 is assumed to be script path only. taprootKeyPathSpend is for p2trMusig2 key path
56
+ exports.UnspentTypeScript2of3 = makeEnum('p2sh', 'p2shP2wsh', 'p2wsh', 'p2tr', 'p2trMusig2', 'taprootKeyPathSpend');
57
+ exports.UnspentTypePubKeyHash = makeEnum('p2pkh', 'p2wpkh');
58
+ class UnspentTypeOpReturn {
59
+ constructor(size) {
60
+ this.size = size;
61
+ }
62
+ toString() {
63
+ return `opReturn(${this.size})`;
64
+ }
65
+ }
66
+ exports.UnspentTypeOpReturn = UnspentTypeOpReturn;
67
+ function getInputScriptTypes() {
68
+ return [...utxolib.bitgo.outputScripts.scriptTypes2Of3, 'p2shP2pk', 'taprootKeyPathSpend'];
69
+ }
70
+ /**
71
+ * Return the input dimensions based on unspent type
72
+ * @param unspentType - one of UnspentTypeScript2of3
73
+ * @return Dimensions
74
+ */
75
+ const getInputDimensionsForUnspentType = (unspentType) => {
76
+ switch (unspentType) {
77
+ case exports.UnspentTypeScript2of3.p2sh:
78
+ return unspents.Dimensions.sum({ nP2shInputs: 1 });
79
+ case exports.UnspentTypeScript2of3.p2shP2wsh:
80
+ return unspents.Dimensions.sum({ nP2shP2wshInputs: 1 });
81
+ case exports.UnspentTypeScript2of3.p2wsh:
82
+ return unspents.Dimensions.sum({ nP2wshInputs: 1 });
83
+ case exports.UnspentTypeScript2of3.p2tr:
84
+ case exports.UnspentTypeScript2of3.p2trMusig2:
85
+ return unspents.Dimensions.sum({ nP2trScriptPathLevel1Inputs: 1 });
86
+ case exports.UnspentTypeScript2of3.taprootKeyPathSpend:
87
+ return unspents.Dimensions.sum({ nP2trKeypathInputs: 1 });
88
+ case exports.UnspentTypeP2shP2pk:
89
+ return unspents.Dimensions.sum({ nP2shP2pkInputs: 1 });
90
+ }
91
+ throw new Error(`no input dimensions for ${unspentType}`);
92
+ };
93
+ exports.getInputDimensionsForUnspentType = getInputDimensionsForUnspentType;
94
+ const getOutputDimensionsForUnspentType = (unspentType) => {
95
+ /* The values here are validated in the test 'calculates output dimensions dynamically' */
96
+ switch (unspentType) {
97
+ case exports.UnspentTypeScript2of3.p2sh:
98
+ case exports.UnspentTypeScript2of3.p2shP2wsh:
99
+ case exports.UnspentTypeP2shP2pk:
100
+ return unspents.Dimensions.fromOutputScriptLength(23);
101
+ case exports.UnspentTypeScript2of3.p2wsh:
102
+ return unspents.Dimensions.fromOutputScriptLength(34);
103
+ case exports.UnspentTypeScript2of3.p2tr:
104
+ case exports.UnspentTypeScript2of3.p2trMusig2:
105
+ case exports.UnspentTypeScript2of3.taprootKeyPathSpend:
106
+ return unspents.Dimensions.fromOutputScriptLength(34);
107
+ case exports.UnspentTypePubKeyHash.p2pkh:
108
+ return unspents.Dimensions.fromOutputScriptLength(25);
109
+ case exports.UnspentTypePubKeyHash.p2wpkh:
110
+ return unspents.Dimensions.fromOutputScriptLength(22);
111
+ default:
112
+ if (unspentType instanceof UnspentTypeOpReturn) {
113
+ return unspents.Dimensions.fromOutputScriptLength(1 + unspentType.size);
114
+ }
115
+ throw new TypeError(`unknown unspentType ${unspentType}`);
116
+ }
117
+ };
118
+ exports.getOutputDimensionsForUnspentType = getOutputDimensionsForUnspentType;
119
+ function getDefaultSignerNames(inputType, signers) {
120
+ if (signers) {
121
+ return [signers.signerName, signers.cosignerName];
122
+ }
123
+ if (inputType === 'p2shP2pk') {
124
+ return ['user'];
125
+ }
126
+ if (inputType === 'p2trMusig2') {
127
+ return ['user', 'backup'];
128
+ }
129
+ return ['user', 'bitgo'];
130
+ }
131
+ function constructPsbt(keys, inputTypes, outputTypes, signatureStatus, signers) {
132
+ const psbt = utxolib.bitgo.createPsbtForNetwork({ network: utxolib.networks.bitcoin });
133
+ inputTypes.forEach((t, i) => {
134
+ if (t === 'p2shP2pk') {
135
+ const signer = keys[getDefaultSignerNames(t, signers)[0]];
136
+ const unspent = utxolib.testutil.mockReplayProtectionUnspent(utxolib.networks.bitcoin, BigInt(10), {
137
+ key: signer,
138
+ vout: i,
139
+ });
140
+ const { redeemScript } = utxolib.bitgo.outputScripts.createOutputScriptP2shP2pk(signer.publicKey);
141
+ assert_1.default.ok(redeemScript);
142
+ utxolib.bitgo.addReplayProtectionUnspentToPsbt(psbt, unspent, redeemScript);
143
+ }
144
+ else {
145
+ const unspent = utxolib.testutil.mockWalletUnspent(utxolib.networks.bitcoin, BigInt(10), {
146
+ keys,
147
+ chain: utxolib.bitgo.getExternalChainCode(t === 'taprootKeyPathSpend' ? 'p2trMusig2' : t),
148
+ vout: i,
149
+ index: i,
150
+ });
151
+ const signerNames = getDefaultSignerNames(t, signers);
152
+ utxolib.bitgo.addWalletUnspentToPsbt(psbt, unspent, keys, signerNames[0], signerNames[1]);
153
+ }
154
+ });
155
+ outputTypes.forEach((t, index) => {
156
+ psbt.addOutput({
157
+ script: (0, txGen_1.createScriptPubKey)(keys.triple, t),
158
+ value: BigInt(10),
159
+ });
160
+ });
161
+ if (signatureStatus === 'unsigned') {
162
+ return psbt;
163
+ }
164
+ psbt.setAllInputsMusig2NonceHD(keys['user']);
165
+ psbt.setAllInputsMusig2NonceHD(keys['bitgo']);
166
+ inputTypes.forEach((t, i) => {
167
+ const signerNames = getDefaultSignerNames(t, signers);
168
+ if (t === 'p2shP2pk') {
169
+ if (signatureStatus === 'fullysigned') {
170
+ psbt.signInput(i, keys[signerNames[0]]);
171
+ }
172
+ }
173
+ else {
174
+ psbt.signInputHD(i, keys[signerNames[0]]);
175
+ if (signatureStatus === 'fullysigned') {
176
+ psbt.signInputHD(i, keys[signerNames[1]]);
177
+ }
178
+ }
179
+ });
180
+ if (signatureStatus === 'fullysigned') {
181
+ assert_1.default.ok(psbt.validateSignaturesOfAllInputs());
182
+ }
183
+ return psbt;
184
+ }
185
+ function getSignedTransaction(keys, signerName, cosignerName, inputTypes, outputTypes) {
186
+ const psbt = constructPsbt(keys, inputTypes, outputTypes, 'fullysigned', { signerName, cosignerName });
187
+ psbt.finalizeAllInputs();
188
+ return psbt.extractTransaction().clone('number');
189
+ }
190
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdHV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC90ZXN0dXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMENBLGtEQUVDO0FBbUVELHNDQThEQztBQUVELG9EQVVDO0FBekxELGlEQUFtQztBQUNuQyw4REFBZ0Q7QUFDaEQsb0RBQTRCO0FBQzVCLDRDQUFzRDtBQUV0RDs7Ozs7R0FLRztBQUNILE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFjLEVBQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUVsRyxRQUFBLG1CQUFtQixHQUFHLFVBQVUsQ0FBQztBQUU5QywrRkFBK0Y7QUFDbEYsUUFBQSxxQkFBcUIsR0FPOUIsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUscUJBQXFCLENBQUMsQ0FBQztBQUUzRSxRQUFBLHFCQUFxQixHQUc5QixRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBSWhDLE1BQWEsbUJBQW1CO0lBQzlCLFlBQW1CLElBQVk7UUFBWixTQUFJLEdBQUosSUFBSSxDQUFRO0lBQUcsQ0FBQztJQUU1QixRQUFRO1FBQ2IsT0FBTyxZQUFZLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUNsQyxDQUFDO0NBQ0Y7QUFORCxrREFNQztBQUlELFNBQWdCLG1CQUFtQjtJQUNqQyxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixD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RTlCLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUN2RyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUN6QixPQUFRLElBQUksQ0FBQyxrQkFBa0IsRUFBNEMsQ0FBQyxLQUFLLENBQVMsUUFBUSxDQUFDLENBQUM7QUFDdEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHVuc3BlbnRzIGZyb20gJy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGNyZWF0ZVNjcmlwdFB1YktleSB9IGZyb20gJy4vc2lnbmVkVHgvdHhHZW4nO1xuXG4vKipcbiAqIG1ha2VFbnVtKCdhJywgJ2InKSByZXR1cm5zIGB7IGE6ICdhJywgYjogJ2InIH1gXG4gKlxuICogQHBhcmFtIGFyZ3NcbiAqIEByZXR1cm4gbWFwIHdpdGggc3RyaW5nIGtleXMgYW5kIHN5bWJvbCB2YWx1ZXNcbiAqL1xuY29uc3QgbWFrZUVudW0gPSAoLi4uYXJnczogc3RyaW5nW10pOiBhbnkgPT4gYXJncy5yZWR1Y2UoKG9iaiwga2V5KSA9PiBPYmplY3QuYXNzaWduKG9iaiwgeyBba2V5XToga2V5IH0pLCB7fSk7XG5cbmV4cG9ydCBjb25zdCBVbnNwZW50VHlwZVAyc2hQMnBrID0gJ3Ayc2hQMnBrJztcblxuLy8gcDJ0ck11c2lnMiBpcyBhc3N1bWVkIHRvIGJlIHNjcmlwdCBwYXRoIG9ubHkuIHRhcHJvb3RLZXlQYXRoU3BlbmQgaXMgZm9yIHAydHJNdXNpZzIga2V5IHBhdGhcbmV4cG9ydCBjb25zdCBVbnNwZW50VHlwZVNjcmlwdDJvZjM6IHtcbiAgcDJzaDogc3RyaW5nO1xuICBwMnNoUDJ3c2g6IHN0cmluZztcbiAgcDJ3c2g6IHN0cmluZztcbiAgcDJ0cjogc3RyaW5nO1xuICBwMnRyTXVzaWcyOiBzdHJpbmc7XG4gIHRhcHJvb3RLZXlQYXRoU3BlbmQ6IHN0cmluZztcbn0gPSBtYWtlRW51bSgncDJzaCcsICdwMnNoUDJ3c2gnLCAncDJ3c2gnLCAncDJ0cicsICdwMnRyTXVzaWcyJywgJ3RhcHJvb3RLZXlQYXRoU3BlbmQnKTtcblxuZXhwb3J0IGNvbnN0IFVuc3BlbnRUeXBlUHViS2V5SGFzaDoge1xuICBwMnBraDogJ3AycGtoJztcbiAgcDJ3cGtoOiAncDJ3cGtoJztcbn0gPSBtYWtlRW51bSgncDJwa2gnLCAncDJ3cGtoJyk7XG5cbmV4cG9ydCB0eXBlIFRlc3RVbnNwZW50VHlwZSA9IHN0cmluZyB8IFVuc3BlbnRUeXBlT3BSZXR1cm47XG5cbmV4cG9ydCBjbGFzcyBVbnNwZW50VHlwZU9wUmV0dXJuIHtcbiAgY29uc3RydWN0b3IocHVibGljIHNpemU6IG51bWJlcikge31cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG9wUmV0dXJuKCR7dGhpcy5zaXplfSlgO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIElucHV0U2NyaXB0VHlwZSA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5TY3JpcHRUeXBlIHwgJ3RhcHJvb3RLZXlQYXRoU3BlbmQnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5wdXRTY3JpcHRUeXBlcygpOiBJbnB1dFNjcmlwdFR5cGVbXSB7XG4gIHJldHVybiBbLi4udXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLnNjcmlwdFR5cGVzMk9mMywgJ3Ayc2hQMnBrJywgJ3RhcHJvb3RLZXlQYXRoU3BlbmQnXTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIGlucHV0IGRpbWVuc2lvbnMgYmFzZWQgb24gdW5zcGVudCB0eXBlXG4gKiBAcGFyYW0gdW5zcGVudFR5cGUgLSBvbmUgb2YgVW5zcGVudFR5cGVTY3JpcHQyb2YzXG4gKiBAcmV0dXJuIERpbWVuc2lvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldElucHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlID0gKHVuc3BlbnRUeXBlOiBUZXN0VW5zcGVudFR5cGUpOiB1bnNwZW50cy5EaW1lbnNpb25zID0+IHtcbiAgc3dpdGNoICh1bnNwZW50VHlwZSkge1xuICAgIGNhc2UgVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAyc2g6XG4gICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5zdW0oeyBuUDJzaElucHV0czogMSB9KTtcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMnNoUDJ3c2g6XG4gICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5zdW0oeyBuUDJzaFAyd3NoSW5wdXRzOiAxIH0pO1xuICAgIGNhc2UgVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAyd3NoOlxuICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuc3VtKHsgblAyd3NoSW5wdXRzOiAxIH0pO1xuICAgIGNhc2UgVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAydHI6XG4gICAgY2FzZSBVbnNwZW50VHlwZVNjcmlwdDJvZjMucDJ0ck11c2lnMjpcbiAgICAgIHJldHVybiB1bnNwZW50cy5EaW1lbnNpb25zLnN1bSh7IG5QMnRyU2NyaXB0UGF0aExldmVsMUlucHV0czogMSB9KTtcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy50YXByb290S2V5UGF0aFNwZW5kOlxuICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuc3VtKHsgblAydHJLZXlwYXRoSW5wdXRzOiAxIH0pO1xuICAgIGNhc2UgVW5zcGVudFR5cGVQMnNoUDJwazpcbiAgICAgIHJldHVybiB1bnNwZW50cy5EaW1lbnNpb25zLnN1bSh7IG5QMnNoUDJwa0lucHV0czogMSB9KTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYG5vIGlucHV0IGRpbWVuc2lvbnMgZm9yICR7dW5zcGVudFR5cGV9YCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0T3V0cHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlID0gKHVuc3BlbnRUeXBlOiBUZXN0VW5zcGVudFR5cGUpOiB1bnNwZW50cy5EaW1lbnNpb25zID0+IHtcbiAgLyogVGhlIHZhbHVlcyBoZXJlIGFyZSB2YWxpZGF0ZWQgaW4gdGhlIHRlc3QgJ2NhbGN1bGF0ZXMgb3V0cHV0IGRpbWVuc2lvbnMgZHluYW1pY2FsbHknICovXG4gIHN3aXRjaCAodW5zcGVudFR5cGUpIHtcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMnNoOlxuICAgIGNhc2UgVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAyc2hQMndzaDpcbiAgICBjYXNlIFVuc3BlbnRUeXBlUDJzaFAycGs6XG4gICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5mcm9tT3V0cHV0U2NyaXB0TGVuZ3RoKDIzKTtcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMndzaDpcbiAgICAgIHJldHVybiB1bnNwZW50cy5EaW1lbnNpb25zLmZyb21PdXRwdXRTY3JpcHRMZW5ndGgoMzQpO1xuICAgIGNhc2UgVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAydHI6XG4gICAgY2FzZSBVbnNwZW50VHlwZVNjcmlwdDJvZjMucDJ0ck11c2lnMjpcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy50YXByb290S2V5UGF0aFNwZW5kOlxuICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuZnJvbU91dHB1dFNjcmlwdExlbmd0aCgzNCk7XG4gICAgY2FzZSBVbnNwZW50VHlwZVB1YktleUhhc2gucDJwa2g6XG4gICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5mcm9tT3V0cHV0U2NyaXB0TGVuZ3RoKDI1KTtcbiAgICBjYXNlIFVuc3BlbnRUeXBlUHViS2V5SGFzaC5wMndwa2g6XG4gICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5mcm9tT3V0cHV0U2NyaXB0TGVuZ3RoKDIyKTtcbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKHVuc3BlbnRUeXBlIGluc3RhbmNlb2YgVW5zcGVudFR5cGVPcFJldHVybikge1xuICAgICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5mcm9tT3V0cHV0U2NyaXB0TGVuZ3RoKDEgKyB1bnNwZW50VHlwZS5zaXplKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYHVua25vd24gdW5zcGVudFR5cGUgJHt1bnNwZW50VHlwZX1gKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFNpZ25lck5hbWVzKFxuICBpbnB1dFR5cGU6IElucHV0U2NyaXB0VHlwZSxcbiAgc2lnbmVycz86IHsgc2lnbmVyTmFtZTogdXR4b2xpYi5iaXRnby5LZXlOYW1lOyBjb3NpZ25lck5hbWU6IHV0eG9saWIuYml0Z28uS2V5TmFtZSB9XG4pOiB1dHhvbGliLmJpdGdvLktleU5hbWVbXSB7XG4gIGlmIChzaWduZXJzKSB7XG4gICAgcmV0dXJuIFtzaWduZXJzLnNpZ25lck5hbWUsIHNpZ25lcnMuY29zaWduZXJOYW1lXTtcbiAgfVxuICBpZiAoaW5wdXRUeXBlID09PSAncDJzaFAycGsnKSB7XG4gICAgcmV0dXJuIFsndXNlciddO1xuICB9XG4gIGlmIChpbnB1dFR5cGUgPT09ICdwMnRyTXVzaWcyJykge1xuICAgIHJldHVybiBbJ3VzZXInLCAnYmFja3VwJ107XG4gIH1cbiAgcmV0dXJuIFsndXNlcicsICdiaXRnbyddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uc3RydWN0UHNidChcbiAga2V5czogdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyxcbiAgaW5wdXRUeXBlczogSW5wdXRTY3JpcHRUeXBlW10sXG4gIG91dHB1dFR5cGVzOiBUZXN0VW5zcGVudFR5cGVbXSxcbiAgc2lnbmF0dXJlU3RhdHVzOiAndW5zaWduZWQnIHwgJ2hhbGZzaWduZWQnIHwgJ2Z1bGx5c2lnbmVkJyxcbiAgc2lnbmVycz86IHsgc2lnbmVyTmFtZTogdXR4b2xpYi5iaXRnby5LZXlOYW1lOyBjb3NpZ25lck5hbWU6IHV0eG9saWIuYml0Z28uS2V5TmFtZSB9XG4pOiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0PHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4+IHtcbiAgY29uc3QgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZvck5ldHdvcmsoeyBuZXR3b3JrOiB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4gfSk7XG5cbiAgaW5wdXRUeXBlcy5mb3JFYWNoKCh0LCBpKSA9PiB7XG4gICAgaWYgKHQgPT09ICdwMnNoUDJwaycpIHtcbiAgICAgIGNvbnN0IHNpZ25lciA9IGtleXNbZ2V0RGVmYXVsdFNpZ25lck5hbWVzKHQsIHNpZ25lcnMpWzBdXTtcbiAgICAgIGNvbnN0IHVuc3BlbnQgPSB1dHhvbGliLnRlc3R1dGlsLm1vY2tSZXBsYXlQcm90ZWN0aW9uVW5zcGVudCh1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4sIEJpZ0ludCgxMCksIHtcbiAgICAgICAga2V5OiBzaWduZXIsXG4gICAgICAgIHZvdXQ6IGksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsgcmVkZWVtU2NyaXB0IH0gPSB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuY3JlYXRlT3V0cHV0U2NyaXB0UDJzaFAycGsoc2lnbmVyLnB1YmxpY0tleSk7XG4gICAgICBhc3NlcnQub2socmVkZWVtU2NyaXB0KTtcbiAgICAgIHV0eG9saWIuYml0Z28uYWRkUmVwbGF5UHJvdGVjdGlvblVuc3BlbnRUb1BzYnQocHNidCwgdW5zcGVudCwgcmVkZWVtU2NyaXB0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdW5zcGVudCA9IHV0eG9saWIudGVzdHV0aWwubW9ja1dhbGxldFVuc3BlbnQodXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLCBCaWdJbnQoMTApLCB7XG4gICAgICAgIGtleXMsXG4gICAgICAgIGNoYWluOiB1dHhvbGliLmJpdGdvLmdldEV4dGVybmFsQ2hhaW5Db2RlKHQgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJyA/ICdwMnRyTXVzaWcyJyA6IHQpLFxuICAgICAgICB2b3V0OiBpLFxuICAgICAgICBpbmRleDogaSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2lnbmVyTmFtZXMgPSBnZXREZWZhdWx0U2lnbmVyTmFtZXModCwgc2lnbmVycyk7XG4gICAgICB1dHhvbGliLmJpdGdvLmFkZFdhbGxldFVuc3BlbnRUb1BzYnQocHNidCwgdW5zcGVudCwga2V5cywgc2lnbmVyTmFtZXNbMF0sIHNpZ25lck5hbWVzWzFdKTtcbiAgICB9XG4gIH0pO1xuXG4gIG91dHB1dFR5cGVzLmZvckVhY2goKHQsIGluZGV4KSA9PiB7XG4gICAgcHNidC5hZGRPdXRwdXQoe1xuICAgICAgc2NyaXB0OiBjcmVhdGVTY3JpcHRQdWJLZXkoa2V5cy50cmlwbGUsIHQpLFxuICAgICAgdmFsdWU6IEJpZ0ludCgxMCksXG4gICAgfSk7XG4gIH0pO1xuXG4gIGlmIChzaWduYXR1cmVTdGF0dXMgPT09ICd1bnNpZ25lZCcpIHtcbiAgICByZXR1cm4gcHNidDtcbiAgfVxuXG4gIHBzYnQuc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2VIRChrZXlzWyd1c2VyJ10pO1xuICBwc2J0LnNldEFsbElucHV0c011c2lnMk5vbmNlSEQoa2V5c1snYml0Z28nXSk7XG5cbiAgaW5wdXRUeXBlcy5mb3JFYWNoKCh0LCBpKSA9PiB7XG4gICAgY29uc3Qgc2lnbmVyTmFtZXMgPSBnZXREZWZhdWx0U2lnbmVyTmFtZXModCwgc2lnbmVycyk7XG4gICAgaWYgKHQgPT09ICdwMnNoUDJwaycpIHtcbiAgICAgIGlmIChzaWduYXR1cmVTdGF0dXMgPT09ICdmdWxseXNpZ25lZCcpIHtcbiAgICAgICAgcHNidC5zaWduSW5wdXQoaSwga2V5c1tzaWduZXJOYW1lc1swXV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwc2J0LnNpZ25JbnB1dEhEKGksIGtleXNbc2lnbmVyTmFtZXNbMF1dKTtcbiAgICAgIGlmIChzaWduYXR1cmVTdGF0dXMgPT09ICdmdWxseXNpZ25lZCcpIHtcbiAgICAgICAgcHNidC5zaWduSW5wdXRIRChpLCBrZXlzW3NpZ25lck5hbWVzWzFdXSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgaWYgKHNpZ25hdHVyZVN0YXR1cyA9PT0gJ2Z1bGx5c2lnbmVkJykge1xuICAgIGFzc2VydC5vayhwc2J0LnZhbGlkYXRlU2lnbmF0dXJlc09mQWxsSW5wdXRzKCkpO1xuICB9XG4gIHJldHVybiBwc2J0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2lnbmVkVHJhbnNhY3Rpb24oXG4gIGtleXM6IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMsXG4gIHNpZ25lck5hbWU6IHV0eG9saWIuYml0Z28uS2V5TmFtZSxcbiAgY29zaWduZXJOYW1lOiB1dHhvbGliLmJpdGdvLktleU5hbWUsXG4gIGlucHV0VHlwZXM6IElucHV0U2NyaXB0VHlwZVtdLFxuICBvdXRwdXRUeXBlczogVGVzdFVuc3BlbnRUeXBlW11cbik6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uIHtcbiAgY29uc3QgcHNidCA9IGNvbnN0cnVjdFBzYnQoa2V5cywgaW5wdXRUeXBlcywgb3V0cHV0VHlwZXMsICdmdWxseXNpZ25lZCcsIHsgc2lnbmVyTmFtZSwgY29zaWduZXJOYW1lIH0pO1xuICBwc2J0LmZpbmFsaXplQWxsSW5wdXRzKCk7XG4gIHJldHVybiAocHNidC5leHRyYWN0VHJhbnNhY3Rpb24oKSBhcyB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+KS5jbG9uZTxudW1iZXI+KCdudW1iZXInKTtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=virtualSizes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualSizes.d.ts","sourceRoot":"","sources":["../../test/virtualSizes.ts"],"names":[],"mappings":""}