@bitgo-beta/unspents 0.13.2-beta.21 → 0.13.2-beta.2100
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.
- package/README.md +0 -9
- package/dist/bin/generate_tables.d.ts +2 -0
- package/dist/bin/generate_tables.d.ts.map +1 -0
- package/dist/bin/generate_tables.js +107 -0
- package/dist/{codes.d.ts → src/codes.d.ts} +11 -10
- package/dist/src/codes.d.ts.map +1 -0
- package/dist/src/codes.js +182 -0
- package/dist/{dimensions.d.ts → src/dimensions.d.ts} +17 -17
- package/dist/src/dimensions.d.ts.map +1 -0
- package/dist/src/dimensions.js +502 -0
- package/dist/{index.d.ts → src/index.d.ts} +2 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +46 -0
- package/dist/{inputWeights.d.ts → src/inputWeights.d.ts} +4 -3
- package/dist/src/inputWeights.d.ts.map +1 -0
- package/dist/src/inputWeights.js +97 -0
- package/dist/{scriptSizes.d.ts → src/scriptSizes.d.ts} +1 -0
- package/dist/src/scriptSizes.d.ts.map +1 -0
- package/dist/src/scriptSizes.js +50 -0
- package/dist/{types.d.ts → src/types.d.ts} +1 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +39 -0
- package/dist/{virtualSizes.d.ts → src/virtualSizes.d.ts} +13 -12
- package/dist/src/virtualSizes.d.ts.map +1 -0
- package/dist/src/virtualSizes.js +114 -0
- package/dist/src/zcash.d.ts +9 -0
- package/dist/src/zcash.d.ts.map +1 -0
- package/dist/src/zcash.js +22 -0
- package/dist/test/chain.d.ts +2 -0
- package/dist/test/chain.d.ts.map +1 -0
- package/dist/test/chain.js +92 -0
- package/dist/test/dimensions.d.ts +2 -0
- package/dist/test/dimensions.d.ts.map +1 -0
- package/dist/test/dimensions.js +235 -0
- package/dist/test/signedTx/inputWeights.d.ts +2 -0
- package/dist/test/signedTx/inputWeights.d.ts.map +1 -0
- package/dist/test/signedTx/inputWeights.js +127 -0
- package/dist/test/signedTx/txCombinations.d.ts +3 -0
- package/dist/test/signedTx/txCombinations.d.ts.map +1 -0
- package/dist/test/signedTx/txCombinations.js +130 -0
- package/dist/test/signedTx/txGen.d.ts +74 -0
- package/dist/test/signedTx/txGen.d.ts.map +1 -0
- package/dist/test/signedTx/txGen.js +233 -0
- package/dist/test/testutils.d.ts +36 -0
- package/dist/test/testutils.d.ts.map +1 -0
- package/dist/test/testutils.js +190 -0
- package/dist/test/virtualSizes.d.ts +2 -0
- package/dist/test/virtualSizes.d.ts.map +1 -0
- package/dist/test/virtualSizes.js +18 -0
- package/dist/test/zcash.d.ts +2 -0
- package/dist/test/zcash.d.ts.map +1 -0
- package/dist/test/zcash.js +60 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +12 -9
- package/.eslintignore +0 -1
- package/.eslintrc.js +0 -3
- package/.mocharc.js +0 -6
- package/.prettierrc.yml +0 -3
- package/CHANGELOG.md +0 -157
- package/dist/codes.js +0 -168
- package/dist/dimensions.js +0 -485
- package/dist/index.js +0 -30
- package/dist/inputWeights.js +0 -97
- package/dist/scriptSizes.js +0 -51
- package/dist/types.js +0 -25
- 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[];
|
|
27
|
+
inputValue: number;
|
|
28
|
+
unspents: IUnspent[];
|
|
29
|
+
inputTx: any;
|
|
30
|
+
constructor(walletKeys: BIP32Interface[], inputTypes: string[], outputTypes: TestUnspentType[], expectedDims?: Readonly<Dimensions>, signKeys?: BIP32Interface[], 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;IACJ,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,OAAO,EAAE,GAAG,CAAC;gBAGlB,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,EAC3B,UAAU,SAAK;IAkBV,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;IACN,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzB,KAAK,SAAK;gBAEL,GAAG,GAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAa;IAIzC,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.total = 0;
|
|
156
|
+
this.map = map;
|
|
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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TyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFOzRCQUMvQixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7NEJBQzdGLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDNUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7NEJBQy9DLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0NBQzlCLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQzs0QkFDOUMsQ0FBQyxDQUFDLENBQUM7NEJBRUgsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO3dCQUN4QixDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2FBQ0YsQ0FBQztZQUVGLFFBQVEsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRTRDLHNEQUFxQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudCAqL1xuXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGJpcDMyLCBCSVAzMkludGVyZmFjZSB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgJ2xvZGFzaC5jb21iaW5hdGlvbnMnO1xuaW1wb3J0IHsgRGltZW5zaW9ucyB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQge1xuICBJbnB1dFNjcmlwdFR5cGUsXG4gIFRlc3RVbnNwZW50VHlwZSxcbiAgVW5zcGVudFR5cGVPcFJldHVybixcbiAgVW5zcGVudFR5cGVQMnNoUDJwayxcbiAgVW5zcGVudFR5cGVQdWJLZXlIYXNoLFxuICBVbnNwZW50VHlwZVNjcmlwdDJvZjMsXG59IGZyb20gJy4uL3Rlc3R1dGlscyc7XG5cbmludGVyZmFjZSBJVW5zcGVudCB7XG4gIHNjcmlwdFB1YktleTogQnVmZmVyO1xuICByZWRlZW1TY3JpcHQ/OiBCdWZmZXI7XG4gIHdpdG5lc3NTY3JpcHQ/OiBCdWZmZXI7XG4gIHZhbHVlOiBudW1iZXI7XG4gIGlucHV0VHlwZTogdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLlNjcmlwdFR5cGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVVuc3BlbnQocHVia2V5czogQnVmZmVyW10sIGlucHV0VHlwZTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKTogSVVuc3BlbnQge1xuICBsZXQgc3BlbmRhYmxlU2NyaXB0O1xuICBjb25zdCBzY3JpcHRUeXBlID0gaW5wdXRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcgPyAncDJ0ck11c2lnMicgOiBpbnB1dFR5cGU7XG4gIGlmIChzY3JpcHRUeXBlID09PSBVbnNwZW50VHlwZVAyc2hQMnBrKSB7XG4gICAgc3BlbmRhYmxlU2NyaXB0ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdFAyc2hQMnBrKHB1YmtleXNbMF0pO1xuICB9IGVsc2UgaWYgKHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5pc1NjcmlwdFR5cGUyT2YzKHNjcmlwdFR5cGUpKSB7XG4gICAgc3BlbmRhYmxlU2NyaXB0ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMocHVia2V5cywgc2NyaXB0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIGlucHV0VHlwZSAke3NjcmlwdFR5cGV9YCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnNwZW5kYWJsZVNjcmlwdCxcbiAgICB2YWx1ZSxcbiAgICBpbnB1dFR5cGU6IHNjcmlwdFR5cGUsXG4gIH07XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBrZXlzIC0gUHVia2V5cyB0byB1c2UgZm9yIGdlbmVyYXRpbmcgdGhlIGFkZHJlc3MuXG4gKiAgICAgICAgICAgICAgIElmIHVuc3BlbnRUeXBlIGlzIG9uZSBvZiBVbnNwZW50VHlwZVB1YktleUhhc2ggaXMgdXNlZCwgdGhlIGZpcnN0IGtleSB3aWxsIGJlIHVzZWQuXG4gKiBAcGFyYW0gdW5zcGVudFR5cGUge1N0cmluZ30gLSBvbmUgb2YgVW5zcGVudFR5cGVTY3JpcHQyb2YzIG9yIFVuc3BlbnRUeXBlUHViS2V5SGFzaFxuICogQHJldHVybiB7U3RyaW5nfSBhZGRyZXNzXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVTY3JpcHRQdWJLZXkgPSAoa2V5czogQklQMzJJbnRlcmZhY2VbXSwgdW5zcGVudFR5cGU6IFRlc3RVbnNwZW50VHlwZSk6IEJ1ZmZlciA9PiB7XG4gIGNvbnN0IHB1YmtleXMgPSBrZXlzLm1hcCgoa2V5KSA9PiBrZXkucHVibGljS2V5KTtcbiAgaWYgKHR5cGVvZiB1bnNwZW50VHlwZSA9PT0gJ3N0cmluZycgJiYgdW5zcGVudFR5cGUgaW4gVW5zcGVudFR5cGVTY3JpcHQyb2YzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVVuc3BlbnQocHVia2V5cywgdW5zcGVudFR5cGUsIDApLnNjcmlwdFB1YktleTtcbiAgfVxuXG4gIGNvbnN0IHBrSGFzaCA9IHV0eG9saWIuY3J5cHRvLmhhc2gxNjAocHVia2V5c1swXSk7XG4gIHN3aXRjaCAodW5zcGVudFR5cGUpIHtcbiAgICBjYXNlIFVuc3BlbnRUeXBlUHViS2V5SGFzaC5wMnBraDpcbiAgICAgIHJldHVybiB1dHhvbGliLnBheW1lbnRzLnAycGtoKHsgaGFzaDogcGtIYXNoIH0pLm91dHB1dCE7XG4gICAgY2FzZSBVbnNwZW50VHlwZVB1YktleUhhc2gucDJ3cGtoOlxuICAgICAgcmV0dXJuIHV0eG9saWIucGF5bWVudHMucDJ3cGtoKHsgaGFzaDogcGtIYXNoIH0pLm91dHB1dCE7XG4gIH1cblxuICBpZiAodW5zcGVudFR5cGUgaW5zdGFuY2VvZiBVbnNwZW50VHlwZU9wUmV0dXJuKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5hbGxvYyh1bnNwZW50VHlwZS5zaXplKS5maWxsKHB1YmtleXNbMF0pO1xuICAgIHJldHVybiB1dHhvbGliLnNjcmlwdC5jb21waWxlKFsweDZhLCBwYXlsb2FkXSk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIG91dHB1dCB0eXBlICR7dW5zcGVudFR5cGV9YCk7XG59O1xuXG5jb25zdCBjcmVhdGVJbnB1dFR4ID0gKHVuc3BlbnRzOiBhbnlbXSwgaW5wdXRWYWx1ZTogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IHR4SW5wdXRCdWlsZGVyID0gbmV3IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uQnVpbGRlcih1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICB0eElucHV0QnVpbGRlci5hZGRJbnB1dChBcnJheSgzMikuZmlsbCgnMDEnKS5qb2luKCcnKSwgMCk7XG4gIHVuc3BlbnRzLmZvckVhY2goKHsgc2NyaXB0UHViS2V5IH0pID0+IHR4SW5wdXRCdWlsZGVyLmFkZE91dHB1dChzY3JpcHRQdWJLZXksIGlucHV0VmFsdWUpKTtcbiAgcmV0dXJuIHR4SW5wdXRCdWlsZGVyLmJ1aWxkSW5jb21wbGV0ZSgpO1xufTtcblxuZnVuY3Rpb24gc2lnbklucHV0KFxuICB0eEJ1aWxkZXI6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uQnVpbGRlcixcbiAgaW5kZXg6IG51bWJlcixcbiAgd2FsbGV0S2V5czogQklQMzJJbnRlcmZhY2VbXSxcbiAgdW5zcGVudDogSVVuc3BlbnQsXG4gIHNpZ25LZXlzOiBCSVAzMkludGVyZmFjZVtdID0gdW5zcGVudC5pbnB1dFR5cGUgPT09ICdwMnNoUDJwaycgPyBbd2FsbGV0S2V5c1swXV0gOiBbd2FsbGV0S2V5c1swXSwgd2FsbGV0S2V5c1syXV1cbikge1xuICBzaWduS2V5cy5mb3JFYWNoKChrZXlQYWlyKSA9PiB7XG4gICAgaWYgKHVuc3BlbnQuaW5wdXRUeXBlID09PSAncDJzaFAycGsnKSB7XG4gICAgICB1dHhvbGliLmJpdGdvLnNpZ25JbnB1dFAyc2hQMnBrKHR4QnVpbGRlciwgaW5kZXgsIGtleVBhaXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2lnbktleXMubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBzaWduS2V5cyBsZW5ndGhgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvc2lnbmVyID0ga2V5UGFpciA9PT0gc2lnbktleXNbMF0gPyBzaWduS2V5c1sxXSA6IHNpZ25LZXlzWzBdO1xuICAgICAgdXR4b2xpYi5iaXRnby5zaWduSW5wdXQyT2YzKFxuICAgICAgICB0eEJ1aWxkZXIsXG4gICAgICAgIGluZGV4LFxuICAgICAgICB1bnNwZW50LmlucHV0VHlwZSxcbiAgICAgICAgd2FsbGV0S2V5cy5tYXAoKGspID0+IGsucHVibGljS2V5KSBhcyB1dHhvbGliLmJpdGdvLlRyaXBsZTxCdWZmZXI+LFxuICAgICAgICBrZXlQYWlyLFxuICAgICAgICBjb3NpZ25lci5wdWJsaWNLZXksXG4gICAgICAgIHVuc3BlbnQudmFsdWVcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn1cblxuY2xhc3MgVHhDb21ibyB7XG4gIHB1YmxpYyB3YWxsZXRLZXlzOiBCSVAzMkludGVyZmFjZVtdO1xuICBwdWJsaWMgaW5wdXRUeXBlczogc3RyaW5nW107XG4gIHB1YmxpYyBvdXRwdXRUeXBlczogVGVzdFVuc3BlbnRUeXBlW107XG4gIHB1YmxpYyBleHBlY3RlZERpbXM6IFJlYWRvbmx5PERpbWVuc2lvbnM+O1xuICBwdWJsaWMgc2lnbktleXM/OiBCSVAzMkludGVyZmFjZVtdO1xuICBwdWJsaWMgaW5wdXRWYWx1ZTogbnVtYmVyO1xuICBwdWJsaWMgdW5zcGVudHM6IElVbnNwZW50W107XG4gIHB1YmxpYyBpbnB1dFR4OiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgd2FsbGV0S2V5czogQklQMzJJbnRlcmZhY2VbXSxcbiAgICBpbnB1dFR5cGVzOiBzdHJpbmdbXSxcbiAgICBvdXRwdXRUeXBlczogVGVzdFVuc3BlbnRUeXBlW10sXG4gICAgZXhwZWN0ZWREaW1zOiBSZWFkb25seTxEaW1lbnNpb25zPiA9IERpbWVuc2lvbnMuWkVSTyxcbiAgICBzaWduS2V5cz86IEJJUDMySW50ZXJmYWNlW10sXG4gICAgaW5wdXRWYWx1ZSA9IDEwXG4gICkge1xuICAgIHRoaXMud2FsbGV0S2V5cyA9IHdhbGxldEtleXM7XG4gICAgdGhpcy5pbnB1dFR5cGVzID0gaW5wdXRUeXBlcztcbiAgICB0aGlzLm91dHB1dFR5cGVzID0gb3V0cHV0VHlwZXM7XG4gICAgdGhpcy5leHBlY3RlZERpbXMgPSBleHBlY3RlZERpbXM7XG4gICAgdGhpcy5zaWduS2V5cyA9IHNpZ25LZXlzO1xuICAgIHRoaXMuaW5wdXRWYWx1ZSA9IGlucHV0VmFsdWU7XG4gICAgdGhpcy51bnNwZW50cyA9IGlucHV0VHlwZXMubWFwKChpbnB1dFR5cGUpID0+XG4gICAgICBjcmVhdGVVbnNwZW50KFxuICAgICAgICB3YWxsZXRLZXlzLm1hcCgoa2V5KSA9PiBrZXkucHVibGljS2V5KSxcbiAgICAgICAgaW5wdXRUeXBlLFxuICAgICAgICB0aGlzLmlucHV0VmFsdWVcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuaW5wdXRUeCA9IGNyZWF0ZUlucHV0VHgodGhpcy51bnNwZW50cywgaW5wdXRWYWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QnVpbGRlcldpdGhVbnNpZ25lZFR4KCk6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkJ1aWxkZXJGb3JOZXR3b3JrKHV0eG9saWIubmV0d29ya3MuYml0Y29pbik7XG4gICAgdGhpcy5pbnB1dFR4Lm91dHMuZm9yRWFjaCgoe30sIGk6IG51bWJlcikgPT4gdHhCdWlsZGVyLmFkZElucHV0KHRoaXMuaW5wdXRUeCwgaSkpO1xuICAgIHRoaXMub3V0cHV0VHlwZXMuZm9yRWFjaCgodW5zcGVudFR5cGUpID0+XG4gICAgICB0eEJ1aWxkZXIuYWRkT3V0cHV0KGNyZWF0ZVNjcmlwdFB1YktleSh0aGlzLndhbGxldEtleXMsIHVuc3BlbnRUeXBlKSwgdGhpcy5pbnB1dFZhbHVlKVxuICAgICk7XG4gICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbnNpZ25lZFR4KCk6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCdWlsZGVyV2l0aFVuc2lnbmVkVHgoKS5idWlsZEluY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTaWduZWRUeCgpOiB1dHhvbGliLlRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSB0aGlzLmdldEJ1aWxkZXJXaXRoVW5zaWduZWRUeCgpO1xuICAgIHRoaXMudW5zcGVudHMuZm9yRWFjaCgodW5zcGVudCwgaSkgPT4ge1xuICAgICAgc2lnbklucHV0KHR4QnVpbGRlciwgaSwgdGhpcy53YWxsZXRLZXlzLCB1bnNwZW50LCB0aGlzLnNpZ25LZXlzKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdHhCdWlsZGVyLmJ1aWxkKCk7XG4gIH1cbn1cblxuY29uc3QgcnVuQ29tYmluYXRpb25zID0gKFxuICB7XG4gICAgaW5wdXRUeXBlcyxcbiAgICBtYXhOSW5wdXRzLFxuICAgIG91dHB1dFR5cGVzLFxuICAgIG1heE5PdXRwdXRzLFxuICB9OiB7XG4gICAgaW5wdXRUeXBlczogSW5wdXRTY3JpcHRUeXBlW107XG4gICAgbWF4TklucHV0czogbnVtYmVyO1xuICAgIG91dHB1dFR5cGVzOiBUZXN0VW5zcGVudFR5cGVbXTtcbiAgICBtYXhOT3V0cHV0czogbnVtYmVyO1xuICB9LFxuICBjYWxsYmFjazogKGlucHV0Q29tYm86IElucHV0U2NyaXB0VHlwZVtdLCBvdXRwdXRDb21ibzogVGVzdFVuc3BlbnRUeXBlW10pID0+IHZvaWRcbik6IHZvaWQgPT4ge1xuICAvLyBDcmVhdGUgY29tYmluYXRpb25zIG9mIGRpZmZlcmVudCBpbnB1dCBhbmQgb3V0cHV0IHR5cGVzLiBMZW5ndGggYmV0d2VlbiAxIGFuZCAzLlxuICBjb25zdCBpbnB1dENvbWJpbmF0aW9ucyA9IF8uZmxhdHRlbihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgWy4uLkFycmF5KG1heE5JbnB1dHMpXS5tYXAoKF9fLCBpKSA9PiBfLmNvbWJpbmF0aW9ucyhpbnB1dFR5cGVzLCBpICsgMSkpXG4gICk7XG4gIGNvbnN0IG91dHB1dENvbWJpbmF0aW9ucyA9IF8uZmxhdHRlbihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgWy4uLkFycmF5KG1heE5PdXRwdXRzKV0ubWFwKChfXywgaSkgPT4gXy5jb21iaW5hdGlvbnMob3V0cHV0VHlwZXMsIGkgKyAxKSlcbiAgKTtcblxuICBpbnB1dENvbWJpbmF0aW9ucy5mb3JFYWNoKChpbnB1dFR5cGVDb21ibykgPT5cbiAgICBvdXRwdXRDb21iaW5hdGlvbnMuZm9yRWFjaCgob3V0cHV0VHlwZUNvbWJvKSA9PiB7XG4gICAgICBjYWxsYmFjayhpbnB1dFR5cGVDb21ibywgb3V0cHV0VHlwZUNvbWJvKTtcbiAgICB9KVxuICApO1xufTtcblxuY2xhc3MgSGlzdG9ncmFtIHtcbiAgcHVibGljIG1hcDogTWFwPG51bWJlciwgbnVtYmVyPjtcbiAgcHVibGljIHRvdGFsID0gMDtcblxuICBjb25zdHJ1Y3RvcihtYXA6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwKCkpIHtcbiAgICB0aGlzLm1hcCA9IG1hcDtcbiAgfVxuXG4gIHB1YmxpYyBhZGQoc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KHNpemUsICh0aGlzLm1hcC5nZXQoc2l6ZSkgfHwgMCkgKyAxKTtcbiAgICB0aGlzLnRvdGFsKys7XG4gIH1cblxuICBwdWJsaWMgYXNTb3J0ZWRBcnJheSgpOiBudW1iZXJbXVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMubWFwLmVudHJpZXMoKV0uc29ydCgoW2FdLCBbYl0pID0+IGEgLSBiKTtcbiAgfVxuXG4gIHB1YmxpYyBhc0Z1bGxTb3J0ZWRBcnJheSgpOiBudW1iZXJbXVtdIHtcbiAgICByZXR1cm4gXy5yYW5nZSh0aGlzLmdldFBlcmNlbnRpbGUoMCksIHRoaXMuZ2V0UGVyY2VudGlsZSgxKSkubWFwKCh2KSA9PiBbdiwgdGhpcy5tYXAuZ2V0KHYpIHx8IDBdKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQZXJjZW50aWxlKHA6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKDAgPiBwIHx8IHAgPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDFgKTtcbiAgICB9XG5cbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiB0aGlzLmFzU29ydGVkQXJyYXkoKSkge1xuICAgICAgc3VtICs9IHY7XG4gICAgICBpZiAoc3VtIC8gdGhpcy50b3RhbCA+PSBwKSB7XG4gICAgICAgIHJldHVybiBrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGZpbmQgcGVyY2VudGlsZScpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qga2V5cyA9IFsuLi50aGlzLm1hcC5rZXlzKCldLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICByZXR1cm4gYFske2tleXMubWFwKChrKSA9PiBgWyR7a30sICR7dGhpcy5tYXAuZ2V0KGspfV1gKS5qb2luKCcgJyl9XWA7XG4gIH1cbn1cblxuY29uc3QgZ2V0S2V5VHJpcGxldHMgPSAocHJlZml4OiBzdHJpbmcsIGNvdW50OiBudW1iZXIpID0+XG4gIFsuLi5BcnJheShjb3VudCldLm1hcCgodiwgaSkgPT5cbiAgICBbMSwgMiwgM10ubWFwKChqKSA9PiBiaXAzMi5mcm9tU2VlZChCdWZmZXIuYWxsb2MoMTYsIGAke3ByZWZpeH0vJHtpfS8ke2p9YCksIHV0eG9saWIubmV0d29ya3MuYml0Y29pbikpXG4gICk7XG5cbi8qKlxuICpcbiAqIENhbGxzIGBjYWxsYmFja2Agd2l0aCBhIHZhcmlldHkgb2Ygc2lnbmVkIHR4cywgYmFzZWQgb24gaW5wdXQgcGFyYW1ldGVyc1xuICogQ2FsbGJhY2sgYXJndW1lbnRzIGFyZVxuICogICBpbnB1dFR5cGUsIGlucHV0Q291bnQsIG91dHB1dFR5cGUsIHR4c1xuICogIHdoZXJlIGB0eHNgIGltcGxlbWVudHMgYGZvckVhY2goKWBcbiAqXG4gKiBAcGFyYW0gaW5wdXRUeXBlcyAtIGlucHV0IHR5cGVzIHRvIHRlc3RcbiAqIEBwYXJhbSBuSW5wdXRLZXlUcmlwbGV0cyAtIG51bWJlciBvZiBkaWZmZXJlbnQgaW5wdXQga2V5IHRyaXBsZXMgdG8gY3ljbGUgdGhyb3VnaFxuICogQHBhcmFtIG91dHB1dFR5cGVzIC0gb3V0cHV0IHR5cGVzIHRvIHRlc3RcbiAqIEBwYXJhbSBuT3V0cHV0S2V5VHJpcGxldHMgLSBudW1iZXIgb2YgZGlmZmVyZW50IG91dHB1dCBrZXkgdHJpcGxldHMgdG8gY3ljbGUgdGhyb3VnaFxuICogQHBhcmFtIGNhbGxiYWNrXG4gKi9cbmNvbnN0IHJ1blNpZ25lZFRyYW5zYWN0aW9ucyA9IChcbiAge1xuICAgIGlucHV0VHlwZXMsXG4gICAgbklucHV0S2V5VHJpcGxldHMsXG4gICAgb3V0cHV0VHlwZXMsXG4gICAgbk91dHB1dEtleVRyaXBsZXRzLFxuICB9OiB7XG4gICAgaW5wdXRUeXBlczogQXJyYXk8eyBpbnB1dFR5cGU6IHN0cmluZzsgY291bnQ6IG51bWJlciB9PjtcbiAgICBuSW5wdXRLZXlUcmlwbGV0czogbnVtYmVyO1xuICAgIG91dHB1dFR5cGVzOiBUZXN0VW5zcGVudFR5cGVbXTtcbiAgICBuT3V0cHV0S2V5VHJpcGxldHM6IG51bWJlcjtcbiAgfSxcbiAgY2FsbGJhY2s6IChpbnB1dFR5cGU6IHN0cmluZywgaW5wdXRDb3VudDogbnVtYmVyLCBvdXRwdXRUeXBlOiBUZXN0VW5zcGVudFR5cGUsIHR4czogYW55KSA9PiB2b2lkXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgaW5wdXRLZXlUcmlwbGV0cyA9IGdldEtleVRyaXBsZXRzKCd0ZXN0L2lucHV0LycsIG5JbnB1dEtleVRyaXBsZXRzKTtcbiAgY29uc3Qgb3V0cHV0S2V5VHJpcGxldHMgPSBnZXRLZXlUcmlwbGV0cygndGVzdC9vdXRwdXQvJywgbk91dHB1dEtleVRyaXBsZXRzKTtcbiAgY29uc3Qgb3V0cHV0VmFsdWUgPSAxZTg7XG5cbiAgaW5wdXRUeXBlcy5mb3JFYWNoKCh7IGlucHV0VHlwZSwgY291bnQ6IGlucHV0Q291bnQgfSkgPT4ge1xuICAgIGNvbnN0IGlucHV0VHhzID0gaW5wdXRLZXlUcmlwbGV0cy5tYXAoKGlucHV0S2V5cykgPT4ge1xuICAgICAgY29uc3QgdW5zcGVudHMgPSBbLi4uQXJyYXkoaW5wdXRDb3VudCldLm1hcCgoKSA9PlxuICAgICAgICBjcmVhdGVVbnNwZW50KFxuICAgICAgICAgIGlucHV0S2V5cy5tYXAoKGtleSkgPT4ga2V5LnB1YmxpY0tleSksXG4gICAgICAgICAgaW5wdXRUeXBlLFxuICAgICAgICAgIG91dHB1dFZhbHVlXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCBpbnB1dFR4ID0gY3JlYXRlSW5wdXRUeCh1bnNwZW50cywgb3V0cHV0VmFsdWUpO1xuICAgICAgcmV0dXJuIHsgaW5wdXRLZXlzLCB1bnNwZW50cywgaW5wdXRUeCB9O1xuICAgIH0pO1xuXG4gICAgb3V0cHV0VHlwZXMuZm9yRWFjaCgob3V0cHV0VHlwZSkgPT4ge1xuICAgICAgY29uc3Qgb3V0cHV0cyA9IG91dHB1dEtleVRyaXBsZXRzLm1hcCgob3V0cHV0S2V5cykgPT4gY3JlYXRlU2NyaXB0UHViS2V5KG91dHB1dEtleXMsIG91dHB1dFR5cGUpKTtcblxuICAgICAgY29uc3QgdHhzID0ge1xuICAgICAgICBmb3JFYWNoKGNiOiAodHg6IHV0eG9saWIuVHJhbnNhY3Rpb24pID0+IHZvaWQpIHtcbiAgICAgICAgICBpbnB1dFR4cy5mb3JFYWNoKCh7IGlucHV0S2V5cywgdW5zcGVudHMsIGlucHV0VHggfSkgPT4ge1xuICAgICAgICAgICAgb3V0cHV0cy5mb3JFYWNoKChzY3JpcHRQdWJLZXkpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkJ1aWxkZXJGb3JOZXR3b3JrKHV0eG9saWIubmV0d29ya3MuYml0Y29pbik7XG4gICAgICAgICAgICAgIGlucHV0VHgub3V0cy5mb3JFYWNoKCh2OiBhbnksIGk6IG51bWJlcikgPT4gdHhCdWlsZGVyLmFkZElucHV0KGlucHV0VHgsIGkpKTtcbiAgICAgICAgICAgICAgdHhCdWlsZGVyLmFkZE91dHB1dChzY3JpcHRQdWJLZXksIG91dHB1dFZhbHVlKTtcbiAgICAgICAgICAgICAgdW5zcGVudHMuZm9yRWFjaCgodW5zcGVudCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIHNpZ25JbnB1dCh0eEJ1aWxkZXIsIGksIGlucHV0S2V5cywgdW5zcGVudCk7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNiKHR4QnVpbGRlci5idWlsZCgpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY2FsbGJhY2soaW5wdXRUeXBlLCBpbnB1dENvdW50LCBvdXRwdXRUeXBlLCB0eHMpO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbmV4cG9ydCB7IFR4Q29tYm8sIEhpc3RvZ3JhbSwgcnVuQ29tYmluYXRpb25zLCBydW5TaWduZWRUcmFuc2FjdGlvbnMgfTtcbiJdfQ==
|
|
@@ -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;IACvB,IAAI,EAAE,MAAM,CAAC;gBACR,IAAI,EAAE,MAAM;IAIjB,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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdHV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC90ZXN0dXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkNBLGtEQUVDO0FBbUVELHNDQThEQztBQUVELG9EQVVDO0FBNUxELGlEQUFtQztBQUNuQyw4REFBZ0Q7QUFDaEQsb0RBQTRCO0FBQzVCLDRDQUFzRDtBQUV0RDs7Ozs7R0FLRztBQUNILE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFjLEVBQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUVsRyxRQUFBLG1CQUFtQixHQUFHLFVBQVUsQ0FBQztBQUU5QywrRkFBK0Y7QUFDbEYsUUFBQSxxQkFBcUIsR0FPOUIsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUscUJBQXFCLENBQUMsQ0FBQztBQUUzRSxRQUFBLHFCQUFxQixHQUc5QixRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBSWhDLE1BQWEsbUJBQW1CO0lBRTlCLFlBQVksSUFBWTtRQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sWUFBWSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBVEQsa0RBU0M7QUFJRCxTQUFnQixtQkFBbUI7SUFDakMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLFVBQVUsRUFB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QixXQUE4QjtJQUU5QixNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDdkcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDekIsT0FBUSxJQUFJLENBQUMsa0JBQWtCLEVBQTRDLENBQUMsS0FBSyxDQUFTLFFBQVEsQ0FBQyxDQUFDO0FBQ3RHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1bnNwZW50cyBmcm9tICcuLi9zcmMnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBjcmVhdGVTY3JpcHRQdWJLZXkgfSBmcm9tICcuL3NpZ25lZFR4L3R4R2VuJztcblxuLyoqXG4gKiBtYWtlRW51bSgnYScsICdiJykgcmV0dXJucyBgeyBhOiAnYScsIGI6ICdiJyB9YFxuICpcbiAqIEBwYXJhbSBhcmdzXG4gKiBAcmV0dXJuIG1hcCB3aXRoIHN0cmluZyBrZXlzIGFuZCBzeW1ib2wgdmFsdWVzXG4gKi9cbmNvbnN0IG1ha2VFbnVtID0gKC4uLmFyZ3M6IHN0cmluZ1tdKTogYW55ID0+IGFyZ3MucmVkdWNlKChvYmosIGtleSkgPT4gT2JqZWN0LmFzc2lnbihvYmosIHsgW2tleV06IGtleSB9KSwge30pO1xuXG5leHBvcnQgY29uc3QgVW5zcGVudFR5cGVQMnNoUDJwayA9ICdwMnNoUDJwayc7XG5cbi8vIHAydHJNdXNpZzIgaXMgYXNzdW1lZCB0byBiZSBzY3JpcHQgcGF0aCBvbmx5LiB0YXByb290S2V5UGF0aFNwZW5kIGlzIGZvciBwMnRyTXVzaWcyIGtleSBwYXRoXG5leHBvcnQgY29uc3QgVW5zcGVudFR5cGVTY3JpcHQyb2YzOiB7XG4gIHAyc2g6IHN0cmluZztcbiAgcDJzaFAyd3NoOiBzdHJpbmc7XG4gIHAyd3NoOiBzdHJpbmc7XG4gIHAydHI6IHN0cmluZztcbiAgcDJ0ck11c2lnMjogc3RyaW5nO1xuICB0YXByb290S2V5UGF0aFNwZW5kOiBzdHJpbmc7XG59ID0gbWFrZUVudW0oJ3Ayc2gnLCAncDJzaFAyd3NoJywgJ3Ayd3NoJywgJ3AydHInLCAncDJ0ck11c2lnMicsICd0YXByb290S2V5UGF0aFNwZW5kJyk7XG5cbmV4cG9ydCBjb25zdCBVbnNwZW50VHlwZVB1YktleUhhc2g6IHtcbiAgcDJwa2g6ICdwMnBraCc7XG4gIHAyd3BraDogJ3Ayd3BraCc7XG59ID0gbWFrZUVudW0oJ3AycGtoJywgJ3Ayd3BraCcpO1xuXG5leHBvcnQgdHlwZSBUZXN0VW5zcGVudFR5cGUgPSBzdHJpbmcgfCBVbnNwZW50VHlwZU9wUmV0dXJuO1xuXG5leHBvcnQgY2xhc3MgVW5zcGVudFR5cGVPcFJldHVybiB7XG4gIHB1YmxpYyBzaXplOiBudW1iZXI7XG4gIGNvbnN0cnVjdG9yKHNpemU6IG51bWJlcikge1xuICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG9wUmV0dXJuKCR7dGhpcy5zaXplfSlgO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIElucHV0U2NyaXB0VHlwZSA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5TY3JpcHRUeXBlIHwgJ3RhcHJvb3RLZXlQYXRoU3BlbmQnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5wdXRTY3JpcHRUeXBlcygpOiBJbnB1dFNjcmlwdFR5cGVbXSB7XG4gIHJldHVybiBbLi4udXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLnNjcmlwdFR5cGVzMk9mMywgJ3Ayc2hQMnBrJywgJ3RhcHJvb3RLZXlQYXRoU3BlbmQnXTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIGlucHV0IGRpbWVuc2lvbnMgYmFzZWQgb24gdW5zcGVudCB0eXBlXG4gKiBAcGFyYW0gdW5zcGVudFR5cGUgLSBvbmUgb2YgVW5zcGVudFR5cGVTY3JpcHQyb2YzXG4gKiBAcmV0dXJuIERpbWVuc2lvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldElucHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlID0gKHVuc3BlbnRUeXBlOiBUZXN0VW5zcGVudFR5cGUpOiB1bnNwZW50cy5EaW1lbnNpb25zID0+IHtcbiAgc3dpdGNoICh1bnNwZW50VHlwZSkge1xuICAgIGNhc2UgVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAyc2g6XG4gICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5zdW0oeyBuUDJzaElucHV0czogMSB9KTtcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMnNoUDJ3c2g6XG4gICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5zdW0oeyBuUDJzaFAyd3NoSW5wdXRzOiAxIH0pO1xuICAgIGNhc2UgVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAyd3NoOlxuICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuc3VtKHsgblAyd3NoSW5wdXRzOiAxIH0pO1xuICAgIGNhc2UgVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAydHI6XG4gICAgY2FzZSBVbnNwZW50VHlwZVNjcmlwdDJvZjMucDJ0ck11c2lnMjpcbiAgICAgIHJldHVybiB1bnNwZW50cy5EaW1lbnNpb25zLnN1bSh7IG5QMnRyU2NyaXB0UGF0aExldmVsMUlucHV0czogMSB9KTtcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy50YXByb290S2V5UGF0aFNwZW5kOlxuICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuc3VtKHsgblAydHJLZXlwYXRoSW5wdXRzOiAxIH0pO1xuICAgIGNhc2UgVW5zcGVudFR5cGVQMnNoUDJwazpcbiAgICAgIHJldHVybiB1bnNwZW50cy5EaW1lbnNpb25zLnN1bSh7IG5QMnNoUDJwa0lucHV0czogMSB9KTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYG5vIGlucHV0IGRpbWVuc2lvbnMgZm9yICR7dW5zcGVudFR5cGV9YCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0T3V0cHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlID0gKHVuc3BlbnRUeXBlOiBUZXN0VW5zcGVudFR5cGUpOiB1bnNwZW50cy5EaW1lbnNpb25zID0+IHtcbiAgLyogVGhlIHZhbHVlcyBoZXJlIGFyZSB2YWxpZGF0ZWQgaW4gdGhlIHRlc3QgJ2NhbGN1bGF0ZXMgb3V0cHV0IGRpbWVuc2lvbnMgZHluYW1pY2FsbHknICovXG4gIHN3aXRjaCAodW5zcGVudFR5cGUpIHtcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMnNoOlxuICAgIGNhc2UgVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAyc2hQMndzaDpcbiAgICBjYXNlIFVuc3BlbnRUeXBlUDJzaFAycGs6XG4gICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5mcm9tT3V0cHV0U2NyaXB0TGVuZ3RoKDIzKTtcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMndzaDpcbiAgICAgIHJldHVybiB1bnNwZW50cy5EaW1lbnNpb25zLmZyb21PdXRwdXRTY3JpcHRMZW5ndGgoMzQpO1xuICAgIGNhc2UgVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAydHI6XG4gICAgY2FzZSBVbnNwZW50VHlwZVNjcmlwdDJvZjMucDJ0ck11c2lnMjpcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy50YXByb290S2V5UGF0aFNwZW5kOlxuICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuZnJvbU91dHB1dFNjcmlwdExlbmd0aCgzNCk7XG4gICAgY2FzZSBVbnNwZW50VHlwZVB1YktleUhhc2gucDJwa2g6XG4gICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5mcm9tT3V0cHV0U2NyaXB0TGVuZ3RoKDI1KTtcbiAgICBjYXNlIFVuc3BlbnRUeXBlUHViS2V5SGFzaC5wMndwa2g6XG4gICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5mcm9tT3V0cHV0U2NyaXB0TGVuZ3RoKDIyKTtcbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKHVuc3BlbnRUeXBlIGluc3RhbmNlb2YgVW5zcGVudFR5cGVPcFJldHVybikge1xuICAgICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5mcm9tT3V0cHV0U2NyaXB0TGVuZ3RoKDEgKyB1bnNwZW50VHlwZS5zaXplKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYHVua25vd24gdW5zcGVudFR5cGUgJHt1bnNwZW50VHlwZX1gKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFNpZ25lck5hbWVzKFxuICBpbnB1dFR5cGU6IElucHV0U2NyaXB0VHlwZSxcbiAgc2lnbmVycz86IHsgc2lnbmVyTmFtZTogdXR4b2xpYi5iaXRnby5LZXlOYW1lOyBjb3NpZ25lck5hbWU6IHV0eG9saWIuYml0Z28uS2V5TmFtZSB9XG4pOiB1dHhvbGliLmJpdGdvLktleU5hbWVbXSB7XG4gIGlmIChzaWduZXJzKSB7XG4gICAgcmV0dXJuIFtzaWduZXJzLnNpZ25lck5hbWUsIHNpZ25lcnMuY29zaWduZXJOYW1lXTtcbiAgfVxuICBpZiAoaW5wdXRUeXBlID09PSAncDJzaFAycGsnKSB7XG4gICAgcmV0dXJuIFsndXNlciddO1xuICB9XG4gIGlmIChpbnB1dFR5cGUgPT09ICdwMnRyTXVzaWcyJykge1xuICAgIHJldHVybiBbJ3VzZXInLCAnYmFja3VwJ107XG4gIH1cbiAgcmV0dXJuIFsndXNlcicsICdiaXRnbyddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uc3RydWN0UHNidChcbiAga2V5czogdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyxcbiAgaW5wdXRUeXBlczogSW5wdXRTY3JpcHRUeXBlW10sXG4gIG91dHB1dFR5cGVzOiBUZXN0VW5zcGVudFR5cGVbXSxcbiAgc2lnbmF0dXJlU3RhdHVzOiAndW5zaWduZWQnIHwgJ2hhbGZzaWduZWQnIHwgJ2Z1bGx5c2lnbmVkJyxcbiAgc2lnbmVycz86IHsgc2lnbmVyTmFtZTogdXR4b2xpYi5iaXRnby5LZXlOYW1lOyBjb3NpZ25lck5hbWU6IHV0eG9saWIuYml0Z28uS2V5TmFtZSB9XG4pOiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0PHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4+IHtcbiAgY29uc3QgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZvck5ldHdvcmsoeyBuZXR3b3JrOiB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4gfSk7XG5cbiAgaW5wdXRUeXBlcy5mb3JFYWNoKCh0LCBpKSA9PiB7XG4gICAgaWYgKHQgPT09ICdwMnNoUDJwaycpIHtcbiAgICAgIGNvbnN0IHNpZ25lciA9IGtleXNbZ2V0RGVmYXVsdFNpZ25lck5hbWVzKHQsIHNpZ25lcnMpWzBdXTtcbiAgICAgIGNvbnN0IHVuc3BlbnQgPSB1dHhvbGliLnRlc3R1dGlsLm1vY2tSZXBsYXlQcm90ZWN0aW9uVW5zcGVudCh1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4sIEJpZ0ludCgxMCksIHtcbiAgICAgICAga2V5OiBzaWduZXIsXG4gICAgICAgIHZvdXQ6IGksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsgcmVkZWVtU2NyaXB0IH0gPSB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuY3JlYXRlT3V0cHV0U2NyaXB0UDJzaFAycGsoc2lnbmVyLnB1YmxpY0tleSk7XG4gICAgICBhc3NlcnQub2socmVkZWVtU2NyaXB0KTtcbiAgICAgIHV0eG9saWIuYml0Z28uYWRkUmVwbGF5UHJvdGVjdGlvblVuc3BlbnRUb1BzYnQocHNidCwgdW5zcGVudCwgcmVkZWVtU2NyaXB0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdW5zcGVudCA9IHV0eG9saWIudGVzdHV0aWwubW9ja1dhbGxldFVuc3BlbnQodXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLCBCaWdJbnQoMTApLCB7XG4gICAgICAgIGtleXMsXG4gICAgICAgIGNoYWluOiB1dHhvbGliLmJpdGdvLmdldEV4dGVybmFsQ2hhaW5Db2RlKHQgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJyA/ICdwMnRyTXVzaWcyJyA6IHQpLFxuICAgICAgICB2b3V0OiBpLFxuICAgICAgICBpbmRleDogaSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2lnbmVyTmFtZXMgPSBnZXREZWZhdWx0U2lnbmVyTmFtZXModCwgc2lnbmVycyk7XG4gICAgICB1dHhvbGliLmJpdGdvLmFkZFdhbGxldFVuc3BlbnRUb1BzYnQocHNidCwgdW5zcGVudCwga2V5cywgc2lnbmVyTmFtZXNbMF0sIHNpZ25lck5hbWVzWzFdKTtcbiAgICB9XG4gIH0pO1xuXG4gIG91dHB1dFR5cGVzLmZvckVhY2goKHQsIGluZGV4KSA9PiB7XG4gICAgcHNidC5hZGRPdXRwdXQoe1xuICAgICAgc2NyaXB0OiBjcmVhdGVTY3JpcHRQdWJLZXkoa2V5cy50cmlwbGUsIHQpLFxuICAgICAgdmFsdWU6IEJpZ0ludCgxMCksXG4gICAgfSk7XG4gIH0pO1xuXG4gIGlmIChzaWduYXR1cmVTdGF0dXMgPT09ICd1bnNpZ25lZCcpIHtcbiAgICByZXR1cm4gcHNidDtcbiAgfVxuXG4gIHBzYnQuc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2VIRChrZXlzWyd1c2VyJ10pO1xuICBwc2J0LnNldEFsbElucHV0c011c2lnMk5vbmNlSEQoa2V5c1snYml0Z28nXSk7XG5cbiAgaW5wdXRUeXBlcy5mb3JFYWNoKCh0LCBpKSA9PiB7XG4gICAgY29uc3Qgc2lnbmVyTmFtZXMgPSBnZXREZWZhdWx0U2lnbmVyTmFtZXModCwgc2lnbmVycyk7XG4gICAgaWYgKHQgPT09ICdwMnNoUDJwaycpIHtcbiAgICAgIGlmIChzaWduYXR1cmVTdGF0dXMgPT09ICdmdWxseXNpZ25lZCcpIHtcbiAgICAgICAgcHNidC5zaWduSW5wdXQoaSwga2V5c1tzaWduZXJOYW1lc1swXV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwc2J0LnNpZ25JbnB1dEhEKGksIGtleXNbc2lnbmVyTmFtZXNbMF1dKTtcbiAgICAgIGlmIChzaWduYXR1cmVTdGF0dXMgPT09ICdmdWxseXNpZ25lZCcpIHtcbiAgICAgICAgcHNidC5zaWduSW5wdXRIRChpLCBrZXlzW3NpZ25lck5hbWVzWzFdXSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgaWYgKHNpZ25hdHVyZVN0YXR1cyA9PT0gJ2Z1bGx5c2lnbmVkJykge1xuICAgIGFzc2VydC5vayhwc2J0LnZhbGlkYXRlU2lnbmF0dXJlc09mQWxsSW5wdXRzKCkpO1xuICB9XG4gIHJldHVybiBwc2J0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2lnbmVkVHJhbnNhY3Rpb24oXG4gIGtleXM6IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMsXG4gIHNpZ25lck5hbWU6IHV0eG9saWIuYml0Z28uS2V5TmFtZSxcbiAgY29zaWduZXJOYW1lOiB1dHhvbGliLmJpdGdvLktleU5hbWUsXG4gIGlucHV0VHlwZXM6IElucHV0U2NyaXB0VHlwZVtdLFxuICBvdXRwdXRUeXBlczogVGVzdFVuc3BlbnRUeXBlW11cbik6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uIHtcbiAgY29uc3QgcHNidCA9IGNvbnN0cnVjdFBzYnQoa2V5cywgaW5wdXRUeXBlcywgb3V0cHV0VHlwZXMsICdmdWxseXNpZ25lZCcsIHsgc2lnbmVyTmFtZSwgY29zaWduZXJOYW1lIH0pO1xuICBwc2J0LmZpbmFsaXplQWxsSW5wdXRzKCk7XG4gIHJldHVybiAocHNidC5leHRyYWN0VHJhbnNhY3Rpb24oKSBhcyB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+KS5jbG9uZTxudW1iZXI+KCdudW1iZXInKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtualSizes.d.ts","sourceRoot":"","sources":["../../test/virtualSizes.ts"],"names":[],"mappings":""}
|