utxo-lib 1.1.2 → 1.1.4

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 (40) hide show
  1. package/README.md +16 -19
  2. package/dist/src/bitgo/PsbtUtil.d.ts +0 -5
  3. package/dist/src/bitgo/PsbtUtil.d.ts.map +1 -1
  4. package/dist/src/bitgo/PsbtUtil.js +2 -15
  5. package/dist/src/bitgo/UtxoPsbt.d.ts +0 -9
  6. package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -1
  7. package/dist/src/bitgo/UtxoPsbt.js +12 -42
  8. package/dist/src/bitgo/index.d.ts +0 -1
  9. package/dist/src/bitgo/index.d.ts.map +1 -1
  10. package/dist/src/bitgo/index.js +2 -3
  11. package/dist/src/bitgo/parseInput.js +2 -2
  12. package/dist/src/bitgo/wallet/Psbt.d.ts +0 -14
  13. package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -1
  14. package/dist/src/bitgo/wallet/Psbt.js +3 -71
  15. package/dist/src/bitgo/wallet/WalletOutput.d.ts +1 -17
  16. package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -1
  17. package/dist/src/bitgo/wallet/WalletOutput.js +23 -64
  18. package/dist/src/bitgo/wallet/chains.d.ts +1 -1
  19. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +1 -0
  20. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -1
  21. package/dist/src/bitgo/zcash/ZcashPsbt.js +12 -3
  22. package/dist/src/testutil/keys.d.ts +0 -3
  23. package/dist/src/testutil/keys.d.ts.map +1 -1
  24. package/dist/src/testutil/keys.js +2 -17
  25. package/dist/src/testutil/psbt.d.ts +5 -23
  26. package/dist/src/testutil/psbt.d.ts.map +1 -1
  27. package/dist/src/testutil/psbt.js +13 -16
  28. package/dist/src/testutil/transaction.d.ts +5 -14
  29. package/dist/src/testutil/transaction.d.ts.map +1 -1
  30. package/dist/src/testutil/transaction.js +9 -9
  31. package/package.json +5 -5
  32. package/dist/src/base_crypto.d.ts +0 -14
  33. package/dist/src/base_crypto.d.ts.map +0 -1
  34. package/dist/src/base_crypto.js +0 -215
  35. package/dist/src/bitgo/legacysafe/index.d.ts +0 -15
  36. package/dist/src/bitgo/legacysafe/index.d.ts.map +0 -1
  37. package/dist/src/bitgo/legacysafe/index.js +0 -61
  38. package/dist/src/musig.d.ts +0 -390
  39. package/dist/src/musig.d.ts.map +0 -1
  40. package/dist/src/musig.js +0 -447
