@bitgo-beta/utxo-descriptors 0.0.1-beta.31 → 0.0.1-beta.310

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/cjs/src/index.d.ts +1 -0
  2. package/dist/cjs/src/index.d.ts.map +1 -1
  3. package/dist/cjs/src/index.js +3 -2
  4. package/dist/cjs/src/pox5/descriptor.d.ts +22 -0
  5. package/dist/cjs/src/pox5/descriptor.d.ts.map +1 -0
  6. package/dist/cjs/src/pox5/descriptor.js +79 -0
  7. package/dist/cjs/src/pox5/index.d.ts +5 -0
  8. package/dist/cjs/src/pox5/index.d.ts.map +1 -0
  9. package/dist/cjs/src/pox5/index.js +21 -0
  10. package/dist/cjs/src/pox5/input.d.ts +28 -0
  11. package/dist/cjs/src/pox5/input.d.ts.map +1 -0
  12. package/dist/cjs/src/pox5/input.js +47 -0
  13. package/dist/cjs/src/pox5/parseDescriptor.d.ts +18 -0
  14. package/dist/cjs/src/pox5/parseDescriptor.d.ts.map +1 -0
  15. package/dist/cjs/src/pox5/parseDescriptor.js +95 -0
  16. package/dist/cjs/src/pox5/validation.d.ts +12 -0
  17. package/dist/cjs/src/pox5/validation.d.ts.map +1 -0
  18. package/dist/cjs/src/pox5/validation.js +70 -0
  19. package/dist/cjs/src/sbtc/parseDescriptor.d.ts +8 -0
  20. package/dist/cjs/src/sbtc/parseDescriptor.d.ts.map +1 -1
  21. package/dist/cjs/src/sbtc/parseDescriptor.js +7 -1
  22. package/dist/cjs/test/unit/pox5/descriptor.d.ts +2 -0
  23. package/dist/cjs/test/unit/pox5/descriptor.d.ts.map +1 -0
  24. package/dist/cjs/test/unit/pox5/descriptor.js +157 -0
  25. package/dist/cjs/test/unit/pox5/input.d.ts +2 -0
  26. package/dist/cjs/test/unit/pox5/input.d.ts.map +1 -0
  27. package/dist/cjs/test/unit/pox5/input.js +113 -0
  28. package/dist/cjs/test/unit/pox5/validation.d.ts +2 -0
  29. package/dist/cjs/test/unit/pox5/validation.d.ts.map +1 -0
  30. package/dist/cjs/test/unit/pox5/validation.js +99 -0
  31. package/dist/cjs/test/unit/sbtc/parseDescriptor.js +14 -1
  32. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  33. package/dist/esm/index.d.ts +1 -0
  34. package/dist/esm/index.d.ts.map +1 -1
  35. package/dist/esm/index.js +2 -1
  36. package/dist/esm/pox5/descriptor.d.ts +22 -0
  37. package/dist/esm/pox5/descriptor.d.ts.map +1 -0
  38. package/dist/esm/pox5/descriptor.js +74 -0
  39. package/dist/esm/pox5/index.d.ts +5 -0
  40. package/dist/esm/pox5/index.d.ts.map +1 -0
  41. package/dist/esm/pox5/index.js +5 -0
  42. package/dist/esm/pox5/input.d.ts +28 -0
  43. package/dist/esm/pox5/input.d.ts.map +1 -0
  44. package/dist/esm/pox5/input.js +43 -0
  45. package/dist/esm/pox5/parseDescriptor.d.ts +18 -0
  46. package/dist/esm/pox5/parseDescriptor.d.ts.map +1 -0
  47. package/dist/esm/pox5/parseDescriptor.js +92 -0
  48. package/dist/esm/pox5/validation.d.ts +12 -0
  49. package/dist/esm/pox5/validation.d.ts.map +1 -0
  50. package/dist/esm/pox5/validation.js +65 -0
  51. package/dist/esm/sbtc/parseDescriptor.d.ts +8 -0
  52. package/dist/esm/sbtc/parseDescriptor.d.ts.map +1 -1
  53. package/dist/esm/sbtc/parseDescriptor.js +7 -1
  54. package/package.json +8 -5
@@ -1,2 +1,3 @@
1
1
  export * as sbtc from './sbtc';
