@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,182 @@
|
|
|
1
|
+
import { BIP32, Descriptor, ast } from '@bitgo/wasm-utxo';
|
|
2
|
+
import { PatternMatcher } from '@bitgo-beta/utxo-core/descriptor';
|
|
3
|
+
import { MAX_FEE_BYTE_LENGTH, STACKS_RECIPIENT_BYTE_LENGTH, UNSPENDABLE_INTERNAL_KEY } from './constants';
|
|
4
|
+
function asString(v, field) {
|
|
5
|
+
if (typeof v !== 'string') {
|
|
6
|
+
throw new Error(`${field} must be a string`);
|
|
7
|
+
}
|
|
8
|
+
return v;
|
|
9
|
+
}
|
|
10
|
+
function asNumber(v, field) {
|
|
11
|
+
if (typeof v !== 'number') {
|
|
12
|
+
throw new Error(`${field} must be a number`);
|
|
13
|
+
}
|
|
14
|
+
return v;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Pull `[threshold, ...keys]` out of a `multi_a` AST node value, validating
|
|
18
|
+
* each element. The descriptor's `multi_a` is rendered with keys either as
|
|
19
|
+
* concrete hex (definite descriptor) or as xpub strings ending in `/*`
|
|
20
|
+
* (derivable descriptor) — both are strings here, so we don't try to convert
|
|
21
|
+
* to Buffer at this level.
|
|
22
|
+
*/
|
|
23
|
+
function parseMulti(multi) {
|
|
24
|
+
if (!Array.isArray(multi) || multi.length < 1) {
|
|
25
|
+
throw new Error('Invalid multi_a structure: not an array or empty');
|
|
26
|
+
}
|
|
27
|
+
const [threshold, ...keys] = multi;
|
|
28
|
+
if (typeof threshold !== 'number') {
|
|
29
|
+
throw new Error('Invalid multi_a structure: threshold is not a number');
|
|
30
|
+
}
|
|
31
|
+
if (!keys.every((k) => typeof k === 'string')) {
|
|
32
|
+
throw new Error('Invalid multi_a structure: not all keys are strings');
|
|
33
|
+
}
|
|
34
|
+
return [threshold, keys];
|
|
35
|
+
}
|
|
36
|
+
function parseDepositLeaf(depositNode, matcher) {
|
|
37
|
+
const depositPattern = {
|
|
38
|
+
and_v: [{ payload_drop: { $var: 'payloadHex' } }, { pk: { $var: 'signersKey' } }],
|
|
39
|
+
};
|
|
40
|
+
const match = matcher.match(depositNode, depositPattern);
|
|
41
|
+
if (!match) {
|
|
42
|
+
throw new Error('Deposit leaf does not match expected pattern');
|
|
43
|
+
}
|
|
44
|
+
const payloadHex = asString(match.payloadHex, 'payload_drop value');
|
|
45
|
+
const signersKeyHex = asString(match.signersKey, 'pk_k key');
|
|
46
|
+
const expectedPayloadLength = MAX_FEE_BYTE_LENGTH + STACKS_RECIPIENT_BYTE_LENGTH;
|
|
47
|
+
const payload = Buffer.from(payloadHex, 'hex');
|
|
48
|
+
if (payload.length !== expectedPayloadLength) {
|
|
49
|
+
throw new Error(`payload_drop value must be ${expectedPayloadLength} bytes (${expectedPayloadLength * 2} hex chars), got ${payload.length} bytes`);
|
|
50
|
+
}
|
|
51
|
+
const maxFee = payload.readBigUInt64BE(0);
|
|
52
|
+
const stacksRecipient = payload.subarray(MAX_FEE_BYTE_LENGTH);
|
|
53
|
+
const signersAggregateKey = Buffer.from(signersKeyHex, 'hex');
|
|
54
|
+
if (signersAggregateKey.length !== 32) {
|
|
55
|
+
throw new Error(`signersAggregateKey must be 32 bytes x-only, got ${signersAggregateKey.length}`);
|
|
56
|
+
}
|
|
57
|
+
return { signersAggregateKey, maxFee, stacksRecipient };
|
|
58
|
+
}
|
|
59
|
+
function parseReclaimLeaf(reclaimNode, matcher) {
|
|
60
|
+
// and_v(r:older(<lockTime>), multi_a(2, k1, k2, k3))
|
|
61
|
+
const reclaimPattern = {
|
|
62
|
+
and_v: [{ 'r:older': { $var: 'lockTime' } }, { multi_a: { $var: 'reclaimMulti' } }],
|
|
63
|
+
};
|
|
64
|
+
const match = matcher.match(reclaimNode, reclaimPattern);
|
|
65
|
+
if (!match) {
|
|
66
|
+
throw new Error('Reclaim leaf does not match expected pattern');
|
|
67
|
+
}
|
|
68
|
+
const lockTime = asNumber(match.lockTime, 'r:older argument');
|
|
69
|
+
if (lockTime <= 0) {
|
|
70
|
+
throw new Error(`reclaim lockTime must be > 0, got ${lockTime}`);
|
|
71
|
+
}
|
|
72
|
+
const [threshold, reclaimKeyStrings] = parseMulti(match.reclaimMulti);
|
|
73
|
+
if (threshold !== 2) {
|
|
74
|
+
throw new Error(`reclaim multi_a threshold must be 2, got ${threshold}`);
|
|
75
|
+
}
|
|
76
|
+
if (reclaimKeyStrings.length !== 3) {
|
|
77
|
+
throw new Error(`reclaim multi_a must have exactly 3 keys, got ${reclaimKeyStrings.length}`);
|
|
78
|
+
}
|
|
79
|
+
return { lockTime, reclaimKeyStrings };
|
|
80
|
+
}
|
|
81
|
+
const HEX_X_ONLY_KEY = /^[0-9a-fA-F]{64}$/;
|
|
82
|
+
const XPUB_WITH_INDEX = /^([1-9A-HJ-NP-Za-km-z]+)\/(\d+)$/;
|
|
83
|
+
/**
|
|
84
|
+
* Resolve a single `multi_a` key entry to a 32-byte x-only public key.
|
|
85
|
+
*
|
|
86
|
+
* Accepts:
|
|
87
|
+
* - 64-hex-char string → returned as-is (already x-only)
|
|
88
|
+
* - `xpub.../<index>` → BIP32-derive at that index and drop the prefix byte
|
|
89
|
+
*
|
|
90
|
+
* Returns null for any other shape (e.g. wildcard `xpub.../*`, malformed input).
|
|
91
|
+
*/
|
|
92
|
+
function resolveReclaimKey(s) {
|
|
93
|
+
if (HEX_X_ONLY_KEY.test(s)) {
|
|
94
|
+
return Buffer.from(s, 'hex');
|
|
95
|
+
}
|
|
96
|
+
const m = s.match(XPUB_WITH_INDEX);
|
|
97
|
+
if (!m) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const [, xpub, indexStr] = m;
|
|
101
|
+
const index = Number.parseInt(indexStr, 10);
|
|
102
|
+
if (!Number.isFinite(index) || index < 0) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
let node;
|
|
106
|
+
try {
|
|
107
|
+
node = BIP32.fromBase58(xpub);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
// BIP32 public key is 33 bytes (1 prefix + 32 x-only). Drop the prefix.
|
|
113
|
+
return Buffer.from(node.derive(index).publicKey.subarray(1));
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Convert reclaim-leaf key strings into 32-byte x-only buffers. Accepts both
|
|
117
|
+
* the definite/derived form (concrete 64-hex-char x-only keys) and the form
|
|
118
|
+
* produced by `Descriptor.atDerivationIndex(n)` (`xpub.../<n>`). Returns
|
|
119
|
+
* undefined if any entry is still wildcard (`xpub.../*`) or otherwise
|
|
120
|
+
* unresolvable.
|
|
121
|
+
*/
|
|
122
|
+
function reclaimKeysFromStrings(keyStrings) {
|
|
123
|
+
const resolved = keyStrings.map(resolveReclaimKey);
|
|
124
|
+
if (resolved.some((b) => b === null) || resolved.length !== 3) {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
return [resolved[0], resolved[1], resolved[2]];
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Parse an sBTC peg-in deposit descriptor and return its components.
|
|
131
|
+
*
|
|
132
|
+
* Returns `null` if the descriptor does not match the expected
|
|
133
|
+
* `tr(<UNSPENDABLE>, {<depositLeaf>, <reclaimLeaf>})` shape — same convention
|
|
134
|
+
* as babylon's `parseStakingDescriptor`. Throws if the shape matches but a
|
|
135
|
+
* sub-field is malformed (e.g. signers key isn't 32 bytes, payload isn't 30
|
|
136
|
+
* bytes, threshold isn't 2).
|
|
137
|
+
*
|
|
138
|
+
* Accepts both the `Descriptor` WASM object (definite or derivable) and a
|
|
139
|
+
* pre-extracted `ast.DescriptorNode`
|
|
140
|
+
*/
|
|
141
|
+
export function parseSbtcDepositDescriptor(descriptor) {
|
|
142
|
+
const pattern = {
|
|
143
|
+
tr: [UNSPENDABLE_INTERNAL_KEY, [{ $var: 'depositLeaf' }, { $var: 'reclaimLeaf' }]],
|
|
144
|
+
};
|
|
145
|
+
const matcher = new PatternMatcher();
|
|
146
|
+
const descriptorNode = descriptor instanceof Descriptor ? ast.fromDescriptor(descriptor) : descriptor;
|
|
147
|
+
const result = matcher.match(descriptorNode, pattern);
|
|
148
|
+
if (!result) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
const depositMiniscriptNode = result.depositLeaf;
|
|
152
|
+
let reclaimMiniscriptNode = result.reclaimLeaf;
|
|
153
|
+
const { signersAggregateKey, maxFee, stacksRecipient } = parseDepositLeaf(depositMiniscriptNode, matcher);
|
|
154
|
+
const { lockTime, reclaimKeyStrings } = parseReclaimLeaf(reclaimMiniscriptNode, matcher);
|
|
155
|
+
const reclaimKeyStringsTuple = [
|
|
156
|
+
reclaimKeyStrings[0],
|
|
157
|
+
reclaimKeyStrings[1],
|
|
158
|
+
reclaimKeyStrings[2],
|
|
159
|
+
];
|
|
160
|
+
const reclaimKeys = reclaimKeysFromStrings(reclaimKeyStrings);
|
|
161
|
+
if (reclaimKeys) {
|
|
162
|
+
// Rewrite the reclaim leaf with concrete hex keys when we can resolve
|
|
163
|
+
// them — `Miniscript.fromString(..., 'tap')` only accepts x-only hex in
|
|
164
|
+
// `multi_a`, not xpub-form strings. With this rewrite the formatted
|
|
165
|
+
// leaf is directly compilable; without it callers must do the
|
|
166
|
+
// resolution themselves.
|
|
167
|
+
reclaimMiniscriptNode = {
|
|
168
|
+
and_v: [{ 'r:older': lockTime }, { multi_a: [2, ...reclaimKeys.map((k) => k.toString('hex'))] }],
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
signersAggregateKey,
|
|
173
|
+
maxFee,
|
|
174
|
+
stacksRecipient,
|
|
175
|
+
lockTime,
|
|
176
|
+
reclaimKeys,
|
|
177
|
+
reclaimKeyStrings: reclaimKeyStringsTuple,
|
|
178
|
+
depositMiniscriptNode,
|
|
179
|
+
reclaimMiniscriptNode,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VEZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NidGMvcGFyc2VEZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQVcsTUFBTSxrQ0FBa0MsQ0FBQztBQUUzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsNEJBQTRCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUEyQzFHLFNBQVMsUUFBUSxDQUFDLENBQVUsRUFBRSxLQUFhO0lBQ3pDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssbUJBQW1CLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBVSxFQUFFLEtBQWE7SUFDekMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxLQUFjO0lBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ25DLElBQUksT0FBTyxTQUFT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QVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNqRyxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU87UUFDTCxtQkFBbUI7UUFDbkIsTUFBTTtRQUNOLGVBQWU7UUFDZixRQUFRO1FBQ1IsV0FBVztRQUNYLGlCQUFpQixFQUFFLHNCQUFzQjtRQUN6QyxxQkFBcUI7UUFDckIscUJBQXFCO0tBQ3RCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQklQMzIsIERlc2NyaXB0b3IsIGFzdCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHsgUGF0dGVybk1hdGNoZXIsIFBhdHRlcm4gfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWNvcmUvZGVzY3JpcHRvcic7XG5cbmltcG9ydCB7IE1BWF9GRUVfQllURV9MRU5HVEgsIFNUQUNLU19SRUNJUElFTlRfQllURV9MRU5HVEgsIFVOU1BFTkRBQkxFX0lOVEVSTkFMX0tFWSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBQYXJzZWQgY29tcG9uZW50cyBvZiBhbiBzQlRDIHBlZy1pbiBkZXBvc2l0IGRlc2NyaXB0b3IuXG4gKlxuICogVGhlIHBhcnNlciByZXR1cm5zIGJvdGggdGhlIGhpZ2gtbGV2ZWxcbiAqIGZpZWxkcyBjYWxsZXJzIHVzdWFsbHkgbmVlZCAoa2V5cywgbG9ja1RpbWUsIGZlZSwgcmVjaXBpZW50KSBhbmQgdGhlIHJhd1xuICogbWluaXNjcmlwdCBBU1Qgbm9kZXMgc28gdGhlIGxlYXZlcyBjYW4gYmUgcmUtY29tcGlsZWQgaW50byBhXG4gKiBgTWluaXNjcmlwdGAgdmlhIGBhc3QuZm9ybWF0Tm9kZWAgKyBgTWluaXNjcmlwdC5mcm9tU3RyaW5nYC5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyc2VkU2J0Y0RlcG9zaXREZXNjcmlwdG9yID0ge1xuICAvKiogMzItYnl0ZSB4LW9ubHkgc2lnbmVycyBhZ2dyZWdhdGUga2V5IGZyb20gdGhlIGRlcG9zaXQgbGVhZi4gKi9cbiAgc2lnbmVyc0FnZ3JlZ2F0ZUtleTogQnVmZmVyO1xuICAvKiogTWF4IHNpZ25lciBmZWUgcGFyc2VkIGZyb20gdGhlIGZpcnN0IDggYnl0ZXMgb2YgdGhlIHBheWxvYWRfZHJvcCB2YWx1ZS4gKi9cbiAgbWF4RmVlOiBiaWdpbnQ7XG4gIC8qKiAyMi1ieXRlIFN0YWNrcyByZWNpcGllbnQgcGFyc2VkIGZyb20gdGhlIHRyYWlsaW5nIGJ5dGVzIG9mIHRoZSBwYXlsb2FkLiAqL1xuICBzdGFja3NSZWNpcGllbnQ6IEJ1ZmZlcjtcbiAgLyoqIFJlY2xhaW0tbGVhZiByZWxhdGl2ZSB0aW1lbG9jayAobnVtYmVyIG9mIEJpdGNvaW4gYmxvY2tzLCBPUF9DU1YgYXJndW1lbnQpLiAqL1xuICBsb2NrVGltZTogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHRocmVlIGNvbmNyZXRlIHgtb25seSByZWNsYWltIGtleXMgZnJvbSB0aGUgcmVjbGFpbS1sZWFmIGBtdWx0aV9hYCxcbiAgICogaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluc2lkZSB0aGUgbGVhZiAoZGVzY3JpcHRvciBsaWJyYXJ5IHNvcnRzIGJ5IGhleCkuXG4gICAqIE9ubHkgcHJlc2VudCB3aGVuIHRoZSBkZXNjcmlwdG9yIGlzIGluIGl0cyBkZXJpdmVkL2RlZmluaXRlIGZvcm0g4oCUIGZvclxuICAgKiBkZXJpdmFibGUgZGVzY3JpcHRvcnMgdGhlIG11bHRpX2EgZW50cmllcyBhcmUgeHB1YiBzdHJpbmdzIChlLmcuXG4gICAqIGB4cHViLi4uLypgKSwgd2hpY2ggY2FuJ3QgYmUgdHVybmVkIGludG8gMzItYnl0ZSBidWZmZXJzIHdpdGhvdXQgcGlja2luZ1xuICAgKiBhIGRlcml2YXRpb24gaW5kZXguIENhbGxlcnMgdGhhdCBuZWVkIHJhdyBrZXkgYnl0ZXMgTVVTVCBwYXNzIHRoZVxuICAgKiBkZXJpdmVkIGRlc2NyaXB0b3IgKHNlZSBgZGVyaXZlUmVjbGFpbUtleXNgIGZvciBkZXJpdmFibGUgaW5wdXRzKS5cbiAgICovXG4gIHJlY2xhaW1LZXlzOiBbQnVmZmVyLCBCdWZmZXIsIEJ1ZmZlcl0gfCB1bmRlZmluZWQ7XG4gIC8qKiBSYXcgbWluaXNjcmlwdCBBU1QgZm9yIHRoZSBkZXBvc2l0IGxlYWYgKGZpcnN0IHRhcC10cmVlIGxlYWYpLiAqL1xuICBkZXBvc2l0TWluaXNjcmlwdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgLyoqIFJhdyBtaW5pc2NyaXB0IEFTVCBmb3IgdGhlIHJlY2xhaW0gbGVhZiAoc2Vjb25kIHRhcC10cmVlIGxlYWYpLiAqL1xuICByZWNsYWltTWluaXNjcmlwdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgLyoqXG4gICAqIFRoZSB0aHJlZSByYXcgYG11bHRpX2FgIGtleSBlbnRyaWVzIGZyb20gdGhlIHJlY2xhaW0gbGVhZiwgZXhhY3RseSBhc1xuICAgKiB0aGV5IGFwcGVhciBpbiB0aGUgZGVzY3JpcHRvciDigJQgYHhwdWIuLi4vKmAgZm9yIGRlcml2YWJsZSBkZXNjcmlwdG9ycyBhbmRcbiAgICogNjQtaGV4LWNoYXIgeC1vbmx5IGtleXMgZm9yIGRlZmluaXRlIGRlc2NyaXB0b3JzLiBVc2VmdWwgZm9yIGNhbGxlcnMgdGhhdFxuICAgKiBuZWVkIHRoZSBvcmlnaW5hbCB4cHViIGZvcm0gKGUuZy4gdG8gcm91bmQtdHJpcCBiYWNrIHRvIGEgZGVzY3JpcHRvclxuICAgKiBidWlsZGVyKSBhbmQgZG9uJ3Qgd2FudCB0aGUgcmVzb2x2ZWQgYHJlY2xhaW1LZXlzYCBidWZmZXJzLlxuICAgKi9cbiAgcmVjbGFpbUtleVN0cmluZ3M6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXTtcbn07XG5cbmZ1bmN0aW9uIGFzU3RyaW5nKHY6IHVua25vd24sIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHYgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2ZpZWxkfSBtdXN0IGJlIGEgc3RyaW5nYCk7XG4gIH1cbiAgcmV0dXJuIHY7XG59XG5cbmZ1bmN0aW9uIGFzTnVtYmVyKHY6IHVua25vd24sIGZpZWxkOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHYgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2ZpZWxkfSBtdXN0IGJlIGEgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIHY7XG59XG5cbi8qKlxuICogUHVsbCBgW3RocmVzaG9sZCwgLi4ua2V5c11gIG91dCBvZiBhIGBtdWx0aV9hYCBBU1Qgbm9kZSB2YWx1ZSwgdmFsaWRhdGluZ1xuICogZWFjaCBlbGVtZW50LiBUaGUgZGVzY3JpcHRvcidzIGBtdWx0aV9hYCBpcyByZW5kZXJlZCB3aXRoIGtleXMgZWl0aGVyIGFzXG4gKiBjb25jcmV0ZSBoZXggKGRlZmluaXRlIGRlc2NyaXB0b3IpIG9yIGFzIHhwdWIgc3RyaW5ncyBlbmRpbmcgaW4gYC8qYFxuICogKGRlcml2YWJsZSBkZXNjcmlwdG9yKSDigJQgYm90aCBhcmUgc3RyaW5ncyBoZXJlLCBzbyB3ZSBkb24ndCB0cnkgdG8gY29udmVydFxuICogdG8gQnVmZmVyIGF0IHRoaXMgbGV2ZWwuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTXVsdGkobXVsdGk6IHVua25vd24pOiBbbnVtYmVyLCBzdHJpbmdbXV0ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobXVsdGkpIHx8IG11bHRpLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbXVsdGlfYSBzdHJ1Y3R1cmU6IG5vdCBhbiBhcnJheSBvciBlbXB0eScpO1xuICB9XG4gIGNvbnN0IFt0aHJlc2hvbGQsIC4uLmtleXNdID0gbXVsdGk7XG4gIGlmICh0eXBlb2YgdGhyZXNob2xkICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtdWx0aV9hIHN0cnVjdHVyZTogdGhyZXNob2xkIGlzIG5vdCBhIG51bWJlcicpO1xuICB9XG4gIGlmICgha2V5cy5ldmVyeSgoaykgPT4gdHlwZW9mIGsgPT09ICdzdHJpbmcnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtdWx0aV9hIHN0cnVjdHVyZTogbm90IGFsbCBrZXlzIGFyZSBzdHJpbmdzJyk7XG4gIH1cbiAgcmV0dXJuIFt0aHJlc2hvbGQsIGtleXNdO1xufVxuXG5mdW5jdGlvbiBwYXJzZURlcG9zaXRMZWFmKFxuICBkZXBvc2l0Tm9kZTogYXN0Lk1pbmlzY3JpcHROb2RlLFxuICBtYXRjaGVyOiBQYXR0ZXJuTWF0Y2hlclxuKTogeyBzaWduZXJzQWdncmVnYXRlS2V5OiBCdWZmZXI7IG1heEZlZTogYmlnaW50OyBzdGFja3NSZWNpcGllbnQ6IEJ1ZmZlciB9IHtcbiAgY29uc3QgZGVwb3NpdFBhdHRlcm46IFBhdHRlcm4gPSB7XG4gICAgYW5kX3Y6IFt7IHBheWxvYWRfZHJvcDogeyAkdmFyOiAncGF5bG9hZEhleCcgfSB9LCB7IHBrOiB7ICR2YXI6ICdzaWduZXJzS2V5JyB9IH1dLFxuICB9O1xuICBjb25zdCBtYXRjaCA9IG1hdGNoZXIubWF0Y2goZGVwb3NpdE5vZGUsIGRlcG9zaXRQYXR0ZXJuKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRGVwb3NpdCBsZWFmIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHBhdHRlcm4nKTtcbiAgfVxuXG4gIGNvbnN0IHBheWxvYWRIZXggPSBhc1N0cmluZyhtYXRjaC5wYXlsb2FkSGV4LCAncGF5bG9hZF9kcm9wIHZhbHVlJyk7XG4gIGNvbnN0IHNpZ25lcnNLZXlIZXggPSBhc1N0cmluZyhtYXRjaC5zaWduZXJzS2V5LCAncGtfayBrZXknKTtcblxuICBjb25zdCBleHBlY3RlZFBheWxvYWRMZW5ndGggPSBNQVhfRkVFX0JZVEVfTEVOR1RIICsgU1RBQ0tTX1JFQ0lQSUVOVF9CWVRFX0xFTkdUSDtcbiAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5mcm9tKHBheWxvYWRIZXgsICdoZXgnKTtcbiAgaWYgKHBheWxvYWQubGVuZ3RoICE9PSBleHBlY3RlZFBheWxvYWRMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgcGF5bG9hZF9kcm9wIHZhbHVlIG11c3QgYmUgJHtleHBlY3RlZFBheWxvYWRMZW5ndGh9IGJ5dGVzICgke2V4cGVjdGVkUGF5bG9hZExlbmd0aCAqIDJ9IGhleCBjaGFycyksIGdvdCAke1xuICAgICAgICBwYXlsb2FkLmxlbmd0aFxuICAgICAgfSBieXRlc2BcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbWF4RmVlID0gcGF5bG9hZC5yZWFkQmlnVUludDY0QkUoMCk7XG4gIGNvbnN0IHN0YWNrc1JlY2lwaWVudCA9IHBheWxvYWQuc3ViYXJyYXkoTUFYX0ZFRV9CWVRFX0xFTkdUSCk7XG5cbiAgY29uc3Qgc2lnbmVyc0FnZ3JlZ2F0ZUtleSA9IEJ1ZmZlci5mcm9tKHNpZ25lcnNLZXlIZXgsICdoZXgnKTtcbiAgaWYgKHNpZ25lcnNBZ2dyZWdhdGVLZXkubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgc2lnbmVyc0FnZ3JlZ2F0ZUtleSBtdXN0IGJlIDMyIGJ5dGVzIHgtb25seSwgZ290ICR7c2lnbmVyc0FnZ3JlZ2F0ZUtleS5sZW5ndGh9YCk7XG4gIH1cblxuICByZXR1cm4geyBzaWduZXJzQWdncmVnYXRlS2V5LCBtYXhGZWUsIHN0YWNrc1JlY2lwaWVudCB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVJlY2xhaW1MZWFmKFxuICByZWNsYWltTm9kZTogYXN0Lk1pbmlzY3JpcHROb2RlLFxuICBtYXRjaGVyOiBQYXR0ZXJuTWF0Y2hlclxuKTogeyBsb2NrVGltZTogbnVtYmVyOyByZWNsYWltS2V5U3RyaW5nczogc3RyaW5nW10gfSB7XG4gIC8vIGFuZF92KHI6b2xkZXIoPGxvY2tUaW1lPiksIG11bHRpX2EoMiwgazEsIGsyLCBrMykpXG4gIGNvbnN0IHJlY2xhaW1QYXR0ZXJuOiBQYXR0ZXJuID0ge1xuICAgIGFuZF92OiBbeyAncjpvbGRlcic6IHsgJHZhcjogJ2xvY2tUaW1lJyB9IH0sIHsgbXVsdGlfYTogeyAkdmFyOiAncmVjbGFpbU11bHRpJyB9IH1dLFxuICB9O1xuICBjb25zdCBtYXRjaCA9IG1hdGNoZXIubWF0Y2gocmVjbGFpbU5vZGUsIHJlY2xhaW1QYXR0ZXJuKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVjbGFpbSBsZWFmIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHBhdHRlcm4nKTtcbiAgfVxuXG4gIGNvbnN0IGxvY2tUaW1lID0gYXNOdW1iZXIobWF0Y2gubG9ja1RpbWUsICdyOm9sZGVyIGFyZ3VtZW50Jyk7XG4gIGlmIChsb2NrVGltZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGByZWNsYWltIGxvY2tUaW1lIG11c3QgYmUgPiAwLCBnb3QgJHtsb2NrVGltZX1gKTtcbiAgfVxuXG4gIGNvbnN0IFt0aHJlc2hvbGQsIHJlY2xhaW1LZXlTdHJpbmdzXSA9IHBhcnNlTXVsdGkobWF0Y2gucmVjbGFpbU11bHRpKTtcbiAgaWYgKHRocmVzaG9sZCAhPT0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmVjbGFpbSBtdWx0aV9hIHRocmVzaG9sZCBtdXN0IGJlIDIsIGdvdCAke3RocmVzaG9sZH1gKTtcbiAgfVxuICBpZiAocmVjbGFpbUtleVN0cmluZ3MubGVuZ3RoICE9PSAzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGByZWNsYWltIG11bHRpX2EgbXVzdCBoYXZlIGV4YWN0bHkgMyBrZXlzLCBnb3QgJHtyZWNsYWltS2V5U3RyaW5ncy5sZW5ndGh9YCk7XG4gIH1cblxuICByZXR1cm4geyBsb2NrVGltZSwgcmVjbGFpbUtleVN0cmluZ3MgfTtcbn1cblxuY29uc3QgSEVYX1hfT05MWV9LRVkgPSAvXlswLTlhLWZBLUZdezY0fSQvO1xuY29uc3QgWFBVQl9XSVRIX0lOREVYID0gL14oWzEtOUEtSEotTlAtWmEta20tel0rKVxcLyhcXGQrKSQvO1xuXG4vKipcbiAqIFJlc29sdmUgYSBzaW5nbGUgYG11bHRpX2FgIGtleSBlbnRyeSB0byBhIDMyLWJ5dGUgeC1vbmx5IHB1YmxpYyBrZXkuXG4gKlxuICogQWNjZXB0czpcbiAqICAgLSA2NC1oZXgtY2hhciBzdHJpbmcg4oaSIHJldHVybmVkIGFzLWlzIChhbHJlYWR5IHgtb25seSlcbiAqICAgLSBgeHB1Yi4uLi88aW5kZXg+YCDihpIgQklQMzItZGVyaXZlIGF0IHRoYXQgaW5kZXggYW5kIGRyb3AgdGhlIHByZWZpeCBieXRlXG4gKlxuICogUmV0dXJucyBudWxsIGZvciBhbnkgb3RoZXIgc2hhcGUgKGUuZy4gd2lsZGNhcmQgYHhwdWIuLi4vKmAsIG1hbGZvcm1lZCBpbnB1dCkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZWNsYWltS2V5KHM6IHN0cmluZyk6IEJ1ZmZlciB8IG51bGwge1xuICBpZiAoSEVYX1hfT05MWV9LRVkudGVzdChzKSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShzLCAnaGV4Jyk7XG4gIH1cbiAgY29uc3QgbSA9IHMubWF0Y2goWFBVQl9XSVRIX0lOREVYKTtcbiAgaWYgKCFtKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgWywgeHB1YiwgaW5kZXhTdHJdID0gbTtcbiAgY29uc3QgaW5kZXggPSBOdW1iZXIucGFyc2VJbnQoaW5kZXhTdHIsIDEwKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoaW5kZXgpIHx8IGluZGV4IDwgMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGxldCBub2RlO1xuICB0cnkge1xuICAgIG5vZGUgPSBCSVAzMi5mcm9tQmFzZTU4KHhwdWIpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBCSVAzMiBwdWJsaWMga2V5IGlzIDMzIGJ5dGVzICgxIHByZWZpeCArIDMyIHgtb25seSkuIERyb3AgdGhlIHByZWZpeC5cbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKG5vZGUuZGVyaXZlKGluZGV4KS5wdWJsaWNLZXkuc3ViYXJyYXkoMSkpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgcmVjbGFpbS1sZWFmIGtleSBzdHJpbmdzIGludG8gMzItYnl0ZSB4LW9ubHkgYnVmZmVycy4gQWNjZXB0cyBib3RoXG4gKiB0aGUgZGVmaW5pdGUvZGVyaXZlZCBmb3JtIChjb25jcmV0ZSA2NC1oZXgtY2hhciB4LW9ubHkga2V5cykgYW5kIHRoZSBmb3JtXG4gKiBwcm9kdWNlZCBieSBgRGVzY3JpcHRvci5hdERlcml2YXRpb25JbmRleChuKWAgKGB4cHViLi4uLzxuPmApLiBSZXR1cm5zXG4gKiB1bmRlZmluZWQgaWYgYW55IGVudHJ5IGlzIHN0aWxsIHdpbGRjYXJkIChgeHB1Yi4uLi8qYCkgb3Igb3RoZXJ3aXNlXG4gKiB1bnJlc29sdmFibGUuXG4gKi9cbmZ1bmN0aW9uIHJlY2xhaW1LZXlzRnJvbVN0cmluZ3Moa2V5U3RyaW5nczogc3RyaW5nW10pOiBbQnVmZmVyLCBCdWZmZXIsIEJ1ZmZlcl0gfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZCA9IGtleVN0cmluZ3MubWFwKHJlc29sdmVSZWNsYWltS2V5KTtcbiAgaWYgKHJlc29sdmVkLnNvbWUoKGIpID0+IGIgPT09IG51bGwpIHx8IHJlc29sdmVkLmxlbmd0aCAhPT0gMykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIFtyZXNvbHZlZFswXSBhcyBCdWZmZXIsIHJlc29sdmVkWzFdIGFzIEJ1ZmZlciwgcmVzb2x2ZWRbMl0gYXMgQnVmZmVyXTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBzQlRDIHBlZy1pbiBkZXBvc2l0IGRlc2NyaXB0b3IgYW5kIHJldHVybiBpdHMgY29tcG9uZW50cy5cbiAqXG4gKiBSZXR1cm5zIGBudWxsYCBpZiB0aGUgZGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWRcbiAqIGB0cig8VU5TUEVOREFCTEU+LCB7PGRlcG9zaXRMZWFmPiwgPHJlY2xhaW1MZWFmPn0pYCBzaGFwZSDigJQgc2FtZSBjb252ZW50aW9uXG4gKiBhcyBiYWJ5bG9uJ3MgYHBhcnNlU3Rha2luZ0Rlc2NyaXB0b3JgLiBUaHJvd3MgaWYgdGhlIHNoYXBlIG1hdGNoZXMgYnV0IGFcbiAqIHN1Yi1maWVsZCBpcyBtYWxmb3JtZWQgKGUuZy4gc2lnbmVycyBrZXkgaXNuJ3QgMzIgYnl0ZXMsIHBheWxvYWQgaXNuJ3QgMzBcbiAqIGJ5dGVzLCB0aHJlc2hvbGQgaXNuJ3QgMikuXG4gKlxuICogQWNjZXB0cyBib3RoIHRoZSBgRGVzY3JpcHRvcmAgV0FTTSBvYmplY3QgKGRlZmluaXRlIG9yIGRlcml2YWJsZSkgYW5kIGFcbiAqIHByZS1leHRyYWN0ZWQgYGFzdC5EZXNjcmlwdG9yTm9kZWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2J0Y0RlcG9zaXREZXNjcmlwdG9yKFxuICBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yIHwgYXN0LkRlc2NyaXB0b3JOb2RlXG4pOiBQYXJzZWRTYnRjRGVwb3NpdERlc2NyaXB0b3IgfCBudWxsIHtcbiAgY29uc3QgcGF0dGVybjogUGF0dGVybiA9IHtcbiAgICB0cjogW1VOU1BFTkRBQkxFX0lOVEVSTkFMX0tFWSwgW3sgJHZhcjogJ2RlcG9zaXRMZWFmJyB9LCB7ICR2YXI6ICdyZWNsYWltTGVhZicgfV1dLFxuICB9O1xuXG4gIGNvbnN0IG1hdGNoZXIgPSBuZXcgUGF0dGVybk1hdGNoZXIoKTtcbiAgY29uc3QgZGVzY3JpcHRvck5vZGUgPSBkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGVzY3JpcHRvciA/IGFzdC5mcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKSA6IGRlc2NyaXB0b3I7XG4gIGNvbnN0IHJlc3VsdCA9IG1hdGNoZXIubWF0Y2goZGVzY3JpcHRvck5vZGUsIHBhdHRlcm4pO1xuXG4gIGlmICghcmVzdWx0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBkZXBvc2l0TWluaXNjcmlwdE5vZGUgPSByZXN1bHQuZGVwb3NpdExlYWYgYXMgYXN0Lk1pbmlzY3JpcHROb2RlO1xuICBsZXQgcmVjbGFpbU1pbmlzY3JpcHROb2RlID0gcmVzdWx0LnJlY2xhaW1MZWFmIGFzIGFzdC5NaW5pc2NyaXB0Tm9kZTtcblxuICBjb25zdCB7IHNpZ25lcnNBZ2dyZWdhdGVLZXksIG1heEZlZSwgc3RhY2tzUmVjaXBpZW50IH0gPSBwYXJzZURlcG9zaXRMZWFmKGRlcG9zaXRNaW5pc2NyaXB0Tm9kZSwgbWF0Y2hlcik7XG4gIGNvbnN0IHsgbG9ja1RpbWUsIHJlY2xhaW1LZXlTdHJpbmdzIH0gPSBwYXJzZVJlY2xhaW1MZWFmKHJlY2xhaW1NaW5pc2NyaXB0Tm9kZSwgbWF0Y2hlcik7XG4gIGNvbnN0IHJlY2xhaW1LZXlTdHJpbmdzVHVwbGU6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSA9IFtcbiAgICByZWNsYWltS2V5U3RyaW5nc1swXSxcbiAgICByZWNsYWltS2V5U3RyaW5nc1sxXSxcbiAgICByZWNsYWltS2V5U3RyaW5nc1syXSxcbiAgXTtcblxuICBjb25zdCByZWNsYWltS2V5cyA9IHJlY2xhaW1LZXlzRnJvbVN0cmluZ3MocmVjbGFpbUtleVN0cmluZ3MpO1xuICBpZiAocmVjbGFpbUtleXMpIHtcbiAgICAvLyBSZXdyaXRlIHRoZSByZWNsYWltIGxlYWYgd2l0aCBjb25jcmV0ZSBoZXgga2V5cyB3aGVuIHdlIGNhbiByZXNvbHZlXG4gICAgLy8gdGhlbSDigJQgYE1pbmlzY3JpcHQuZnJvbVN0cmluZyguLi4sICd0YXAnKWAgb25seSBhY2NlcHRzIHgtb25seSBoZXggaW5cbiAgICAvLyBgbXVsdGlfYWAsIG5vdCB4cHViLWZvcm0gc3RyaW5ncy4gV2l0aCB0aGlzIHJld3JpdGUgdGhlIGZvcm1hdHRlZFxuICAgIC8vIGxlYWYgaXMgZGlyZWN0bHkgY29tcGlsYWJsZTsgd2l0aG91dCBpdCBjYWxsZXJzIG11c3QgZG8gdGhlXG4gICAgLy8gcmVzb2x1dGlvbiB0aGVtc2VsdmVzLlxuICAgIHJlY2xhaW1NaW5pc2NyaXB0Tm9kZSA9IHtcbiAgICAgIGFuZF92OiBbeyAncjpvbGRlcic6IGxvY2tUaW1lIH0sIHsgbXVsdGlfYTogWzIsIC4uLnJlY2xhaW1LZXlzLm1hcCgoaykgPT4gay50b1N0cmluZygnaGV4JykpXSB9XSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzaWduZXJzQWdncmVnYXRlS2V5LFxuICAgIG1heEZlZSxcbiAgICBzdGFja3NSZWNpcGllbnQsXG4gICAgbG9ja1RpbWUsXG4gICAgcmVjbGFpbUtleXMsXG4gICAgcmVjbGFpbUtleVN0cmluZ3M6IHJlY2xhaW1LZXlTdHJpbmdzVHVwbGUsXG4gICAgZGVwb3NpdE1pbmlzY3JpcHROb2RlLFxuICAgIHJlY2xhaW1NaW5pc2NyaXB0Tm9kZSxcbiAgfTtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitgo-beta/utxo-descriptors",
|
|
3
|
-
"version": "0.0.1-beta.
|
|
3
|
+
"version": "0.0.1-beta.300",
|
|
4
4
|
"description": "BitGo SDK for building UTXO descriptors",
|
|
5
5
|
"main": "./dist/cjs/src/index.js",
|
|
6
6
|
"module": "./dist/esm/index.js",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"author": "BitGo SDK Team <sdkteam@bitgo.com>",
|
|
38
38
|
"license": "MIT",
|
|
39
39
|
"engines": {
|
|
40
|
-
"node": ">=
|
|
40
|
+
"node": ">=22"
|
|
41
41
|
},
|
|
42
42
|
"repository": {
|
|
43
43
|
"type": "git",
|
|
@@ -59,8 +59,11 @@
|
|
|
59
59
|
]
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@bitgo-beta/utxo-core": "1.8.1-beta.
|
|
63
|
-
"@bitgo/wasm-utxo": "^
|
|
62
|
+
"@bitgo-beta/utxo-core": "1.8.1-beta.1167",
|
|
63
|
+
"@bitgo/wasm-utxo": "^5.3.0"
|
|
64
64
|
},
|
|
65
|
-
"
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@stacks/bitcoin-staking": "7.6.0"
|
|
67
|
+
},
|
|
68
|
+
"gitHead": "aa87cf8aeeb60435e7a423a6761ebede610f286c"
|
|
66
69
|
}
|