@bitgo-beta/utxo-descriptors 0.0.1-beta.3 → 0.0.1-beta.300
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/dist/cjs/src/index.d.ts +1 -0
- package/dist/cjs/src/index.d.ts.map +1 -1
- package/dist/cjs/src/index.js +3 -2
- package/dist/cjs/src/pox5/descriptor.d.ts +22 -0
- package/dist/cjs/src/pox5/descriptor.d.ts.map +1 -0
- package/dist/cjs/src/pox5/descriptor.js +79 -0
- package/dist/cjs/src/pox5/index.d.ts +5 -0
- package/dist/cjs/src/pox5/index.d.ts.map +1 -0
- package/dist/cjs/src/pox5/index.js +21 -0
- package/dist/cjs/src/pox5/input.d.ts +28 -0
- package/dist/cjs/src/pox5/input.d.ts.map +1 -0
- package/dist/cjs/src/pox5/input.js +47 -0
- package/dist/cjs/src/pox5/parseDescriptor.d.ts +18 -0
- package/dist/cjs/src/pox5/parseDescriptor.d.ts.map +1 -0
- package/dist/cjs/src/pox5/parseDescriptor.js +95 -0
- package/dist/cjs/src/pox5/validation.d.ts +12 -0
- package/dist/cjs/src/pox5/validation.d.ts.map +1 -0
- package/dist/cjs/src/pox5/validation.js +70 -0
- package/dist/cjs/src/sbtc/index.d.ts +1 -0
- package/dist/cjs/src/sbtc/index.d.ts.map +1 -1
- package/dist/cjs/src/sbtc/index.js +2 -1
- package/dist/cjs/src/sbtc/parseDescriptor.d.ts +55 -0
- package/dist/cjs/src/sbtc/parseDescriptor.d.ts.map +1 -0
- package/dist/cjs/src/sbtc/parseDescriptor.js +185 -0
- package/dist/cjs/test/unit/pox5/descriptor.d.ts +2 -0
- package/dist/cjs/test/unit/pox5/descriptor.d.ts.map +1 -0
- package/dist/cjs/test/unit/pox5/descriptor.js +157 -0
- package/dist/cjs/test/unit/pox5/input.d.ts +2 -0
- package/dist/cjs/test/unit/pox5/input.d.ts.map +1 -0
- package/dist/cjs/test/unit/pox5/input.js +113 -0
- package/dist/cjs/test/unit/pox5/validation.d.ts +2 -0
- package/dist/cjs/test/unit/pox5/validation.d.ts.map +1 -0
- package/dist/cjs/test/unit/pox5/validation.js +99 -0
- package/dist/cjs/test/unit/sbtc/parseDescriptor.d.ts +2 -0
- package/dist/cjs/test/unit/sbtc/parseDescriptor.d.ts.map +1 -0
- package/dist/cjs/test/unit/sbtc/parseDescriptor.js +202 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/pox5/descriptor.d.ts +22 -0
- package/dist/esm/pox5/descriptor.d.ts.map +1 -0
- package/dist/esm/pox5/descriptor.js +74 -0
- package/dist/esm/pox5/index.d.ts +5 -0
- package/dist/esm/pox5/index.d.ts.map +1 -0
- package/dist/esm/pox5/index.js +5 -0
- package/dist/esm/pox5/input.d.ts +28 -0
- package/dist/esm/pox5/input.d.ts.map +1 -0
- package/dist/esm/pox5/input.js +43 -0
- package/dist/esm/pox5/parseDescriptor.d.ts +18 -0
- package/dist/esm/pox5/parseDescriptor.d.ts.map +1 -0
- package/dist/esm/pox5/parseDescriptor.js +92 -0
- package/dist/esm/pox5/validation.d.ts +12 -0
- package/dist/esm/pox5/validation.d.ts.map +1 -0
- package/dist/esm/pox5/validation.js +65 -0
- package/dist/esm/sbtc/index.d.ts +1 -0
- package/dist/esm/sbtc/index.d.ts.map +1 -1
- package/dist/esm/sbtc/index.js +2 -1
- package/dist/esm/sbtc/parseDescriptor.d.ts +55 -0
- package/dist/esm/sbtc/parseDescriptor.d.ts.map +1 -0
- package/dist/esm/sbtc/parseDescriptor.js +182 -0
- package/package.json +8 -5
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseSbtcDepositDescriptor = parseSbtcDepositDescriptor;
|
|
4
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
5
|
+
const descriptor_1 = require("@bitgo-beta/utxo-core/descriptor");
|
|
6
|
+
const constants_1 = require("./constants");
|
|
7
|
+
function asString(v, field) {
|
|
8
|
+
if (typeof v !== 'string') {
|
|
9
|
+
throw new Error(`${field} must be a string`);
|
|
10
|
+
}
|
|
11
|
+
return v;
|
|
12
|
+
}
|
|
13
|
+
function asNumber(v, field) {
|
|
14
|
+
if (typeof v !== 'number') {
|
|
15
|
+
throw new Error(`${field} must be a number`);
|
|
16
|
+
}
|
|
17
|
+
return v;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Pull `[threshold, ...keys]` out of a `multi_a` AST node value, validating
|
|
21
|
+
* each element. The descriptor's `multi_a` is rendered with keys either as
|
|
22
|
+
* concrete hex (definite descriptor) or as xpub strings ending in `/*`
|
|
23
|
+
* (derivable descriptor) — both are strings here, so we don't try to convert
|
|
24
|
+
* to Buffer at this level.
|
|
25
|
+
*/
|
|
26
|
+
function parseMulti(multi) {
|
|
27
|
+
if (!Array.isArray(multi) || multi.length < 1) {
|
|
28
|
+
throw new Error('Invalid multi_a structure: not an array or empty');
|
|
29
|
+
}
|
|
30
|
+
const [threshold, ...keys] = multi;
|
|
31
|
+
if (typeof threshold !== 'number') {
|
|
32
|
+
throw new Error('Invalid multi_a structure: threshold is not a number');
|
|
33
|
+
}
|
|
34
|
+
if (!keys.every((k) => typeof k === 'string')) {
|
|
35
|
+
throw new Error('Invalid multi_a structure: not all keys are strings');
|
|
36
|
+
}
|
|
37
|
+
return [threshold, keys];
|
|
38
|
+
}
|
|
39
|
+
function parseDepositLeaf(depositNode, matcher) {
|
|
40
|
+
const depositPattern = {
|
|
41
|
+
and_v: [{ payload_drop: { $var: 'payloadHex' } }, { pk: { $var: 'signersKey' } }],
|
|
42
|
+
};
|
|
43
|
+
const match = matcher.match(depositNode, depositPattern);
|
|
44
|
+
if (!match) {
|
|
45
|
+
throw new Error('Deposit leaf does not match expected pattern');
|
|
46
|
+
}
|
|
47
|
+
const payloadHex = asString(match.payloadHex, 'payload_drop value');
|
|
48
|
+
const signersKeyHex = asString(match.signersKey, 'pk_k key');
|
|
49
|
+
const expectedPayloadLength = constants_1.MAX_FEE_BYTE_LENGTH + constants_1.STACKS_RECIPIENT_BYTE_LENGTH;
|
|
50
|
+
const payload = Buffer.from(payloadHex, 'hex');
|
|
51
|
+
if (payload.length !== expectedPayloadLength) {
|
|
52
|
+
throw new Error(`payload_drop value must be ${expectedPayloadLength} bytes (${expectedPayloadLength * 2} hex chars), got ${payload.length} bytes`);
|
|
53
|
+
}
|
|
54
|
+
const maxFee = payload.readBigUInt64BE(0);
|
|
55
|
+
const stacksRecipient = payload.subarray(constants_1.MAX_FEE_BYTE_LENGTH);
|
|
56
|
+
const signersAggregateKey = Buffer.from(signersKeyHex, 'hex');
|
|
57
|
+
if (signersAggregateKey.length !== 32) {
|
|
58
|
+
throw new Error(`signersAggregateKey must be 32 bytes x-only, got ${signersAggregateKey.length}`);
|
|
59
|
+
}
|
|
60
|
+
return { signersAggregateKey, maxFee, stacksRecipient };
|
|
61
|
+
}
|
|
62
|
+
function parseReclaimLeaf(reclaimNode, matcher) {
|
|
63
|
+
// and_v(r:older(<lockTime>), multi_a(2, k1, k2, k3))
|
|
64
|
+
const reclaimPattern = {
|
|
65
|
+
and_v: [{ 'r:older': { $var: 'lockTime' } }, { multi_a: { $var: 'reclaimMulti' } }],
|
|
66
|
+
};
|
|
67
|
+
const match = matcher.match(reclaimNode, reclaimPattern);
|
|
68
|
+
if (!match) {
|
|
69
|
+
throw new Error('Reclaim leaf does not match expected pattern');
|
|
70
|
+
}
|
|
71
|
+
const lockTime = asNumber(match.lockTime, 'r:older argument');
|
|
72
|
+
if (lockTime <= 0) {
|
|
73
|
+
throw new Error(`reclaim lockTime must be > 0, got ${lockTime}`);
|
|
74
|
+
}
|
|
75
|
+
const [threshold, reclaimKeyStrings] = parseMulti(match.reclaimMulti);
|
|
76
|
+
if (threshold !== 2) {
|
|
77
|
+
throw new Error(`reclaim multi_a threshold must be 2, got ${threshold}`);
|
|
78
|
+
}
|
|
79
|
+
if (reclaimKeyStrings.length !== 3) {
|
|
80
|
+
throw new Error(`reclaim multi_a must have exactly 3 keys, got ${reclaimKeyStrings.length}`);
|
|
81
|
+
}
|
|
82
|
+
return { lockTime, reclaimKeyStrings };
|
|
83
|
+
}
|
|
84
|
+
const HEX_X_ONLY_KEY = /^[0-9a-fA-F]{64}$/;
|
|
85
|
+
const XPUB_WITH_INDEX = /^([1-9A-HJ-NP-Za-km-z]+)\/(\d+)$/;
|
|
86
|
+
/**
|
|
87
|
+
* Resolve a single `multi_a` key entry to a 32-byte x-only public key.
|
|
88
|
+
*
|
|
89
|
+
* Accepts:
|
|
90
|
+
* - 64-hex-char string → returned as-is (already x-only)
|
|
91
|
+
* - `xpub.../<index>` → BIP32-derive at that index and drop the prefix byte
|
|
92
|
+
*
|
|
93
|
+
* Returns null for any other shape (e.g. wildcard `xpub.../*`, malformed input).
|
|
94
|
+
*/
|
|
95
|
+
function resolveReclaimKey(s) {
|
|
96
|
+
if (HEX_X_ONLY_KEY.test(s)) {
|
|
97
|
+
return Buffer.from(s, 'hex');
|
|
98
|
+
}
|
|
99
|
+
const m = s.match(XPUB_WITH_INDEX);
|
|
100
|
+
if (!m) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
const [, xpub, indexStr] = m;
|
|
104
|
+
const index = Number.parseInt(indexStr, 10);
|
|
105
|
+
if (!Number.isFinite(index) || index < 0) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
let node;
|
|
109
|
+
try {
|
|
110
|
+
node = wasm_utxo_1.BIP32.fromBase58(xpub);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
// BIP32 public key is 33 bytes (1 prefix + 32 x-only). Drop the prefix.
|
|
116
|
+
return Buffer.from(node.derive(index).publicKey.subarray(1));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Convert reclaim-leaf key strings into 32-byte x-only buffers. Accepts both
|
|
120
|
+
* the definite/derived form (concrete 64-hex-char x-only keys) and the form
|
|
121
|
+
* produced by `Descriptor.atDerivationIndex(n)` (`xpub.../<n>`). Returns
|
|
122
|
+
* undefined if any entry is still wildcard (`xpub.../*`) or otherwise
|
|
123
|
+
* unresolvable.
|
|
124
|
+
*/
|
|
125
|
+
function reclaimKeysFromStrings(keyStrings) {
|
|
126
|
+
const resolved = keyStrings.map(resolveReclaimKey);
|
|
127
|
+
if (resolved.some((b) => b === null) || resolved.length !== 3) {
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
return [resolved[0], resolved[1], resolved[2]];
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Parse an sBTC peg-in deposit descriptor and return its components.
|
|
134
|
+
*
|
|
135
|
+
* Returns `null` if the descriptor does not match the expected
|
|
136
|
+
* `tr(<UNSPENDABLE>, {<depositLeaf>, <reclaimLeaf>})` shape — same convention
|
|
137
|
+
* as babylon's `parseStakingDescriptor`. Throws if the shape matches but a
|
|
138
|
+
* sub-field is malformed (e.g. signers key isn't 32 bytes, payload isn't 30
|
|
139
|
+
* bytes, threshold isn't 2).
|
|
140
|
+
*
|
|
141
|
+
* Accepts both the `Descriptor` WASM object (definite or derivable) and a
|
|
142
|
+
* pre-extracted `ast.DescriptorNode`
|
|
143
|
+
*/
|
|
144
|
+
function parseSbtcDepositDescriptor(descriptor) {
|
|
145
|
+
const pattern = {
|
|
146
|
+
tr: [constants_1.UNSPENDABLE_INTERNAL_KEY, [{ $var: 'depositLeaf' }, { $var: 'reclaimLeaf' }]],
|
|
147
|
+
};
|
|
148
|
+
const matcher = new descriptor_1.PatternMatcher();
|
|
149
|
+
const descriptorNode = descriptor instanceof wasm_utxo_1.Descriptor ? wasm_utxo_1.ast.fromDescriptor(descriptor) : descriptor;
|
|
150
|
+
const result = matcher.match(descriptorNode, pattern);
|
|
151
|
+
if (!result) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
const depositMiniscriptNode = result.depositLeaf;
|
|
155
|
+
let reclaimMiniscriptNode = result.reclaimLeaf;
|
|
156
|
+
const { signersAggregateKey, maxFee, stacksRecipient } = parseDepositLeaf(depositMiniscriptNode, matcher);
|
|
157
|
+
const { lockTime, reclaimKeyStrings } = parseReclaimLeaf(reclaimMiniscriptNode, matcher);
|
|
158
|
+
const reclaimKeyStringsTuple = [
|
|
159
|
+
reclaimKeyStrings[0],
|
|
160
|
+
reclaimKeyStrings[1],
|
|
161
|
+
reclaimKeyStrings[2],
|
|
162
|
+
];
|
|
163
|
+
const reclaimKeys = reclaimKeysFromStrings(reclaimKeyStrings);
|
|
164
|
+
if (reclaimKeys) {
|
|
165
|
+
// Rewrite the reclaim leaf with concrete hex keys when we can resolve
|
|
166
|
+
// them — `Miniscript.fromString(..., 'tap')` only accepts x-only hex in
|
|
167
|
+
// `multi_a`, not xpub-form strings. With this rewrite the formatted
|
|
168
|
+
// leaf is directly compilable; without it callers must do the
|
|
169
|
+
// resolution themselves.
|
|
170
|
+
reclaimMiniscriptNode = {
|
|
171
|
+
and_v: [{ 'r:older': lockTime }, { multi_a: [2, ...reclaimKeys.map((k) => k.toString('hex'))] }],
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
signersAggregateKey,
|
|
176
|
+
maxFee,
|
|
177
|
+
stacksRecipient,
|
|
178
|
+
lockTime,
|
|
179
|
+
reclaimKeys,
|
|
180
|
+
reclaimKeyStrings: reclaimKeyStringsTuple,
|
|
181
|
+
depositMiniscriptNode,
|
|
182
|
+
reclaimMiniscriptNode,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VEZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NidGMvcGFyc2VEZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZ05BLGdFQWdEQztBQWhRRCxnREFBMEQ7QUFDMUQsaUVBQTJFO0FBRTNFLDJDQUEwRztBQTJDMUcsU0FBUyxRQUFRLENBQUMsQ0FBVSxFQUFFLEtBQWE7SUFDekMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxDQUFVLEVBQUUsS0FBYTtJQUN6QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLG1CQUFtQixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQWM7SUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELE1BQU0sQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDbkMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMs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SyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDakcsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPO1FBQ0wsbUJBQW1CO1FBQ25CLE1BQU07UUFDTixlQUFlO1FBQ2YsUUFBUTtRQUNSLFdBQVc7UUFDWCxpQkFBaUIsRUFBRSxzQkFBc0I7UUFDekMscUJBQXFCO1FBQ3JCLHFCQUFxQjtLQUN0QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJJUDMyLCBEZXNjcmlwdG9yLCBhc3QgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IFBhdHRlcm5NYXRjaGVyLCBQYXR0ZXJuIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1jb3JlL2Rlc2NyaXB0b3InO1xuXG5pbXBvcnQgeyBNQVhfRkVFX0JZVEVfTEVOR1RILCBTVEFDS1NfUkVDSVBJRU5UX0JZVEVfTEVOR1RILCBVTlNQRU5EQUJMRV9JTlRFUk5BTF9LRVkgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogUGFyc2VkIGNvbXBvbmVudHMgb2YgYW4gc0JUQyBwZWctaW4gZGVwb3NpdCBkZXNjcmlwdG9yLlxuICpcbiAqIFRoZSBwYXJzZXIgcmV0dXJucyBib3RoIHRoZSBoaWdoLWxldmVsXG4gKiBmaWVsZHMgY2FsbGVycyB1c3VhbGx5IG5lZWQgKGtleXMsIGxvY2tUaW1lLCBmZWUsIHJlY2lwaWVudCkgYW5kIHRoZSByYXdcbiAqIG1pbmlzY3JpcHQgQVNUIG5vZGVzIHNvIHRoZSBsZWF2ZXMgY2FuIGJlIHJlLWNvbXBpbGVkIGludG8gYVxuICogYE1pbmlzY3JpcHRgIHZpYSBgYXN0LmZvcm1hdE5vZGVgICsgYE1pbmlzY3JpcHQuZnJvbVN0cmluZ2AuXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlZFNidGNEZXBvc2l0RGVzY3JpcHRvciA9IHtcbiAgLyoqIDMyLWJ5dGUgeC1vbmx5IHNpZ25lcnMgYWdncmVnYXRlIGtleSBmcm9tIHRoZSBkZXBvc2l0IGxlYWYuICovXG4gIHNpZ25lcnNBZ2dyZWdhdGVLZXk6IEJ1ZmZlcjtcbiAgLyoqIE1heCBzaWduZXIgZmVlIHBhcnNlZCBmcm9tIHRoZSBmaXJzdCA4IGJ5dGVzIG9mIHRoZSBwYXlsb2FkX2Ryb3AgdmFsdWUuICovXG4gIG1heEZlZTogYmlnaW50O1xuICAvKiogMjItYnl0ZSBTdGFja3MgcmVjaXBpZW50IHBhcnNlZCBmcm9tIHRoZSB0cmFpbGluZyBieXRlcyBvZiB0aGUgcGF5bG9hZC4gKi9cbiAgc3RhY2tzUmVjaXBpZW50OiBCdWZmZXI7XG4gIC8qKiBSZWNsYWltLWxlYWYgcmVsYXRpdmUgdGltZWxvY2sgKG51bWJlciBvZiBCaXRjb2luIGJsb2NrcywgT1BfQ1NWIGFyZ3VtZW50KS4gKi9cbiAgbG9ja1RpbWU6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB0aHJlZSBjb25jcmV0ZSB4LW9ubHkgcmVjbGFpbSBrZXlzIGZyb20gdGhlIHJlY2xhaW0tbGVhZiBgbXVsdGlfYWAsXG4gICAqIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbnNpZGUgdGhlIGxlYWYgKGRlc2NyaXB0b3IgbGlicmFyeSBzb3J0cyBieSBoZXgpLlxuICAgKiBPbmx5IHByZXNlbnQgd2hlbiB0aGUgZGVzY3JpcHRvciBpcyBpbiBpdHMgZGVyaXZlZC9kZWZpbml0ZSBmb3JtIOKAlCBmb3JcbiAgICogZGVyaXZhYmxlIGRlc2NyaXB0b3JzIHRoZSBtdWx0aV9hIGVudHJpZXMgYXJlIHhwdWIgc3RyaW5ncyAoZS5nLlxuICAgKiBgeHB1Yi4uLi8qYCksIHdoaWNoIGNhbid0IGJlIHR1cm5lZCBpbnRvIDMyLWJ5dGUgYnVmZmVycyB3aXRob3V0IHBpY2tpbmdcbiAgICogYSBkZXJpdmF0aW9uIGluZGV4LiBDYWxsZXJzIHRoYXQgbmVlZCByYXcga2V5IGJ5dGVzIE1VU1QgcGFzcyB0aGVcbiAgICogZGVyaXZlZCBkZXNjcmlwdG9yIChzZWUgYGRlcml2ZVJlY2xhaW1LZXlzYCBmb3IgZGVyaXZhYmxlIGlucHV0cykuXG4gICAqL1xuICByZWNsYWltS2V5czogW0J1ZmZlciwgQnVmZmVyLCBCdWZmZXJdIHwgdW5kZWZpbmVkO1xuICAvKiogUmF3IG1pbmlzY3JpcHQgQVNUIGZvciB0aGUgZGVwb3NpdCBsZWFmIChmaXJzdCB0YXAtdHJlZSBsZWFmKS4gKi9cbiAgZGVwb3NpdE1pbmlzY3JpcHROb2RlOiBhc3QuTWluaXNjcmlwdE5vZGU7XG4gIC8qKiBSYXcgbWluaXNjcmlwdCBBU1QgZm9yIHRoZSByZWNsYWltIGxlYWYgKHNlY29uZCB0YXAtdHJlZSBsZWFmKS4gKi9cbiAgcmVjbGFpbU1pbmlzY3JpcHROb2RlOiBhc3QuTWluaXNjcmlwdE5vZGU7XG4gIC8qKlxuICAgKiBUaGUgdGhyZWUgcmF3IGBtdWx0aV9hYCBrZXkgZW50cmllcyBmcm9tIHRoZSByZWNsYWltIGxlYWYsIGV4YWN0bHkgYXNcbiAgICogdGhleSBhcHBlYXIgaW4gdGhlIGRlc2NyaXB0b3Ig4oCUIGB4cHViLi4uLypgIGZvciBkZXJpdmFibGUgZGVzY3JpcHRvcnMgYW5kXG4gICAqIDY0LWhleC1jaGFyIHgtb25seSBrZXlzIGZvciBkZWZpbml0ZSBkZXNjcmlwdG9ycy4gVXNlZnVsIGZvciBjYWxsZXJzIHRoYXRcbiAgICogbmVlZCB0aGUgb3JpZ2luYWwgeHB1YiBmb3JtIChlLmcuIHRvIHJvdW5kLXRyaXAgYmFjayB0byBhIGRlc2NyaXB0b3JcbiAgICogYnVpbGRlcikgYW5kIGRvbid0IHdhbnQgdGhlIHJlc29sdmVkIGByZWNsYWltS2V5c2AgYnVmZmVycy5cbiAgICovXG4gIHJlY2xhaW1LZXlTdHJpbmdzOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ107XG59O1xuXG5mdW5jdGlvbiBhc1N0cmluZyh2OiB1bmtub3duLCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZH0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuICB9XG4gIHJldHVybiB2O1xufVxuXG5mdW5jdGlvbiBhc051bWJlcih2OiB1bmtub3duLCBmaWVsZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB2ICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZH0gbXVzdCBiZSBhIG51bWJlcmApO1xuICB9XG4gIHJldHVybiB2O1xufVxuXG4vKipcbiAqIFB1bGwgYFt0aHJlc2hvbGQsIC4uLmtleXNdYCBvdXQgb2YgYSBgbXVsdGlfYWAgQVNUIG5vZGUgdmFsdWUsIHZhbGlkYXRpbmdcbiAqIGVhY2ggZWxlbWVudC4gVGhlIGRlc2NyaXB0b3IncyBgbXVsdGlfYWAgaXMgcmVuZGVyZWQgd2l0aCBrZXlzIGVpdGhlciBhc1xuICogY29uY3JldGUgaGV4IChkZWZpbml0ZSBkZXNjcmlwdG9yKSBvciBhcyB4cHViIHN0cmluZ3MgZW5kaW5nIGluIGAvKmBcbiAqIChkZXJpdmFibGUgZGVzY3JpcHRvcikg4oCUIGJvdGggYXJlIHN0cmluZ3MgaGVyZSwgc28gd2UgZG9uJ3QgdHJ5IHRvIGNvbnZlcnRcbiAqIHRvIEJ1ZmZlciBhdCB0aGlzIGxldmVsLlxuICovXG5mdW5jdGlvbiBwYXJzZU11bHRpKG11bHRpOiB1bmtub3duKTogW251bWJlciwgc3RyaW5nW11dIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG11bHRpKSB8fCBtdWx0aS5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG11bHRpX2Egc3RydWN0dXJlOiBub3QgYW4gYXJyYXkgb3IgZW1wdHknKTtcbiAgfVxuICBjb25zdCBbdGhyZXNob2xkLCAuLi5rZXlzXSA9IG11bHRpO1xuICBpZiAodHlwZW9mIHRocmVzaG9sZCAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbXVsdGlfYSBzdHJ1Y3R1cmU6IHRocmVzaG9sZCBpcyBub3QgYSBudW1iZXInKTtcbiAgfVxuICBpZiAoIWtleXMuZXZlcnkoKGspID0+IHR5cGVvZiBrID09PSAnc3RyaW5nJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbXVsdGlfYSBzdHJ1Y3R1cmU6IG5vdCBhbGwga2V5cyBhcmUgc3RyaW5ncycpO1xuICB9XG4gIHJldHVybiBbdGhyZXNob2xkLCBrZXlzXTtcbn1cblxuZnVuY3Rpb24gcGFyc2VEZXBvc2l0TGVhZihcbiAgZGVwb3NpdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZSxcbiAgbWF0Y2hlcjogUGF0dGVybk1hdGNoZXJcbik6IHsgc2lnbmVyc0FnZ3JlZ2F0ZUtleTogQnVmZmVyOyBtYXhGZWU6IGJpZ2ludDsgc3RhY2tzUmVjaXBpZW50OiBCdWZmZXIgfSB7XG4gIGNvbnN0IGRlcG9zaXRQYXR0ZXJuOiBQYXR0ZXJuID0ge1xuICAgIGFuZF92OiBbeyBwYXlsb2FkX2Ryb3A6IHsgJHZhcjogJ3BheWxvYWRIZXgnIH0gfSwgeyBwazogeyAkdmFyOiAnc2lnbmVyc0tleScgfSB9XSxcbiAgfTtcbiAgY29uc3QgbWF0Y2ggPSBtYXRjaGVyLm1hdGNoKGRlcG9zaXROb2RlLCBkZXBvc2l0UGF0dGVybik7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RlcG9zaXQgbGVhZiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBwYXR0ZXJuJyk7XG4gIH1cblxuICBjb25zdCBwYXlsb2FkSGV4ID0gYXNTdHJpbmcobWF0Y2gucGF5bG9hZEhleCwgJ3BheWxvYWRfZHJvcCB2YWx1ZScpO1xuICBjb25zdCBzaWduZXJzS2V5SGV4ID0gYXNTdHJpbmcobWF0Y2guc2lnbmVyc0tleSwgJ3BrX2sga2V5Jyk7XG5cbiAgY29uc3QgZXhwZWN0ZWRQYXlsb2FkTGVuZ3RoID0gTUFYX0ZFRV9CWVRFX0xFTkdUSCArIFNUQUNLU19SRUNJUElFTlRfQllURV9MRU5HVEg7XG4gIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuZnJvbShwYXlsb2FkSGV4LCAnaGV4Jyk7XG4gIGlmIChwYXlsb2FkLmxlbmd0aCAhPT0gZXhwZWN0ZWRQYXlsb2FkTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHBheWxvYWRfZHJvcCB2YWx1ZSBtdXN0IGJlICR7ZXhwZWN0ZWRQYXlsb2FkTGVuZ3RofSBieXRlcyAoJHtleHBlY3RlZFBheWxvYWRMZW5ndGggKiAyfSBoZXggY2hhcnMpLCBnb3QgJHtcbiAgICAgICAgcGF5bG9hZC5sZW5ndGhcbiAgICAgIH0gYnl0ZXNgXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IG1heEZlZSA9IHBheWxvYWQucmVhZEJpZ1VJbnQ2NEJFKDApO1xuICBjb25zdCBzdGFja3NSZWNpcGllbnQgPSBwYXlsb2FkLnN1YmFycmF5KE1BWF9GRUVfQllURV9MRU5HVEgpO1xuXG4gIGNvbnN0IHNpZ25lcnNBZ2dyZWdhdGVLZXkgPSBCdWZmZXIuZnJvbShzaWduZXJzS2V5SGV4LCAnaGV4Jyk7XG4gIGlmIChzaWduZXJzQWdncmVnYXRlS2V5Lmxlbmd0aCAhPT0gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHNpZ25lcnNBZ2dyZWdhdGVLZXkgbXVzdCBiZSAzMiBieXRlcyB4LW9ubHksIGdvdCAke3NpZ25lcnNBZ2dyZWdhdGVLZXkubGVuZ3RofWApO1xuICB9XG5cbiAgcmV0dXJuIHsgc2lnbmVyc0FnZ3JlZ2F0ZUtleSwgbWF4RmVlLCBzdGFja3NSZWNpcGllbnQgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWNsYWltTGVhZihcbiAgcmVjbGFpbU5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZSxcbiAgbWF0Y2hlcjogUGF0dGVybk1hdGNoZXJcbik6IHsgbG9ja1RpbWU6IG51bWJlcjsgcmVjbGFpbUtleVN0cmluZ3M6IHN0cmluZ1tdIH0ge1xuICAvLyBhbmRfdihyOm9sZGVyKDxsb2NrVGltZT4pLCBtdWx0aV9hKDIsIGsxLCBrMiwgazMpKVxuICBjb25zdCByZWNsYWltUGF0dGVybjogUGF0dGVybiA9IHtcbiAgICBhbmRfdjogW3sgJ3I6b2xkZXInOiB7ICR2YXI6ICdsb2NrVGltZScgfSB9LCB7IG11bHRpX2E6IHsgJHZhcjogJ3JlY2xhaW1NdWx0aScgfSB9XSxcbiAgfTtcbiAgY29uc3QgbWF0Y2ggPSBtYXRjaGVyLm1hdGNoKHJlY2xhaW1Ob2RlLCByZWNsYWltUGF0dGVybik7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY2xhaW0gbGVhZiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBwYXR0ZXJuJyk7XG4gIH1cblxuICBjb25zdCBsb2NrVGltZSA9IGFzTnVtYmVyKG1hdGNoLmxvY2tUaW1lLCAncjpvbGRlciBhcmd1bWVudCcpO1xuICBpZiAobG9ja1RpbWUgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmVjbGFpbSBsb2NrVGltZSBtdXN0IGJlID4gMCwgZ290ICR7bG9ja1RpbWV9YCk7XG4gIH1cblxuICBjb25zdCBbdGhyZXNob2xkLCByZWNsYWltS2V5U3RyaW5nc10gPSBwYXJzZU11bHRpKG1hdGNoLnJlY2xhaW1NdWx0aSk7XG4gIGlmICh0aHJlc2hvbGQgIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJlY2xhaW0gbXVsdGlfYSB0aHJlc2hvbGQgbXVzdCBiZSAyLCBnb3QgJHt0aHJlc2hvbGR9YCk7XG4gIH1cbiAgaWYgKHJlY2xhaW1LZXlTdHJpbmdzLmxlbmd0aCAhPT0gMykge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmVjbGFpbSBtdWx0aV9hIG11c3QgaGF2ZSBleGFjdGx5IDMga2V5cywgZ290ICR7cmVjbGFpbUtleVN0cmluZ3MubGVuZ3RofWApO1xuICB9XG5cbiAgcmV0dXJuIHsgbG9ja1RpbWUsIHJlY2xhaW1LZXlTdHJpbmdzIH07XG59XG5cbmNvbnN0IEhFWF9YX09OTFlfS0VZID0gL15bMC05YS1mQS1GXXs2NH0kLztcbmNvbnN0IFhQVUJfV0lUSF9JTkRFWCA9IC9eKFsxLTlBLUhKLU5QLVphLWttLXpdKylcXC8oXFxkKykkLztcblxuLyoqXG4gKiBSZXNvbHZlIGEgc2luZ2xlIGBtdWx0aV9hYCBrZXkgZW50cnkgdG8gYSAzMi1ieXRlIHgtb25seSBwdWJsaWMga2V5LlxuICpcbiAqIEFjY2VwdHM6XG4gKiAgIC0gNjQtaGV4LWNoYXIgc3RyaW5nIOKGkiByZXR1cm5lZCBhcy1pcyAoYWxyZWFkeSB4LW9ubHkpXG4gKiAgIC0gYHhwdWIuLi4vPGluZGV4PmAg4oaSIEJJUDMyLWRlcml2ZSBhdCB0aGF0IGluZGV4IGFuZCBkcm9wIHRoZSBwcmVmaXggYnl0ZVxuICpcbiAqIFJldHVybnMgbnVsbCBmb3IgYW55IG90aGVyIHNoYXBlIChlLmcuIHdpbGRjYXJkIGB4cHViLi4uLypgLCBtYWxmb3JtZWQgaW5wdXQpLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUmVjbGFpbUtleShzOiBzdHJpbmcpOiBCdWZmZXIgfCBudWxsIHtcbiAgaWYgKEhFWF9YX09OTFlfS0VZLnRlc3QocykpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20ocywgJ2hleCcpO1xuICB9XG4gIGNvbnN0IG0gPSBzLm1hdGNoKFhQVUJfV0lUSF9JTkRFWCk7XG4gIGlmICghbSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IFssIHhwdWIsIGluZGV4U3RyXSA9IG07XG4gIGNvbnN0IGluZGV4ID0gTnVtYmVyLnBhcnNlSW50KGluZGV4U3RyLCAxMCk7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGluZGV4KSB8fCBpbmRleCA8IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBsZXQgbm9kZTtcbiAgdHJ5IHtcbiAgICBub2RlID0gQklQMzIuZnJvbUJhc2U1OCh4cHViKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gQklQMzIgcHVibGljIGtleSBpcyAzMyBieXRlcyAoMSBwcmVmaXggKyAzMiB4LW9ubHkpLiBEcm9wIHRoZSBwcmVmaXguXG4gIHJldHVybiBCdWZmZXIuZnJvbShub2RlLmRlcml2ZShpbmRleCkucHVibGljS2V5LnN1YmFycmF5KDEpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IHJlY2xhaW0tbGVhZiBrZXkgc3RyaW5ncyBpbnRvIDMyLWJ5dGUgeC1vbmx5IGJ1ZmZlcnMuIEFjY2VwdHMgYm90aFxuICogdGhlIGRlZmluaXRlL2Rlcml2ZWQgZm9ybSAoY29uY3JldGUgNjQtaGV4LWNoYXIgeC1vbmx5IGtleXMpIGFuZCB0aGUgZm9ybVxuICogcHJvZHVjZWQgYnkgYERlc2NyaXB0b3IuYXREZXJpdmF0aW9uSW5kZXgobilgIChgeHB1Yi4uLi88bj5gKS4gUmV0dXJuc1xuICogdW5kZWZpbmVkIGlmIGFueSBlbnRyeSBpcyBzdGlsbCB3aWxkY2FyZCAoYHhwdWIuLi4vKmApIG9yIG90aGVyd2lzZVxuICogdW5yZXNvbHZhYmxlLlxuICovXG5mdW5jdGlvbiByZWNsYWltS2V5c0Zyb21TdHJpbmdzKGtleVN0cmluZ3M6IHN0cmluZ1tdKTogW0J1ZmZlciwgQnVmZmVyLCBCdWZmZXJdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBrZXlTdHJpbmdzLm1hcChyZXNvbHZlUmVjbGFpbUtleSk7XG4gIGlmIChyZXNvbHZlZC5zb21lKChiKSA9PiBiID09PSBudWxsKSB8fCByZXNvbHZlZC5sZW5ndGggIT09IDMpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBbcmVzb2x2ZWRbMF0gYXMgQnVmZmVyLCByZXNvbHZlZFsxXSBhcyBCdWZmZXIsIHJlc29sdmVkWzJdIGFzIEJ1ZmZlcl07XG59XG5cbi8qKlxuICogUGFyc2UgYW4gc0JUQyBwZWctaW4gZGVwb3NpdCBkZXNjcmlwdG9yIGFuZCByZXR1cm4gaXRzIGNvbXBvbmVudHMuXG4gKlxuICogUmV0dXJucyBgbnVsbGAgaWYgdGhlIGRlc2NyaXB0b3IgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkXG4gKiBgdHIoPFVOU1BFTkRBQkxFPiwgezxkZXBvc2l0TGVhZj4sIDxyZWNsYWltTGVhZj59KWAgc2hhcGUg4oCUIHNhbWUgY29udmVudGlvblxuICogYXMgYmFieWxvbidzIGBwYXJzZVN0YWtpbmdEZXNjcmlwdG9yYC4gVGhyb3dzIGlmIHRoZSBzaGFwZSBtYXRjaGVzIGJ1dCBhXG4gKiBzdWItZmllbGQgaXMgbWFsZm9ybWVkIChlLmcuIHNpZ25lcnMga2V5IGlzbid0IDMyIGJ5dGVzLCBwYXlsb2FkIGlzbid0IDMwXG4gKiBieXRlcywgdGhyZXNob2xkIGlzbid0IDIpLlxuICpcbiAqIEFjY2VwdHMgYm90aCB0aGUgYERlc2NyaXB0b3JgIFdBU00gb2JqZWN0IChkZWZpbml0ZSBvciBkZXJpdmFibGUpIGFuZCBhXG4gKiBwcmUtZXh0cmFjdGVkIGBhc3QuRGVzY3JpcHRvck5vZGVgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNidGNEZXBvc2l0RGVzY3JpcHRvcihcbiAgZGVzY3JpcHRvcjogRGVzY3JpcHRvciB8IGFzdC5EZXNjcmlwdG9yTm9kZVxuKTogUGFyc2VkU2J0Y0RlcG9zaXREZXNjcmlwdG9yIHwgbnVsbCB7XG4gIGNvbnN0IHBhdHRlcm46IFBhdHRlcm4gPSB7XG4gICAgdHI6IFtVTlNQRU5EQUJMRV9JTlRFUk5BTF9LRVksIFt7ICR2YXI6ICdkZXBvc2l0TGVhZicgfSwgeyAkdmFyOiAncmVjbGFpbUxlYWYnIH1dXSxcbiAgfTtcblxuICBjb25zdCBtYXRjaGVyID0gbmV3IFBhdHRlcm5NYXRjaGVyKCk7XG4gIGNvbnN0IGRlc2NyaXB0b3JOb2RlID0gZGVzY3JpcHRvciBpbnN0YW5jZW9mIERlc2NyaXB0b3IgPyBhc3QuZnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcikgOiBkZXNjcmlwdG9yO1xuICBjb25zdCByZXN1bHQgPSBtYXRjaGVyLm1hdGNoKGRlc2NyaXB0b3JOb2RlLCBwYXR0ZXJuKTtcblxuICBpZiAoIXJlc3VsdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGVwb3NpdE1pbmlzY3JpcHROb2RlID0gcmVzdWx0LmRlcG9zaXRMZWFmIGFzIGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgbGV0IHJlY2xhaW1NaW5pc2NyaXB0Tm9kZSA9IHJlc3VsdC5yZWNsYWltTGVhZiBhcyBhc3QuTWluaXNjcmlwdE5vZGU7XG5cbiAgY29uc3QgeyBzaWduZXJzQWdncmVnYXRlS2V5LCBtYXhGZWUsIHN0YWNrc1JlY2lwaWVudCB9ID0gcGFyc2VEZXBvc2l0TGVhZihkZXBvc2l0TWluaXNjcmlwdE5vZGUsIG1hdGNoZXIpO1xuICBjb25zdCB7IGxvY2tUaW1lLCByZWNsYWltS2V5U3RyaW5ncyB9ID0gcGFyc2VSZWNsYWltTGVhZihyZWNsYWltTWluaXNjcmlwdE5vZGUsIG1hdGNoZXIpO1xuICBjb25zdCByZWNsYWltS2V5U3RyaW5nc1R1cGxlOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10gPSBbXG4gICAgcmVjbGFpbUtleVN0cmluZ3NbMF0sXG4gICAgcmVjbGFpbUtleVN0cmluZ3NbMV0sXG4gICAgcmVjbGFpbUtleVN0cmluZ3NbMl0sXG4gIF07XG5cbiAgY29uc3QgcmVjbGFpbUtleXMgPSByZWNsYWltS2V5c0Zyb21TdHJpbmdzKHJlY2xhaW1LZXlTdHJpbmdzKTtcbiAgaWYgKHJlY2xhaW1LZXlzKSB7XG4gICAgLy8gUmV3cml0ZSB0aGUgcmVjbGFpbSBsZWFmIHdpdGggY29uY3JldGUgaGV4IGtleXMgd2hlbiB3ZSBjYW4gcmVzb2x2ZVxuICAgIC8vIHRoZW0g4oCUIGBNaW5pc2NyaXB0LmZyb21TdHJpbmcoLi4uLCAndGFwJylgIG9ubHkgYWNjZXB0cyB4LW9ubHkgaGV4IGluXG4gICAgLy8gYG11bHRpX2FgLCBub3QgeHB1Yi1mb3JtIHN0cmluZ3MuIFdpdGggdGhpcyByZXdyaXRlIHRoZSBmb3JtYXR0ZWRcbiAgICAvLyBsZWFmIGlzIGRpcmVjdGx5IGNvbXBpbGFibGU7IHdpdGhvdXQgaXQgY2FsbGVycyBtdXN0IGRvIHRoZVxuICAgIC8vIHJlc29sdXRpb24gdGhlbXNlbHZlcy5cbiAgICByZWNsYWltTWluaXNjcmlwdE5vZGUgPSB7XG4gICAgICBhbmRfdjogW3sgJ3I6b2xkZXInOiBsb2NrVGltZSB9LCB7IG11bHRpX2E6IFsyLCAuLi5yZWNsYWltS2V5cy5tYXAoKGspID0+IGsudG9TdHJpbmcoJ2hleCcpKV0gfV0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2lnbmVyc0FnZ3JlZ2F0ZUtleSxcbiAgICBtYXhGZWUsXG4gICAgc3RhY2tzUmVjaXBpZW50LFxuICAgIGxvY2tUaW1lLFxuICAgIHJlY2xhaW1LZXlzLFxuICAgIHJlY2xhaW1LZXlTdHJpbmdzOiByZWNsYWltS2V5U3RyaW5nc1R1cGxlLFxuICAgIGRlcG9zaXRNaW5pc2NyaXB0Tm9kZSxcbiAgICByZWNsYWltTWluaXNjcmlwdE5vZGUsXG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../../../../test/unit/pox5/descriptor.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const assert = __importStar(require("assert"));
|
|
37
|
+
const crypto_1 = require("crypto");
|
|
38
|
+
const bitcoin_staking_1 = require("@stacks/bitcoin-staking");
|
|
39
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
40
|
+
const testutils_1 = require("@bitgo/wasm-utxo/testutils");
|
|
41
|
+
const pox5_1 = require("../../../src/pox5");
|
|
42
|
+
const OPCODES = {
|
|
43
|
+
OP_0: 0x00,
|
|
44
|
+
OP_IF: 0x63,
|
|
45
|
+
OP_ELSE: 0x67,
|
|
46
|
+
OP_ENDIF: 0x68,
|
|
47
|
+
OP_VERIFY: 0x69,
|
|
48
|
+
OP_SIZE: 0x82,
|
|
49
|
+
OP_EQUAL: 0x87,
|
|
50
|
+
OP_EQUALVERIFY: 0x88,
|
|
51
|
+
OP_SHA256: 0xa8,
|
|
52
|
+
OP_CHECKSIG: 0xac,
|
|
53
|
+
OP_CHECKMULTISIG: 0xae,
|
|
54
|
+
OP_CLTV: 0xb1,
|
|
55
|
+
};
|
|
56
|
+
function getBip32Triple() {
|
|
57
|
+
const [user, backup, bitgo] = (0, testutils_1.getKeyTriple)('default');
|
|
58
|
+
return [user, backup, bitgo];
|
|
59
|
+
}
|
|
60
|
+
function sha256(value) {
|
|
61
|
+
return (0, crypto_1.createHash)('sha256').update(value).digest();
|
|
62
|
+
}
|
|
63
|
+
function params(overrides = {}) {
|
|
64
|
+
const stakerKeys = getBip32Triple();
|
|
65
|
+
const earlyExitKey = Buffer.from(stakerKeys[0].derive(9).publicKey);
|
|
66
|
+
return {
|
|
67
|
+
unlockHeight: 840000,
|
|
68
|
+
stakerCommitment: sha256((0, bitcoin_staking_1.computeRegisterPreimage)('SP000000000000000000002Q6VF78')),
|
|
69
|
+
earlyExitKey,
|
|
70
|
+
stakerKeys,
|
|
71
|
+
...overrides,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function asmToScript(asm) {
|
|
75
|
+
const tokens = asm.split(' ');
|
|
76
|
+
const chunks = [];
|
|
77
|
+
for (let index = 0; index < tokens.length; index++) {
|
|
78
|
+
const token = tokens[index];
|
|
79
|
+
const push = token.match(/^OP_PUSHBYTES_(\d+)$/);
|
|
80
|
+
if (push) {
|
|
81
|
+
const bytes = Buffer.from(tokens[++index], 'hex');
|
|
82
|
+
assert.strictEqual(bytes.length, Number(push[1]));
|
|
83
|
+
chunks.push(Buffer.of(bytes.length), bytes);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const number = token.match(/^OP_PUSHNUM_(\d+)$/);
|
|
87
|
+
if (number) {
|
|
88
|
+
chunks.push(Buffer.of(0x50 + Number(number[1])));
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const opcode = OPCODES[token];
|
|
92
|
+
assert.notStrictEqual(opcode, undefined, `unsupported ASM token ${token}`);
|
|
93
|
+
chunks.push(Buffer.of(opcode));
|
|
94
|
+
}
|
|
95
|
+
return Buffer.concat(chunks);
|
|
96
|
+
}
|
|
97
|
+
function encodeTwoOfThreeUnlock(keys) {
|
|
98
|
+
return Buffer.concat([Buffer.of(0x52), ...keys.flatMap((key) => [Buffer.of(33), key]), Buffer.of(0x53, 0xae)]);
|
|
99
|
+
}
|
|
100
|
+
describe('PoX-5 lockup descriptors', function () {
|
|
101
|
+
it('renders the required byte-identical canonical script and P2WSH output', function () {
|
|
102
|
+
const derivable = params();
|
|
103
|
+
const stakerKeys = (0, pox5_1.derivePox5StakerKeys)(derivable.stakerKeys, 0);
|
|
104
|
+
const definite = { ...derivable, stakerKeys };
|
|
105
|
+
const descriptor = (0, pox5_1.createPox5LockupDescriptor)(definite);
|
|
106
|
+
const localWitnessScript = asmToScript(descriptor.toAsmString());
|
|
107
|
+
const unlockBytes = encodeTwoOfThreeUnlock(stakerKeys);
|
|
108
|
+
const earlyUnlockBytes = (0, bitcoin_staking_1.buildUnlockScript)(definite.earlyExitKey);
|
|
109
|
+
const sdkWitnessScript = Buffer.from((0, bitcoin_staking_1.buildLockScript)({
|
|
110
|
+
stxAddress: 'SP000000000000000000002Q6VF78',
|
|
111
|
+
unlockHeight: definite.unlockHeight,
|
|
112
|
+
unlockBytes,
|
|
113
|
+
earlyUnlockBytes,
|
|
114
|
+
validateEarlyUnlockBytes: false,
|
|
115
|
+
}));
|
|
116
|
+
assert.deepStrictEqual(localWitnessScript, sdkWitnessScript);
|
|
117
|
+
assert.ok(descriptor.toAsmString().includes('OP_SHA256 OP_PUSHBYTES_32'));
|
|
118
|
+
assert.ok(descriptor.toAsmString().includes('OP_EQUALVERIFY OP_PUSHBYTES_33'));
|
|
119
|
+
const localScriptPubKey = (0, pox5_1.createPox5LockupScriptPubKey)(definite);
|
|
120
|
+
const sdkScriptPubKey = Buffer.from((0, bitcoin_staking_1.buildLockOutputScript)({
|
|
121
|
+
stxAddress: 'SP000000000000000000002Q6VF78',
|
|
122
|
+
unlockHeight: definite.unlockHeight,
|
|
123
|
+
unlockBytes,
|
|
124
|
+
earlyUnlockBytes,
|
|
125
|
+
}));
|
|
126
|
+
assert.deepStrictEqual(localScriptPubKey, sdkScriptPubKey);
|
|
127
|
+
assert.strictEqual(wasm_utxo_1.address.fromOutputScriptWithCoin(localScriptPubKey, 'btc'), (0, bitcoin_staking_1.buildLockAddress)({
|
|
128
|
+
stxAddress: 'SP000000000000000000002Q6VF78',
|
|
129
|
+
unlockHeight: definite.unlockHeight,
|
|
130
|
+
unlockBytes,
|
|
131
|
+
earlyUnlockBytes,
|
|
132
|
+
network: 'mainnet',
|
|
133
|
+
validateEarlyUnlockBytes: false,
|
|
134
|
+
}));
|
|
135
|
+
});
|
|
136
|
+
it('supports derivation and preserves wildcard keys until an index is selected', function () {
|
|
137
|
+
const value = params();
|
|
138
|
+
const descriptor = (0, pox5_1.createPox5LockupDescriptor)(value);
|
|
139
|
+
const wildcard = (0, pox5_1.parsePox5LockupDescriptor)(descriptor);
|
|
140
|
+
const derived = (0, pox5_1.parsePox5LockupDescriptor)(descriptor.atDerivationIndex(4));
|
|
141
|
+
assert.ok(wildcard);
|
|
142
|
+
assert.strictEqual(wildcard.stakerKeys, undefined);
|
|
143
|
+
assert.ok(wildcard.stakerKeyStrings.every((key) => key.endsWith('/*')));
|
|
144
|
+
assert.ok(derived?.stakerKeys);
|
|
145
|
+
assert.deepStrictEqual(derived?.stakerKeys, (0, pox5_1.derivePox5StakerKeys)(value.stakerKeys, 4));
|
|
146
|
+
});
|
|
147
|
+
it('rejects noncanonical parameter values and descriptor templates', function () {
|
|
148
|
+
assert.throws(() => (0, pox5_1.createPox5LockupDescriptor)(params({ unlockHeight: 0 })));
|
|
149
|
+
assert.throws(() => (0, pox5_1.createPox5LockupDescriptor)(params({ unlockHeight: 500000000 })));
|
|
150
|
+
assert.throws(() => (0, pox5_1.createPox5LockupDescriptor)(params({ stakerCommitment: Buffer.alloc(31) })));
|
|
151
|
+
assert.throws(() => (0, pox5_1.createPox5LockupDescriptor)(params({ earlyExitKey: Buffer.alloc(32) })));
|
|
152
|
+
assert.throws(() => (0, pox5_1.createPox5LockupDescriptor)(params({ stakerKeys: [getBip32Triple()[0], Buffer.alloc(33, 2), Buffer.alloc(33, 2)] })));
|
|
153
|
+
const validKey = params().earlyExitKey.toString('hex');
|
|
154
|
+
assert.strictEqual((0, pox5_1.parsePox5LockupDescriptor)(wasm_utxo_1.Descriptor.fromString(`wsh(pk(${validKey}))`, 'definite')), undefined);
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9wb3g1L2Rlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsbUNBQW9DO0FBRXBDLDZEQU1pQztBQUNqQyxnREFBOEQ7QUFDOUQsMERBQTBEO0FBRTFELDRDQU0yQjtBQUkzQixNQUFNLE9BQU8sR0FBMkI7SUFDdEMsSUFBSSxFQUFFLElBQUk7SUFDVixLQUFLLEVBQUUsSUFBSTtJQUNYLE9BQU8sRUFBRSxJQUFJO0lBQ2IsUUFBUSxFQUFFLElBQUk7SUFDZCxTQUFTLEVBQUUsSUFBSTtJQUNmLE9BQU8sRUFBRSxJQUFJO0lBQ2IsUUFBUSxFQUFFLElBQUk7SUFDZCxjQUFjLEVBQUUsSUFBSTtJQUNwQixTQUFTLEVBQUUsSUFBSTtJQUNmLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGdCQUFnQixFQUFFLElBQUk7SUFDdEIsT0FBTyxFQUFFLElBQUk7Q0FDZCxDQUFDO0FBRUYsU0FBUyxjQUFjO0lBQ3JCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUEsd0JBQVksRUFBQyxTQUFTLENBQUMsQ0FBQztJQUN0RCxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsS0FBaUI7SUFDL0IsT0FBTyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxZQUFpRCxFQUFFO0lBQ2pFLE1BQU0sVUFBVSxHQUFHLGNBQWMsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwRSxPQUFPO1FBQ0wsWUFBWSxFQUFFLE1BQU87UUFDckIsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLElBQUEseUNBQXVCLEVBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNsRixZQUFZO1FBQ1osVUFBVTtRQUNWLEdBQUcsU0FBUztLQUNiLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsR0FBVztJQUM5QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ25ELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDakQsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUMsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDakQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRCxTQUFTO1FBQ1gsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUseUJBQXlCLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDM0UsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FBQyxJQUE4QjtJQUM1RCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pILENBQUM7QUFFRCxRQUFRLENBQUMsMEJBQTBCLEVBQUU7SUFDbkMsRUFBRSxDQUFDLHVFQUF1RSxFQUFFO1FBQzFFLE1BQU0sU0FBUyxHQUFHLE1BQU0sRUFBRSxDQUFDO1FBQzNCLE1BQU0sVUFBVSxHQUFHLElBQUEsMkJBQW9CLEVBQ3JDLFNBQVMsQ0FBQyxVQUE4RCxFQUN4RSxDQUFDLENBQ0YsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDOUMsTUFBTSxVQUFVLEdBQUcsSUFBQSxpQ0FBMEIsRUFBQyxRQUFRLENBQUMsQ0FBQztRQUN4RCxNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNqRSxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RCxNQUFNLGdCQUFnQixHQUFHLElBQUEsbUNBQWlCLEVBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FDbEMsSUFBQSxpQ0FBZSxFQUFDO1lBQ2QsVUFBVSxFQUFFLCtCQUErQjtZQUMzQyxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7WUFDbkMsV0FBVztZQUNYLGdCQUFnQjtZQUNoQix3QkFBd0IsRUFBRSxLQUFLO1NBQ2hDLENBQUMsQ0FDSCxDQUFDO1FBRUYsTUFBTSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdELE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUM7UUFDMUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQztRQUUvRSxNQUFNLGlCQUFpQixHQUFHLElBQUEsbUNBQTRCLEVBQUMsUUFBUSxDQUFDLENBQUM7UUFDakUsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FDakMsSUFBQSx1Q0FBcUIsRUFBQztZQUNwQixVQUFVLEVBQUUsK0JBQStCO1lBQzNDLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtZQUNuQyxXQUFXO1lBQ1gsZ0JBQWdCO1NBQ2pCLENBQUMsQ0FDSCxDQUFDO1FBQ0YsTUFBTSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUMzRCxNQUFNLENBQUMsV0FBVyxDQUNoQixtQkFBTyxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxFQUMxRCxJQUFBLGtDQUFnQixFQUFDO1lBQ2YsVUFBVSxFQUFFLCtCQUErQjtZQUMzQyxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7WUFDbkMsV0FBVztZQUNYLGdCQUFnQjtZQUNoQixPQUFPLEVBQUUsU0FBUztZQUNsQix3QkFBd0IsRUFBRSxLQUFLO1NBQ2hDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNEVBQTRFLEVBQUU7UUFDL0UsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDdkIsTUFBTSxVQUFVLEdBQUcsSUFBQSxpQ0FBMEIsRUFBQyxLQUFLLENBQUMsQ0FBQztRQUNyRCxNQUFNLFFBQVEsR0FBRyxJQUFBLGdDQUF5QixFQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sT0FBTyxHQUFHLElBQUEsZ0NBQXlCLEVBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0UsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQixNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbkQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsZUFBZSxDQUNwQixPQUFPLEVBQUUsVUFBVSxFQUNuQixJQUFBLDJCQUFvQixFQUFDLEtBQUssQ0FBQyxVQUE4RCxFQUFFLENBQUMsQ0FBQyxDQUM5RixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsZ0VBQWdFLEVBQUU7UUFDbkUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLGlDQUEwQixFQUFDLE1BQU0sQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsaUNBQTBCLEVBQUMsTUFBTSxDQUFDLEVBQUUsWUFBWSxFQUFFLFNBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZGLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSxpQ0FBMEIsRUFBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLGlDQUEwQixFQUFDLE1BQU0sQ0FBQyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FDakIsSUFBQSxpQ0FBMEIsRUFDeEIsTUFBTSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ3hGLENBQ0YsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFBLGdDQUF5QixFQUFDLHNCQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsUUFBUSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN0SCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcblxuaW1wb3J0IHtcbiAgYnVpbGRMb2NrQWRkcmVzcyxcbiAgYnVpbGRMb2NrT3V0cHV0U2NyaXB0LFxuICBidWlsZExvY2tTY3JpcHQsXG4gIGJ1aWxkVW5sb2NrU2NyaXB0LFxuICBjb21wdXRlUmVnaXN0ZXJQcmVpbWFnZSxcbn0gZnJvbSAnQHN0YWNrcy9iaXRjb2luLXN0YWtpbmcnO1xuaW1wb3J0IHsgYWRkcmVzcywgYmlwMzIsIERlc2NyaXB0b3IgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IGdldEtleVRyaXBsZSB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8vdGVzdHV0aWxzJztcblxuaW1wb3J0IHtcbiAgY3JlYXRlUG94NUxvY2t1cERlc2NyaXB0b3IsXG4gIGNyZWF0ZVBveDVMb2NrdXBTY3JpcHRQdWJLZXksXG4gIGRlcml2ZVBveDVTdGFrZXJLZXlzLFxuICBwYXJzZVBveDVMb2NrdXBEZXNjcmlwdG9yLFxuICBQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtcyxcbn0gZnJvbSAnLi4vLi4vLi4vc3JjL3BveDUnO1xuXG50eXBlIEJJUDMySW50ZXJmYWNlID0gYmlwMzIuQklQMzJJbnRlcmZhY2U7XG5cbmNvbnN0IE9QQ09ERVM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gIE9QXzA6IDB4MDAsXG4gIE9QX0lGOiAweDYzLFxuICBPUF9FTFNFOiAweDY3LFxuICBPUF9FTkRJRjogMHg2OCxcbiAgT1BfVkVSSUZZOiAweDY5LFxuICBPUF9TSVpFOiAweDgyLFxuICBPUF9FUVVBTDogMHg4NyxcbiAgT1BfRVFVQUxWRVJJRlk6IDB4ODgsXG4gIE9QX1NIQTI1NjogMHhhOCxcbiAgT1BfQ0hFQ0tTSUc6IDB4YWMsXG4gIE9QX0NIRUNLTVVMVElTSUc6IDB4YWUsXG4gIE9QX0NMVFY6IDB4YjEsXG59O1xuXG5mdW5jdGlvbiBnZXRCaXAzMlRyaXBsZSgpOiBbQklQMzJJbnRlcmZhY2UsIEJJUDMySW50ZXJmYWNlLCBCSVAzMkludGVyZmFjZV0ge1xuICBjb25zdCBbdXNlciwgYmFja3VwLCBiaXRnb10gPSBnZXRLZXlUcmlwbGUoJ2RlZmF1bHQnKTtcbiAgcmV0dXJuIFt1c2VyLCBiYWNrdXAsIGJpdGdvXTtcbn1cblxuZnVuY3Rpb24gc2hhMjU2KHZhbHVlOiBVaW50OEFycmF5KTogQnVmZmVyIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZSh2YWx1ZSkuZGlnZXN0KCk7XG59XG5cbmZ1bmN0aW9uIHBhcmFtcyhvdmVycmlkZXM6IFBhcnRpYWw8UG94NUxvY2t1cERlc2NyaXB0b3JQYXJhbXM+ID0ge30pOiBQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtcyB7XG4gIGNvbnN0IHN0YWtlcktleXMgPSBnZXRCaXAzMlRyaXBsZSgpO1xuICBjb25zdCBlYXJseUV4aXRLZXkgPSBCdWZmZXIuZnJvbShzdGFrZXJLZXlzWzBdLmRlcml2ZSg5KS5wdWJsaWNLZXkpO1xuICByZXR1cm4ge1xuICAgIHVubG9ja0hlaWdodDogODQwXzAwMCxcbiAgICBzdGFrZXJDb21taXRtZW50OiBzaGEyNTYoY29tcHV0ZVJlZ2lzdGVyUHJlaW1hZ2UoJ1NQMDAwMDAwMDAwMDAwMDAwMDAwMDAyUTZWRjc4JykpLFxuICAgIGVhcmx5RXhpdEtleSxcbiAgICBzdGFrZXJLZXlzLFxuICAgIC4uLm92ZXJyaWRlcyxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXNtVG9TY3JpcHQoYXNtOiBzdHJpbmcpOiBCdWZmZXIge1xuICBjb25zdCB0b2tlbnMgPSBhc20uc3BsaXQoJyAnKTtcbiAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG9rZW5zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2luZGV4XTtcbiAgICBjb25zdCBwdXNoID0gdG9rZW4ubWF0Y2goL15PUF9QVVNIQllURVNfKFxcZCspJC8pO1xuICAgIGlmIChwdXNoKSB7XG4gICAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5mcm9tKHRva2Vuc1srK2luZGV4XSwgJ2hleCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ5dGVzLmxlbmd0aCwgTnVtYmVyKHB1c2hbMV0pKTtcbiAgICAgIGNodW5rcy5wdXNoKEJ1ZmZlci5vZihieXRlcy5sZW5ndGgpLCBieXRlcyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbnVtYmVyID0gdG9rZW4ubWF0Y2goL15PUF9QVVNITlVNXyhcXGQrKSQvKTtcbiAgICBpZiAobnVtYmVyKSB7XG4gICAgICBjaHVua3MucHVzaChCdWZmZXIub2YoMHg1MCArIE51bWJlcihudW1iZXJbMV0pKSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qgb3Bjb2RlID0gT1BDT0RFU1t0b2tlbl07XG4gICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKG9wY29kZSwgdW5kZWZpbmVkLCBgdW5zdXBwb3J0ZWQgQVNNIHRva2VuICR7dG9rZW59YCk7XG4gICAgY2h1bmtzLnB1c2goQnVmZmVyLm9mKG9wY29kZSkpO1xuICB9XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcyk7XG59XG5cbmZ1bmN0aW9uIGVuY29kZVR3b09mVGhyZWVVbmxvY2soa2V5czogW0J1ZmZlciwgQnVmZmVyLCBCdWZmZXJdKTogQnVmZmVyIHtcbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5vZigweDUyKSwgLi4ua2V5cy5mbGF0TWFwKChrZXkpID0+IFtCdWZmZXIub2YoMzMpLCBrZXldKSwgQnVmZmVyLm9mKDB4NTMsIDB4YWUpXSk7XG59XG5cbmRlc2NyaWJlKCdQb1gtNSBsb2NrdXAgZGVzY3JpcHRvcnMnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdyZW5kZXJzIHRoZSByZXF1aXJlZCBieXRlLWlkZW50aWNhbCBjYW5vbmljYWwgc2NyaXB0IGFuZCBQMldTSCBvdXRwdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZGVyaXZhYmxlID0gcGFyYW1zKCk7XG4gICAgY29uc3Qgc3Rha2VyS2V5cyA9IGRlcml2ZVBveDVTdGFrZXJLZXlzKFxuICAgICAgZGVyaXZhYmxlLnN0YWtlcktleXMgYXMgW0JJUDMySW50ZXJmYWNlLCBCSVAzMkludGVyZmFjZSwgQklQMzJJbnRlcmZhY2VdLFxuICAgICAgMFxuICAgICk7XG4gICAgY29uc3QgZGVmaW5pdGUgPSB7IC4uLmRlcml2YWJsZSwgc3Rha2VyS2V5cyB9O1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBjcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcihkZWZpbml0ZSk7XG4gICAgY29uc3QgbG9jYWxXaXRuZXNzU2NyaXB0ID0gYXNtVG9TY3JpcHQoZGVzY3JpcHRvci50b0FzbVN0cmluZygpKTtcbiAgICBjb25zdCB1bmxvY2tCeXRlcyA9IGVuY29kZVR3b09mVGhyZWVVbmxvY2soc3Rha2VyS2V5cyk7XG4gICAgY29uc3QgZWFybHlVbmxvY2tCeXRlcyA9IGJ1aWxkVW5sb2NrU2NyaXB0KGRlZmluaXRlLmVhcmx5RXhpdEtleSk7XG4gICAgY29uc3Qgc2RrV2l0bmVzc1NjcmlwdCA9IEJ1ZmZlci5mcm9tKFxuICAgICAgYnVpbGRMb2NrU2NyaXB0KHtcbiAgICAgICAgc3R4QWRkcmVzczogJ1NQMDAwMDAwMDAwMDAwMDAwMDAwMDAyUTZWRjc4JyxcbiAgICAgICAgdW5sb2NrSGVpZ2h0OiBkZWZpbml0ZS51bmxvY2tIZWlnaHQsXG4gICAgICAgIHVubG9ja0J5dGVzLFxuICAgICAgICBlYXJseVVubG9ja0J5dGVzLFxuICAgICAgICB2YWxpZGF0ZUVhcmx5VW5sb2NrQnl0ZXM6IGZhbHNlLFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChsb2NhbFdpdG5lc3NTY3JpcHQsIHNka1dpdG5lc3NTY3JpcHQpO1xuICAgIGFzc2VydC5vayhkZXNjcmlwdG9yLnRvQXNtU3RyaW5nKCkuaW5jbHVkZXMoJ09QX1NIQTI1NiBPUF9QVVNIQllURVNfMzInKSk7XG4gICAgYXNzZXJ0Lm9rKGRlc2NyaXB0b3IudG9Bc21TdHJpbmcoKS5pbmNsdWRlcygnT1BfRVFVQUxWRVJJRlkgT1BfUFVTSEJZVEVTXzMzJykpO1xuXG4gICAgY29uc3QgbG9jYWxTY3JpcHRQdWJLZXkgPSBjcmVhdGVQb3g1TG9ja3VwU2NyaXB0UHViS2V5KGRlZmluaXRlKTtcbiAgICBjb25zdCBzZGtTY3JpcHRQdWJLZXkgPSBCdWZmZXIuZnJvbShcbiAgICAgIGJ1aWxkTG9ja091dHB1dFNjcmlwdCh7XG4gICAgICAgIHN0eEFkZHJlc3M6ICdTUDAwMDAwMDAwMDAwMDAwMDAwMDAwMlE2VkY3OCcsXG4gICAgICAgIHVubG9ja0hlaWdodDogZGVmaW5pdGUudW5sb2NrSGVpZ2h0LFxuICAgICAgICB1bmxvY2tCeXRlcyxcbiAgICAgICAgZWFybHlVbmxvY2tCeXRlcyxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGxvY2FsU2NyaXB0UHViS2V5LCBzZGtTY3JpcHRQdWJLZXkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgIGFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdFdpdGhDb2luKGxvY2FsU2NyaXB0UHViS2V5LCAnYnRjJyksXG4gICAgICBidWlsZExvY2tBZGRyZXNzKHtcbiAgICAgICAgc3R4QWRkcmVzczogJ1NQMDAwMDAwMDAwMDAwMDAwMDAwMDAyUTZWRjc4JyxcbiAgICAgICAgdW5sb2NrSGVpZ2h0OiBkZWZpbml0ZS51bmxvY2tIZWlnaHQsXG4gICAgICAgIHVubG9ja0J5dGVzLFxuICAgICAgICBlYXJseVVubG9ja0J5dGVzLFxuICAgICAgICBuZXR3b3JrOiAnbWFpbm5ldCcsXG4gICAgICAgIHZhbGlkYXRlRWFybHlVbmxvY2tCeXRlczogZmFsc2UsXG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdzdXBwb3J0cyBkZXJpdmF0aW9uIGFuZCBwcmVzZXJ2ZXMgd2lsZGNhcmQga2V5cyB1bnRpbCBhbiBpbmRleCBpcyBzZWxlY3RlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcmFtcygpO1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBjcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcih2YWx1ZSk7XG4gICAgY29uc3Qgd2lsZGNhcmQgPSBwYXJzZVBveDVMb2NrdXBEZXNjcmlwdG9yKGRlc2NyaXB0b3IpO1xuICAgIGNvbnN0IGRlcml2ZWQgPSBwYXJzZVBveDVMb2NrdXBEZXNjcmlwdG9yKGRlc2NyaXB0b3IuYXREZXJpdmF0aW9uSW5kZXgoNCkpO1xuXG4gICAgYXNzZXJ0Lm9rKHdpbGRjYXJkKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwod2lsZGNhcmQuc3Rha2VyS2V5cywgdW5kZWZpbmVkKTtcbiAgICBhc3NlcnQub2sod2lsZGNhcmQuc3Rha2VyS2V5U3RyaW5ncy5ldmVyeSgoa2V5KSA9PiBrZXkuZW5kc1dpdGgoJy8qJykpKTtcbiAgICBhc3NlcnQub2soZGVyaXZlZD8uc3Rha2VyS2V5cyk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgIGRlcml2ZWQ/LnN0YWtlcktleXMsXG4gICAgICBkZXJpdmVQb3g1U3Rha2VyS2V5cyh2YWx1ZS5zdGFrZXJLZXlzIGFzIFtCSVAzMkludGVyZmFjZSwgQklQMzJJbnRlcmZhY2UsIEJJUDMySW50ZXJmYWNlXSwgNClcbiAgICApO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBub25jYW5vbmljYWwgcGFyYW1ldGVyIHZhbHVlcyBhbmQgZGVzY3JpcHRvciB0ZW1wbGF0ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBjcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcihwYXJhbXMoeyB1bmxvY2tIZWlnaHQ6IDAgfSkpKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGNyZWF0ZVBveDVMb2NrdXBEZXNjcmlwdG9yKHBhcmFtcyh7IHVubG9ja0hlaWdodDogNTAwXzAwMF8wMDAgfSkpKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGNyZWF0ZVBveDVMb2NrdXBEZXNjcmlwdG9yKHBhcmFtcyh7IHN0YWtlckNvbW1pdG1lbnQ6IEJ1ZmZlci5hbGxvYygzMSkgfSkpKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGNyZWF0ZVBveDVMb2NrdXBEZXNjcmlwdG9yKHBhcmFtcyh7IGVhcmx5RXhpdEtleTogQnVmZmVyLmFsbG9jKDMyKSB9KSkpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT5cbiAgICAgIGNyZWF0ZVBveDVMb2NrdXBEZXNjcmlwdG9yKFxuICAgICAgICBwYXJhbXMoeyBzdGFrZXJLZXlzOiBbZ2V0QmlwMzJUcmlwbGUoKVswXSwgQnVmZmVyLmFsbG9jKDMzLCAyKSwgQnVmZmVyLmFsbG9jKDMzLCAyKV0gfSlcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHZhbGlkS2V5ID0gcGFyYW1zKCkuZWFybHlFeGl0S2V5LnRvU3RyaW5nKCdoZXgnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGFyc2VQb3g1TG9ja3VwRGVzY3JpcHRvcihEZXNjcmlwdG9yLmZyb21TdHJpbmcoYHdzaChwaygke3ZhbGlkS2V5fSkpYCwgJ2RlZmluaXRlJykpLCB1bmRlZmluZWQpO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../../../test/unit/pox5/input.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const assert = __importStar(require("assert"));
|
|
37
|
+
const crypto_1 = require("crypto");
|
|
38
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
39
|
+
const testutils_1 = require("@bitgo/wasm-utxo/testutils");
|
|
40
|
+
const pox5_1 = require("../../../src/pox5");
|
|
41
|
+
const UNLOCK_HEIGHT = 840000;
|
|
42
|
+
function sha256(value) {
|
|
43
|
+
return (0, crypto_1.createHash)('sha256').update(value).digest();
|
|
44
|
+
}
|
|
45
|
+
function getParams() {
|
|
46
|
+
const stakerKeys = (0, testutils_1.getKeyTriple)('utxo-descriptors-pox5');
|
|
47
|
+
return {
|
|
48
|
+
unlockHeight: UNLOCK_HEIGHT,
|
|
49
|
+
stakerCommitment: sha256(Buffer.alloc(32, 0x42)),
|
|
50
|
+
earlyExitKey: Buffer.from(stakerKeys[0].derive(9).publicKey),
|
|
51
|
+
stakerKeys,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function createInputPsbt(descriptor) {
|
|
55
|
+
return wasm_utxo_1.descriptorWallet.createPsbt({ version: 2, locktime: 0 }, [
|
|
56
|
+
{
|
|
57
|
+
hash: '01'.repeat(32),
|
|
58
|
+
index: 0,
|
|
59
|
+
witnessUtxo: { script: descriptor.scriptPubkey(), value: 100000n },
|
|
60
|
+
descriptor,
|
|
61
|
+
},
|
|
62
|
+
], []);
|
|
63
|
+
}
|
|
64
|
+
describe('PoX-5 input resolution', function () {
|
|
65
|
+
it('matches a definite descriptor without derivation metadata', function () {
|
|
66
|
+
const descriptor = (0, pox5_1.createPox5LockupDescriptor)({
|
|
67
|
+
...getParams(),
|
|
68
|
+
stakerKeys: (0, pox5_1.derivePox5StakerKeys)(getParams().stakerKeys, 0),
|
|
69
|
+
});
|
|
70
|
+
const psbt = wasm_utxo_1.Psbt.create(2, 0);
|
|
71
|
+
psbt.addInput('01'.repeat(32), 0, 100000n, descriptor.scriptPubkey());
|
|
72
|
+
const match = (0, pox5_1.matchPox5Input)(psbt, 0, new Map([['lockup', descriptor]]));
|
|
73
|
+
assert.ok(match);
|
|
74
|
+
assert.strictEqual(match.index, undefined);
|
|
75
|
+
assert.strictEqual(match.descriptor.toString(), descriptor.toString());
|
|
76
|
+
assert.deepStrictEqual(match.info.stakerKeys, (0, pox5_1.derivePox5StakerKeys)(getParams().stakerKeys, 0));
|
|
77
|
+
});
|
|
78
|
+
it('matches a derived descriptor while ignoring foreign root derivations', function () {
|
|
79
|
+
const params = getParams();
|
|
80
|
+
const descriptor = (0, pox5_1.createPox5LockupDescriptor)(params);
|
|
81
|
+
const concreteDescriptor = descriptor.atDerivationIndex(4);
|
|
82
|
+
const psbt = createInputPsbt(concreteDescriptor);
|
|
83
|
+
const match = (0, pox5_1.matchPox5Input)(psbt, 0, new Map([['lockup', descriptor]]));
|
|
84
|
+
assert.ok(match);
|
|
85
|
+
assert.strictEqual(match.index, 4);
|
|
86
|
+
assert.strictEqual(match.descriptor.toString(), concreteDescriptor.toString());
|
|
87
|
+
assert.deepStrictEqual(match.info.stakerKeys, (0, pox5_1.derivePox5StakerKeys)(params.stakerKeys, 4));
|
|
88
|
+
assert.ok(psbt.getInputs()[0]?.bip32Derivation.some((derivation) => derivation.path === ''));
|
|
89
|
+
});
|
|
90
|
+
it('returns no match when the input has no usable derivation metadata', function () {
|
|
91
|
+
const params = getParams();
|
|
92
|
+
const descriptor = (0, pox5_1.createPox5LockupDescriptor)(params);
|
|
93
|
+
const concreteDescriptor = descriptor.atDerivationIndex(4);
|
|
94
|
+
const input = {
|
|
95
|
+
witnessUtxo: { script: concreteDescriptor.scriptPubkey(), value: 100000n },
|
|
96
|
+
bip32Derivation: [],
|
|
97
|
+
tapBip32Derivation: [],
|
|
98
|
+
};
|
|
99
|
+
assert.strictEqual((0, pox5_1.findPox5DescriptorForInput)(input, new Map([['lockup', descriptor]])), undefined);
|
|
100
|
+
});
|
|
101
|
+
it('returns no match for a noncanonical descriptor', function () {
|
|
102
|
+
const params = getParams();
|
|
103
|
+
const pox5Descriptor = (0, pox5_1.createPox5LockupDescriptor)(params);
|
|
104
|
+
const psbt = wasm_utxo_1.Psbt.create(2, 0);
|
|
105
|
+
psbt.addInput('01'.repeat(32), 0, 100000n, pox5Descriptor.atDerivationIndex(0).scriptPubkey());
|
|
106
|
+
const nonPox5Descriptor = (0, pox5_1.createPox5LockupDescriptor)({
|
|
107
|
+
...params,
|
|
108
|
+
unlockHeight: UNLOCK_HEIGHT + 1,
|
|
109
|
+
}).atDerivationIndex(0);
|
|
110
|
+
assert.strictEqual((0, pox5_1.matchPox5Input)(psbt, 0, new Map([['other', nonPox5Descriptor]])), undefined);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvcG94NS9pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyxtQ0FBb0M7QUFFcEMsZ0RBQWlFO0FBQ2pFLDBEQUEwRDtBQUUxRCw0Q0FNMkI7QUFFM0IsTUFBTSxhQUFhLEdBQUcsTUFBTyxDQUFDO0FBTTlCLFNBQVMsTUFBTSxDQUFDLEtBQWlCO0lBQy9CLE9BQU8sSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNyRCxDQUFDO0FBRUQsU0FBUyxTQUFTO0lBQ2hCLE1BQU0sVUFBVSxHQUFHLElBQUEsd0JBQVksRUFBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3pELE9BQU87UUFDTCxZQUFZLEVBQUUsYUFBYTtRQUMzQixnQkFBZ0IsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEQsWUFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDNUQsVUFBVTtLQUNYLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsVUFBeUQ7SUFDaEYsT0FBTyw0QkFBZ0IsQ0FBQyxVQUFVLENBQ2hDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQzNCO1FBQ0U7WUFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDckIsS0FBSyxFQUFFLENBQUM7WUFDUixXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLFlBQVks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QUFjLEVBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDbEcsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5cbmltcG9ydCB7IGJpcDMyLCBkZXNjcmlwdG9yV2FsbGV0LCBQc2J0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgeyBnZXRLZXlUcmlwbGUgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvL3Rlc3R1dGlscyc7XG5cbmltcG9ydCB7XG4gIGNyZWF0ZVBveDVMb2NrdXBEZXNjcmlwdG9yLFxuICBkZXJpdmVQb3g1U3Rha2VyS2V5cyxcbiAgZmluZFBveDVEZXNjcmlwdG9yRm9ySW5wdXQsXG4gIG1hdGNoUG94NUlucHV0LFxuICBQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtcyxcbn0gZnJvbSAnLi4vLi4vLi4vc3JjL3BveDUnO1xuXG5jb25zdCBVTkxPQ0tfSEVJR0hUID0gODQwXzAwMDtcbnR5cGUgQklQMzJJbnRlcmZhY2UgPSBiaXAzMi5CSVAzMkludGVyZmFjZTtcbnR5cGUgUG94NUJpcDMyUGFyYW1zID0gT21pdDxQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtcywgJ3N0YWtlcktleXMnPiAmIHtcbiAgc3Rha2VyS2V5czogW0JJUDMySW50ZXJmYWNlLCBCSVAzMkludGVyZmFjZSwgQklQMzJJbnRlcmZhY2VdO1xufTtcblxuZnVuY3Rpb24gc2hhMjU2KHZhbHVlOiBVaW50OEFycmF5KTogQnVmZmVyIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZSh2YWx1ZSkuZGlnZXN0KCk7XG59XG5cbmZ1bmN0aW9uIGdldFBhcmFtcygpOiBQb3g1QmlwMzJQYXJhbXMge1xuICBjb25zdCBzdGFrZXJLZXlzID0gZ2V0S2V5VHJpcGxlKCd1dHhvLWRlc2NyaXB0b3JzLXBveDUnKTtcbiAgcmV0dXJuIHtcbiAgICB1bmxvY2tIZWlnaHQ6IFVOTE9DS19IRUlHSFQsXG4gICAgc3Rha2VyQ29tbWl0bWVudDogc2hhMjU2KEJ1ZmZlci5hbGxvYygzMiwgMHg0MikpLFxuICAgIGVhcmx5RXhpdEtleTogQnVmZmVyLmZyb20oc3Rha2VyS2V5c1swXS5kZXJpdmUoOSkucHVibGljS2V5KSxcbiAgICBzdGFrZXJLZXlzLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVJbnB1dFBzYnQoZGVzY3JpcHRvcjogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlUG94NUxvY2t1cERlc2NyaXB0b3I+KTogUHNidCB7XG4gIHJldHVybiBkZXNjcmlwdG9yV2FsbGV0LmNyZWF0ZVBzYnQoXG4gICAgeyB2ZXJzaW9uOiAyLCBsb2NrdGltZTogMCB9LFxuICAgIFtcbiAgICAgIHtcbiAgICAgICAgaGFzaDogJzAxJy5yZXBlYXQoMzIpLFxuICAgICAgICBpbmRleDogMCxcbiAgICAgICAgd2l0bmVzc1V0eG86IHsgc2NyaXB0OiBkZXNjcmlwdG9yLnNjcmlwdFB1YmtleSgpLCB2YWx1ZTogMTAwXzAwMG4gfSxcbiAgICAgICAgZGVzY3JpcHRvcixcbiAgICAgIH0sXG4gICAgXSxcbiAgICBbXVxuICApO1xufVxuXG5kZXNjcmliZSgnUG9YLTUgaW5wdXQgcmVzb2x1dGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ21hdGNoZXMgYSBkZWZpbml0ZSBkZXNjcmlwdG9yIHdpdGhvdXQgZGVyaXZhdGlvbiBtZXRhZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gY3JlYXRlUG94NUxvY2t1cERlc2NyaXB0b3Ioe1xuICAgICAgLi4uZ2V0UGFyYW1zKCksXG4gICAgICBzdGFrZXJLZXlzOiBkZXJpdmVQb3g1U3Rha2VyS2V5cyhnZXRQYXJhbXMoKS5zdGFrZXJLZXlzLCAwKSxcbiAgICB9KTtcbiAgICBjb25zdCBwc2J0ID0gUHNidC5jcmVhdGUoMiwgMCk7XG4gICAgcHNidC5hZGRJbnB1dCgnMDEnLnJlcGVhdCgzMiksIDAsIDEwMF8wMDBuLCBkZXNjcmlwdG9yLnNjcmlwdFB1YmtleSgpKTtcbiAgICBjb25zdCBtYXRjaCA9IG1hdGNoUG94NUlucHV0KHBzYnQsIDAsIG5ldyBNYXAoW1snbG9ja3VwJywgZGVzY3JpcHRvcl1dKSk7XG5cbiAgICBhc3NlcnQub2sobWF0Y2gpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChtYXRjaC5pbmRleCwgdW5kZWZpbmVkKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwobWF0Y2guZGVzY3JpcHRvci50b1N0cmluZygpLCBkZXNjcmlwdG9yLnRvU3RyaW5nKCkpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwobWF0Y2guaW5mby5zdGFrZXJLZXlzLCBkZXJpdmVQb3g1U3Rha2VyS2V5cyhnZXRQYXJhbXMoKS5zdGFrZXJLZXlzLCAwKSk7XG4gIH0pO1xuXG4gIGl0KCdtYXRjaGVzIGEgZGVyaXZlZCBkZXNjcmlwdG9yIHdoaWxlIGlnbm9yaW5nIGZvcmVpZ24gcm9vdCBkZXJpdmF0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBnZXRQYXJhbXMoKTtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gY3JlYXRlUG94NUxvY2t1cERlc2NyaXB0b3IocGFyYW1zKTtcbiAgICBjb25zdCBjb25jcmV0ZURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLmF0RGVyaXZhdGlvbkluZGV4KDQpO1xuICAgIGNvbnN0IHBzYnQgPSBjcmVhdGVJbnB1dFBzYnQoY29uY3JldGVEZXNjcmlwdG9yKTtcbiAgICBjb25zdCBtYXRjaCA9IG1hdGNoUG94NUlucHV0KHBzYnQsIDAsIG5ldyBNYXAoW1snbG9ja3VwJywgZGVzY3JpcHRvcl1dKSk7XG5cbiAgICBhc3NlcnQub2sobWF0Y2gpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChtYXRjaC5pbmRleCwgNCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1hdGNoLmRlc2NyaXB0b3IudG9TdHJpbmcoKSwgY29uY3JldGVEZXNjcmlwdG9yLnRvU3RyaW5nKCkpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwobWF0Y2guaW5mby5zdGFrZXJLZXlzLCBkZXJpdmVQb3g1U3Rha2VyS2V5cyhwYXJhbXMuc3Rha2VyS2V5cywgNCkpO1xuICAgIGFzc2VydC5vayhwc2J0LmdldElucHV0cygpWzBdPy5iaXAzMkRlcml2YXRpb24uc29tZSgoZGVyaXZhdGlvbikgPT4gZGVyaXZhdGlvbi5wYXRoID09PSAnJykpO1xuICB9KTtcblxuICBpdCgncmV0dXJucyBubyBtYXRjaCB3aGVuIHRoZSBpbnB1dCBoYXMgbm8gdXNhYmxlIGRlcml2YXRpb24gbWV0YWRhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gZ2V0UGFyYW1zKCk7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IGNyZWF0ZVBveDVMb2NrdXBEZXNjcmlwdG9yKHBhcmFtcyk7XG4gICAgY29uc3QgY29uY3JldGVEZXNjcmlwdG9yID0gZGVzY3JpcHRvci5hdERlcml2YXRpb25JbmRleCg0KTtcbiAgICBjb25zdCBpbnB1dCA9IHtcbiAgICAgIHdpdG5lc3NVdHhvOiB7IHNjcmlwdDogY29uY3JldGVEZXNjcmlwdG9yLnNjcmlwdFB1YmtleSgpLCB2YWx1ZTogMTAwXzAwMG4gfSxcbiAgICAgIGJpcDMyRGVyaXZhdGlvbjogW10sXG4gICAgICB0YXBCaXAzMkRlcml2YXRpb246IFtdLFxuICAgIH07XG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZmluZFBveDVEZXNjcmlwdG9yRm9ySW5wdXQoaW5wdXQsIG5ldyBNYXAoW1snbG9ja3VwJywgZGVzY3JpcHRvcl1dKSksIHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGl0KCdyZXR1cm5zIG5vIG1hdGNoIGZvciBhIG5vbmNhbm9uaWNhbCBkZXNjcmlwdG9yJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IGdldFBhcmFtcygpO1xuICAgIGNvbnN0IHBveDVEZXNjcmlwdG9yID0gY3JlYXRlUG94NUxvY2t1cERlc2NyaXB0b3IocGFyYW1zKTtcbiAgICBjb25zdCBwc2J0ID0gUHNidC5jcmVhdGUoMiwgMCk7XG4gICAgcHNidC5hZGRJbnB1dCgnMDEnLnJlcGVhdCgzMiksIDAsIDEwMF8wMDBuLCBwb3g1RGVzY3JpcHRvci5hdERlcml2YXRpb25JbmRleCgwKS5zY3JpcHRQdWJrZXkoKSk7XG4gICAgY29uc3Qgbm9uUG94NURlc2NyaXB0b3IgPSBjcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcih7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICB1bmxvY2tIZWlnaHQ6IFVOTE9DS19IRUlHSFQgKyAxLFxuICAgIH0pLmF0RGVyaXZhdGlvbkluZGV4KDApO1xuXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1hdGNoUG94NUlucHV0KHBzYnQsIDAsIG5ldyBNYXAoW1snb3RoZXInLCBub25Qb3g1RGVzY3JpcHRvcl1dKSksIHVuZGVmaW5lZCk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../../test/unit/pox5/validation.ts"],"names":[],"mappings":""}
|