2
+ export * as pox5 from './pox5';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC"}
package/dist/esm/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export * as sbtc from './sbtc';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBhcyBzYnRjIGZyb20gJy4vc2J0Yyc7XG4iXX0=
2
+ export * as pox5 from './pox5';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxLQUFLLElBQUksTUFBTSxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBhcyBzYnRjIGZyb20gJy4vc2J0Yyc7XG5leHBvcnQgKiBhcyBwb3g1IGZyb20gJy4vcG94NSc7XG4iXX0=
@@ -0,0 +1,22 @@
1
+ import { bip32, Descriptor } from '@bitgo/wasm-utxo';
2
+ type BIP32Interface = bip32.BIP32Interface;
3
+ export type Pox5StakerKey = BIP32Interface | Buffer;
4
+ export type Pox5LockupDescriptorParams = {
5
+ unlockHeight: number;
6
+ /** sha256(sha256(Clarity consensus principal bytes)). */
7
+ stakerCommitment: Buffer;
8
+ earlyExitKey: Buffer;
9
+ /** User, backup, and BitGo keys, all BIP32 or all concrete compressed keys. */
10
+ stakerKeys: [Pox5StakerKey, Pox5StakerKey, Pox5StakerKey];
11
+ };
12
+ /**
13
+ * Build the canonical PoX-5 P2WSH descriptor. The post-CLTV and early-exit
14
+ * paths share BitGo's standard 2-of-3 compressed-key multisig tail.
15
+ */
16
+ export declare function createPox5LockupDescriptor(params: Pox5LockupDescriptorParams): Descriptor;
17
+ /** Compile the PoX-5 P2WSH scriptPubKey at a BIP32 derivation index. */
18
+ export declare function createPox5LockupScriptPubKey(params: Pox5LockupDescriptorParams, derivationIndex?: number): Buffer;
19
+ /** Derive the compressed staker keys needed to prepare a witness at an index. */
20
+ export declare function derivePox5StakerKeys(stakerKeys: [BIP32Interface, BIP32Interface, BIP32Interface], index: number): [Buffer, Buffer, Buffer];
21
+ export {};
22
+ //# sourceMappingURL=descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../../src/pox5/descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE1D,KAAK,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;AAE3C,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,MAAM,CAAC;AAEpD,MAAM,MAAM,0BAA0B,GAAG;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,UAAU,EAAE,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;CAC3D,CAAC;AA0CF;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,0BAA0B,GAAG,UAAU,CAqBzF;AAED,wEAAwE;AACxE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,0BAA0B,EAAE,eAAe,SAAI,GAAG,MAAM,CAM5G;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC,EAC5D,KAAK,EAAE,MAAM,GACZ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAG1B"}
@@ -0,0 +1,74 @@
1
+ import { ast, Descriptor } from '@bitgo/wasm-utxo';
2
+ function validateCompressedKey(key, field) {
3
+ if (key.length !== 33 || (key[0] !== 0x02 && key[0] !== 0x03)) {
4
+ throw new Error(`${field} must be a 33-byte compressed public key`);
5
+ }
6
+ }
7
+ function isBip32Triple(keys) {
8
+ return keys.every((key) => !Buffer.isBuffer(key));
9
+ }
10
+ function asDescriptorKey(key, field) {
11
+ if (Buffer.isBuffer(key)) {
12
+ validateCompressedKey(key, field);
13
+ return key.toString('hex');
14
+ }
15
+ return key.neutered().toBase58() + '/*';
16
+ }
17
+ function validateParams(params) {
18
+ if (!Number.isSafeInteger(params.unlockHeight) || params.unlockHeight <= 0 || params.unlockHeight >= 500000000) {
19
+ throw new Error(`unlockHeight (${params.unlockHeight}) must be a positive block height below 500000000`);
20
+ }
21
+ if (params.stakerCommitment.length !== 32) {
22
+ throw new Error(`stakerCommitment must be 32 bytes (got ${params.stakerCommitment.length})`);
23
+ }
24
+ validateCompressedKey(params.earlyExitKey, 'earlyExitKey');
25
+ const bufferCount = params.stakerKeys.filter(Buffer.isBuffer).length;
26
+ if (bufferCount !== 0 && bufferCount !== params.stakerKeys.length) {
27
+ throw new Error('stakerKeys must contain either three BIP32 keys or three compressed public keys');
28
+ }
29
+ params.stakerKeys.forEach((key, index) => {
30
+ if (Buffer.isBuffer(key)) {
31
+ validateCompressedKey(key, `stakerKeys[${index}]`);
32
+ }
33
+ });
34
+ }
35
+ /**
36
+ * Build the canonical PoX-5 P2WSH descriptor. The post-CLTV and early-exit
37
+ * paths share BitGo's standard 2-of-3 compressed-key multisig tail.
38
+ */
39
+ export function createPox5LockupDescriptor(params) {
40
+ validateParams(params);
41
+ const stakerKeys = params.stakerKeys.map((key, index) => asDescriptorKey(key, `stakerKeys[${index}]`));
42
+ const miniscript = {
43
+ and_v: [
44
+ {
45
+ 'v:or_i': [
46
+ { after: params.unlockHeight },
47
+ {
48
+ and_v: [
49
+ { 'v:sha256': params.stakerCommitment.toString('hex') },
50
+ { pk: params.earlyExitKey.toString('hex') },
51
+ ],
52
+ },
53
+ ],
54
+ },
55
+ { multi: [2, ...stakerKeys] },
56
+ ],
57
+ };
58
+ const descriptorString = ast.formatNode({ wsh: miniscript });
59
+ return Descriptor.fromString(descriptorString, isBip32Triple(params.stakerKeys) ? 'derivable' : 'definite');
60
+ }
61
+ /** Compile the PoX-5 P2WSH scriptPubKey at a BIP32 derivation index. */
62
+ export function createPox5LockupScriptPubKey(params, derivationIndex = 0) {
63
+ const descriptor = createPox5LockupDescriptor(params);
64
+ if (isBip32Triple(params.stakerKeys)) {
65
+ return Buffer.from(descriptor.atDerivationIndex(derivationIndex).scriptPubkey());
66
+ }
67
+ return Buffer.from(descriptor.scriptPubkey());
68
+ }
69
+ /** Derive the compressed staker keys needed to prepare a witness at an index. */
70
+ export function derivePox5StakerKeys(stakerKeys, index) {
71
+ const keys = stakerKeys.map((key) => Buffer.from(key.derive(index).publicKey));
72
+ return [keys[0], keys[1], keys[2]];
73
+ }
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wb3g1L2Rlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBUyxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQWUxRCxTQUFTLHFCQUFxQixDQUFDLEdBQVcsRUFBRSxLQUFhO0lBQ3ZELElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzlELE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLDBDQUEwQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FDcEIsSUFBOEM7SUFFOUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsR0FBa0IsRUFBRSxLQUFhO0lBQ3hELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3pCLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsQyxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMxQyxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsTUFBa0M7SUFDeEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLE1BQU0s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RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7QUFDaEQsQ0FBQztBQUVELGlGQUFpRjtBQUNqRixNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLFVBQTRELEVBQzVELEtBQWE7SUFFYixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUMvRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXN0LCBiaXAzMiwgRGVzY3JpcHRvciB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG50eXBlIEJJUDMySW50ZXJmYWNlID0gYmlwMzIuQklQMzJJbnRlcmZhY2U7XG5cbmV4cG9ydCB0eXBlIFBveDVTdGFrZXJLZXkgPSBCSVAzMkludGVyZmFjZSB8IEJ1ZmZlcjtcblxuZXhwb3J0IHR5cGUgUG94NUxvY2t1cERlc2NyaXB0b3JQYXJhbXMgPSB7XG4gIHVubG9ja0hlaWdodDogbnVtYmVyO1xuICAvKiogc2hhMjU2KHNoYTI1NihDbGFyaXR5IGNvbnNlbnN1cyBwcmluY2lwYWwgYnl0ZXMpKS4gKi9cbiAgc3Rha2VyQ29tbWl0bWVudDogQnVmZmVyO1xuICBlYXJseUV4aXRLZXk6IEJ1ZmZlcjtcbiAgLyoqIFVzZXIsIGJhY2t1cCwgYW5kIEJpdEdvIGtleXMsIGFsbCBCSVAzMiBvciBhbGwgY29uY3JldGUgY29tcHJlc3NlZCBrZXlzLiAqL1xuICBzdGFrZXJLZXlzOiBbUG94NVN0YWtlcktleSwgUG94NVN0YWtlcktleSwgUG94NVN0YWtlcktleV07XG59O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZUNvbXByZXNzZWRLZXkoa2V5OiBCdWZmZXIsIGZpZWxkOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGtleS5sZW5ndGggIT09IDMzIHx8IChrZXlbMF0gIT09IDB4MDIgJiYga2V5WzBdICE9PSAweDAzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZH0gbXVzdCBiZSBhIDMzLWJ5dGUgY29tcHJlc3NlZCBwdWJsaWMga2V5YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNCaXAzMlRyaXBsZShcbiAga2V5czogUG94NUxvY2t1cERlc2NyaXB0b3JQYXJhbXNbJ3N0YWtlcktleXMnXVxuKToga2V5cyBpcyBbQklQMzJJbnRlcmZhY2UsIEJJUDMySW50ZXJmYWNlLCBCSVAzMkludGVyZmFjZV0ge1xuICByZXR1cm4ga2V5cy5ldmVyeSgoa2V5KSA9PiAhQnVmZmVyLmlzQnVmZmVyKGtleSkpO1xufVxuXG5mdW5jdGlvbiBhc0Rlc2NyaXB0b3JLZXkoa2V5OiBQb3g1U3Rha2VyS2V5LCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihrZXkpKSB7XG4gICAgdmFsaWRhdGVDb21wcmVzc2VkS2V5KGtleSwgZmllbGQpO1xuICAgIHJldHVybiBrZXkudG9TdHJpbmcoJ2hleCcpO1xuICB9XG4gIHJldHVybiBrZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpICsgJy8qJztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQYXJhbXMocGFyYW1zOiBQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtcyk6IHZvaWQge1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHBhcmFtcy51bmxvY2tIZWlnaHQpIHx8IHBhcmFtcy51bmxvY2tIZWlnaHQgPD0gMCB8fCBwYXJhbXMudW5sb2NrSGVpZ2h0ID49IDUwMF8wMDBfMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bmxvY2tIZWlnaHQgKCR7cGFyYW1zLnVubG9ja0hlaWdodH0pIG11c3QgYmUgYSBwb3NpdGl2ZSBibG9jayBoZWlnaHQgYmVsb3cgNTAwMDAwMDAwYCk7XG4gIH1cbiAgaWYgKHBhcmFtcy5zdGFrZXJDb21taXRtZW50Lmxlbmd0aCAhPT0gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHN0YWtlckNvbW1pdG1lbnQgbXVzdCBiZSAzMiBieXRlcyAoZ290ICR7cGFyYW1zLnN0YWtlckNvbW1pdG1lbnQubGVuZ3RofSlgKTtcbiAgfVxuICB2YWxpZGF0ZUNvbXByZXNzZWRLZXkocGFyYW1zLmVhcmx5RXhpdEtleSwgJ2Vhcmx5RXhpdEtleScpO1xuXG4gIGNvbnN0IGJ1ZmZlckNvdW50ID0gcGFyYW1zLnN0YWtlcktleXMuZmlsdGVyKEJ1ZmZlci5pc0J1ZmZlcikubGVuZ3RoO1xuICBpZiAoYnVmZmVyQ291bnQgIT09IDAgJiYgYnVmZmVyQ291bnQgIT09IHBhcmFtcy5zdGFrZXJLZXlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc3Rha2VyS2V5cyBtdXN0IGNvbnRhaW4gZWl0aGVyIHRocmVlIEJJUDMyIGtleXMgb3IgdGhyZWUgY29tcHJlc3NlZCBwdWJsaWMga2V5cycpO1xuICB9XG4gIHBhcmFtcy5zdGFrZXJLZXlzLmZvckVhY2goKGtleSwgaW5kZXgpID0+IHtcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGtleSkpIHtcbiAgICAgIHZhbGlkYXRlQ29tcHJlc3NlZEtleShrZXksIGBzdGFrZXJLZXlzWyR7aW5kZXh9XWApO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGNhbm9uaWNhbCBQb1gtNSBQMldTSCBkZXNjcmlwdG9yLiBUaGUgcG9zdC1DTFRWIGFuZCBlYXJseS1leGl0XG4gKiBwYXRocyBzaGFyZSBCaXRHbydzIHN0YW5kYXJkIDItb2YtMyBjb21wcmVzc2VkLWtleSBtdWx0aXNpZyB0YWlsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUG94NUxvY2t1cERlc2NyaXB0b3IocGFyYW1zOiBQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtcyk6IERlc2NyaXB0b3Ige1xuICB2YWxpZGF0ZVBhcmFtcyhwYXJhbXMpO1xuICBjb25zdCBzdGFrZXJLZXlzID0gcGFyYW1zLnN0YWtlcktleXMubWFwKChrZXksIGluZGV4KSA9PiBhc0Rlc2NyaXB0b3JLZXkoa2V5LCBgc3Rha2VyS2V5c1ske2luZGV4fV1gKSk7XG4gIGNvbnN0IG1pbmlzY3JpcHQ6IGFzdC5NaW5pc2NyaXB0Tm9kZSA9IHtcbiAgICBhbmRfdjogW1xuICAgICAge1xuICAgICAgICAndjpvcl9pJzogW1xuICAgICAgICAgIHsgYWZ0ZXI6IHBhcmFtcy51bmxvY2tIZWlnaHQgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhbmRfdjogW1xuICAgICAgICAgICAgICB7ICd2OnNoYTI1Nic6IHBhcmFtcy5zdGFrZXJDb21taXRtZW50LnRvU3RyaW5nKCdoZXgnKSB9LFxuICAgICAgICAgICAgICB7IHBrOiBwYXJhbXMuZWFybHlFeGl0S2V5LnRvU3RyaW5nKCdoZXgnKSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHsgbXVsdGk6IFsyLCAuLi5zdGFrZXJLZXlzXSB9LFxuICAgIF0sXG4gIH07XG4gIGNvbnN0IGRlc2NyaXB0b3JTdHJpbmcgPSBhc3QuZm9ybWF0Tm9kZSh7IHdzaDogbWluaXNjcmlwdCB9KTtcbiAgcmV0dXJuIERlc2NyaXB0b3IuZnJvbVN0cmluZyhkZXNjcmlwdG9yU3RyaW5nLCBpc0JpcDMyVHJpcGxlKHBhcmFtcy5zdGFrZXJLZXlzKSA/ICdkZXJpdmFibGUnIDogJ2RlZmluaXRlJyk7XG59XG5cbi8qKiBDb21waWxlIHRoZSBQb1gtNSBQMldTSCBzY3JpcHRQdWJLZXkgYXQgYSBCSVAzMiBkZXJpdmF0aW9uIGluZGV4LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBveDVMb2NrdXBTY3JpcHRQdWJLZXkocGFyYW1zOiBQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtcywgZGVyaXZhdGlvbkluZGV4ID0gMCk6IEJ1ZmZlciB7XG4gIGNvbnN0IGRlc2NyaXB0b3IgPSBjcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcihwYXJhbXMpO1xuICBpZiAoaXNCaXAzMlRyaXBsZShwYXJhbXMuc3Rha2VyS2V5cykpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oZGVzY3JpcHRvci5hdERlcml2YXRpb25JbmRleChkZXJpdmF0aW9uSW5kZXgpLnNjcmlwdFB1YmtleSgpKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmZyb20oZGVzY3JpcHRvci5zY3JpcHRQdWJrZXkoKSk7XG59XG5cbi8qKiBEZXJpdmUgdGhlIGNvbXByZXNzZWQgc3Rha2VyIGtleXMgbmVlZGVkIHRvIHByZXBhcmUgYSB3aXRuZXNzIGF0IGFuIGluZGV4LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZVBveDVTdGFrZXJLZXlzKFxuICBzdGFrZXJLZXlzOiBbQklQMzJJbnRlcmZhY2UsIEJJUDMySW50ZXJmYWNlLCBCSVAzMkludGVyZmFjZV0sXG4gIGluZGV4OiBudW1iZXJcbik6IFtCdWZmZXIsIEJ1ZmZlciwgQnVmZmVyXSB7XG4gIGNvbnN0IGtleXMgPSBzdGFrZXJLZXlzLm1hcCgoa2V5KSA9PiBCdWZmZXIuZnJvbShrZXkuZGVyaXZlKGluZGV4KS5wdWJsaWNLZXkpKTtcbiAgcmV0dXJuIFtrZXlzWzBdLCBrZXlzWzFdLCBrZXlzWzJdXTtcbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ export * from './descriptor';
2
+ export * from './parseDescriptor';
3
+ export * from './input';
4
+ export * from './validation';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pox5/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './descriptor';
2
+ export * from './parseDescriptor';
3
+ export * from './input';
4
+ export * from './validation';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcG94NS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9kZXNjcmlwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vcGFyc2VEZXNjcmlwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vaW5wdXQnO1xuZXhwb3J0ICogZnJvbSAnLi92YWxpZGF0aW9uJztcbiJdfQ==
@@ -0,0 +1,28 @@
1
+ import { Descriptor, Psbt, descriptorWallet } from '@bitgo/wasm-utxo';
2
+ import { Pox5DescriptorInfo } from './parseDescriptor';
3
+ type ResolvedPox5DescriptorInfo = Pox5DescriptorInfo & {
4
+ stakerKeys: [Buffer, Buffer, Buffer];
5
+ };
6
+ export type Pox5DescriptorMatch = {
7
+ /** The concrete descriptor whose script matches the input. */
8
+ descriptor: Descriptor;
9
+ /** The derivation index used for a wildcard descriptor, if any. */
10
+ index: number | undefined;
11
+ info: ResolvedPox5DescriptorInfo;
12
+ };
13
+ /** A canonical PoX-5 descriptor match bound to a native PSBT input. */
14
+ export type Pox5InputMatch = Pox5DescriptorMatch & {
15
+ inputIndex: number;
16
+ };
17
+ /**
18
+ * Find and parse a canonical PoX-5 descriptor for a native PSBT input projection.
19
+ *
20
+ * Foreign root derivations are ignored by the shared native descriptor matcher. A
21
+ * match is returned only when all three staker keys can be resolved at the matched
22
+ * descriptor index.
23
+ */
24
+ export declare function findPox5DescriptorForInput(input: descriptorWallet.PsbtInput, descriptors: descriptorWallet.DescriptorMap): Pox5DescriptorMatch | undefined;
25
+ /** Find and parse a canonical PoX-5 descriptor for one native PSBT input. */
26
+ export declare function matchPox5Input(psbt: Psbt, inputIndex: number, descriptors: descriptorWallet.DescriptorMap): Pox5InputMatch | undefined;
27
+ export {};
28
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/pox5/input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEtE,OAAO,EAAE,kBAAkB,EAA6B,MAAM,mBAAmB,CAAC;AAElF,KAAK,0BAA0B,GAAG,kBAAkB,GAAG;IACrD,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,8DAA8D;IAC9D,UAAU,EAAE,UAAU,CAAC;IACvB,mEAAmE;IACnE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,EAAE,0BAA0B,CAAC;CAClC,CAAC;AAEF,uEAAuE;AACvE,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG;IACjD,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAMF;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,gBAAgB,CAAC,SAAS,EACjC,WAAW,EAAE,gBAAgB,CAAC,aAAa,GAC1C,mBAAmB,GAAG,SAAS,CAsBjC;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAC5B,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,gBAAgB,CAAC,aAAa,GAC1C,cAAc,GAAG,SAAS,CAI5B"}
@@ -0,0 +1,43 @@
1
+ import { descriptorWallet } from '@bitgo/wasm-utxo';
2
+ import { parsePox5LockupDescriptor } from './parseDescriptor';
3
+ function getConcreteDescriptor(descriptor, index) {
4
+ return index === undefined ? descriptor : descriptor.atDerivationIndex(index);
5
+ }
6
+ /**
7
+ * Find and parse a canonical PoX-5 descriptor for a native PSBT input projection.
8
+ *
9
+ * Foreign root derivations are ignored by the shared native descriptor matcher. A
10
+ * match is returned only when all three staker keys can be resolved at the matched
11
+ * descriptor index.
12
+ */
13
+ export function findPox5DescriptorForInput(input, descriptors) {
14
+ try {
15
+ const matched = descriptorWallet.findDescriptorForInput(input, descriptors);
16
+ if (!matched) {
17
+ return undefined;
18
+ }
19
+ const descriptor = getConcreteDescriptor(matched.descriptor, matched.index);
20
+ const info = parsePox5LockupDescriptor(descriptor);
21
+ if (!info?.stakerKeys) {
22
+ return undefined;
23
+ }
24
+ return {
25
+ descriptor,
26
+ index: matched.index,
27
+ info: {
28
+ ...info,
29
+ stakerKeys: info.stakerKeys,
30
+ },
31
+ };
32
+ }
33
+ catch {
34
+ return undefined;
35
+ }
36
+ }
37
+ /** Find and parse a canonical PoX-5 descriptor for one native PSBT input. */
38
+ export function matchPox5Input(psbt, inputIndex, descriptors) {
39
+ const input = psbt.getInputs()[inputIndex];
40
+ const match = input ? findPox5DescriptorForInput(input, descriptors) : undefined;
41
+ return match ? { ...match, inputIndex } : undefined;
42
+ }
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcG94NS9pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9CLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdEUsT0FBTyxFQUFzQix5QkFBeUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBbUJsRixTQUFTLHFCQUFxQixDQUFDLFVBQXNCLEVBQUUsS0FBeUI7SUFDOUUsT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoRixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUN4QyxLQUFpQyxFQUNqQyxXQUEyQztJQUUzQyxJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVFLE1BQU0sSUFBSSxHQUFHLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUM7WUFDdEIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE9BQU87WUFDTCxVQUFVO1lBQ1YsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3BCLElBQUksRUFBRTtnQkFDSixHQUFHLElBQUk7Z0JBQ1AsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2FBQzVCO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUVELDZFQUE2RTtBQUM3RSxNQUFNLFVBQVUsY0FBYyxDQUM1QixJQUFVLEVBQ1YsVUFBa0IsRUFDbEIsV0FBMkM7SUFFM0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDakYsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN0RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzY3JpcHRvciwgUHNidCwgZGVzY3JpcHRvcldhbGxldCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG5pbXBvcnQgeyBQb3g1RGVzY3JpcHRvckluZm8sIHBhcnNlUG94NUxvY2t1cERlc2NyaXB0b3IgfSBmcm9tICcuL3BhcnNlRGVzY3JpcHRvcic7XG5cbnR5cGUgUmVzb2x2ZWRQb3g1RGVzY3JpcHRvckluZm8gPSBQb3g1RGVzY3JpcHRvckluZm8gJiB7XG4gIHN0YWtlcktleXM6IFtCdWZmZXIsIEJ1ZmZlciwgQnVmZmVyXTtcbn07XG5cbmV4cG9ydCB0eXBlIFBveDVEZXNjcmlwdG9yTWF0Y2ggPSB7XG4gIC8qKiBUaGUgY29uY3JldGUgZGVzY3JpcHRvciB3aG9zZSBzY3JpcHQgbWF0Y2hlcyB0aGUgaW5wdXQuICovXG4gIGRlc2NyaXB0b3I6IERlc2NyaXB0b3I7XG4gIC8qKiBUaGUgZGVyaXZhdGlvbiBpbmRleCB1c2VkIGZvciBhIHdpbGRjYXJkIGRlc2NyaXB0b3IsIGlmIGFueS4gKi9cbiAgaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgaW5mbzogUmVzb2x2ZWRQb3g1RGVzY3JpcHRvckluZm87XG59O1xuXG4vKiogQSBjYW5vbmljYWwgUG9YLTUgZGVzY3JpcHRvciBtYXRjaCBib3VuZCB0byBhIG5hdGl2ZSBQU0JUIGlucHV0LiAqL1xuZXhwb3J0IHR5cGUgUG94NUlucHV0TWF0Y2ggPSBQb3g1RGVzY3JpcHRvck1hdGNoICYge1xuICBpbnB1dEluZGV4OiBudW1iZXI7XG59O1xuXG5mdW5jdGlvbiBnZXRDb25jcmV0ZURlc2NyaXB0b3IoZGVzY3JpcHRvcjogRGVzY3JpcHRvciwgaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCk6IERlc2NyaXB0b3Ige1xuICByZXR1cm4gaW5kZXggPT09IHVuZGVmaW5lZCA/IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9yLmF0RGVyaXZhdGlvbkluZGV4KGluZGV4KTtcbn1cblxuLyoqXG4gKiBGaW5kIGFuZCBwYXJzZSBhIGNhbm9uaWNhbCBQb1gtNSBkZXNjcmlwdG9yIGZvciBhIG5hdGl2ZSBQU0JUIGlucHV0IHByb2plY3Rpb24uXG4gKlxuICogRm9yZWlnbiByb290IGRlcml2YXRpb25zIGFyZSBpZ25vcmVkIGJ5IHRoZSBzaGFyZWQgbmF0aXZlIGRlc2NyaXB0b3IgbWF0Y2hlci4gQVxuICogbWF0Y2ggaXMgcmV0dXJuZWQgb25seSB3aGVuIGFsbCB0aHJlZSBzdGFrZXIga2V5cyBjYW4gYmUgcmVzb2x2ZWQgYXQgdGhlIG1hdGNoZWRcbiAqIGRlc2NyaXB0b3IgaW5kZXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUG94NURlc2NyaXB0b3JGb3JJbnB1dChcbiAgaW5wdXQ6IGRlc2NyaXB0b3JXYWxsZXQuUHNidElucHV0LFxuICBkZXNjcmlwdG9yczogZGVzY3JpcHRvcldhbGxldC5EZXNjcmlwdG9yTWFwXG4pOiBQb3g1RGVzY3JpcHRvck1hdGNoIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtYXRjaGVkID0gZGVzY3JpcHRvcldhbGxldC5maW5kRGVzY3JpcHRvckZvcklucHV0KGlucHV0LCBkZXNjcmlwdG9ycyk7XG4gICAgaWYgKCFtYXRjaGVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBkZXNjcmlwdG9yID0gZ2V0Q29uY3JldGVEZXNjcmlwdG9yKG1hdGNoZWQuZGVzY3JpcHRvciwgbWF0Y2hlZC5pbmRleCk7XG4gICAgY29uc3QgaW5mbyA9IHBhcnNlUG94NUxvY2t1cERlc2NyaXB0b3IoZGVzY3JpcHRvcik7XG4gICAgaWYgKCFpbmZvPy5zdGFrZXJLZXlzKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZGVzY3JpcHRvcixcbiAgICAgIGluZGV4OiBtYXRjaGVkLmluZGV4LFxuICAgICAgaW5mbzoge1xuICAgICAgICAuLi5pbmZvLFxuICAgICAgICBzdGFrZXJLZXlzOiBpbmZvLnN0YWtlcktleXMsXG4gICAgICB9LFxuICAgIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqIEZpbmQgYW5kIHBhcnNlIGEgY2Fub25pY2FsIFBvWC01IGRlc2NyaXB0b3IgZm9yIG9uZSBuYXRpdmUgUFNCVCBpbnB1dC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaFBveDVJbnB1dChcbiAgcHNidDogUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyLFxuICBkZXNjcmlwdG9yczogZGVzY3JpcHRvcldhbGxldC5EZXNjcmlwdG9yTWFwXG4pOiBQb3g1SW5wdXRNYXRjaCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGlucHV0ID0gcHNidC5nZXRJbnB1dHMoKVtpbnB1dEluZGV4XTtcbiAgY29uc3QgbWF0Y2ggPSBpbnB1dCA/IGZpbmRQb3g1RGVzY3JpcHRvckZvcklucHV0KGlucHV0LCBkZXNjcmlwdG9ycykgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBtYXRjaCA/IHsgLi4ubWF0Y2gsIGlucHV0SW5kZXggfSA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
@@ -0,0 +1,18 @@
1
+ import { Descriptor, ast } from '@bitgo/wasm-utxo';
2
+ export type Pox5DescriptorInfo = {
3
+ unlockHeight: number;
4
+ stakerCommitment: Buffer;
5
+ earlyExitKey: Buffer;
6
+ stakerKeyStrings: [string, string, string];
7
+ stakerKeys: [Buffer, Buffer, Buffer] | undefined;
8
+ miniscriptNode: ast.MiniscriptNode;
9
+ };
10
+ /** @deprecated Use Pox5DescriptorInfo instead. */
11
+ export type ParsedPox5LockupDescriptor = Pox5DescriptorInfo;
12
+ /**
13
+ * Parse only the canonical PoX-5 descriptor template. Other descriptors return
14
+ * undefined; malformed fields within the template throw so callers cannot finalize
15
+ * a script under an ambiguous policy.
16
+ */
17
+ export declare function parsePox5LockupDescriptor(descriptor: Descriptor | ast.DescriptorNode): Pox5DescriptorInfo | undefined;
18
+ //# sourceMappingURL=parseDescriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseDescriptor.d.ts","sourceRoot":"","sources":["../../../src/pox5/parseDescriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,UAAU,EAAE,GAAG,EAAoB,MAAM,kBAAkB,CAAC;AAI5E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACjD,cAAc,EAAE,GAAG,CAAC,cAAc,CAAC;CACpC,CAAC;AAEF,kDAAkD;AAClD,MAAM,MAAM,0BAA0B,GAAG,kBAAkB,CAAC;AA2C5D;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,UAAU,GAAG,GAAG,CAAC,cAAc,GAAG,kBAAkB,GAAG,SAAS,CAmDrH"}
@@ -0,0 +1,92 @@
1
+ import { BIP32, Descriptor, ast, descriptorWallet } from '@bitgo/wasm-utxo';
2
+ const COMPRESSED_KEY = /^(02|03)[0-9a-fA-F]{64}$/;
3
+ const XPUB_WITH_INDEX = /^([1-9A-HJ-NP-Za-km-z]+)\/(\d+)$/;
4
+ function asNumber(value, field) {
5
+ if (typeof value !== 'number') {
6
+ throw new Error(`${field} must be a number`);
7
+ }
8
+ return value;
9
+ }
10
+ function asString(value, field) {
11
+ if (typeof value !== 'string') {
12
+ throw new Error(`${field} must be a string`);
13
+ }
14
+ return value;
15
+ }
16
+ function parseCompressedKey(value, field) {
17
+ if (!COMPRESSED_KEY.test(value)) {
18
+ throw new Error(`${field} must be a compressed public key`);
19
+ }
20
+ return Buffer.from(value, 'hex');
21
+ }
22
+ function resolveStakerKey(value) {
23
+ if (COMPRESSED_KEY.test(value)) {
24
+ return Buffer.from(value, 'hex');
25
+ }
26
+ const match = value.match(XPUB_WITH_INDEX);
27
+ if (!match) {
28
+ return undefined;
29
+ }
30
+ const [, xpub, indexString] = match;
31
+ const index = Number.parseInt(indexString, 10);
32
+ try {
33
+ return Buffer.from(BIP32.fromBase58(xpub).derive(index).publicKey);
34
+ }
35
+ catch {
36
+ return undefined;
37
+ }
38
+ }
39
+ /**
40
+ * Parse only the canonical PoX-5 descriptor template. Other descriptors return
41
+ * undefined; malformed fields within the template throw so callers cannot finalize
42
+ * a script under an ambiguous policy.
43
+ */
44
+ export function parsePox5LockupDescriptor(descriptor) {
45
+ const matcher = new descriptorWallet.PatternMatcher();
46
+ const descriptorNode = descriptor instanceof Descriptor ? ast.fromDescriptor(descriptor) : descriptor;
47
+ const matched = matcher.match(descriptorNode, { wsh: { $var: 'miniscript' } });
48
+ if (!matched) {
49
+ return undefined;
50
+ }
51
+ const miniscriptNode = matched.miniscript;
52
+ const pattern = {
53
+ and_v: [
54
+ {
55
+ 'v:or_i': [
56
+ { after: { $var: 'unlockHeight' } },
57
+ { and_v: [{ 'v:sha256': { $var: 'stakerCommitment' } }, { pk: { $var: 'earlyExitKey' } }] },
58
+ ],
59
+ },
60
+ { multi: { $var: 'stakerMulti' } },
61
+ ],
62
+ };
63
+ const fields = matcher.match(miniscriptNode, pattern);
64
+ if (!fields) {
65
+ return undefined;
66
+ }
67
+ const unlockHeight = asNumber(fields.unlockHeight, 'after argument');
68
+ if (!Number.isSafeInteger(unlockHeight) || unlockHeight <= 0 || unlockHeight >= 500000000) {
69
+ throw new Error(`unlockHeight (${unlockHeight}) must be a positive block height below 500000000`);
70
+ }
71
+ const commitmentHex = asString(fields.stakerCommitment, 'sha256 commitment');
72
+ if (!/^[0-9a-fA-F]{64}$/.test(commitmentHex)) {
73
+ throw new Error('stakerCommitment must be 32 bytes');
74
+ }
75
+ const earlyExitKey = parseCompressedKey(asString(fields.earlyExitKey, 'early exit key'), 'earlyExitKey');
76
+ if (!Array.isArray(fields.stakerMulti) || fields.stakerMulti.length !== 4 || fields.stakerMulti[0] !== 2) {
77
+ throw new Error('staker multi must be a 2-of-3 multisig');
78
+ }
79
+ const stakerKeyStrings = fields.stakerMulti.slice(1).map((key, index) => asString(key, `staker key ${index}`));
80
+ const resolvedKeys = stakerKeyStrings.map(resolveStakerKey);
81
+ return {
82
+ unlockHeight,
83
+ stakerCommitment: Buffer.from(commitmentHex, 'hex'),
84
+ earlyExitKey,
85
+ stakerKeyStrings: [stakerKeyStrings[0], stakerKeyStrings[1], stakerKeyStrings[2]],
86
+ stakerKeys: resolvedKeys.every((key) => key !== undefined)
87
+ ? [resolvedKeys[0], resolvedKeys[1], resolvedKeys[2]]
88
+ : undefined,
89
+ miniscriptNode,
90
+ };
91
+ }
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VEZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BveDUvcGFyc2VEZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBZ0I1RSxNQUFNLGNBQWMsR0FBRywwQkFBMEIsQ0FBQztBQUNsRCxNQUFNLGVBQWUsR0FBRyxrQ0FBa0MsQ0FBQztBQUUzRCxTQUFTLFFBQVEsQ0FBQyxLQUFjLEVBQUUsS0FBYTtJQUM3QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLG1CQUFtQixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLEtBQWMsRUFBRSxLQUFhO0lBQzdDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssbUJBQW1CLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxLQUFhLEVBQUUsS0FBYTtJQUN0RCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLGtDQUFrQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsS0FBYTtJQUNyQyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxD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O0tBQ2YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCSVAzMiwgRGVzY3JpcHRvciwgYXN0LCBkZXNjcmlwdG9yV2FsbGV0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbnR5cGUgUGF0dGVybiA9IGRlc2NyaXB0b3JXYWxsZXQuUGF0dGVybjtcblxuZXhwb3J0IHR5cGUgUG94NURlc2NyaXB0b3JJbmZvID0ge1xuICB1bmxvY2tIZWlnaHQ6IG51bWJlcjtcbiAgc3Rha2VyQ29tbWl0bWVudDogQnVmZmVyO1xuICBlYXJseUV4aXRLZXk6IEJ1ZmZlcjtcbiAgc3Rha2VyS2V5U3RyaW5nczogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddO1xuICBzdGFrZXJLZXlzOiBbQnVmZmVyLCBCdWZmZXIsIEJ1ZmZlcl0gfCB1bmRlZmluZWQ7XG4gIG1pbmlzY3JpcHROb2RlOiBhc3QuTWluaXNjcmlwdE5vZGU7XG59O1xuXG4vKiogQGRlcHJlY2F0ZWQgVXNlIFBveDVEZXNjcmlwdG9ySW5mbyBpbnN0ZWFkLiAqL1xuZXhwb3J0IHR5cGUgUGFyc2VkUG94NUxvY2t1cERlc2NyaXB0b3IgPSBQb3g1RGVzY3JpcHRvckluZm87XG5cbmNvbnN0IENPTVBSRVNTRURfS0VZID0gL14oMDJ8MDMpWzAtOWEtZkEtRl17NjR9JC87XG5jb25zdCBYUFVCX1dJVEhfSU5ERVggPSAvXihbMS05QS1ISi1OUC1aYS1rbS16XSspXFwvKFxcZCspJC87XG5cbmZ1bmN0aW9uIGFzTnVtYmVyKHZhbHVlOiB1bmtub3duLCBmaWVsZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmllbGR9IG11c3QgYmUgYSBudW1iZXJgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlOiB1bmtub3duLCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmllbGR9IG11c3QgYmUgYSBzdHJpbmdgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ29tcHJlc3NlZEtleSh2YWx1ZTogc3RyaW5nLCBmaWVsZDogc3RyaW5nKTogQnVmZmVyIHtcbiAgaWYgKCFDT01QUkVTU0VEX0tFWS50ZXN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZH0gbXVzdCBiZSBhIGNvbXByZXNzZWQgcHVibGljIGtleWApO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSwgJ2hleCcpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlU3Rha2VyS2V5KHZhbHVlOiBzdHJpbmcpOiBCdWZmZXIgfCB1bmRlZmluZWQge1xuICBpZiAoQ09NUFJFU1NFRF9LRVkudGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUsICdoZXgnKTtcbiAgfVxuICBjb25zdCBtYXRjaCA9IHZhbHVlLm1hdGNoKFhQVUJfV0lUSF9JTkRFWCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IFssIHhwdWIsIGluZGV4U3RyaW5nXSA9IG1hdGNoO1xuICBjb25zdCBpbmRleCA9IE51bWJlci5wYXJzZUludChpbmRleFN0cmluZywgMTApO1xuICB0cnkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShCSVAzMi5mcm9tQmFzZTU4KHhwdWIpLmRlcml2ZShpbmRleCkucHVibGljS2V5KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlIG9ubHkgdGhlIGNhbm9uaWNhbCBQb1gtNSBkZXNjcmlwdG9yIHRlbXBsYXRlLiBPdGhlciBkZXNjcmlwdG9ycyByZXR1cm5cbiAqIHVuZGVmaW5lZDsgbWFsZm9ybWVkIGZpZWxkcyB3aXRoaW4gdGhlIHRlbXBsYXRlIHRocm93IHNvIGNhbGxlcnMgY2Fubm90IGZpbmFsaXplXG4gKiBhIHNjcmlwdCB1bmRlciBhbiBhbWJpZ3VvdXMgcG9saWN5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQb3g1TG9ja3VwRGVzY3JpcHRvcihkZXNjcmlwdG9yOiBEZXNjcmlwdG9yIHwgYXN0LkRlc2NyaXB0b3JOb2RlKTogUG94NURlc2NyaXB0b3JJbmZvIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2hlciA9IG5ldyBkZXNjcmlwdG9yV2FsbGV0LlBhdHRlcm5NYXRjaGVyKCk7XG4gIGNvbnN0IGRlc2NyaXB0b3JOb2RlID0gZGVzY3JpcHRvciBpbnN0YW5jZW9mIERlc2NyaXB0b3IgPyBhc3QuZnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcikgOiBkZXNjcmlwdG9yO1xuICBjb25zdCBtYXRjaGVkID0gbWF0Y2hlci5tYXRjaChkZXNjcmlwdG9yTm9kZSwgeyB3c2g6IHsgJHZhcjogJ21pbmlzY3JpcHQnIH0gfSk7XG4gIGlmICghbWF0Y2hlZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBtaW5pc2NyaXB0Tm9kZSA9IG1hdGNoZWQubWluaXNjcmlwdCBhcyBhc3QuTWluaXNjcmlwdE5vZGU7XG4gIGNvbnN0IHBhdHRlcm46IFBhdHRlcm4gPSB7XG4gICAgYW5kX3Y6IFtcbiAgICAgIHtcbiAgICAgICAgJ3Y6b3JfaSc6IFtcbiAgICAgICAgICB7IGFmdGVyOiB7ICR2YXI6ICd1bmxvY2tIZWlnaHQnIH0gfSxcbiAgICAgICAgICB7IGFuZF92OiBbeyAndjpzaGEyNTYnOiB7ICR2YXI6ICdzdGFrZXJDb21taXRtZW50JyB9IH0sIHsgcGs6IHsgJHZhcjogJ2Vhcmx5RXhpdEtleScgfSB9XSB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHsgbXVsdGk6IHsgJHZhcjogJ3N0YWtlck11bHRpJyB9IH0sXG4gICAgXSxcbiAgfTtcbiAgY29uc3QgZmllbGRzID0gbWF0Y2hlci5tYXRjaChtaW5pc2NyaXB0Tm9kZSwgcGF0dGVybik7XG4gIGlmICghZmllbGRzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHVubG9ja0hlaWdodCA9IGFzTnVtYmVyKGZpZWxkcy51bmxvY2tIZWlnaHQsICdhZnRlciBhcmd1bWVudCcpO1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHVubG9ja0hlaWdodCkgfHwgdW5sb2NrSGVpZ2h0IDw9IDAgfHwgdW5sb2NrSGVpZ2h0ID49IDUwMF8wMDBfMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bmxvY2tIZWlnaHQgKCR7dW5sb2NrSGVpZ2h0fSkgbXVzdCBiZSBhIHBvc2l0aXZlIGJsb2NrIGhlaWdodCBiZWxvdyA1MDAwMDAwMDBgKTtcbiAgfVxuICBjb25zdCBjb21taXRtZW50SGV4ID0gYXNTdHJpbmcoZmllbGRzLnN0YWtlckNvbW1pdG1lbnQsICdzaGEyNTYgY29tbWl0bWVudCcpO1xuICBpZiAoIS9eWzAtOWEtZkEtRl17NjR9JC8udGVzdChjb21taXRtZW50SGV4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignc3Rha2VyQ29tbWl0bWVudCBtdXN0IGJlIDMyIGJ5dGVzJyk7XG4gIH1cbiAgY29uc3QgZWFybHlFeGl0S2V5ID0gcGFyc2VDb21wcmVzc2VkS2V5KGFzU3RyaW5nKGZpZWxkcy5lYXJseUV4aXRLZXksICdlYXJseSBleGl0IGtleScpLCAnZWFybHlFeGl0S2V5Jyk7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGZpZWxkcy5zdGFrZXJNdWx0aSkgfHwgZmllbGRzLnN0YWtlck11bHRpLmxlbmd0aCAhPT0gNCB8fCBmaWVsZHMuc3Rha2VyTXVsdGlbMF0gIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YWtlciBtdWx0aSBtdXN0IGJlIGEgMi1vZi0zIG11bHRpc2lnJyk7XG4gIH1cbiAgY29uc3Qgc3Rha2VyS2V5U3RyaW5ncyA9IGZpZWxkcy5zdGFrZXJNdWx0aS5zbGljZSgxKS5tYXAoKGtleSwgaW5kZXgpID0+IGFzU3RyaW5nKGtleSwgYHN0YWtlciBrZXkgJHtpbmRleH1gKSk7XG4gIGNvbnN0IHJlc29sdmVkS2V5cyA9IHN0YWtlcktleVN0cmluZ3MubWFwKHJlc29sdmVTdGFrZXJLZXkpO1xuXG4gIHJldHVybiB7XG4gICAgdW5sb2NrSGVpZ2h0LFxuICAgIHN0YWtlckNvbW1pdG1lbnQ6IEJ1ZmZlci5mcm9tKGNvbW1pdG1lbnRIZXgsICdoZXgnKSxcbiAgICBlYXJseUV4aXRLZXksXG4gICAgc3Rha2VyS2V5U3RyaW5nczogW3N0YWtlcktleVN0cmluZ3NbMF0sIHN0YWtlcktleVN0cmluZ3NbMV0sIHN0YWtlcktleVN0cmluZ3NbMl1dLFxuICAgIHN0YWtlcktleXM6IHJlc29sdmVkS2V5cy5ldmVyeSgoa2V5KToga2V5IGlzIEJ1ZmZlciA9PiBrZXkgIT09IHVuZGVmaW5lZClcbiAgICAgID8gW3Jlc29sdmVkS2V5c1swXSwgcmVzb2x2ZWRLZXlzWzFdLCByZXNvbHZlZEtleXNbMl1dXG4gICAgICA6IHVuZGVmaW5lZCxcbiAgICBtaW5pc2NyaXB0Tm9kZSxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,12 @@
1
+ import { Psbt, type Descriptor } from '@bitgo/wasm-utxo';
2
+ import { Pox5DescriptorInfo } from './parseDescriptor';
3
+ /**
4
+ * Read the principal preimage committed by a canonical PoX-5 descriptor from a
5
+ * native PSBT input. The PSBT_IN_SHA256 key data is the descriptor commitment.
6
+ */
7
+ export declare function getPox5PrincipalPreimage(psbt: Psbt, inputIndex: number, descriptor: Pox5DescriptorInfo | Descriptor | import('@bitgo/wasm-utxo').ast.DescriptorNode): Buffer;
8
+ /** Verify that a principal preimage is committed by a canonical PoX-5 descriptor. */
9
+ export declare function assertPox5PrincipalPreimage(descriptor: Pox5DescriptorInfo | Descriptor | import('@bitgo/wasm-utxo').ast.DescriptorNode, principalPreimage: Uint8Array): void;
10
+ /** Alias for callers that prefer validation terminology. */
11
+ export declare function validatePox5PrincipalPreimage(descriptor: Pox5DescriptorInfo | Descriptor | import('@bitgo/wasm-utxo').ast.DescriptorNode, principalPreimage: Uint8Array): void;
12
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/pox5/validation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAA0B,MAAM,kBAAkB,CAAC;AAEjF,OAAO,EAAE,kBAAkB,EAA6B,MAAM,mBAAmB,CAAC;AAUlF;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,GAAG,UAAU,GAAG,OAAO,kBAAkB,EAAE,GAAG,CAAC,cAAc,GAC1F,MAAM,CA0BR;AAwBD,qFAAqF;AACrF,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,kBAAkB,GAAG,UAAU,GAAG,OAAO,kBAAkB,EAAE,GAAG,CAAC,cAAc,EAC3F,iBAAiB,EAAE,UAAU,GAC5B,IAAI,CASN;AAED,4DAA4D;AAC5D,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,kBAAkB,GAAG,UAAU,GAAG,OAAO,kBAAkB,EAAE,GAAG,CAAC,cAAc,EAC3F,iBAAiB,EAAE,UAAU,GAC5B,IAAI,CAEN"}
@@ -0,0 +1,65 @@
1
+ import { createHash } from 'crypto';
2
+ import { parsePox5LockupDescriptor } from './parseDescriptor';
3
+ const SHA256_INPUT_KEY = 'PSBT_IN_SHA256';
4
+ function isSha256InputKeyValue(keyValue) {
5
+ return keyValue.type === 'known' && keyValue.key === SHA256_INPUT_KEY;
6
+ }
7
+ /**
8
+ * Read the principal preimage committed by a canonical PoX-5 descriptor from a
9
+ * native PSBT input. The PSBT_IN_SHA256 key data is the descriptor commitment.
10
+ */
11
+ export function getPox5PrincipalPreimage(psbt, inputIndex, descriptor) {
12
+ const info = getPox5DescriptorInfo(descriptor);
13
+ const records = psbt
14
+ .getInputKeyValues(inputIndex)
15
+ .filter(isSha256InputKeyValue)
16
+ .filter((record) => Buffer.from(record.keyData).equals(info.stakerCommitment));
17
+ if (records.length !== 1) {
18
+ throw new Error(`expected exactly one ${SHA256_INPUT_KEY} record matching the descriptor commitment, found ${records.length}`);
19
+ }
20
+ const [record] = records;
21
+ if (record.keyData.length !== 32) {
22
+ throw new Error(`${SHA256_INPUT_KEY} digest must be 32 bytes`);
23
+ }
24
+ if (record.value.length !== 32) {
25
+ throw new Error(`${SHA256_INPUT_KEY} preimage must be 32 bytes`);
26
+ }
27
+ const preimage = Buffer.from(record.value);
28
+ const digest = createHash('sha256').update(preimage).digest();
29
+ if (!digest.equals(Buffer.from(record.keyData))) {
30
+ throw new Error(`${SHA256_INPUT_KEY} digest does not match its preimage`);
31
+ }
32
+ return preimage;
33
+ }
34
+ function isPox5DescriptorInfo(value) {
35
+ return (value !== null &&
36
+ typeof value === 'object' &&
37
+ 'stakerCommitment' in value &&
38
+ Buffer.isBuffer(value.stakerCommitment));
39
+ }
40
+ function getPox5DescriptorInfo(descriptor) {
41
+ if (isPox5DescriptorInfo(descriptor)) {
42
+ return descriptor;
43
+ }
44
+ const info = parsePox5LockupDescriptor(descriptor);
45
+ if (!info) {
46
+ throw new Error('descriptor is not a canonical PoX-5 lockup descriptor');
47
+ }
48
+ return info;
49
+ }
50
+ /** Verify that a principal preimage is committed by a canonical PoX-5 descriptor. */
51
+ export function assertPox5PrincipalPreimage(descriptor, principalPreimage) {
52
+ if (principalPreimage.length !== 32) {
53
+ throw new Error('principalPreimage must be 32 bytes');
54
+ }
55
+ const info = getPox5DescriptorInfo(descriptor);
56
+ const digest = createHash('sha256').update(principalPreimage).digest();
57
+ if (!digest.equals(info.stakerCommitment)) {
58
+ throw new Error('principalPreimage does not match the descriptor stakerCommitment');
59
+ }
60
+ }
61
+ /** Alias for callers that prefer validation terminology. */
62
+ export function validatePox5PrincipalPreimage(descriptor, principalPreimage) {
63
+ assertPox5PrincipalPreimage(descriptor, principalPreimage);
64
+ }
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wb3g1L3ZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUlwQyxPQUFPLEVBQXNCLHlCQUF5QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEYsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUkxQyxTQUFTLHFCQUFxQixDQUFDLFFBQTJCO0lBQ3hELE9BQU8sUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksUUFBUSxDQUFDLEdBQUcsS0FBSyxnQkFBZ0IsQ0FBQztBQUN4RSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxJQUFVLEVBQ1YsVUFBa0IsRUFDbEIsVUFBMkY7SUFFM0YsTUFBTSxJQUFJLEdBQUcscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDL0MsTUFBTSxPQUFPLEdBQUcsSUFBSTtTQUNqQixpQkFBaUIsQ0FBQyxVQUFVLENBQUM7U0FDN0IsTUFBTSxDQUFDLHFCQUFxQixDQUFDO1NBQzdCLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFDakYsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQ2Isd0JBQXdCLGdCQUFnQixxREFBcUQsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUM5RyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDekIsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsZ0JBQWdCLDBCQUEwQixDQUFDLENBQUM7SUFDakUsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLGdCQUFnQiw0QkFBNEIsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsZ0JBQWdCLHFDQUFxQyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLEtBQWM7SUFDMUMsT0FBTyxDQUNMLEtBQUssS0FBSyxJQUFJO1FBQ2QsT0FBTyxLQUFLLEtBQUssUUFBUTtRQUN6QixrQkFBa0IsSUFBSSxLQUFLO1FBQzNCLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQ3hDLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FDNUIsVUFBMkY7SUFFM0YsSUFBSSxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixNQUFNLFVBQVUsMkJBQTJCLENBQ3pDLFVBQTJGLEVBQzNGLGlCQUE2QjtJQUU3QixJQUFJLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN2RSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQztJQUN0RixDQUFDO0FBQ0gsQ0FBQztBQUVELDREQUE0RDtBQUM1RCxNQUFNLFVBQVUsNkJBQTZCLENBQzNDLFVBQTJGLEVBQzNGLGlCQUE2QjtJQUU3QiwyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUM3RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5cbmltcG9ydCB7IFBzYnQsIHR5cGUgRGVzY3JpcHRvciwgdHlwZSBQc2J0SW5wdXRLZXlWYWx1ZSB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG5pbXBvcnQgeyBQb3g1RGVzY3JpcHRvckluZm8sIHBhcnNlUG94NUxvY2t1cERlc2NyaXB0b3IgfSBmcm9tICcuL3BhcnNlRGVzY3JpcHRvcic7XG5cbmNvbnN0IFNIQTI1Nl9JTlBVVF9LRVkgPSAnUFNCVF9JTl9TSEEyNTYnO1xuXG50eXBlIFNoYTI1NklucHV0S2V5VmFsdWUgPSBFeHRyYWN0PFBzYnRJbnB1dEtleVZhbHVlLCB7IHR5cGU6ICdrbm93bicgfT47XG5cbmZ1bmN0aW9uIGlzU2hhMjU2SW5wdXRLZXlWYWx1ZShrZXlWYWx1ZTogUHNidElucHV0S2V5VmFsdWUpOiBrZXlWYWx1ZSBpcyBTaGEyNTZJbnB1dEtleVZhbHVlIHtcbiAgcmV0dXJuIGtleVZhbHVlLnR5cGUgPT09ICdrbm93bicgJiYga2V5VmFsdWUua2V5ID09PSBTSEEyNTZfSU5QVVRfS0VZO1xufVxuXG4vKipcbiAqIFJlYWQgdGhlIHByaW5jaXBhbCBwcmVpbWFnZSBjb21taXR0ZWQgYnkgYSBjYW5vbmljYWwgUG9YLTUgZGVzY3JpcHRvciBmcm9tIGFcbiAqIG5hdGl2ZSBQU0JUIGlucHV0LiBUaGUgUFNCVF9JTl9TSEEyNTYga2V5IGRhdGEgaXMgdGhlIGRlc2NyaXB0b3IgY29tbWl0bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBveDVQcmluY2lwYWxQcmVpbWFnZShcbiAgcHNidDogUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyLFxuICBkZXNjcmlwdG9yOiBQb3g1RGVzY3JpcHRvckluZm8gfCBEZXNjcmlwdG9yIHwgaW1wb3J0KCdAYml0Z28vd2FzbS11dHhvJykuYXN0LkRlc2NyaXB0b3JOb2RlXG4pOiBCdWZmZXIge1xuICBjb25zdCBpbmZvID0gZ2V0UG94NURlc2NyaXB0b3JJbmZvKGRlc2NyaXB0b3IpO1xuICBjb25zdCByZWNvcmRzID0gcHNidFxuICAgIC5nZXRJbnB1dEtleVZhbHVlcyhpbnB1dEluZGV4KVxuICAgIC5maWx0ZXIoaXNTaGEyNTZJbnB1dEtleVZhbHVlKVxuICAgIC5maWx0ZXIoKHJlY29yZCkgPT4gQnVmZmVyLmZyb20ocmVjb3JkLmtleURhdGEpLmVxdWFscyhpbmZvLnN0YWtlckNvbW1pdG1lbnQpKTtcbiAgaWYgKHJlY29yZHMubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYGV4cGVjdGVkIGV4YWN0bHkgb25lICR7U0hBMjU2X0lOUFVUX0tFWX0gcmVjb3JkIG1hdGNoaW5nIHRoZSBkZXNjcmlwdG9yIGNvbW1pdG1lbnQsIGZvdW5kICR7cmVjb3Jkcy5sZW5ndGh9YFxuICAgICk7XG4gIH1cblxuICBjb25zdCBbcmVjb3JkXSA9IHJlY29yZHM7XG4gIGlmIChyZWNvcmQua2V5RGF0YS5sZW5ndGggIT09IDMyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke1NIQTI1Nl9JTlBVVF9LRVl9IGRpZ2VzdCBtdXN0IGJlIDMyIGJ5dGVzYCk7XG4gIH1cbiAgaWYgKHJlY29yZC52YWx1ZS5sZW5ndGggIT09IDMyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke1NIQTI1Nl9JTlBVVF9LRVl9IHByZWltYWdlIG11c3QgYmUgMzIgYnl0ZXNgKTtcbiAgfVxuXG4gIGNvbnN0IHByZWltYWdlID0gQnVmZmVyLmZyb20ocmVjb3JkLnZhbHVlKTtcbiAgY29uc3QgZGlnZXN0ID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHByZWltYWdlKS5kaWdlc3QoKTtcbiAgaWYgKCFkaWdlc3QuZXF1YWxzKEJ1ZmZlci5mcm9tKHJlY29yZC5rZXlEYXRhKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U0hBMjU2X0lOUFVUX0tFWX0gZGlnZXN0IGRvZXMgbm90IG1hdGNoIGl0cyBwcmVpbWFnZWApO1xuICB9XG4gIHJldHVybiBwcmVpbWFnZTtcbn1cblxuZnVuY3Rpb24gaXNQb3g1RGVzY3JpcHRvckluZm8odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQb3g1RGVzY3JpcHRvckluZm8ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICdzdGFrZXJDb21taXRtZW50JyBpbiB2YWx1ZSAmJlxuICAgIEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZS5zdGFrZXJDb21taXRtZW50KVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRQb3g1RGVzY3JpcHRvckluZm8oXG4gIGRlc2NyaXB0b3I6IFBveDVEZXNjcmlwdG9ySW5mbyB8IERlc2NyaXB0b3IgfCBpbXBvcnQoJ0BiaXRnby93YXNtLXV0eG8nKS5hc3QuRGVzY3JpcHRvck5vZGVcbik6IFBveDVEZXNjcmlwdG9ySW5mbyB7XG4gIGlmIChpc1BveDVEZXNjcmlwdG9ySW5mbyhkZXNjcmlwdG9yKSkge1xuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9XG4gIGNvbnN0IGluZm8gPSBwYXJzZVBveDVMb2NrdXBEZXNjcmlwdG9yKGRlc2NyaXB0b3IpO1xuICBpZiAoIWluZm8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rlc2NyaXB0b3IgaXMgbm90IGEgY2Fub25pY2FsIFBvWC01IGxvY2t1cCBkZXNjcmlwdG9yJyk7XG4gIH1cbiAgcmV0dXJuIGluZm87XG59XG5cbi8qKiBWZXJpZnkgdGhhdCBhIHByaW5jaXBhbCBwcmVpbWFnZSBpcyBjb21taXR0ZWQgYnkgYSBjYW5vbmljYWwgUG9YLTUgZGVzY3JpcHRvci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQb3g1UHJpbmNpcGFsUHJlaW1hZ2UoXG4gIGRlc2NyaXB0b3I6IFBveDVEZXNjcmlwdG9ySW5mbyB8IERlc2NyaXB0b3IgfCBpbXBvcnQoJ0BiaXRnby93YXNtLXV0eG8nKS5hc3QuRGVzY3JpcHRvck5vZGUsXG4gIHByaW5jaXBhbFByZWltYWdlOiBVaW50OEFycmF5XG4pOiB2b2lkIHtcbiAgaWYgKHByaW5jaXBhbFByZWltYWdlLmxlbmd0aCAhPT0gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByaW5jaXBhbFByZWltYWdlIG11c3QgYmUgMzIgYnl0ZXMnKTtcbiAgfVxuICBjb25zdCBpbmZvID0gZ2V0UG94NURlc2NyaXB0b3JJbmZvKGRlc2NyaXB0b3IpO1xuICBjb25zdCBkaWdlc3QgPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUocHJpbmNpcGFsUHJlaW1hZ2UpLmRpZ2VzdCgpO1xuICBpZiAoIWRpZ2VzdC5lcXVhbHMoaW5mby5zdGFrZXJDb21taXRtZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJpbmNpcGFsUHJlaW1hZ2UgZG9lcyBub3QgbWF0Y2ggdGhlIGRlc2NyaXB0b3Igc3Rha2VyQ29tbWl0bWVudCcpO1xuICB9XG59XG5cbi8qKiBBbGlhcyBmb3IgY2FsbGVycyB0aGF0IHByZWZlciB2YWxpZGF0aW9uIHRlcm1pbm9sb2d5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUG94NVByaW5jaXBhbFByZWltYWdlKFxuICBkZXNjcmlwdG9yOiBQb3g1RGVzY3JpcHRvckluZm8gfCBEZXNjcmlwdG9yIHwgaW1wb3J0KCdAYml0Z28vd2FzbS11dHhvJykuYXN0LkRlc2NyaXB0b3JOb2RlLFxuICBwcmluY2lwYWxQcmVpbWFnZTogVWludDhBcnJheVxuKTogdm9pZCB7XG4gIGFzc2VydFBveDVQcmluY2lwYWxQcmVpbWFnZShkZXNjcmlwdG9yLCBwcmluY2lwYWxQcmVpbWFnZSk7XG59XG4iXX0=
@@ -30,6 +30,14 @@ export type ParsedSbtcDepositDescriptor = {
30
30
  depositMiniscriptNode: ast.MiniscriptNode;
31
31
  /** Raw miniscript AST for the reclaim leaf (second tap-tree leaf). */
32
32
  reclaimMiniscriptNode: ast.MiniscriptNode;
33
+ /**
34
+ * The three raw `multi_a` key entries from the reclaim leaf, exactly as
35
+ * they appear in the descriptor — `xpub.../*` for derivable descriptors and
36
+ * 64-hex-char x-only keys for definite descriptors. Useful for callers that
37
+ * need the original xpub form (e.g. to round-trip back to a descriptor
38
+ * builder) and don't want the resolved `reclaimKeys` buffers.
39
+ */
40
+ reclaimKeyStrings: [string, string, string];
33
41
  };