@@ -1 +0,0 @@
1
- {"version":3,"file":"base_crypto.d.ts","sourceRoot":"","sources":["../../src/base_crypto.ts"],"names":[],"mappings":"AA4CA,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD;AAkCD,wBAAgB,OAAO,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAqB9C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAOnD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,UAAU,CAKlE;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,UAAU,CAKvE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAItD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAInD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAO/C;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAO/C;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAcrD;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAIhD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAW/C"}
@@ -1,215 +0,0 @@
1
- "use strict";
2
- // BigInt / Uint8Array versions of Crypto functions that do not require point
3
- // math. If your JS interpreter has BigInt, you can use all of these. If not,
4
- // you'll need to either shim it in or override more of these functions.
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.hasEvenY = exports.pointX = exports.pointNegate = exports.isSecret = exports.isScalar = exports.scalarMod = exports.scalarNegate = exports.scalarMultiply = exports.scalarAdd = exports.isXOnlyPoint = exports.isPoint = exports.readSecret = exports.readScalar = void 0;
7
- // Idea from noble-secp256k1, be nice to bad JS parsers
8
- const _0n = BigInt(0);
9
- const _1n = BigInt(1);
10
- const _2n = BigInt(2);
11
- const _3n = BigInt(3);
12
- const _5n = BigInt(5);
13
- const _7n = BigInt(7);
14
- const _64n = BigInt(64);
15
- const _64mask = BigInt('0xFFFFFFFFFFFFFFFF');
16
- const MAX_INT = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF');
17
- const CURVE = {
18
- b: BigInt(7),
19
- P: BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F'),
20
- n: BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141'),
21
- };
22
- // Big Endian
23
- function read32b(bytes) {
24
- if (bytes.length !== 32)
25
- throw new Error(`Expected 32-bytes, not ${bytes.length}`);
26
- const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.length);
27
- let b = view.getBigUint64(0);
28
- for (let offs = 8; offs < bytes.length; offs += 8) {
29
- b <<= _64n;
30
- b += view.getBigUint64(offs);
31
- }
32
- return b;
33
- }
34
- function write32b(num, dest = new Uint8Array(32)) {
35
- // All input values are modulo P or n, so no bounds checking needed
36
- const view = new DataView(dest.buffer, dest.byteOffset, dest.length);
37
- for (let offs = 24; offs >= 0; offs -= 8) {
38
- view.setBigUint64(offs, num & _64mask);
39
- num >>= _64n;
40
- }
41
- return dest;
42
- }
43
- function readScalar(bytes) {
44
- const a = read32b(bytes);
45
- if (a >= CURVE.n)
46
- throw new Error('Expected value mod n');
47
- return a;
48
- }
49
- exports.readScalar = readScalar;
50
- function readSecret(bytes) {
51
- const a = readScalar(bytes);
52
- if (a === 0n)
53
- throw new Error('Expected non-zero');
54
- return a;
55
- }
56
- exports.readSecret = readSecret;
57
- // The short Weierstrass form curve equation simplifes to y^2 = x^3 + 7.
58
- function secp256k1Right(x) {
59
- const x2 = (x * x) % CURVE.P;
60
- const x3 = (x2 * x) % CURVE.P;
61
- return (x3 + CURVE.b) % CURVE.P;
62
- }
63
- // For prime P, the Jacobi Symbol of 'a' is 1 if and only if 'a' is a quadratic
64
- // residue mod P, ie. there exists a value 'x' for whom x^2 = a.
65
- function jacobiSymbol(a) {
66
- if (a === _0n)
67
- return 0; // Vanishingly improbable
68
- let p = CURVE.P;
69
- let sign = 1;
70
- // This algorithm is fairly heavily optimized, so don't simplify it w/o benchmarking
71
- for (;;) {
72
- let and3;
73
- // Handle runs of zeros efficiently w/o flipping sign each time
74
- for (and3 = a & _3n; and3 === _0n; a >>= _2n, and3 = a & _3n)
75
- ;
76
- // If there's one more zero, shift it off and flip the sign
77
- if (and3 === _2n) {
78
- a >>= _1n;
79
- const pand7 = p & _7n;
80
- if (pand7 === _3n || pand7 === _5n)
81
- sign = -sign;
82
- }
83
- if (a === _1n)
84
- break;
85
- if ((_3n & a) === _3n && (_3n & p) === _3n)
86
- sign = -sign;
87
- [a, p] = [p % a, a];
88
- }
89
- return sign > 0 ? 1 : -1;
90
- }
91
- function isPoint(p) {
92
- if (p.length < 33)
93
- return false;
94
- const t = p[0];
95
- if (p.length === 33) {
96
- return (t === 0x02 || t === 0x03) && isXOnlyPoint(p.subarray(1));
97
- }
98
- if (t !== 0x04 || p.length !== 65)
99
- return false;
100
- const x = read32b(p.subarray(1, 33));
101
- if (x === _0n)
102
- return false;
103
- if (x >= CURVE.P)
104
- return false;
105
- const y = read32b(p.subarray(33));
106
- if (y === _0n)
107
- return false;
108
- if (y >= CURVE.P)
109
- return false;
110
- const left = (y * y) % CURVE.P;
111
- const right = secp256k1Right(x);
112
- return left === right;
113
- }
114
- exports.isPoint = isPoint;
115
- function isXOnlyPoint(p) {
116
- if (p.length !== 32)
117
- return false;
118
- const x = read32b(p);
119
- if (x === _0n)
120
- return false;
121
- if (x >= CURVE.P)
122
- return false;
123
- const y2 = secp256k1Right(x);
124
- return jacobiSymbol(y2) === 1; // If sqrt(y^2) exists, x is on the curve.
125
- }
126
- exports.isXOnlyPoint = isXOnlyPoint;
127
- function scalarAdd(a, b) {
128
- const aN = readScalar(a);
129
- const bN = readScalar(b);
130
- const sum = (aN + bN) % CURVE.n;
131
- return write32b(sum);
132
- }
133
- exports.scalarAdd = scalarAdd;
134
- function scalarMultiply(a, b) {
135
- const aN = readScalar(a);
136
- const bN = readScalar(b);
137
- const product = (aN * bN) % CURVE.n;
138
- return write32b(product);
139
- }
140
- exports.scalarMultiply = scalarMultiply;
141
- function scalarNegate(a) {
142
- const aN = readScalar(a);
143
- const negated = aN === _0n ? _0n : CURVE.n - aN;
144
- return write32b(negated);
145
- }
146
- exports.scalarNegate = scalarNegate;
147
- function scalarMod(a) {
148
- const aN = read32b(a);
149
- const remainder = aN % CURVE.n;
150
- return write32b(remainder);
151
- }
152
- exports.scalarMod = scalarMod;
153
- function isScalar(t) {
154
- try {
155
- readScalar(t);
156
- return true;
157
- }
158
- catch {
159
- return false;
160
- }
161
- }
162
- exports.isScalar = isScalar;
163
- function isSecret(s) {
164
- try {
165
- readSecret(s);
166
- return true;
167
- }
168
- catch {
169
- return false;
170
- }
171
- }
172
- exports.isSecret = isSecret;
173
- function pointNegate(p) {
174
- // hasEvenY does basic structure check, so start there
175
- const even = hasEvenY(p);
176
- // `from` because node.Buffer.slice doesn't copy but looks like a Uint8Array
177
- const negated = Uint8Array.from(p);
178
- if (p.length === 33) {
179
- negated[0] = even ? 3 : 2;
180
- }
181
- else if (p.length === 65) {
182
- const y = read32b(p.subarray(33));
183
- if (y >= CURVE.P)
184
- throw new Error('Expected Y coordinate mod P');
185
- const minusY = y === _0n ? _0n : CURVE.P - y;
186
- write32b(minusY, negated.subarray(33));
187
- }
188
- return negated;
189
- }
190
- exports.pointNegate = pointNegate;
191
- function pointX(p) {
192
- if (p.length === 32)
193
- return p;
194
- hasEvenY(p); // hasEvenY throws if not well structured
195
- return p.slice(1, 33);
196
- }
197
- exports.pointX = pointX;
198
- function hasEvenY(p) {
199
- if (p.length === 33) {
200
- if (p[0] === 2)
201
- return true;
202
- else if (p[0] === 3)
203
- return false;
204
- else
205
- throw new Error('Wrong first byte to be a point');
206
- }
207
- if (p.length === 65) {
208
- if (p[0] !== 4)
209
- throw new Error('Wrong first byte to be point');
210
- return p[64] % 2 === 0;
211
- }
212
- throw new Error('Wrong length to be a point');
213
- }
214
- exports.hasEvenY = hasEvenY;
215
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZV9jcnlwdG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmFzZV9jcnlwdG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDZFQUE2RTtBQUM3RSw2RUFBNkU7QUFDN0Usd0VBQXdFOzs7QUFFeEUsdURBQXVEO0FBQ3ZELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUU3QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsb0VBQW9FLENBQUMsQ0FBQztBQUU3RixNQUFNLEtBQUssR0FBRztJQUNaLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxFQUFFLE1BQU0sQ0FBQyxvRUFBb0UsQ0FBQztJQUMvRSxDQUFDLEVBQUUsTUFBTSxDQUFDLG9FQUFvRSxDQUFDO0NBQ2hGLENBQUM7QUFFRixhQUFhO0FBQ2IsU0FBUyxPQUFPLENBQUMsS0FBaUI7SUFDaEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEVBQUU7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNuRixNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxL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SyxFQUFFO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMseUNBQXlDO0lBQ3RELE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQUpELHdCQUlDO0FBRUQsU0FBZ0IsUUFBUSxDQUFDLENBQWE7SUFDcEMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRTtRQUNuQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7YUFDdkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDOztZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7S0FDeEQ7SUFDRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQ25CLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDaEUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN4QjtJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBWEQsNEJBV0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBCaWdJbnQgLyBVaW50OEFycmF5IHZlcnNpb25zIG9mIENyeXB0byBmdW5jdGlvbnMgdGhhdCBkbyBub3QgcmVxdWlyZSBwb2ludFxuLy8gbWF0aC4gSWYgeW91ciBKUyBpbnRlcnByZXRlciBoYXMgQmlnSW50LCB5b3UgY2FuIHVzZSBhbGwgb2YgdGhlc2UuIElmIG5vdCxcbi8vIHlvdSdsbCBuZWVkIHRvIGVpdGhlciBzaGltIGl0IGluIG9yIG92ZXJyaWRlIG1vcmUgb2YgdGhlc2UgZnVuY3Rpb25zLlxuXG4vLyBJZGVhIGZyb20gbm9ibGUtc2VjcDI1NmsxLCBiZSBuaWNlIHRvIGJhZCBKUyBwYXJzZXJzXG5jb25zdCBfMG4gPSBCaWdJbnQoMCk7XG5jb25zdCBfMW4gPSBCaWdJbnQoMSk7XG5jb25zdCBfMm4gPSBCaWdJbnQoMik7XG5jb25zdCBfM24gPSBCaWdJbnQoMyk7XG5jb25zdCBfNW4gPSBCaWdJbnQoNSk7XG5jb25zdCBfN24gPSBCaWdJbnQoNyk7XG5jb25zdCBfNjRuID0gQmlnSW50KDY0KTtcbmNvbnN0IF82NG1hc2sgPSBCaWdJbnQoJzB4RkZGRkZGRkZGRkZGRkZGRicpO1xuXG5jb25zdCBNQVhfSU5UID0gQmlnSW50KCcweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYnKTtcblxuY29uc3QgQ1VSVkUgPSB7XG4gIGI6IEJpZ0ludCg3KSxcbiAgUDogQmlnSW50KCcweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZDMkYnKSxcbiAgbjogQmlnSW50KCcweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFQkFBRURDRTZBRjQ4QTAzQkJGRDI1RThDRDAzNjQxNDEnKSxcbn07XG5cbi8vIEJpZyBFbmRpYW5cbmZ1bmN0aW9uIHJlYWQzMmIoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBiaWdpbnQge1xuICBpZiAoYnl0ZXMubGVuZ3RoICE9PSAzMikgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAzMi1ieXRlcywgbm90ICR7Ynl0ZXMubGVuZ3RofWApO1xuICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlciwgYnl0ZXMuYnl0ZU9mZnNldCwgYnl0ZXMubGVuZ3RoKTtcbiAgbGV0IGIgPSB2aWV3LmdldEJpZ1VpbnQ2NCgwKTtcbiAgZm9yIChsZXQgb2ZmcyA9IDg7IG9mZnMgPCBieXRlcy5sZW5ndGg7IG9mZnMgKz0gOCkge1xuICAgIGIgPDw9IF82NG47XG4gICAgYiArPSB2aWV3LmdldEJpZ1VpbnQ2NChvZmZzKTtcbiAgfVxuICByZXR1cm4gYjtcbn1cblxuZnVuY3Rpb24gd3JpdGUzMmIobnVtOiBiaWdpbnQsIGRlc3Q6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSgzMikpOiBVaW50OEFycmF5IHtcbiAgLy8gQWxsIGlucHV0IHZhbHVlcyBhcmUgbW9kdWxvIFAgb3Igbiwgc28gbm8gYm91bmRzIGNoZWNraW5nIG5lZWRlZFxuICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGRlc3QuYnVmZmVyLCBkZXN0LmJ5dGVPZmZzZXQsIGRlc3QubGVuZ3RoKTtcbiAgZm9yIChsZXQgb2ZmcyA9IDI0OyBvZmZzID49IDA7IG9mZnMgLT0gOCkge1xuICAgIHZpZXcuc2V0QmlnVWludDY0KG9mZnMsIG51bSAmIF82NG1hc2spO1xuICAgIG51bSA+Pj0gXzY0bjtcbiAgfVxuICByZXR1cm4gZGVzdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRTY2FsYXIoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBiaWdpbnQge1xuICBjb25zdCBhID0gcmVhZDMyYihieXRlcyk7XG4gIGlmIChhID49IENVUlZFLm4pIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdmFsdWUgbW9kIG4nKTtcbiAgcmV0dXJuIGE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkU2VjcmV0KGJ5dGVzOiBVaW50OEFycmF5KTogYmlnaW50IHtcbiAgY29uc3QgYSA9IHJlYWRTY2FsYXIoYnl0ZXMpO1xuICBpZiAoYSA9PT0gMG4pIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgbm9uLXplcm8nKTtcbiAgcmV0dXJuIGE7XG59XG5cbi8vIFRoZSBzaG9ydCBXZWllcnN0cmFzcyBmb3JtIGN1cnZlIGVxdWF0aW9uIHNpbXBsaWZlcyB0byB5XjIgPSB4XjMgKyA3LlxuZnVuY3Rpb24gc2VjcDI1NmsxUmlnaHQoeDogYmlnaW50KTogYmlnaW50IHtcbiAgY29uc3QgeDIgPSAoeCAqIHgpICUgQ1VSVkUuUDtcbiAgY29uc3QgeDMgPSAoeDIgKiB4KSAlIENVUlZFLlA7XG4gIHJldHVybiAoeDMgKyBDVVJWRS5iKSAlIENVUlZFLlA7XG59XG5cbi8vIEZvciBwcmltZSBQLCB0aGUgSmFjb2JpIFN5bWJvbCBvZiAnYScgaXMgMSBpZiBhbmQgb25seSBpZiAnYScgaXMgYSBxdWFkcmF0aWNcbi8vIHJlc2lkdWUgbW9kIFAsIGllLiB0aGVyZSBleGlzdHMgYSB2YWx1ZSAneCcgZm9yIHdob20geF4yID0gYS5cbmZ1bmN0aW9uIGphY29iaVN5bWJvbChhOiBiaWdpbnQpOiAtMSB8IDAgfCAxIHtcbiAgaWYgKGEgPT09IF8wbikgcmV0dXJuIDA7IC8vIFZhbmlzaGluZ2x5IGltcHJvYmFibGVcblxuICBsZXQgcCA9IENVUlZFLlA7XG4gIGxldCBzaWduID0gMTtcbiAgLy8gVGhpcyBhbGdvcml0aG0gaXMgZmFpcmx5IGhlYXZpbHkgb3B0aW1pemVkLCBzbyBkb24ndCBzaW1wbGlmeSBpdCB3L28gYmVuY2htYXJraW5nXG4gIGZvciAoOzspIHtcbiAgICBsZXQgYW5kMztcbiAgICAvLyBIYW5kbGUgcnVucyBvZiB6ZXJvcyBlZmZpY2llbnRseSB3L28gZmxpcHBpbmcgc2lnbiBlYWNoIHRpbWVcbiAgICBmb3IgKGFuZDMgPSBhICYgXzNuOyBhbmQzID09PSBfMG47IGEgPj49IF8ybiwgYW5kMyA9IGEgJiBfM24pO1xuICAgIC8vIElmIHRoZXJlJ3Mgb25lIG1vcmUgemVybywgc2hpZnQgaXQgb2ZmIGFuZCBmbGlwIHRoZSBzaWduXG4gICAgaWYgKGFuZDMgPT09IF8ybikge1xuICAgICAgYSA+Pj0gXzFuO1xuICAgICAgY29uc3QgcGFuZDcgPSBwICYgXzduO1xuICAgICAgaWYgKHBhbmQ3ID09PSBfM24gfHwgcGFuZDcgPT09IF81bikgc2lnbiA9IC1zaWduO1xuICAgIH1cbiAgICBpZiAoYSA9PT0gXzFuKSBicmVhaztcbiAgICBpZiAoKF8zbiAmIGEpID09PSBfM24gJiYgKF8zbiAmIHApID09PSBfM24pIHNpZ24gPSAtc2lnbjtcbiAgICBbYSwgcF0gPSBbcCAlIGEsIGFdO1xuICB9XG4gIHJldHVybiBzaWduID4gMCA/IDEgOiAtMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUG9pbnQocDogVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICBpZiAocC5sZW5ndGggPCAzMykgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IHQgPSBwWzBdO1xuICBpZiAocC5sZW5ndGggPT09IDMzKSB7XG4gICAgcmV0dXJuICh0ID09PSAweDAyIHx8IHQgPT09IDB4MDMpICYmIGlzWE9ubHlQb2ludChwLnN1YmFycmF5KDEpKTtcbiAgfVxuXG4gIGlmICh0ICE9PSAweDA0IHx8IHAubGVuZ3RoICE9PSA2NSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IHggPSByZWFkMzJiKHAuc3ViYXJyYXkoMSwgMzMpKTtcbiAgaWYgKHggPT09IF8wbikgcmV0dXJuIGZhbHNlO1xuICBpZiAoeCA+PSBDVVJWRS5QKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgeSA9IHJlYWQzMmIocC5zdWJhcnJheSgzMykpO1xuICBpZiAoeSA9PT0gXzBuKSByZXR1cm4gZmFsc2U7XG4gIGlmICh5ID49IENVUlZFLlApIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBsZWZ0ID0gKHkgKiB5KSAlIENVUlZFLlA7XG4gIGNvbnN0IHJpZ2h0ID0gc2VjcDI1NmsxUmlnaHQoeCk7XG4gIHJldHVybiBsZWZ0ID09PSByaWdodDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzWE9ubHlQb2ludChwOiBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gIGlmIChwLmxlbmd0aCAhPT0gMzIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgeCA9IHJlYWQzMmIocCk7XG4gIGlmICh4ID09PSBfMG4pIHJldHVybiBmYWxzZTtcbiAgaWYgKHggPj0gQ1VSVkUuUCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB5MiA9IHNlY3AyNTZrMVJpZ2h0KHgpO1xuICByZXR1cm4gamFjb2JpU3ltYm9sKHkyKSA9PT0gMTsgLy8gSWYgc3FydCh5XjIpIGV4aXN0cywgeCBpcyBvbiB0aGUgY3VydmUuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsYXJBZGQoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBhTiA9IHJlYWRTY2FsYXIoYSk7XG4gIGNvbnN0IGJOID0gcmVhZFNjYWxhcihiKTtcbiAgY29uc3Qgc3VtID0gKGFOICsgYk4pICUgQ1VSVkUubjtcbiAgcmV0dXJuIHdyaXRlMzJiKHN1bSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsYXJNdWx0aXBseShhOiBVaW50OEFycmF5LCBiOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gIGNvbnN0IGFOID0gcmVhZFNjYWxhcihhKTtcbiAgY29uc3QgYk4gPSByZWFkU2NhbGFyKGIpO1xuICBjb25zdCBwcm9kdWN0ID0gKGFOICogYk4pICUgQ1VSVkUubjtcbiAgcmV0dXJuIHdyaXRlMzJiKHByb2R1Y3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGFyTmVnYXRlKGE6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgY29uc3QgYU4gPSByZWFkU2NhbGFyKGEpO1xuICBjb25zdCBuZWdhdGVkID0gYU4gPT09IF8wbiA/IF8wbiA6IENVUlZFLm4gLSBhTjtcbiAgcmV0dXJuIHdyaXRlMzJiKG5lZ2F0ZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGFyTW9kKGE6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgY29uc3QgYU4gPSByZWFkMzJiKGEpO1xuICBjb25zdCByZW1haW5kZXIgPSBhTiAlIENVUlZFLm47XG4gIHJldHVybiB3cml0ZTMyYihyZW1haW5kZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTY2FsYXIodDogVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJlYWRTY2FsYXIodCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTZWNyZXQoczogVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJlYWRTZWNyZXQocyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9pbnROZWdhdGUocDogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAvLyBoYXNFdmVuWSBkb2VzIGJhc2ljIHN0cnVjdHVyZSBjaGVjaywgc28gc3RhcnQgdGhlcmVcbiAgY29uc3QgZXZlbiA9IGhhc0V2ZW5ZKHApO1xuICAvLyBgZnJvbWAgYmVjYXVzZSBub2RlLkJ1ZmZlci5zbGljZSBkb2Vzbid0IGNvcHkgYnV0IGxvb2tzIGxpa2UgYSBVaW50OEFycmF5XG4gIGNvbnN0IG5lZ2F0ZWQgPSBVaW50OEFycmF5LmZyb20ocCk7XG4gIGlmIChwLmxlbmd0aCA9PT0gMzMpIHtcbiAgICBuZWdhdGVkWzBdID0gZXZlbiA/IDMgOiAyO1xuICB9IGVsc2UgaWYgKHAubGVuZ3RoID09PSA2NSkge1xuICAgIGNvbnN0IHkgPSByZWFkMzJiKHAuc3ViYXJyYXkoMzMpKTtcbiAgICBpZiAoeSA+PSBDVVJWRS5QKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIFkgY29vcmRpbmF0ZSBtb2QgUCcpO1xuICAgIGNvbnN0IG1pbnVzWSA9IHkgPT09IF8wbiA/IF8wbiA6IENVUlZFLlAgLSB5O1xuICAgIHdyaXRlMzJiKG1pbnVzWSwgbmVnYXRlZC5zdWJhcnJheSgzMykpO1xuICB9XG4gIHJldHVybiBuZWdhdGVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9pbnRYKHA6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgaWYgKHAubGVuZ3RoID09PSAzMikgcmV0dXJuIHA7XG4gIGhhc0V2ZW5ZKHApOyAvLyBoYXNFdmVuWSB0aHJvd3MgaWYgbm90IHdlbGwgc3RydWN0dXJlZFxuICByZXR1cm4gcC5zbGljZSgxLCAzMyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNFdmVuWShwOiBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gIGlmIChwLmxlbmd0aCA9PT0gMzMpIHtcbiAgICBpZiAocFswXSA9PT0gMikgcmV0dXJuIHRydWU7XG4gICAgZWxzZSBpZiAocFswXSA9PT0gMykgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdXcm9uZyBmaXJzdCBieXRlIHRvIGJlIGEgcG9pbnQnKTtcbiAgfVxuICBpZiAocC5sZW5ndGggPT09IDY1KSB7XG4gICAgaWYgKHBbMF0gIT09IDQpIHRocm93IG5ldyBFcnJvcignV3JvbmcgZmlyc3QgYnl0ZSB0byBiZSBwb2ludCcpO1xuICAgIHJldHVybiBwWzY0XSAlIDIgPT09IDA7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdXcm9uZyBsZW5ndGggdG8gYmUgYSBwb2ludCcpO1xufVxuIl19
@@ -1,15 +0,0 @@
1
- /**
2
- * V1 Safe Wallets are the oldest type of wallets that BitGo supports. They were
3
- * created back in 2013-14 and don't use HD chains. Instead, they have only one
4
- * P2SH address per wallet whose redeem script uses uncompressed public keys.
5
- * */
6
- /// <reference types="node" />
7
- import { Network } from '../../networks';
8
- export declare function toUncompressedPub(pubkey: Buffer): Buffer;
9
- export declare function toCompressedPub(pubkey: Buffer): Buffer;
10
- /** create p2sh scripts with uncompressed pubkeys */
11
- export declare function createLegacySafeOutputScript2of3(pubkeys: Buffer[], network?: Network): {
12
- scriptPubKey: Buffer;
13
- redeemScript: Buffer;
14
- };
15
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/legacysafe/index.ts"],"names":[],"mappings":"AAAA;;;;KAIK;;AAIL,OAAO,EAAa,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAepD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,oDAAoD;AACpD,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE,OAAO,GAChB;IACD,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB,CAgCA"}
@@ -1,61 +0,0 @@
1
- "use strict";
2
- /**
3
- * V1 Safe Wallets are the oldest type of wallets that BitGo supports. They were
4
- * created back in 2013-14 and don't use HD chains. Instead, they have only one
5
- * P2SH address per wallet whose redeem script uses uncompressed public keys.
6
- * */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.createLegacySafeOutputScript2of3 = exports.toCompressedPub = exports.toUncompressedPub = void 0;
9
- const assert = require("assert");
10
- const noble_ecc_1 = require("../../noble_ecc");
11
- const networks_1 = require("../../networks");
12
- const types_1 = require("../types");
13
- const bitcoinjs = require("bitcoinjs-lib");
14
- function getPublicKeyBuffer(publicKey, { compressed = true } = {}) {
15
- const res = noble_ecc_1.ecc.pointCompress(publicKey, compressed);
16
- if (res === null) {
17
- throw new Error('invalid public key');
18
- }
19
- const buffer = Buffer.from(res);
20
- assert.strictEqual(buffer.length, compressed ? 33 : 65);
21
- return buffer;
22
- }
23
- function toUncompressedPub(pubkey) {
24
- return getPublicKeyBuffer(pubkey, { compressed: false });
25
- }
26
- exports.toUncompressedPub = toUncompressedPub;
27
- function toCompressedPub(pubkey) {
28
- return getPublicKeyBuffer(pubkey, { compressed: true });
29
- }
30
- exports.toCompressedPub = toCompressedPub;
31
- /** create p2sh scripts with uncompressed pubkeys */
32
- function createLegacySafeOutputScript2of3(pubkeys, network) {
33
- if (network) {
34
- if (!networks_1.isBitcoin(network)) {
35
- throw new Error(`unsupported network for legacy safe output script: ${network.coin}`);
36
- }
37
- }
38
- if (!types_1.isTriple(pubkeys)) {
39
- throw new Error(`must provide pubkey triple`);
40
- }
41
- pubkeys.forEach((key) => {
42
- if (key.length !== pubkeys[0].length) {
43
- throw new Error(`all pubkeys must have the same length`);
44
- }
45
- if (key.length !== 65 && key.length !== 33) {
46
- // V1 Safe BTC wallets could contain either uncompressed or compressed pubkeys
47
- throw new Error(`Unexpected key length ${key.length}, neither compressed nor uncompressed.`);
48
- }
49
- });
50
- const script2of3 = bitcoinjs.payments.p2ms({ m: 2, pubkeys });
51
- assert(script2of3.output);
52
- const scriptPubKey = bitcoinjs.payments.p2sh({ redeem: script2of3 });
53
- assert(scriptPubKey);
54
- assert(scriptPubKey.output);
55
- return {
56
- scriptPubKey: scriptPubKey.output,
57
- redeemScript: script2of3.output,
58
- };
59
- }
60
- exports.createLegacySafeOutputScript2of3 = createLegacySafeOutputScript2of3;
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vbGVnYWN5c2FmZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7S0FJSzs7O0FBRUwsaUNBQWlDO0FBQ2pDLCtDQUFnRDtBQUNoRCw2Q0FBb0Q7QUFDcEQsb0NBQW9DO0FBQ3BDLDJDQUEyQztBQUUzQyxTQUFTLGtCQUFrQixDQUFDLFNBQWlCLEVBQUUsRUFBRSxVQUFVLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRTtJQUN2RSxNQUFNLEdBQUcsR0FBRyxlQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN4RCxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUU7UUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0tBQ3ZDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVoQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFnQixpQkFBaUIsQ0FBQyxNQUFjO0lBQzlDLE9BQU8sa0JBQWtCLENBQUMsTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUZELDhDQUVDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLE1BQWM7SUFDNUMsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRkQsMENBRUM7QUFFRCxvREFBb0Q7QUFDcEQsU0FBZ0IsZ0NBQWdDLENBQzlDLE9BQWlCLEVBQ2pCLE9BQWlCO0lBS2pCLElBQUksT0FBTyxFQUFFO1FBQ1gsSUFBSSxDQUFDLG9CQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7U0FDdkY7S0FDRjtJQUVELElBQUksQ0FBQyxnQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztLQUMvQztJQUVELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUN0QixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtZQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7U0FDMUQ7UUFDRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1lBQzFDLDhFQUE4RTtZQUM5RSxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixHQUFHLENBQUMsTUFBTSx3Q0FBd0MsQ0FBQyxDQUFDO1NBQzlGO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM5RCxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTFCLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDckUsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3JCLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFNUIsT0FBTztRQUNMLFlBQVksRUFBRSxZQUFZLENBQUMsTUFBTTtRQUNqQyxZQUFZLEVBQUUsVUFBVSxDQUFDLE1BQU07S0FDaEMsQ0FBQztBQUNKLENBQUM7QUF0Q0QsNEVBc0NDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBWMSBTYWZlIFdhbGxldHMgYXJlIHRoZSBvbGRlc3QgdHlwZSBvZiB3YWxsZXRzIHRoYXQgQml0R28gc3VwcG9ydHMuIFRoZXkgd2VyZVxuICogY3JlYXRlZCBiYWNrIGluIDIwMTMtMTQgYW5kIGRvbid0IHVzZSBIRCBjaGFpbnMuIEluc3RlYWQsIHRoZXkgaGF2ZSBvbmx5IG9uZVxuICogUDJTSCBhZGRyZXNzIHBlciB3YWxsZXQgd2hvc2UgcmVkZWVtIHNjcmlwdCB1c2VzIHVuY29tcHJlc3NlZCBwdWJsaWMga2V5cy5cbiAqICovXG5cbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgZWNjIGFzIGVjY0xpYiB9IGZyb20gJy4uLy4uL25vYmxlX2VjYyc7XG5pbXBvcnQgeyBpc0JpdGNvaW4sIE5ldHdvcmsgfSBmcm9tICcuLi8uLi9uZXR3b3Jrcyc7XG5pbXBvcnQgeyBpc1RyaXBsZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIGJpdGNvaW5qcyBmcm9tICdiaXRjb2luanMtbGliJztcblxuZnVuY3Rpb24gZ2V0UHVibGljS2V5QnVmZmVyKHB1YmxpY0tleTogQnVmZmVyLCB7IGNvbXByZXNzZWQgPSB0cnVlIH0gPSB7fSk6IEJ1ZmZlciB7XG4gIGNvbnN0IHJlcyA9IGVjY0xpYi5wb2ludENvbXByZXNzKHB1YmxpY0tleSwgY29tcHJlc3NlZCk7XG4gIGlmIChyZXMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHVibGljIGtleScpO1xuICB9XG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlcyk7XG5cbiAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1ZmZlci5sZW5ndGgsIGNvbXByZXNzZWQgPyAzMyA6IDY1KTtcbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvVW5jb21wcmVzc2VkUHViKHB1YmtleTogQnVmZmVyKTogQnVmZmVyIHtcbiAgcmV0dXJuIGdldFB1YmxpY0tleUJ1ZmZlcihwdWJrZXksIHsgY29tcHJlc3NlZDogZmFsc2UgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0NvbXByZXNzZWRQdWIocHVia2V5OiBCdWZmZXIpOiBCdWZmZXIge1xuICByZXR1cm4gZ2V0UHVibGljS2V5QnVmZmVyKHB1YmtleSwgeyBjb21wcmVzc2VkOiB0cnVlIH0pO1xufVxuXG4vKiogY3JlYXRlIHAyc2ggc2NyaXB0cyB3aXRoIHVuY29tcHJlc3NlZCBwdWJrZXlzICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGVnYWN5U2FmZU91dHB1dFNjcmlwdDJvZjMoXG4gIHB1YmtleXM6IEJ1ZmZlcltdLFxuICBuZXR3b3JrPzogTmV0d29ya1xuKToge1xuICBzY3JpcHRQdWJLZXk6IEJ1ZmZlcjtcbiAgcmVkZWVtU2NyaXB0OiBCdWZmZXI7XG59IHtcbiAgaWYgKG5ldHdvcmspIHtcbiAgICBpZiAoIWlzQml0Y29pbihuZXR3b3JrKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBuZXR3b3JrIGZvciBsZWdhY3kgc2FmZSBvdXRwdXQgc2NyaXB0OiAke25ldHdvcmsuY29pbn1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWlzVHJpcGxlKHB1YmtleXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBtdXN0IHByb3ZpZGUgcHVia2V5IHRyaXBsZWApO1xuICB9XG5cbiAgcHVia2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBpZiAoa2V5Lmxlbmd0aCAhPT0gcHVia2V5c1swXS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgYWxsIHB1YmtleXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aGApO1xuICAgIH1cbiAgICBpZiAoa2V5Lmxlbmd0aCAhPT0gNjUgJiYga2V5Lmxlbmd0aCAhPT0gMzMpIHtcbiAgICAgIC8vIFYxIFNhZmUgQlRDIHdhbGxldHMgY291bGQgY29udGFpbiBlaXRoZXIgdW5jb21wcmVzc2VkIG9yIGNvbXByZXNzZWQgcHVia2V5c1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGtleSBsZW5ndGggJHtrZXkubGVuZ3RofSwgbmVpdGhlciBjb21wcmVzc2VkIG5vciB1bmNvbXByZXNzZWQuYCk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBzY3JpcHQyb2YzID0gYml0Y29pbmpzLnBheW1lbnRzLnAybXMoeyBtOiAyLCBwdWJrZXlzIH0pO1xuICBhc3NlcnQoc2NyaXB0Mm9mMy5vdXRwdXQpO1xuXG4gIGNvbnN0IHNjcmlwdFB1YktleSA9IGJpdGNvaW5qcy5wYXltZW50cy5wMnNoKHsgcmVkZWVtOiBzY3JpcHQyb2YzIH0pO1xuICBhc3NlcnQoc2NyaXB0UHViS2V5KTtcbiAgYXNzZXJ0KHNjcmlwdFB1YktleS5vdXRwdXQpO1xuXG4gIHJldHVybiB7XG4gICAgc2NyaXB0UHViS2V5OiBzY3JpcHRQdWJLZXkub3V0cHV0LFxuICAgIHJlZGVlbVNjcmlwdDogc2NyaXB0Mm9mMy5vdXRwdXQsXG4gIH07XG59XG4iXX0=