34
42
  /**
35
43
  * Parse an sBTC peg-in deposit descriptor and return its components.
@@ -1 +1 @@
1
- {"version":3,"file":"parseDescriptor.d.ts","sourceRoot":"","sources":["../../../src/sbtc/parseDescriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,UAAU,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAK1D;;;;;;;GAOG;AACH,MAAM,MAAM,2BAA2B,GAAG;IACxC,kEAAkE;IAClE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,eAAe,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;;OAQG;IACH,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAClD,qEAAqE;IACrE,qBAAqB,EAAE,GAAG,CAAC,cAAc,CAAC;IAC1C,sEAAsE;IACtE,qBAAqB,EAAE,GAAG,CAAC,cAAc,CAAC;CAC3C,CAAC;AAwJF;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,UAAU,GAAG,GAAG,CAAC,cAAc,GAC1C,2BAA2B,GAAG,IAAI,CAwCpC"}
1
+ {"version":3,"file":"parseDescriptor.d.ts","sourceRoot":"","sources":["../../../src/sbtc/parseDescriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,UAAU,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAK1D;;;;;;;GAOG;AACH,MAAM,MAAM,2BAA2B,GAAG;IACxC,kEAAkE;IAClE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,eAAe,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;;OAQG;IACH,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAClD,qEAAqE;IACrE,qBAAqB,EAAE,GAAG,CAAC,cAAc,CAAC;IAC1C,sEAAsE;IACtE,qBAAqB,EAAE,GAAG,CAAC,cAAc,CAAC;IAC1C;;;;;;OAMG;IACH,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C,CAAC;AAwJF;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,UAAU,GAAG,GAAG,CAAC,cAAc,GAC1C,2BAA2B,GAAG,IAAI,CA8CpC"}
@@ -152,6 +152,11 @@ export function parseSbtcDepositDescriptor(descriptor) {
152
152
  let reclaimMiniscriptNode = result.reclaimLeaf;
153
153
  const { signersAggregateKey, maxFee, stacksRecipient } = parseDepositLeaf(depositMiniscriptNode, matcher);
154
154
  const { lockTime, reclaimKeyStrings } = parseReclaimLeaf(reclaimMiniscriptNode, matcher);
155
+ const reclaimKeyStringsTuple = [
156
+ reclaimKeyStrings[0],
157
+ reclaimKeyStrings[1],
158
+ reclaimKeyStrings[2],
159
+ ];
155
160
  const reclaimKeys = reclaimKeysFromStrings(reclaimKeyStrings);
156
161
  if (reclaimKeys) {
157
162
  // Rewrite the reclaim leaf with concrete hex keys when we can resolve
@@ -169,8 +174,9 @@ export function parseSbtcDepositDescriptor(descriptor) {
169
174
  stacksRecipient,
170
175
  lockTime,
171
176
  reclaimKeys,
177
+ reclaimKeyStrings: reclaimKeyStringsTuple,
172
178
  depositMiniscriptNode,
173
179
  reclaimMiniscriptNode,
174
180
  };
175
181
  }
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VEZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NidGMvcGFyc2VEZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQVcsTUFBTSxrQ0FBa0MsQ0FBQztBQUUzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsNEJBQTRCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFtQzFHLFNBQVMsUUFBUSxDQUFDLENBQVUsRUFBRSxLQUFhO0lBQ3pDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssbUJBQW1CLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBVSxFQUFFLEtBQWE7SUFDekMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxLQUFjO0lBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ25DLElBQUksT0FBTyxTQUFT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Q0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ2pHLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTztRQUNMLG1CQUFtQjtRQUNuQixNQUFNO1FBQ04sZUFBZTtRQUNmLFFBQVE7UUFDUixXQUFXO1FBQ1gscUJBQXFCO1FBQ3JCLHFCQUFxQjtLQUN0QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJJUDMyLCBEZXNjcmlwdG9yLCBhc3QgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IFBhdHRlcm5NYXRjaGVyLCBQYXR0ZXJuIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1jb3JlL2Rlc2NyaXB0b3InO1xuXG5pbXBvcnQgeyBNQVhfRkVFX0JZVEVfTEVOR1RILCBTVEFDS1NfUkVDSVBJRU5UX0JZVEVfTEVOR1RILCBVTlNQRU5EQUJMRV9JTlRFUk5BTF9LRVkgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogUGFyc2VkIGNvbXBvbmVudHMgb2YgYW4gc0JUQyBwZWctaW4gZGVwb3NpdCBkZXNjcmlwdG9yLlxuICpcbiAqIFRoZSBwYXJzZXIgcmV0dXJucyBib3RoIHRoZSBoaWdoLWxldmVsXG4gKiBmaWVsZHMgY2FsbGVycyB1c3VhbGx5IG5lZWQgKGtleXMsIGxvY2tUaW1lLCBmZWUsIHJlY2lwaWVudCkgYW5kIHRoZSByYXdcbiAqIG1pbmlzY3JpcHQgQVNUIG5vZGVzIHNvIHRoZSBsZWF2ZXMgY2FuIGJlIHJlLWNvbXBpbGVkIGludG8gYVxuICogYE1pbmlzY3JpcHRgIHZpYSBgYXN0LmZvcm1hdE5vZGVgICsgYE1pbmlzY3JpcHQuZnJvbVN0cmluZ2AuXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlZFNidGNEZXBvc2l0RGVzY3JpcHRvciA9IHtcbiAgLyoqIDMyLWJ5dGUgeC1vbmx5IHNpZ25lcnMgYWdncmVnYXRlIGtleSBmcm9tIHRoZSBkZXBvc2l0IGxlYWYuICovXG4gIHNpZ25lcnNBZ2dyZWdhdGVLZXk6IEJ1ZmZlcjtcbiAgLyoqIE1heCBzaWduZXIgZmVlIHBhcnNlZCBmcm9tIHRoZSBmaXJzdCA4IGJ5dGVzIG9mIHRoZSBwYXlsb2FkX2Ryb3AgdmFsdWUuICovXG4gIG1heEZlZTogYmlnaW50O1xuICAvKiogMjItYnl0ZSBTdGFja3MgcmVjaXBpZW50IHBhcnNlZCBmcm9tIHRoZSB0cmFpbGluZyBieXRlcyBvZiB0aGUgcGF5bG9hZC4gKi9cbiAgc3RhY2tzUmVjaXBpZW50OiBCdWZmZXI7XG4gIC8qKiBSZWNsYWltLWxlYWYgcmVsYXRpdmUgdGltZWxvY2sgKG51bWJlciBvZiBCaXRjb2luIGJsb2NrcywgT1BfQ1NWIGFyZ3VtZW50KS4gKi9cbiAgbG9ja1RpbWU6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB0aHJlZSBjb25jcmV0ZSB4LW9ubHkgcmVjbGFpbSBrZXlzIGZyb20gdGhlIHJlY2xhaW0tbGVhZiBgbXVsdGlfYWAsXG4gICAqIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbnNpZGUgdGhlIGxlYWYgKGRlc2NyaXB0b3IgbGlicmFyeSBzb3J0cyBieSBoZXgpLlxuICAgKiBPbmx5IHByZXNlbnQgd2hlbiB0aGUgZGVzY3JpcHRvciBpcyBpbiBpdHMgZGVyaXZlZC9kZWZpbml0ZSBmb3JtIOKAlCBmb3JcbiAgICogZGVyaXZhYmxlIGRlc2NyaXB0b3JzIHRoZSBtdWx0aV9hIGVudHJpZXMgYXJlIHhwdWIgc3RyaW5ncyAoZS5nLlxuICAgKiBgeHB1Yi4uLi8qYCksIHdoaWNoIGNhbid0IGJlIHR1cm5lZCBpbnRvIDMyLWJ5dGUgYnVmZmVycyB3aXRob3V0IHBpY2tpbmdcbiAgICogYSBkZXJpdmF0aW9uIGluZGV4LiBDYWxsZXJzIHRoYXQgbmVlZCByYXcga2V5IGJ5dGVzIE1VU1QgcGFzcyB0aGVcbiAgICogZGVyaXZlZCBkZXNjcmlwdG9yIChzZWUgYGRlcml2ZVJlY2xhaW1LZXlzYCBmb3IgZGVyaXZhYmxlIGlucHV0cykuXG4gICAqL1xuICByZWNsYWltS2V5czogW0J1ZmZlciwgQnVmZmVyLCBCdWZmZXJdIHwgdW5kZWZpbmVkO1xuICAvKiogUmF3IG1pbmlzY3JpcHQgQVNUIGZvciB0aGUgZGVwb3NpdCBsZWFmIChmaXJzdCB0YXAtdHJlZSBsZWFmKS4gKi9cbiAgZGVwb3NpdE1pbmlzY3JpcHROb2RlOiBhc3QuTWluaXNjcmlwdE5vZGU7XG4gIC8qKiBSYXcgbWluaXNjcmlwdCBBU1QgZm9yIHRoZSByZWNsYWltIGxlYWYgKHNlY29uZCB0YXAtdHJlZSBsZWFmKS4gKi9cbiAgcmVjbGFpbU1pbmlzY3JpcHROb2RlOiBhc3QuTWluaXNjcmlwdE5vZGU7XG59O1xuXG5mdW5jdGlvbiBhc1N0cmluZyh2OiB1bmtub3duLCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZH0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuICB9XG4gIHJldHVybiB2O1xufVxuXG5mdW5jdGlvbiBhc051bWJlcih2OiB1bmtub3duLCBmaWVsZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB2ICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZH0gbXVzdCBiZSBhIG51bWJlcmApO1xuICB9XG4gIHJldHVybiB2O1xufVxuXG4vKipcbiAqIFB1bGwgYFt0aHJlc2hvbGQsIC4uLmtleXNdYCBvdXQgb2YgYSBgbXVsdGlfYWAgQVNUIG5vZGUgdmFsdWUsIHZhbGlkYXRpbmdcbiAqIGVhY2ggZWxlbWVudC4gVGhlIGRlc2NyaXB0b3IncyBgbXVsdGlfYWAgaXMgcmVuZGVyZWQgd2l0aCBrZXlzIGVpdGhlciBhc1xuICogY29uY3JldGUgaGV4IChkZWZpbml0ZSBkZXNjcmlwdG9yKSBvciBhcyB4cHViIHN0cmluZ3MgZW5kaW5nIGluIGAvKmBcbiAqIChkZXJpdmFibGUgZGVzY3JpcHRvcikg4oCUIGJvdGggYXJlIHN0cmluZ3MgaGVyZSwgc28gd2UgZG9uJ3QgdHJ5IHRvIGNvbnZlcnRcbiAqIHRvIEJ1ZmZlciBhdCB0aGlzIGxldmVsLlxuICovXG5mdW5jdGlvbiBwYXJzZU11bHRpKG11bHRpOiB1bmtub3duKTogW251bWJlciwgc3RyaW5nW11dIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG11bHRpKSB8fCBtdWx0aS5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG11bHRpX2Egc3RydWN0dXJlOiBub3QgYW4gYXJyYXkgb3IgZW1wdHknKTtcbiAgfVxuICBjb25zdCBbdGhyZXNob2xkLCAuLi5rZXlzXSA9IG11bHRpO1xuICBpZiAodHlwZW9mIHRocmVzaG9sZCAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbXVsdGlfYSBzdHJ1Y3R1cmU6IHRocmVzaG9sZCBpcyBub3QgYSBudW1iZXInKTtcbiAgfVxuICBpZiAoIWtleXMuZXZlcnkoKGspID0+IHR5cGVvZiBrID09PSAnc3RyaW5nJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbXVsdGlfYSBzdHJ1Y3R1cmU6IG5vdCBhbGwga2V5cyBhcmUgc3RyaW5ncycpO1xuICB9XG4gIHJldHVybiBbdGhyZXNob2xkLCBrZXlzXTtcbn1cblxuZnVuY3Rpb24gcGFyc2VEZXBvc2l0TGVhZihcbiAgZGVwb3NpdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZSxcbiAgbWF0Y2hlcjogUGF0dGVybk1hdGNoZXJcbik6IHsgc2lnbmVyc0FnZ3JlZ2F0ZUtleTogQnVmZmVyOyBtYXhGZWU6IGJpZ2ludDsgc3RhY2tzUmVjaXBpZW50OiBCdWZmZXIgfSB7XG4gIGNvbnN0IGRlcG9zaXRQYXR0ZXJuOiBQYXR0ZXJuID0ge1xuICAgIGFuZF92OiBbeyBwYXlsb2FkX2Ryb3A6IHsgJHZhcjogJ3BheWxvYWRIZXgnIH0gfSwgeyBwazogeyAkdmFyOiAnc2lnbmVyc0tleScgfSB9XSxcbiAgfTtcbiAgY29uc3QgbWF0Y2ggPSBtYXRjaGVyLm1hdGNoKGRlcG9zaXROb2RlLCBkZXBvc2l0UGF0dGVybik7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RlcG9zaXQgbGVhZiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBwYXR0ZXJuJyk7XG4gIH1cblxuICBjb25zdCBwYXlsb2FkSGV4ID0gYXNTdHJpbmcobWF0Y2gucGF5bG9hZEhleCwgJ3BheWxvYWRfZHJvcCB2YWx1ZScpO1xuICBjb25zdCBzaWduZXJzS2V5SGV4ID0gYXNTdHJpbmcobWF0Y2guc2lnbmVyc0tleSwgJ3BrX2sga2V5Jyk7XG5cbiAgY29uc3QgZXhwZWN0ZWRQYXlsb2FkTGVuZ3RoID0gTUFYX0ZFRV9CWVRFX0xFTkdUSCArIFNUQUNLU19SRUNJUElFTlRfQllURV9MRU5HVEg7XG4gIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuZnJvbShwYXlsb2FkSGV4LCAnaGV4Jyk7XG4gIGlmIChwYXlsb2FkLmxlbmd0aCAhPT0gZXhwZWN0ZWRQYXlsb2FkTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHBheWxvYWRfZHJvcCB2YWx1ZSBtdXN0IGJlICR7ZXhwZWN0ZWRQYXlsb2FkTGVuZ3RofSBieXRlcyAoJHtleHBlY3RlZFBheWxvYWRMZW5ndGggKiAyfSBoZXggY2hhcnMpLCBnb3QgJHtcbiAgICAgICAgcGF5bG9hZC5sZW5ndGhcbiAgICAgIH0gYnl0ZXNgXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IG1heEZlZSA9IHBheWxvYWQucmVhZEJpZ1VJbnQ2NEJFKDApO1xuICBjb25zdCBzdGFja3NSZWNpcGllbnQgPSBwYXlsb2FkLnN1YmFycmF5KE1BWF9GRUVfQllURV9MRU5HVEgpO1xuXG4gIGNvbnN0IHNpZ25lcnNBZ2dyZWdhdGVLZXkgPSBCdWZmZXIuZnJvbShzaWduZXJzS2V5SGV4LCAnaGV4Jyk7XG4gIGlmIChzaWduZXJzQWdncmVnYXRlS2V5Lmxlbmd0aCAhPT0gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHNpZ25lcnNBZ2dyZWdhdGVLZXkgbXVzdCBiZSAzMiBieXRlcyB4LW9ubHksIGdvdCAke3NpZ25lcnNBZ2dyZWdhdGVLZXkubGVuZ3RofWApO1xuICB9XG5cbiAgcmV0dXJuIHsgc2lnbmVyc0FnZ3JlZ2F0ZUtleSwgbWF4RmVlLCBzdGFja3NSZWNpcGllbnQgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWNsYWltTGVhZihcbiAgcmVjbGFpbU5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZSxcbiAgbWF0Y2hlcjogUGF0dGVybk1hdGNoZXJcbik6IHsgbG9ja1RpbWU6IG51bWJlcjsgcmVjbGFpbUtleVN0cmluZ3M6IHN0cmluZ1tdIH0ge1xuICAvLyBhbmRfdihyOm9sZGVyKDxsb2NrVGltZT4pLCBtdWx0aV9hKDIsIGsxLCBrMiwgazMpKVxuICBjb25zdCByZWNsYWltUGF0dGVybjogUGF0dGVybiA9IHtcbiAgICBhbmRfdjogW3sgJ3I6b2xkZXInOiB7ICR2YXI6ICdsb2NrVGltZScgfSB9LCB7IG11bHRpX2E6IHsgJHZhcjogJ3JlY2xhaW1NdWx0aScgfSB9XSxcbiAgfTtcbiAgY29uc3QgbWF0Y2ggPSBtYXRjaGVyLm1hdGNoKHJlY2xhaW1Ob2RlLCByZWNsYWltUGF0dGVybik7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY2xhaW0gbGVhZiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBwYXR0ZXJuJyk7XG4gIH1cblxuICBjb25zdCBsb2NrVGltZSA9IGFzTnVtYmVyKG1hdGNoLmxvY2tUaW1lLCAncjpvbGRlciBhcmd1bWVudCcpO1xuICBpZiAobG9ja1RpbWUgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmVjbGFpbSBsb2NrVGltZSBtdXN0IGJlID4gMCwgZ290ICR7bG9ja1RpbWV9YCk7XG4gIH1cblxuICBjb25zdCBbdGhyZXNob2xkLCByZWNsYWltS2V5U3RyaW5nc10gPSBwYXJzZU11bHRpKG1hdGNoLnJlY2xhaW1NdWx0aSk7XG4gIGlmICh0aHJlc2hvbGQgIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJlY2xhaW0gbXVsdGlfYSB0aHJlc2hvbGQgbXVzdCBiZSAyLCBnb3QgJHt0aHJlc2hvbGR9YCk7XG4gIH1cbiAgaWYgKHJlY2xhaW1LZXlTdHJpbmdzLmxlbmd0aCAhPT0gMykge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmVjbGFpbSBtdWx0aV9hIG11c3QgaGF2ZSBleGFjdGx5IDMga2V5cywgZ290ICR7cmVjbGFpbUtleVN0cmluZ3MubGVuZ3RofWApO1xuICB9XG5cbiAgcmV0dXJuIHsgbG9ja1RpbWUsIHJlY2xhaW1LZXlTdHJpbmdzIH07XG59XG5cbmNvbnN0IEhFWF9YX09OTFlfS0VZID0gL15bMC05YS1mQS1GXXs2NH0kLztcbmNvbnN0IFhQVUJfV0lUSF9JTkRFWCA9IC9eKFsxLTlBLUhKLU5QLVphLWttLXpdKylcXC8oXFxkKykkLztcblxuLyoqXG4gKiBSZXNvbHZlIGEgc2luZ2xlIGBtdWx0aV9hYCBrZXkgZW50cnkgdG8gYSAzMi1ieXRlIHgtb25seSBwdWJsaWMga2V5LlxuICpcbiAqIEFjY2VwdHM6XG4gKiAgIC0gNjQtaGV4LWNoYXIgc3RyaW5nIOKGkiByZXR1cm5lZCBhcy1pcyAoYWxyZWFkeSB4LW9ubHkpXG4gKiAgIC0gYHhwdWIuLi4vPGluZGV4PmAg4oaSIEJJUDMyLWRlcml2ZSBhdCB0aGF0IGluZGV4IGFuZCBkcm9wIHRoZSBwcmVmaXggYnl0ZVxuICpcbiAqIFJldHVybnMgbnVsbCBmb3IgYW55IG90aGVyIHNoYXBlIChlLmcuIHdpbGRjYXJkIGB4cHViLi4uLypgLCBtYWxmb3JtZWQgaW5wdXQpLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUmVjbGFpbUtleShzOiBzdHJpbmcpOiBCdWZmZXIgfCBudWxsIHtcbiAgaWYgKEhFWF9YX09OTFlfS0VZLnRlc3QocykpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20ocywgJ2hleCcpO1xuICB9XG4gIGNvbnN0IG0gPSBzLm1hdGNoKFhQVUJfV0lUSF9JTkRFWCk7XG4gIGlmICghbSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IFssIHhwdWIsIGluZGV4U3RyXSA9IG07XG4gIGNvbnN0IGluZGV4ID0gTnVtYmVyLnBhcnNlSW50KGluZGV4U3RyLCAxMCk7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGluZGV4KSB8fCBpbmRleCA8IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBsZXQgbm9kZTtcbiAgdHJ5IHtcbiAgICBub2RlID0gQklQMzIuZnJvbUJhc2U1OCh4cHViKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gQklQMzIgcHVibGljIGtleSBpcyAzMyBieXRlcyAoMSBwcmVmaXggKyAzMiB4LW9ubHkpLiBEcm9wIHRoZSBwcmVmaXguXG4gIHJldHVybiBCdWZmZXIuZnJvbShub2RlLmRlcml2ZShpbmRleCkucHVibGljS2V5LnN1YmFycmF5KDEpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IHJlY2xhaW0tbGVhZiBrZXkgc3RyaW5ncyBpbnRvIDMyLWJ5dGUgeC1vbmx5IGJ1ZmZlcnMuIEFjY2VwdHMgYm90aFxuICogdGhlIGRlZmluaXRlL2Rlcml2ZWQgZm9ybSAoY29uY3JldGUgNjQtaGV4LWNoYXIgeC1vbmx5IGtleXMpIGFuZCB0aGUgZm9ybVxuICogcHJvZHVjZWQgYnkgYERlc2NyaXB0b3IuYXREZXJpdmF0aW9uSW5kZXgobilgIChgeHB1Yi4uLi88bj5gKS4gUmV0dXJuc1xuICogdW5kZWZpbmVkIGlmIGFueSBlbnRyeSBpcyBzdGlsbCB3aWxkY2FyZCAoYHhwdWIuLi4vKmApIG9yIG90aGVyd2lzZVxuICogdW5yZXNvbHZhYmxlLlxuICovXG5mdW5jdGlvbiByZWNsYWltS2V5c0Zyb21TdHJpbmdzKGtleVN0cmluZ3M6IHN0cmluZ1tdKTogW0J1ZmZlciwgQnVmZmVyLCBCdWZmZXJdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBrZXlTdHJpbmdzLm1hcChyZXNvbHZlUmVjbGFpbUtleSk7XG4gIGlmIChyZXNvbHZlZC5zb21lKChiKSA9PiBiID09PSBudWxsKSB8fCByZXNvbHZlZC5sZW5ndGggIT09IDMpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBbcmVzb2x2ZWRbMF0gYXMgQnVmZmVyLCByZXNvbHZlZFsxXSBhcyBCdWZmZXIsIHJlc29sdmVkWzJdIGFzIEJ1ZmZlcl07XG59XG5cbi8qKlxuICogUGFyc2UgYW4gc0JUQyBwZWctaW4gZGVwb3NpdCBkZXNjcmlwdG9yIGFuZCByZXR1cm4gaXRzIGNvbXBvbmVudHMuXG4gKlxuICogUmV0dXJucyBgbnVsbGAgaWYgdGhlIGRlc2NyaXB0b3IgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkXG4gKiBgdHIoPFVOU1BFTkRBQkxFPiwgezxkZXBvc2l0TGVhZj4sIDxyZWNsYWltTGVhZj59KWAgc2hhcGUg4oCUIHNhbWUgY29udmVudGlvblxuICogYXMgYmFieWxvbidzIGBwYXJzZVN0YWtpbmdEZXNjcmlwdG9yYC4gVGhyb3dzIGlmIHRoZSBzaGFwZSBtYXRjaGVzIGJ1dCBhXG4gKiBzdWItZmllbGQgaXMgbWFsZm9ybWVkIChlLmcuIHNpZ25lcnMga2V5IGlzbid0IDMyIGJ5dGVzLCBwYXlsb2FkIGlzbid0IDMwXG4gKiBieXRlcywgdGhyZXNob2xkIGlzbid0IDIpLlxuICpcbiAqIEFjY2VwdHMgYm90aCB0aGUgYERlc2NyaXB0b3JgIFdBU00gb2JqZWN0IChkZWZpbml0ZSBvciBkZXJpdmFibGUpIGFuZCBhXG4gKiBwcmUtZXh0cmFjdGVkIGBhc3QuRGVzY3JpcHRvck5vZGVgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNidGNEZXBvc2l0RGVzY3JpcHRvcihcbiAgZGVzY3JpcHRvcjogRGVzY3JpcHRvciB8IGFzdC5EZXNjcmlwdG9yTm9kZVxuKTogUGFyc2VkU2J0Y0RlcG9zaXREZXNjcmlwdG9yIHwgbnVsbCB7XG4gIGNvbnN0IHBhdHRlcm46IFBhdHRlcm4gPSB7XG4gICAgdHI6IFtVTlNQRU5EQUJMRV9JTlRFUk5BTF9LRVksIFt7ICR2YXI6ICdkZXBvc2l0TGVhZicgfSwgeyAkdmFyOiAncmVjbGFpbUxlYWYnIH1dXSxcbiAgfTtcblxuICBjb25zdCBtYXRjaGVyID0gbmV3IFBhdHRlcm5NYXRjaGVyKCk7XG4gIGNvbnN0IGRlc2NyaXB0b3JOb2RlID0gZGVzY3JpcHRvciBpbnN0YW5jZW9mIERlc2NyaXB0b3IgPyBhc3QuZnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcikgOiBkZXNjcmlwdG9yO1xuICBjb25zdCByZXN1bHQgPSBtYXRjaGVyLm1hdGNoKGRlc2NyaXB0b3JOb2RlLCBwYXR0ZXJuKTtcblxuICBpZiAoIXJlc3VsdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGVwb3NpdE1pbmlzY3JpcHROb2RlID0gcmVzdWx0LmRlcG9zaXRMZWFmIGFzIGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgbGV0IHJlY2xhaW1NaW5pc2NyaXB0Tm9kZSA9IHJlc3VsdC5yZWNsYWltTGVhZiBhcyBhc3QuTWluaXNjcmlwdE5vZGU7XG5cbiAgY29uc3QgeyBzaWduZXJzQWdncmVnYXRlS2V5LCBtYXhGZWUsIHN0YWNrc1JlY2lwaWVudCB9ID0gcGFyc2VEZXBvc2l0TGVhZihkZXBvc2l0TWluaXNjcmlwdE5vZGUsIG1hdGNoZXIpO1xuICBjb25zdCB7IGxvY2tUaW1lLCByZWNsYWltS2V5U3RyaW5ncyB9ID0gcGFyc2VSZWNsYWltTGVhZihyZWNsYWltTWluaXNjcmlwdE5vZGUsIG1hdGNoZXIpO1xuXG4gIGNvbnN0IHJlY2xhaW1LZXlzID0gcmVjbGFpbUtleXNGcm9tU3RyaW5ncyhyZWNsYWltS2V5U3RyaW5ncyk7XG4gIGlmIChyZWNsYWltS2V5cykge1xuICAgIC8vIFJld3JpdGUgdGhlIHJlY2xhaW0gbGVhZiB3aXRoIGNvbmNyZXRlIGhleCBrZXlzIHdoZW4gd2UgY2FuIHJlc29sdmVcbiAgICAvLyB0aGVtIOKAlCBgTWluaXNjcmlwdC5mcm9tU3RyaW5nKC4uLiwgJ3RhcCcpYCBvbmx5IGFjY2VwdHMgeC1vbmx5IGhleCBpblxuICAgIC8vIGBtdWx0aV9hYCwgbm90IHhwdWItZm9ybSBzdHJpbmdzLiBXaXRoIHRoaXMgcmV3cml0ZSB0aGUgZm9ybWF0dGVkXG4gICAgLy8gbGVhZiBpcyBkaXJlY3RseSBjb21waWxhYmxlOyB3aXRob3V0IGl0IGNhbGxlcnMgbXVzdCBkbyB0aGVcbiAgICAvLyByZXNvbHV0aW9uIHRoZW1zZWx2ZXMuXG4gICAgcmVjbGFpbU1pbmlzY3JpcHROb2RlID0ge1xuICAgICAgYW5kX3Y6IFt7ICdyOm9sZGVyJzogbG9ja1RpbWUgfSwgeyBtdWx0aV9hOiBbMiwgLi4ucmVjbGFpbUtleXMubWFwKChrKSA9PiBrLnRvU3RyaW5nKCdoZXgnKSldIH1dLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNpZ25lcnNBZ2dyZWdhdGVLZXksXG4gICAgbWF4RmVlLFxuICAgIHN0YWNrc1JlY2lwaWVudCxcbiAgICBsb2NrVGltZSxcbiAgICByZWNsYWltS2V5cyxcbiAgICBkZXBvc2l0TWluaXNjcmlwdE5vZGUsXG4gICAgcmVjbGFpbU1pbmlzY3JpcHROb2RlLFxuICB9O1xufVxuIl19
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VEZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NidGMvcGFyc2VEZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQVcsTUFBTSxrQ0FBa0MsQ0FBQztBQUUzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsNEJBQTRCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUEyQzFHLFNBQVMsUUFBUSxDQUFDLENBQVUsRUFBRSxLQUFhO0lBQ3pDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssbUJBQW1CLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBVSxFQUFFLEtBQWE7SUFDekMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxLQUFjO0lBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ25DLElBQUksT0FBTyxTQUFT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QVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNqRyxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU87UUFDTCxtQkFBbUI7UUFDbkIsTUFBTTtRQUNOLGVBQWU7UUFDZixRQUFRO1FBQ1IsV0FBVztRQUNYLGlCQUFpQixFQUFFLHNCQUFzQjtRQUN6QyxxQkFBcUI7UUFDckIscUJBQXFCO0tBQ3RCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQklQMzIsIERlc2NyaXB0b3IsIGFzdCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHsgUGF0dGVybk1hdGNoZXIsIFBhdHRlcm4gfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWNvcmUvZGVzY3JpcHRvcic7XG5cbmltcG9ydCB7IE1BWF9GRUVfQllURV9MRU5HVEgsIFNUQUNLU19SRUNJUElFTlRfQllURV9MRU5HVEgsIFVOU1BFTkRBQkxFX0lOVEVSTkFMX0tFWSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBQYXJzZWQgY29tcG9uZW50cyBvZiBhbiBzQlRDIHBlZy1pbiBkZXBvc2l0IGRlc2NyaXB0b3IuXG4gKlxuICogVGhlIHBhcnNlciByZXR1cm5zIGJvdGggdGhlIGhpZ2gtbGV2ZWxcbiAqIGZpZWxkcyBjYWxsZXJzIHVzdWFsbHkgbmVlZCAoa2V5cywgbG9ja1RpbWUsIGZlZSwgcmVjaXBpZW50KSBhbmQgdGhlIHJhd1xuICogbWluaXNjcmlwdCBBU1Qgbm9kZXMgc28gdGhlIGxlYXZlcyBjYW4gYmUgcmUtY29tcGlsZWQgaW50byBhXG4gKiBgTWluaXNjcmlwdGAgdmlhIGBhc3QuZm9ybWF0Tm9kZWAgKyBgTWluaXNjcmlwdC5mcm9tU3RyaW5nYC5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyc2VkU2J0Y0RlcG9zaXREZXNjcmlwdG9yID0ge1xuICAvKiogMzItYnl0ZSB4LW9ubHkgc2lnbmVycyBhZ2dyZWdhdGUga2V5IGZyb20gdGhlIGRlcG9zaXQgbGVhZi4gKi9cbiAgc2lnbmVyc0FnZ3JlZ2F0ZUtleTogQnVmZmVyO1xuICAvKiogTWF4IHNpZ25lciBmZWUgcGFyc2VkIGZyb20gdGhlIGZpcnN0IDggYnl0ZXMgb2YgdGhlIHBheWxvYWRfZHJvcCB2YWx1ZS4gKi9cbiAgbWF4RmVlOiBiaWdpbnQ7XG4gIC8qKiAyMi1ieXRlIFN0YWNrcyByZWNpcGllbnQgcGFyc2VkIGZyb20gdGhlIHRyYWlsaW5nIGJ5dGVzIG9mIHRoZSBwYXlsb2FkLiAqL1xuICBzdGFja3NSZWNpcGllbnQ6IEJ1ZmZlcjtcbiAgLyoqIFJlY2xhaW0tbGVhZiByZWxhdGl2ZSB0aW1lbG9jayAobnVtYmVyIG9mIEJpdGNvaW4gYmxvY2tzLCBPUF9DU1YgYXJndW1lbnQpLiAqL1xuICBsb2NrVGltZTogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHRocmVlIGNvbmNyZXRlIHgtb25seSByZWNsYWltIGtleXMgZnJvbSB0aGUgcmVjbGFpbS1sZWFmIGBtdWx0aV9hYCxcbiAgICogaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluc2lkZSB0aGUgbGVhZiAoZGVzY3JpcHRvciBsaWJyYXJ5IHNvcnRzIGJ5IGhleCkuXG4gICAqIE9ubHkgcHJlc2VudCB3aGVuIHRoZSBkZXNjcmlwdG9yIGlzIGluIGl0cyBkZXJpdmVkL2RlZmluaXRlIGZvcm0g4oCUIGZvclxuICAgKiBkZXJpdmFibGUgZGVzY3JpcHRvcnMgdGhlIG11bHRpX2EgZW50cmllcyBhcmUgeHB1YiBzdHJpbmdzIChlLmcuXG4gICAqIGB4cHViLi4uLypgKSwgd2hpY2ggY2FuJ3QgYmUgdHVybmVkIGludG8gMzItYnl0ZSBidWZmZXJzIHdpdGhvdXQgcGlja2luZ1xuICAgKiBhIGRlcml2YXRpb24gaW5kZXguIENhbGxlcnMgdGhhdCBuZWVkIHJhdyBrZXkgYnl0ZXMgTVVTVCBwYXNzIHRoZVxuICAgKiBkZXJpdmVkIGRlc2NyaXB0b3IgKHNlZSBgZGVyaXZlUmVjbGFpbUtleXNgIGZvciBkZXJpdmFibGUgaW5wdXRzKS5cbiAgICovXG4gIHJlY2xhaW1LZXlzOiBbQnVmZmVyLCBCdWZmZXIsIEJ1ZmZlcl0gfCB1bmRlZmluZWQ7XG4gIC8qKiBSYXcgbWluaXNjcmlwdCBBU1QgZm9yIHRoZSBkZXBvc2l0IGxlYWYgKGZpcnN0IHRhcC10cmVlIGxlYWYpLiAqL1xuICBkZXBvc2l0TWluaXNjcmlwdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgLyoqIFJhdyBtaW5pc2NyaXB0IEFTVCBmb3IgdGhlIHJlY2xhaW0gbGVhZiAoc2Vjb25kIHRhcC10cmVlIGxlYWYpLiAqL1xuICByZWNsYWltTWluaXNjcmlwdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgLyoqXG4gICAqIFRoZSB0aHJlZSByYXcgYG11bHRpX2FgIGtleSBlbnRyaWVzIGZyb20gdGhlIHJlY2xhaW0gbGVhZiwgZXhhY3RseSBhc1xuICAgKiB0aGV5IGFwcGVhciBpbiB0aGUgZGVzY3JpcHRvciDigJQgYHhwdWIuLi4vKmAgZm9yIGRlcml2YWJsZSBkZXNjcmlwdG9ycyBhbmRcbiAgICogNjQtaGV4LWNoYXIgeC1vbmx5IGtleXMgZm9yIGRlZmluaXRlIGRlc2NyaXB0b3JzLiBVc2VmdWwgZm9yIGNhbGxlcnMgdGhhdFxuICAgKiBuZWVkIHRoZSBvcmlnaW5hbCB4cHViIGZvcm0gKGUuZy4gdG8gcm91bmQtdHJpcCBiYWNrIHRvIGEgZGVzY3JpcHRvclxuICAgKiBidWlsZGVyKSBhbmQgZG9uJ3Qgd2FudCB0aGUgcmVzb2x2ZWQgYHJlY2xhaW1LZXlzYCBidWZmZXJzLlxuICAgKi9cbiAgcmVjbGFpbUtleVN0cmluZ3M6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXTtcbn07XG5cbmZ1bmN0aW9uIGFzU3RyaW5nKHY6IHVua25vd24sIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHYgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2ZpZWxkfSBtdXN0IGJlIGEgc3RyaW5nYCk7XG4gIH1cbiAgcmV0dXJuIHY7XG59XG5cbmZ1bmN0aW9uIGFzTnVtYmVyKHY6IHVua25vd24sIGZpZWxkOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHYgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2ZpZWxkfSBtdXN0IGJlIGEgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIHY7XG59XG5cbi8qKlxuICogUHVsbCBgW3RocmVzaG9sZCwgLi4ua2V5c11gIG91dCBvZiBhIGBtdWx0aV9hYCBBU1Qgbm9kZSB2YWx1ZSwgdmFsaWRhdGluZ1xuICogZWFjaCBlbGVtZW50LiBUaGUgZGVzY3JpcHRvcidzIGBtdWx0aV9hYCBpcyByZW5kZXJlZCB3aXRoIGtleXMgZWl0aGVyIGFzXG4gKiBjb25jcmV0ZSBoZXggKGRlZmluaXRlIGRlc2NyaXB0b3IpIG9yIGFzIHhwdWIgc3RyaW5ncyBlbmRpbmcgaW4gYC8qYFxuICogKGRlcml2YWJsZSBkZXNjcmlwdG9yKSDigJQgYm90aCBhcmUgc3RyaW5ncyBoZXJlLCBzbyB3ZSBkb24ndCB0cnkgdG8gY29udmVydFxuICogdG8gQnVmZmVyIGF0IHRoaXMgbGV2ZWwuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTXVsdGkobXVsdGk6IHVua25vd24pOiBbbnVtYmVyLCBzdHJpbmdbXV0ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobXVsdGkpIHx8IG11bHRpLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbXVsdGlfYSBzdHJ1Y3R1cmU6IG5vdCBhbiBhcnJheSBvciBlbXB0eScpO1xuICB9XG4gIGNvbnN0IFt0aHJlc2hvbGQsIC4uLmtleXNdID0gbXVsdGk7XG4gIGlmICh0eXBlb2YgdGhyZXNob2xkICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtdWx0aV9hIHN0cnVjdHVyZTogdGhyZXNob2xkIGlzIG5vdCBhIG51bWJlcicpO1xuICB9XG4gIGlmICgha2V5cy5ldmVyeSgoaykgPT4gdHlwZW9mIGsgPT09ICdzdHJpbmcnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtdWx0aV9hIHN0cnVjdHVyZTogbm90IGFsbCBrZXlzIGFyZSBzdHJpbmdzJyk7XG4gIH1cbiAgcmV0dXJuIFt0aHJlc2hvbGQsIGtleXNdO1xufVxuXG5mdW5jdGlvbiBwYXJzZURlcG9zaXRMZWFmKFxuICBkZXBvc2l0Tm9kZTogYXN0Lk1pbmlzY3JpcHROb2RlLFxuICBtYXRjaGVyOiBQYXR0ZXJuTWF0Y2hlclxuKTogeyBzaWduZXJzQWdncmVnYXRlS2V5OiBCdWZmZXI7IG1heEZlZTogYmlnaW50OyBzdGFja3NSZWNpcGllbnQ6IEJ1ZmZlciB9IHtcbiAgY29uc3QgZGVwb3NpdFBhdHRlcm46IFBhdHRlcm4gPSB7XG4gICAgYW5kX3Y6IFt7IHBheWxvYWRfZHJvcDogeyAkdmFyOiAncGF5bG9hZEhleCcgfSB9LCB7IHBrOiB7ICR2YXI6ICdzaWduZXJzS2V5JyB9IH1dLFxuICB9O1xuICBjb25zdCBtYXRjaCA9IG1hdGNoZXIubWF0Y2goZGVwb3NpdE5vZGUsIGRlcG9zaXRQYXR0ZXJuKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRGVwb3NpdCBsZWFmIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHBhdHRlcm4nKTtcbiAgfVxuXG4gIGNvbnN0IHBheWxvYWRIZXggPSBhc1N0cmluZyhtYXRjaC5wYXlsb2FkSGV4LCAncGF5bG9hZF9kcm9wIHZhbHVlJyk7XG4gIGNvbnN0IHNpZ25lcnNLZXlIZXggPSBhc1N0cmluZyhtYXRjaC5zaWduZXJzS2V5LCAncGtfayBrZXknKTtcblxuICBjb25zdCBleHBlY3RlZFBheWxvYWRMZW5ndGggPSBNQVhfRkVFX0JZVEVfTEVOR1RIICsgU1RBQ0tTX1JFQ0lQSUVOVF9CWVRFX0xFTkdUSDtcbiAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5mcm9tKHBheWxvYWRIZXgsICdoZXgnKTtcbiAgaWYgKHBheWxvYWQubGVuZ3RoICE9PSBleHBlY3RlZFBheWxvYWRMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgcGF5bG9hZF9kcm9wIHZhbHVlIG11c3QgYmUgJHtleHBlY3RlZFBheWxvYWRMZW5ndGh9IGJ5dGVzICgke2V4cGVjdGVkUGF5bG9hZExlbmd0aCAqIDJ9IGhleCBjaGFycyksIGdvdCAke1xuICAgICAgICBwYXlsb2FkLmxlbmd0aFxuICAgICAgfSBieXRlc2BcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbWF4RmVlID0gcGF5bG9hZC5yZWFkQmlnVUludDY0QkUoMCk7XG4gIGNvbnN0IHN0YWNrc1JlY2lwaWVudCA9IHBheWxvYWQuc3ViYXJyYXkoTUFYX0ZFRV9CWVRFX0xFTkdUSCk7XG5cbiAgY29uc3Qgc2lnbmVyc0FnZ3JlZ2F0ZUtleSA9IEJ1ZmZlci5mcm9tKHNpZ25lcnNLZXlIZXgsICdoZXgnKTtcbiAgaWYgKHNpZ25lcnNBZ2dyZWdhdGVLZXkubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgc2lnbmVyc0FnZ3JlZ2F0ZUtleSBtdXN0IGJlIDMyIGJ5dGVzIHgtb25seSwgZ290ICR7c2lnbmVyc0FnZ3JlZ2F0ZUtleS5sZW5ndGh9YCk7XG4gIH1cblxuICByZXR1cm4geyBzaWduZXJzQWdncmVnYXRlS2V5LCBtYXhGZWUsIHN0YWNrc1JlY2lwaWVudCB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVJlY2xhaW1MZWFmKFxuICByZWNsYWltTm9kZTogYXN0Lk1pbmlzY3JpcHROb2RlLFxuICBtYXRjaGVyOiBQYXR0ZXJuTWF0Y2hlclxuKTogeyBsb2NrVGltZTogbnVtYmVyOyByZWNsYWltS2V5U3RyaW5nczogc3RyaW5nW10gfSB7XG4gIC8vIGFuZF92KHI6b2xkZXIoPGxvY2tUaW1lPiksIG11bHRpX2EoMiwgazEsIGsyLCBrMykpXG4gIGNvbnN0IHJlY2xhaW1QYXR0ZXJuOiBQYXR0ZXJuID0ge1xuICAgIGFuZF92OiBbeyAncjpvbGRlcic6IHsgJHZhcjogJ2xvY2tUaW1lJyB9IH0sIHsgbXVsdGlfYTogeyAkdmFyOiAncmVjbGFpbU11bHRpJyB9IH1dLFxuICB9O1xuICBjb25zdCBtYXRjaCA9IG1hdGNoZXIubWF0Y2gocmVjbGFpbU5vZGUsIHJlY2xhaW1QYXR0ZXJuKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVjbGFpbSBsZWFmIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHBhdHRlcm4nKTtcbiAgfVxuXG4gIGNvbnN0IGxvY2tUaW1lID0gYXNOdW1iZXIobWF0Y2gubG9ja1RpbWUsICdyOm9sZGVyIGFyZ3VtZW50Jyk7XG4gIGlmIChsb2NrVGltZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGByZWNsYWltIGxvY2tUaW1lIG11c3QgYmUgPiAwLCBnb3QgJHtsb2NrVGltZX1gKTtcbiAgfVxuXG4gIGNvbnN0IFt0aHJlc2hvbGQsIHJlY2xhaW1LZXlTdHJpbmdzXSA9IHBhcnNlTXVsdGkobWF0Y2gucmVjbGFpbU11bHRpKTtcbiAgaWYgKHRocmVzaG9sZCAhPT0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmVjbGFpbSBtdWx0aV9hIHRocmVzaG9sZCBtdXN0IGJlIDIsIGdvdCAke3RocmVzaG9sZH1gKTtcbiAgfVxuICBpZiAocmVjbGFpbUtleVN0cmluZ3MubGVuZ3RoICE9PSAzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGByZWNsYWltIG11bHRpX2EgbXVzdCBoYXZlIGV4YWN0bHkgMyBrZXlzLCBnb3QgJHtyZWNsYWltS2V5U3RyaW5ncy5sZW5ndGh9YCk7XG4gIH1cblxuICByZXR1cm4geyBsb2NrVGltZSwgcmVjbGFpbUtleVN0cmluZ3MgfTtcbn1cblxuY29uc3QgSEVYX1hfT05MWV9LRVkgPSAvXlswLTlhLWZBLUZdezY0fSQvO1xuY29uc3QgWFBVQl9XSVRIX0lOREVYID0gL14oWzEtOUEtSEotTlAtWmEta20tel0rKVxcLyhcXGQrKSQvO1xuXG4vKipcbiAqIFJlc29sdmUgYSBzaW5nbGUgYG11bHRpX2FgIGtleSBlbnRyeSB0byBhIDMyLWJ5dGUgeC1vbmx5IHB1YmxpYyBrZXkuXG4gKlxuICogQWNjZXB0czpcbiAqICAgLSA2NC1oZXgtY2hhciBzdHJpbmcg4oaSIHJldHVybmVkIGFzLWlzIChhbHJlYWR5IHgtb25seSlcbiAqICAgLSBgeHB1Yi4uLi88aW5kZXg+YCDihpIgQklQMzItZGVyaXZlIGF0IHRoYXQgaW5kZXggYW5kIGRyb3AgdGhlIHByZWZpeCBieXRlXG4gKlxuICogUmV0dXJucyBudWxsIGZvciBhbnkgb3RoZXIgc2hhcGUgKGUuZy4gd2lsZGNhcmQgYHhwdWIuLi4vKmAsIG1hbGZvcm1lZCBpbnB1dCkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZWNsYWltS2V5KHM6IHN0cmluZyk6IEJ1ZmZlciB8IG51bGwge1xuICBpZiAoSEVYX1hfT05MWV9LRVkudGVzdChzKSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShzLCAnaGV4Jyk7XG4gIH1cbiAgY29uc3QgbSA9IHMubWF0Y2goWFBVQl9XSVRIX0lOREVYKTtcbiAgaWYgKCFtKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgWywgeHB1YiwgaW5kZXhTdHJdID0gbTtcbiAgY29uc3QgaW5kZXggPSBOdW1iZXIucGFyc2VJbnQoaW5kZXhTdHIsIDEwKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoaW5kZXgpIHx8IGluZGV4IDwgMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGxldCBub2RlO1xuICB0cnkge1xuICAgIG5vZGUgPSBCSVAzMi5mcm9tQmFzZTU4KHhwdWIpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBCSVAzMiBwdWJsaWMga2V5IGlzIDMzIGJ5dGVzICgxIHByZWZpeCArIDMyIHgtb25seSkuIERyb3AgdGhlIHByZWZpeC5cbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKG5vZGUuZGVyaXZlKGluZGV4KS5wdWJsaWNLZXkuc3ViYXJyYXkoMSkpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgcmVjbGFpbS1sZWFmIGtleSBzdHJpbmdzIGludG8gMzItYnl0ZSB4LW9ubHkgYnVmZmVycy4gQWNjZXB0cyBib3RoXG4gKiB0aGUgZGVmaW5pdGUvZGVyaXZlZCBmb3JtIChjb25jcmV0ZSA2NC1oZXgtY2hhciB4LW9ubHkga2V5cykgYW5kIHRoZSBmb3JtXG4gKiBwcm9kdWNlZCBieSBgRGVzY3JpcHRvci5hdERlcml2YXRpb25JbmRleChuKWAgKGB4cHViLi4uLzxuPmApLiBSZXR1cm5zXG4gKiB1bmRlZmluZWQgaWYgYW55IGVudHJ5IGlzIHN0aWxsIHdpbGRjYXJkIChgeHB1Yi4uLi8qYCkgb3Igb3RoZXJ3aXNlXG4gKiB1bnJlc29sdmFibGUuXG4gKi9cbmZ1bmN0aW9uIHJlY2xhaW1LZXlzRnJvbVN0cmluZ3Moa2V5U3RyaW5nczogc3RyaW5nW10pOiBbQnVmZmVyLCBCdWZmZXIsIEJ1ZmZlcl0gfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZCA9IGtleVN0cmluZ3MubWFwKHJlc29sdmVSZWNsYWltS2V5KTtcbiAgaWYgKHJlc29sdmVkLnNvbWUoKGIpID0+IGIgPT09IG51bGwpIHx8IHJlc29sdmVkLmxlbmd0aCAhPT0gMykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIFtyZXNvbHZlZFswXSBhcyBCdWZmZXIsIHJlc29sdmVkWzFdIGFzIEJ1ZmZlciwgcmVzb2x2ZWRbMl0gYXMgQnVmZmVyXTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBzQlRDIHBlZy1pbiBkZXBvc2l0IGRlc2NyaXB0b3IgYW5kIHJldHVybiBpdHMgY29tcG9uZW50cy5cbiAqXG4gKiBSZXR1cm5zIGBudWxsYCBpZiB0aGUgZGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWRcbiAqIGB0cig8VU5TUEVOREFCTEU+LCB7PGRlcG9zaXRMZWFmPiwgPHJlY2xhaW1MZWFmPn0pYCBzaGFwZSDigJQgc2FtZSBjb252ZW50aW9uXG4gKiBhcyBiYWJ5bG9uJ3MgYHBhcnNlU3Rha2luZ0Rlc2NyaXB0b3JgLiBUaHJvd3MgaWYgdGhlIHNoYXBlIG1hdGNoZXMgYnV0IGFcbiAqIHN1Yi1maWVsZCBpcyBtYWxmb3JtZWQgKGUuZy4gc2lnbmVycyBrZXkgaXNuJ3QgMzIgYnl0ZXMsIHBheWxvYWQgaXNuJ3QgMzBcbiAqIGJ5dGVzLCB0aHJlc2hvbGQgaXNuJ3QgMikuXG4gKlxuICogQWNjZXB0cyBib3RoIHRoZSBgRGVzY3JpcHRvcmAgV0FTTSBvYmplY3QgKGRlZmluaXRlIG9yIGRlcml2YWJsZSkgYW5kIGFcbiAqIHByZS1leHRyYWN0ZWQgYGFzdC5EZXNjcmlwdG9yTm9kZWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2J0Y0RlcG9zaXREZXNjcmlwdG9yKFxuICBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yIHwgYXN0LkRlc2NyaXB0b3JOb2RlXG4pOiBQYXJzZWRTYnRjRGVwb3NpdERlc2NyaXB0b3IgfCBudWxsIHtcbiAgY29uc3QgcGF0dGVybjogUGF0dGVybiA9IHtcbiAgICB0cjogW1VOU1BFTkRBQkxFX0lOVEVSTkFMX0tFWSwgW3sgJHZhcjogJ2RlcG9zaXRMZWFmJyB9LCB7ICR2YXI6ICdyZWNsYWltTGVhZicgfV1dLFxuICB9O1xuXG4gIGNvbnN0IG1hdGNoZXIgPSBuZXcgUGF0dGVybk1hdGNoZXIoKTtcbiAgY29uc3QgZGVzY3JpcHRvck5vZGUgPSBkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGVzY3JpcHRvciA/IGFzdC5mcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKSA6IGRlc2NyaXB0b3I7XG4gIGNvbnN0IHJlc3VsdCA9IG1hdGNoZXIubWF0Y2goZGVzY3JpcHRvck5vZGUsIHBhdHRlcm4pO1xuXG4gIGlmICghcmVzdWx0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBkZXBvc2l0TWluaXNjcmlwdE5vZGUgPSByZXN1bHQuZGVwb3NpdExlYWYgYXMgYXN0Lk1pbmlzY3JpcHROb2RlO1xuICBsZXQgcmVjbGFpbU1pbmlzY3JpcHROb2RlID0gcmVzdWx0LnJlY2xhaW1MZWFmIGFzIGFzdC5NaW5pc2NyaXB0Tm9kZTtcblxuICBjb25zdCB7IHNpZ25lcnNBZ2dyZWdhdGVLZXksIG1heEZlZSwgc3RhY2tzUmVjaXBpZW50IH0gPSBwYXJzZURlcG9zaXRMZWFmKGRlcG9zaXRNaW5pc2NyaXB0Tm9kZSwgbWF0Y2hlcik7XG4gIGNvbnN0IHsgbG9ja1RpbWUsIHJlY2xhaW1LZXlTdHJpbmdzIH0gPSBwYXJzZVJlY2xhaW1MZWFmKHJlY2xhaW1NaW5pc2NyaXB0Tm9kZSwgbWF0Y2hlcik7XG4gIGNvbnN0IHJlY2xhaW1LZXlTdHJpbmdzVHVwbGU6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSA9IFtcbiAgICByZWNsYWltS2V5U3RyaW5nc1swXSxcbiAgICByZWNsYWltS2V5U3RyaW5nc1sxXSxcbiAgICByZWNsYWltS2V5U3RyaW5nc1syXSxcbiAgXTtcblxuICBjb25zdCByZWNsYWltS2V5cyA9IHJlY2xhaW1LZXlzRnJvbVN0cmluZ3MocmVjbGFpbUtleVN0cmluZ3MpO1xuICBpZiAocmVjbGFpbUtleXMpIHtcbiAgICAvLyBSZXdyaXRlIHRoZSByZWNsYWltIGxlYWYgd2l0aCBjb25jcmV0ZSBoZXgga2V5cyB3aGVuIHdlIGNhbiByZXNvbHZlXG4gICAgLy8gdGhlbSDigJQgYE1pbmlzY3JpcHQuZnJvbVN0cmluZyguLi4sICd0YXAnKWAgb25seSBhY2NlcHRzIHgtb25seSBoZXggaW5cbiAgICAvLyBgbXVsdGlfYWAsIG5vdCB4cHViLWZvcm0gc3RyaW5ncy4gV2l0aCB0aGlzIHJld3JpdGUgdGhlIGZvcm1hdHRlZFxuICAgIC8vIGxlYWYgaXMgZGlyZWN0bHkgY29tcGlsYWJsZTsgd2l0aG91dCBpdCBjYWxsZXJzIG11c3QgZG8gdGhlXG4gICAgLy8gcmVzb2x1dGlvbiB0aGVtc2VsdmVzLlxuICAgIHJlY2xhaW1NaW5pc2NyaXB0Tm9kZSA9IHtcbiAgICAgIGFuZF92OiBbeyAncjpvbGRlcic6IGxvY2tUaW1lIH0sIHsgbXVsdGlfYTogWzIsIC4uLnJlY2xhaW1LZXlzLm1hcCgoaykgPT4gay50b1N0cmluZygnaGV4JykpXSB9XSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzaWduZXJzQWdncmVnYXRlS2V5LFxuICAgIG1heEZlZSxcbiAgICBzdGFja3NSZWNpcGllbnQsXG4gICAgbG9ja1RpbWUsXG4gICAgcmVjbGFpbUtleXMsXG4gICAgcmVjbGFpbUtleVN0cmluZ3M6IHJlY2xhaW1LZXlTdHJpbmdzVHVwbGUsXG4gICAgZGVwb3NpdE1pbmlzY3JpcHROb2RlLFxuICAgIHJlY2xhaW1NaW5pc2NyaXB0Tm9kZSxcbiAgfTtcbn1cbiJdfQ==