@bitgo-beta/utxo-descriptors 0.0.1-beta.236 → 0.0.1-beta.238

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.
@@ -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"}
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.sbtc = void 0;
36
+ exports.pox5 = exports.sbtc = void 0;
37
37
  exports.sbtc = __importStar(require("./sbtc"));
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQStCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogYXMgc2J0YyBmcm9tICcuL3NidGMnO1xuIl19
38
+ exports.pox5 = __importStar(require("./pox5"));
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQStCO0FBQy9CLCtDQUErQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGFzIHNidGMgZnJvbSAnLi9zYnRjJztcbmV4cG9ydCAqIGFzIHBveDUgZnJvbSAnLi9wb3g1JztcbiJdfQ==
@@ -0,0 +1,22 @@
1
+ import { bip32 } 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): string;
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,EAAc,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,MAAM,CAoBrF;AAED,wEAAwE;AACxE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,0BAA0B,EAAE,eAAe,SAAI,GAAG,MAAM,CAQ5G;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,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPox5LockupDescriptor = createPox5LockupDescriptor;
4
+ exports.createPox5LockupScriptPubKey = createPox5LockupScriptPubKey;
5
+ exports.derivePox5StakerKeys = derivePox5StakerKeys;
6
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
7
+ function validateCompressedKey(key, field) {
8
+ if (key.length !== 33 || (key[0] !== 0x02 && key[0] !== 0x03)) {
9
+ throw new Error(`${field} must be a 33-byte compressed public key`);
10
+ }
11
+ }
12
+ function isBip32Triple(keys) {
13
+ return keys.every((key) => !Buffer.isBuffer(key));
14
+ }
15
+ function asDescriptorKey(key, field) {
16
+ if (Buffer.isBuffer(key)) {
17
+ validateCompressedKey(key, field);
18
+ return key.toString('hex');
19
+ }
20
+ return key.neutered().toBase58() + '/*';
21
+ }
22
+ function validateParams(params) {
23
+ if (!Number.isSafeInteger(params.unlockHeight) || params.unlockHeight <= 0 || params.unlockHeight >= 500000000) {
24
+ throw new Error(`unlockHeight (${params.unlockHeight}) must be a positive block height below 500000000`);
25
+ }
26
+ if (params.stakerCommitment.length !== 32) {
27
+ throw new Error(`stakerCommitment must be 32 bytes (got ${params.stakerCommitment.length})`);
28
+ }
29
+ validateCompressedKey(params.earlyExitKey, 'earlyExitKey');
30
+ const bufferCount = params.stakerKeys.filter(Buffer.isBuffer).length;
31
+ if (bufferCount !== 0 && bufferCount !== params.stakerKeys.length) {
32
+ throw new Error('stakerKeys must contain either three BIP32 keys or three compressed public keys');
33
+ }
34
+ params.stakerKeys.forEach((key, index) => {
35
+ if (Buffer.isBuffer(key)) {
36
+ validateCompressedKey(key, `stakerKeys[${index}]`);
37
+ }
38
+ });
39
+ }
40
+ /**
41
+ * Build the canonical PoX-5 P2WSH descriptor. The post-CLTV and early-exit
42
+ * paths share BitGo's standard 2-of-3 compressed-key multisig tail.
43
+ */
44
+ function createPox5LockupDescriptor(params) {
45
+ validateParams(params);
46
+ const stakerKeys = params.stakerKeys.map((key, index) => asDescriptorKey(key, `stakerKeys[${index}]`));
47
+ const miniscript = {
48
+ and_v: [
49
+ {
50
+ 'v:or_i': [
51
+ { after: params.unlockHeight },
52
+ {
53
+ and_v: [
54
+ { 'v:sha256': params.stakerCommitment.toString('hex') },
55
+ { pk: params.earlyExitKey.toString('hex') },
56
+ ],
57
+ },
58
+ ],
59
+ },
60
+ { multi: [2, ...stakerKeys] },
61
+ ],
62
+ };
63
+ return wasm_utxo_1.ast.formatNode({ wsh: miniscript });
64
+ }
65
+ /** Compile the PoX-5 P2WSH scriptPubKey at a BIP32 derivation index. */
66
+ function createPox5LockupScriptPubKey(params, derivationIndex = 0) {
67
+ const descriptor = createPox5LockupDescriptor(params);
68
+ if (isBip32Triple(params.stakerKeys)) {
69
+ return Buffer.from(wasm_utxo_1.Descriptor.fromString(descriptor, 'derivable').atDerivationIndex(derivationIndex).scriptPubkey());
70
+ }
71
+ return Buffer.from(wasm_utxo_1.Descriptor.fromString(descriptor, 'definite').scriptPubkey());
72
+ }
73
+ /** Derive the compressed staker keys needed to prepare a witness at an index. */
74
+ function derivePox5StakerKeys(stakerKeys, index) {
75
+ const keys = stakerKeys.map((key) => Buffer.from(key.derive(index).publicKey));
76
+ return [keys[0], keys[1], keys[2]];
77
+ }
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wb3g1L2Rlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEyREEsZ0VBb0JDO0FBR0Qsb0VBUUM7QUFHRCxvREFNQztBQW5HRCxnREFBMEQ7QUFlMUQsU0FBUyxxQkFBcUIsQ0FBQyxHQUFXLEVBQUUsS0FBYTtJQUN2RCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM5RCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSywwQ0FBMEMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQ3BCLElBQThDO0lBRTlDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEdBQWtCLEVBQUUsS0FBYTtJQUN4RCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN6QixxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEMsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDMUMsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLE1BQWtDO0lBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxNQUFN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QUVELGlGQUFpRjtBQUNqRixTQUFnQixvQkFBb0IsQ0FDbEMsVUFBNEQsRUFDNUQsS0FBYTtJQUViLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQy9FLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3QsIGJpcDMyLCBEZXNjcmlwdG9yIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbnR5cGUgQklQMzJJbnRlcmZhY2UgPSBiaXAzMi5CSVAzMkludGVyZmFjZTtcblxuZXhwb3J0IHR5cGUgUG94NVN0YWtlcktleSA9IEJJUDMySW50ZXJmYWNlIHwgQnVmZmVyO1xuXG5leHBvcnQgdHlwZSBQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtcyA9IHtcbiAgdW5sb2NrSGVpZ2h0OiBudW1iZXI7XG4gIC8qKiBzaGEyNTYoc2hhMjU2KENsYXJpdHkgY29uc2Vuc3VzIHByaW5jaXBhbCBieXRlcykpLiAqL1xuICBzdGFrZXJDb21taXRtZW50OiBCdWZmZXI7XG4gIGVhcmx5RXhpdEtleTogQnVmZmVyO1xuICAvKiogVXNlciwgYmFja3VwLCBhbmQgQml0R28ga2V5cywgYWxsIEJJUDMyIG9yIGFsbCBjb25jcmV0ZSBjb21wcmVzc2VkIGtleXMuICovXG4gIHN0YWtlcktleXM6IFtQb3g1U3Rha2VyS2V5LCBQb3g1U3Rha2VyS2V5LCBQb3g1U3Rha2VyS2V5XTtcbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ29tcHJlc3NlZEtleShrZXk6IEJ1ZmZlciwgZmllbGQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoa2V5Lmxlbmd0aCAhPT0gMzMgfHwgKGtleVswXSAhPT0gMHgwMiAmJiBrZXlbMF0gIT09IDB4MDMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2ZpZWxkfSBtdXN0IGJlIGEgMzMtYnl0ZSBjb21wcmVzc2VkIHB1YmxpYyBrZXlgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0JpcDMyVHJpcGxlKFxuICBrZXlzOiBQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtc1snc3Rha2VyS2V5cyddXG4pOiBrZXlzIGlzIFtCSVAzMkludGVyZmFjZSwgQklQMzJJbnRlcmZhY2UsIEJJUDMySW50ZXJmYWNlXSB7XG4gIHJldHVybiBrZXlzLmV2ZXJ5KChrZXkpID0+ICFCdWZmZXIuaXNCdWZmZXIoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIGFzRGVzY3JpcHRvcktleShrZXk6IFBveDVTdGFrZXJLZXksIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGtleSkpIHtcbiAgICB2YWxpZGF0ZUNvbXByZXNzZWRLZXkoa2V5LCBmaWVsZCk7XG4gICAgcmV0dXJuIGtleS50b1N0cmluZygnaGV4Jyk7XG4gIH1cbiAgcmV0dXJuIGtleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgKyAnLyonO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVBhcmFtcyhwYXJhbXM6IFBveDVMb2NrdXBEZXNjcmlwdG9yUGFyYW1zKTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIocGFyYW1zLnVubG9ja0hlaWdodCkgfHwgcGFyYW1zLnVubG9ja0hlaWdodCA8PSAwIHx8IHBhcmFtcy51bmxvY2tIZWlnaHQgPj0gNTAwXzAwMF8wMDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVubG9ja0hlaWdodCAoJHtwYXJhbXMudW5sb2NrSGVpZ2h0fSkgbXVzdCBiZSBhIHBvc2l0aXZlIGJsb2NrIGhlaWdodCBiZWxvdyA1MDAwMDAwMDBgKTtcbiAgfVxuICBpZiAocGFyYW1zLnN0YWtlckNvbW1pdG1lbnQubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgc3Rha2VyQ29tbWl0bWVudCBtdXN0IGJlIDMyIGJ5dGVzIChnb3QgJHtwYXJhbXMuc3Rha2VyQ29tbWl0bWVudC5sZW5ndGh9KWApO1xuICB9XG4gIHZhbGlkYXRlQ29tcHJlc3NlZEtleShwYXJhbXMuZWFybHlFeGl0S2V5LCAnZWFybHlFeGl0S2V5Jyk7XG5cbiAgY29uc3QgYnVmZmVyQ291bnQgPSBwYXJhbXMuc3Rha2VyS2V5cy5maWx0ZXIoQnVmZmVyLmlzQnVmZmVyKS5sZW5ndGg7XG4gIGlmIChidWZmZXJDb3VudCAhPT0gMCAmJiBidWZmZXJDb3VudCAhPT0gcGFyYW1zLnN0YWtlcktleXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzdGFrZXJLZXlzIG11c3QgY29udGFpbiBlaXRoZXIgdGhyZWUgQklQMzIga2V5cyBvciB0aHJlZSBjb21wcmVzc2VkIHB1YmxpYyBrZXlzJyk7XG4gIH1cbiAgcGFyYW1zLnN0YWtlcktleXMuZm9yRWFjaCgoa2V5LCBpbmRleCkgPT4ge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgICAgdmFsaWRhdGVDb21wcmVzc2VkS2V5KGtleSwgYHN0YWtlcktleXNbJHtpbmRleH1dYCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgY2Fub25pY2FsIFBvWC01IFAyV1NIIGRlc2NyaXB0b3IuIFRoZSBwb3N0LUNMVFYgYW5kIGVhcmx5LWV4aXRcbiAqIHBhdGhzIHNoYXJlIEJpdEdvJ3Mgc3RhbmRhcmQgMi1vZi0zIGNvbXByZXNzZWQta2V5IG11bHRpc2lnIHRhaWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcihwYXJhbXM6IFBveDVMb2NrdXBEZXNjcmlwdG9yUGFyYW1zKTogc3RyaW5nIHtcbiAgdmFsaWRhdGVQYXJhbXMocGFyYW1zKTtcbiAgY29uc3Qgc3Rha2VyS2V5cyA9IHBhcmFtcy5zdGFrZXJLZXlzLm1hcCgoa2V5LCBpbmRleCkgPT4gYXNEZXNjcmlwdG9yS2V5KGtleSwgYHN0YWtlcktleXNbJHtpbmRleH1dYCkpO1xuICBjb25zdCBtaW5pc2NyaXB0OiBhc3QuTWluaXNjcmlwdE5vZGUgPSB7XG4gICAgYW5kX3Y6IFtcbiAgICAgIHtcbiAgICAgICAgJ3Y6b3JfaSc6IFtcbiAgICAgICAgICB7IGFmdGVyOiBwYXJhbXMudW5sb2NrSGVpZ2h0IH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYW5kX3Y6IFtcbiAgICAgICAgICAgICAgeyAndjpzaGEyNTYnOiBwYXJhbXMuc3Rha2VyQ29tbWl0bWVudC50b1N0cmluZygnaGV4JykgfSxcbiAgICAgICAgICAgICAgeyBwazogcGFyYW1zLmVhcmx5RXhpdEtleS50b1N0cmluZygnaGV4JykgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7IG11bHRpOiBbMiwgLi4uc3Rha2VyS2V5c10gfSxcbiAgICBdLFxuICB9O1xuICByZXR1cm4gYXN0LmZvcm1hdE5vZGUoeyB3c2g6IG1pbmlzY3JpcHQgfSk7XG59XG5cbi8qKiBDb21waWxlIHRoZSBQb1gtNSBQMldTSCBzY3JpcHRQdWJLZXkgYXQgYSBCSVAzMiBkZXJpdmF0aW9uIGluZGV4LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBveDVMb2NrdXBTY3JpcHRQdWJLZXkocGFyYW1zOiBQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtcywgZGVyaXZhdGlvbkluZGV4ID0gMCk6IEJ1ZmZlciB7XG4gIGNvbnN0IGRlc2NyaXB0b3IgPSBjcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcihwYXJhbXMpO1xuICBpZiAoaXNCaXAzMlRyaXBsZShwYXJhbXMuc3Rha2VyS2V5cykpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgICBEZXNjcmlwdG9yLmZyb21TdHJpbmcoZGVzY3JpcHRvciwgJ2Rlcml2YWJsZScpLmF0RGVyaXZhdGlvbkluZGV4KGRlcml2YXRpb25JbmRleCkuc2NyaXB0UHVia2V5KClcbiAgICApO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbShEZXNjcmlwdG9yLmZyb21TdHJpbmcoZGVzY3JpcHRvciwgJ2RlZmluaXRlJykuc2NyaXB0UHVia2V5KCkpO1xufVxuXG4vKiogRGVyaXZlIHRoZSBjb21wcmVzc2VkIHN0YWtlciBrZXlzIG5lZWRlZCB0byBwcmVwYXJlIGEgd2l0bmVzcyBhdCBhbiBpbmRleC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVQb3g1U3Rha2VyS2V5cyhcbiAgc3Rha2VyS2V5czogW0JJUDMySW50ZXJmYWNlLCBCSVAzMkludGVyZmFjZSwgQklQMzJJbnRlcmZhY2VdLFxuICBpbmRleDogbnVtYmVyXG4pOiBbQnVmZmVyLCBCdWZmZXIsIEJ1ZmZlcl0ge1xuICBjb25zdCBrZXlzID0gc3Rha2VyS2V5cy5tYXAoKGtleSkgPT4gQnVmZmVyLmZyb20oa2V5LmRlcml2ZShpbmRleCkucHVibGljS2V5KSk7XG4gIHJldHVybiBba2V5c1swXSwga2V5c1sxXSwga2V5c1syXV07XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ export * from './descriptor';
2
+ export * from './parseDescriptor';
3
+ //# 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"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./descriptor"), exports);
18
+ __exportStar(require("./parseDescriptor"), exports);
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcG94NS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQTZCO0FBQzdCLG9EQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZGVzY3JpcHRvcic7XG5leHBvcnQgKiBmcm9tICcuL3BhcnNlRGVzY3JpcHRvcic7XG4iXX0=
@@ -0,0 +1,16 @@
1
+ import { Descriptor, ast } from '@bitgo/wasm-utxo';
2
+ export type ParsedPox5LockupDescriptor = {
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
+ /**
11
+ * Parse only the canonical PoX-5 descriptor template. Other descriptors return
12
+ * null; malformed fields within the template throw so callers cannot finalize
13
+ * a script under an ambiguous policy.
14
+ */
15
+ export declare function parsePox5LockupDescriptor(descriptor: Descriptor | ast.DescriptorNode): ParsedPox5LockupDescriptor | null;
16
+ //# 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,EAAE,MAAM,kBAAkB,CAAC;AAG1D,MAAM,MAAM,0BAA0B,GAAG;IACvC,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;AA2CF;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,UAAU,GAAG,GAAG,CAAC,cAAc,GAC1C,0BAA0B,GAAG,IAAI,CAmDnC"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parsePox5LockupDescriptor = parsePox5LockupDescriptor;
4
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
5
+ const descriptor_1 = require("@bitgo-beta/utxo-core/descriptor");
6
+ const COMPRESSED_KEY = /^(02|03)[0-9a-fA-F]{64}$/;
7
+ const XPUB_WITH_INDEX = /^([1-9A-HJ-NP-Za-km-z]+)\/(\d+)$/;
8
+ function asNumber(value, field) {
9
+ if (typeof value !== 'number') {
10
+ throw new Error(`${field} must be a number`);
11
+ }
12
+ return value;
13
+ }
14
+ function asString(value, field) {
15
+ if (typeof value !== 'string') {
16
+ throw new Error(`${field} must be a string`);
17
+ }
18
+ return value;
19
+ }
20
+ function parseCompressedKey(value, field) {
21
+ if (!COMPRESSED_KEY.test(value)) {
22
+ throw new Error(`${field} must be a compressed public key`);
23
+ }
24
+ return Buffer.from(value, 'hex');
25
+ }
26
+ function resolveStakerKey(value) {
27
+ if (COMPRESSED_KEY.test(value)) {
28
+ return Buffer.from(value, 'hex');
29
+ }
30
+ const match = value.match(XPUB_WITH_INDEX);
31
+ if (!match) {
32
+ return undefined;
33
+ }
34
+ const [, xpub, indexString] = match;
35
+ const index = Number.parseInt(indexString, 10);
36
+ try {
37
+ return Buffer.from(wasm_utxo_1.BIP32.fromBase58(xpub).derive(index).publicKey);
38
+ }
39
+ catch {
40
+ return undefined;
41
+ }
42
+ }
43
+ /**
44
+ * Parse only the canonical PoX-5 descriptor template. Other descriptors return
45
+ * null; malformed fields within the template throw so callers cannot finalize
46
+ * a script under an ambiguous policy.
47
+ */
48
+ function parsePox5LockupDescriptor(descriptor) {
49
+ const matcher = new descriptor_1.PatternMatcher();
50
+ const descriptorNode = descriptor instanceof wasm_utxo_1.Descriptor ? wasm_utxo_1.ast.fromDescriptor(descriptor) : descriptor;
51
+ const matched = matcher.match(descriptorNode, { wsh: { $var: 'miniscript' } });
52
+ if (!matched) {
53
+ return null;
54
+ }
55
+ const miniscriptNode = matched.miniscript;
56
+ const pattern = {
57
+ and_v: [
58
+ {
59
+ 'v:or_i': [
60
+ { after: { $var: 'unlockHeight' } },
61
+ { and_v: [{ 'v:sha256': { $var: 'stakerCommitment' } }, { pk: { $var: 'earlyExitKey' } }] },
62
+ ],
63
+ },
64
+ { multi: { $var: 'stakerMulti' } },
65
+ ],
66
+ };
67
+ const fields = matcher.match(miniscriptNode, pattern);
68
+ if (!fields) {
69
+ return null;
70
+ }
71
+ const unlockHeight = asNumber(fields.unlockHeight, 'after argument');
72
+ if (!Number.isSafeInteger(unlockHeight) || unlockHeight <= 0 || unlockHeight >= 500000000) {
73
+ throw new Error(`unlockHeight (${unlockHeight}) must be a positive block height below 500000000`);
74
+ }
75
+ const commitmentHex = asString(fields.stakerCommitment, 'sha256 commitment');
76
+ if (!/^[0-9a-fA-F]{64}$/.test(commitmentHex)) {
77
+ throw new Error('stakerCommitment must be 32 bytes');
78
+ }
79
+ const earlyExitKey = parseCompressedKey(asString(fields.earlyExitKey, 'early exit key'), 'earlyExitKey');
80
+ if (!Array.isArray(fields.stakerMulti) || fields.stakerMulti.length !== 4 || fields.stakerMulti[0] !== 2) {
81
+ throw new Error('staker multi must be a 2-of-3 multisig');
82
+ }
83
+ const stakerKeyStrings = fields.stakerMulti.slice(1).map((key, index) => asString(key, `staker key ${index}`));
84
+ const resolvedKeys = stakerKeyStrings.map(resolveStakerKey);
85
+ return {
86
+ unlockHeight,
87
+ stakerCommitment: Buffer.from(commitmentHex, 'hex'),
88
+ earlyExitKey,
89
+ stakerKeyStrings: [stakerKeyStrings[0], stakerKeyStrings[1], stakerKeyStrings[2]],
90
+ stakerKeys: resolvedKeys.every((key) => key !== undefined)
91
+ ? [resolvedKeys[0], resolvedKeys[1], resolvedKeys[2]]
92
+ : undefined,
93
+ miniscriptNode,
94
+ };
95
+ }
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VEZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BveDUvcGFyc2VEZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMERBLDhEQXFEQztBQS9HRCxnREFBMEQ7QUFDMUQsaUVBQTJFO0FBVzNFLE1BQU0sY0FBYyxHQUFHLDBCQUEwQixDQUFDO0FBQ2xELE1BQU0sZUFBZSxHQUFHLGtDQUFrQyxDQUFDO0FBRTNELFNBQVMsUUFBUSxDQUFDLEtBQWMsRUFBRSxLQUFhO0lBQzdDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssbUJBQW1CLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBYyxFQUFFLEtBQWE7SUFDN0MsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQ3RELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssa0NBQWtDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFhO0lBQ3JDLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDM0MsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDcEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0MsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IseUJBQXlCLENBQ3ZDLFVBQTJDO0lBRTNDLE1BQU0sT0FBTyxHQUFHLElBQUksMkJBQWMsRUFBRSxDQUFDO0lBQ3JDLE1BQU0sY0FBYyxHQUFHLFVBQVUsWUFBWSxzQkFBVSxDQUFDLENBQUMsQ0FBQyxlQUFHLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDdEcsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxVQUFnQyxDQUFDO0lBQ2hFLE1BQU0sT0FBTyxHQUFZO1FBQ3ZCLEtBQUssRUFBRTtZQUNMO2dCQUNFLFFBQVEsRUFBRTtvQkFDUixFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsRUFBRTtvQkFDbkMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEVBQUUsQ0FBQyxFQUFFO2lCQUM1RjthQUNGO1lBQ0QsRUFBRSxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLEVBQUU7U0FDbkM7S0FDRixDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUNyRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLFlBQVksSUFBSSxTQUFXLEVBQUUsQ0FBQztRQUM1RixNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixZQUFZLG1EQUFtRCxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUM3RSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFDRCxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBRXpHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6RyxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUNELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxjQUFjLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvRyxNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUU1RCxPQUFPO1FBQ0wsWUFBWTtRQUNaLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQztRQUNuRCxZQUFZO1FBQ1osZ0JBQWdCLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRixVQUFVLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBaUIsRUFBRSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsQ0FBQyxDQUFDLFNBQVM7UUFDYixjQUFjO0tBQ2YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCSVAzMiwgRGVzY3JpcHRvciwgYXN0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgeyBQYXR0ZXJuLCBQYXR0ZXJuTWF0Y2hlciB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tY29yZS9kZXNjcmlwdG9yJztcblxuZXhwb3J0IHR5cGUgUGFyc2VkUG94NUxvY2t1cERlc2NyaXB0b3IgPSB7XG4gIHVubG9ja0hlaWdodDogbnVtYmVyO1xuICBzdGFrZXJDb21taXRtZW50OiBCdWZmZXI7XG4gIGVhcmx5RXhpdEtleTogQnVmZmVyO1xuICBzdGFrZXJLZXlTdHJpbmdzOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ107XG4gIHN0YWtlcktleXM6IFtCdWZmZXIsIEJ1ZmZlciwgQnVmZmVyXSB8IHVuZGVmaW5lZDtcbiAgbWluaXNjcmlwdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZTtcbn07XG5cbmNvbnN0IENPTVBSRVNTRURfS0VZID0gL14oMDJ8MDMpWzAtOWEtZkEtRl17NjR9JC87XG5jb25zdCBYUFVCX1dJVEhfSU5ERVggPSAvXihbMS05QS1ISi1OUC1aYS1rbS16XSspXFwvKFxcZCspJC87XG5cbmZ1bmN0aW9uIGFzTnVtYmVyKHZhbHVlOiB1bmtub3duLCBmaWVsZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmllbGR9IG11c3QgYmUgYSBudW1iZXJgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlOiB1bmtub3duLCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmllbGR9IG11c3QgYmUgYSBzdHJpbmdgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ29tcHJlc3NlZEtleSh2YWx1ZTogc3RyaW5nLCBmaWVsZDogc3RyaW5nKTogQnVmZmVyIHtcbiAgaWYgKCFDT01QUkVTU0VEX0tFWS50ZXN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZH0gbXVzdCBiZSBhIGNvbXByZXNzZWQgcHVibGljIGtleWApO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSwgJ2hleCcpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlU3Rha2VyS2V5KHZhbHVlOiBzdHJpbmcpOiBCdWZmZXIgfCB1bmRlZmluZWQge1xuICBpZiAoQ09NUFJFU1NFRF9LRVkudGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUsICdoZXgnKTtcbiAgfVxuICBjb25zdCBtYXRjaCA9IHZhbHVlLm1hdGNoKFhQVUJfV0lUSF9JTkRFWCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IFssIHhwdWIsIGluZGV4U3RyaW5nXSA9IG1hdGNoO1xuICBjb25zdCBpbmRleCA9IE51bWJlci5wYXJzZUludChpbmRleFN0cmluZywgMTApO1xuICB0cnkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShCSVAzMi5mcm9tQmFzZTU4KHhwdWIpLmRlcml2ZShpbmRleCkucHVibGljS2V5KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlIG9ubHkgdGhlIGNhbm9uaWNhbCBQb1gtNSBkZXNjcmlwdG9yIHRlbXBsYXRlLiBPdGhlciBkZXNjcmlwdG9ycyByZXR1cm5cbiAqIG51bGw7IG1hbGZvcm1lZCBmaWVsZHMgd2l0aGluIHRoZSB0ZW1wbGF0ZSB0aHJvdyBzbyBjYWxsZXJzIGNhbm5vdCBmaW5hbGl6ZVxuICogYSBzY3JpcHQgdW5kZXIgYW4gYW1iaWd1b3VzIHBvbGljeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUG94NUxvY2t1cERlc2NyaXB0b3IoXG4gIGRlc2NyaXB0b3I6IERlc2NyaXB0b3IgfCBhc3QuRGVzY3JpcHRvck5vZGVcbik6IFBhcnNlZFBveDVMb2NrdXBEZXNjcmlwdG9yIHwgbnVsbCB7XG4gIGNvbnN0IG1hdGNoZXIgPSBuZXcgUGF0dGVybk1hdGNoZXIoKTtcbiAgY29uc3QgZGVzY3JpcHRvck5vZGUgPSBkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGVzY3JpcHRvciA/IGFzdC5mcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKSA6IGRlc2NyaXB0b3I7XG4gIGNvbnN0IG1hdGNoZWQgPSBtYXRjaGVyLm1hdGNoKGRlc2NyaXB0b3JOb2RlLCB7IHdzaDogeyAkdmFyOiAnbWluaXNjcmlwdCcgfSB9KTtcbiAgaWYgKCFtYXRjaGVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBtaW5pc2NyaXB0Tm9kZSA9IG1hdGNoZWQubWluaXNjcmlwdCBhcyBhc3QuTWluaXNjcmlwdE5vZGU7XG4gIGNvbnN0IHBhdHRlcm46IFBhdHRlcm4gPSB7XG4gICAgYW5kX3Y6IFtcbiAgICAgIHtcbiAgICAgICAgJ3Y6b3JfaSc6IFtcbiAgICAgICAgICB7IGFmdGVyOiB7ICR2YXI6ICd1bmxvY2tIZWlnaHQnIH0gfSxcbiAgICAgICAgICB7IGFuZF92OiBbeyAndjpzaGEyNTYnOiB7ICR2YXI6ICdzdGFrZXJDb21taXRtZW50JyB9IH0sIHsgcGs6IHsgJHZhcjogJ2Vhcmx5RXhpdEtleScgfSB9XSB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHsgbXVsdGk6IHsgJHZhcjogJ3N0YWtlck11bHRpJyB9IH0sXG4gICAgXSxcbiAgfTtcbiAgY29uc3QgZmllbGRzID0gbWF0Y2hlci5tYXRjaChtaW5pc2NyaXB0Tm9kZSwgcGF0dGVybik7XG4gIGlmICghZmllbGRzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB1bmxvY2tIZWlnaHQgPSBhc051bWJlcihmaWVsZHMudW5sb2NrSGVpZ2h0LCAnYWZ0ZXIgYXJndW1lbnQnKTtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih1bmxvY2tIZWlnaHQpIHx8IHVubG9ja0hlaWdodCA8PSAwIHx8IHVubG9ja0hlaWdodCA+PSA1MDBfMDAwXzAwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdW5sb2NrSGVpZ2h0ICgke3VubG9ja0hlaWdodH0pIG11c3QgYmUgYSBwb3NpdGl2ZSBibG9jayBoZWlnaHQgYmVsb3cgNTAwMDAwMDAwYCk7XG4gIH1cbiAgY29uc3QgY29tbWl0bWVudEhleCA9IGFzU3RyaW5nKGZpZWxkcy5zdGFrZXJDb21taXRtZW50LCAnc2hhMjU2IGNvbW1pdG1lbnQnKTtcbiAgaWYgKCEvXlswLTlhLWZBLUZdezY0fSQvLnRlc3QoY29tbWl0bWVudEhleCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YWtlckNvbW1pdG1lbnQgbXVzdCBiZSAzMiBieXRlcycpO1xuICB9XG4gIGNvbnN0IGVhcmx5RXhpdEtleSA9IHBhcnNlQ29tcHJlc3NlZEtleShhc1N0cmluZyhmaWVsZHMuZWFybHlFeGl0S2V5LCAnZWFybHkgZXhpdCBrZXknKSwgJ2Vhcmx5RXhpdEtleScpO1xuXG4gIGlmICghQXJyYXkuaXNBcnJheShmaWVsZHMuc3Rha2VyTXVsdGkpIHx8IGZpZWxkcy5zdGFrZXJNdWx0aS5sZW5ndGggIT09IDQgfHwgZmllbGRzLnN0YWtlck11bHRpWzBdICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzdGFrZXIgbXVsdGkgbXVzdCBiZSBhIDItb2YtMyBtdWx0aXNpZycpO1xuICB9XG4gIGNvbnN0IHN0YWtlcktleVN0cmluZ3MgPSBmaWVsZHMuc3Rha2VyTXVsdGkuc2xpY2UoMSkubWFwKChrZXksIGluZGV4KSA9PiBhc1N0cmluZyhrZXksIGBzdGFrZXIga2V5ICR7aW5kZXh9YCkpO1xuICBjb25zdCByZXNvbHZlZEtleXMgPSBzdGFrZXJLZXlTdHJpbmdzLm1hcChyZXNvbHZlU3Rha2VyS2V5KTtcblxuICByZXR1cm4ge1xuICAgIHVubG9ja0hlaWdodCxcbiAgICBzdGFrZXJDb21taXRtZW50OiBCdWZmZXIuZnJvbShjb21taXRtZW50SGV4LCAnaGV4JyksXG4gICAgZWFybHlFeGl0S2V5LFxuICAgIHN0YWtlcktleVN0cmluZ3M6IFtzdGFrZXJLZXlTdHJpbmdzWzBdLCBzdGFrZXJLZXlTdHJpbmdzWzFdLCBzdGFrZXJLZXlTdHJpbmdzWzJdXSxcbiAgICBzdGFrZXJLZXlzOiByZXNvbHZlZEtleXMuZXZlcnkoKGtleSk6IGtleSBpcyBCdWZmZXIgPT4ga2V5ICE9PSB1bmRlZmluZWQpXG4gICAgICA/IFtyZXNvbHZlZEtleXNbMF0sIHJlc29sdmVkS2V5c1sxXSwgcmVzb2x2ZWRLZXlzWzJdXVxuICAgICAgOiB1bmRlZmluZWQsXG4gICAgbWluaXNjcmlwdE5vZGUsXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../../../../test/unit/pox5/descriptor.ts"],"names":[],"mappings":""}
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const assert = __importStar(require("assert"));
37
+ const crypto_1 = require("crypto");
38
+ const bitcoin_staking_1 = require("@stacks/bitcoin-staking");
39
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
40
+ const testutils_1 = require("@bitgo/wasm-utxo/testutils");
41
+ const pox5_1 = require("../../../src/pox5");
42
+ const OPCODES = {
43
+ OP_0: 0x00,
44
+ OP_IF: 0x63,
45
+ OP_ELSE: 0x67,
46
+ OP_ENDIF: 0x68,
47
+ OP_VERIFY: 0x69,
48
+ OP_SIZE: 0x82,
49
+ OP_EQUAL: 0x87,
50
+ OP_EQUALVERIFY: 0x88,
51
+ OP_SHA256: 0xa8,
52
+ OP_CHECKSIG: 0xac,
53
+ OP_CHECKMULTISIG: 0xae,
54
+ OP_CLTV: 0xb1,
55
+ };
56
+ function getBip32Triple() {
57
+ const [user, backup, bitgo] = (0, testutils_1.getKeyTriple)('default');
58
+ return [user, backup, bitgo];
59
+ }
60
+ function sha256(value) {
61
+ return (0, crypto_1.createHash)('sha256').update(value).digest();
62
+ }
63
+ function params(overrides = {}) {
64
+ const stakerKeys = getBip32Triple();
65
+ const earlyExitKey = Buffer.from(stakerKeys[0].derive(9).publicKey);
66
+ return {
67
+ unlockHeight: 840000,
68
+ stakerCommitment: sha256((0, bitcoin_staking_1.computeRegisterPreimage)('SP000000000000000000002Q6VF78')),
69
+ earlyExitKey,
70
+ stakerKeys,
71
+ ...overrides,
72
+ };
73
+ }
74
+ function asmToScript(asm) {
75
+ const tokens = asm.split(' ');
76
+ const chunks = [];
77
+ for (let index = 0; index < tokens.length; index++) {
78
+ const token = tokens[index];
79
+ const push = token.match(/^OP_PUSHBYTES_(\d+)$/);
80
+ if (push) {
81
+ const bytes = Buffer.from(tokens[++index], 'hex');
82
+ assert.strictEqual(bytes.length, Number(push[1]));
83
+ chunks.push(Buffer.of(bytes.length), bytes);
84
+ continue;
85
+ }
86
+ const number = token.match(/^OP_PUSHNUM_(\d+)$/);
87
+ if (number) {
88
+ chunks.push(Buffer.of(0x50 + Number(number[1])));
89
+ continue;
90
+ }
91
+ const opcode = OPCODES[token];
92
+ assert.notStrictEqual(opcode, undefined, `unsupported ASM token ${token}`);
93
+ chunks.push(Buffer.of(opcode));
94
+ }
95
+ return Buffer.concat(chunks);
96
+ }
97
+ function encodeTwoOfThreeUnlock(keys) {
98
+ return Buffer.concat([Buffer.of(0x52), ...keys.flatMap((key) => [Buffer.of(33), key]), Buffer.of(0x53, 0xae)]);
99
+ }
100
+ describe('PoX-5 lockup descriptors', function () {
101
+ it('renders the required byte-identical canonical script and P2WSH output', function () {
102
+ const derivable = params();
103
+ const stakerKeys = (0, pox5_1.derivePox5StakerKeys)(derivable.stakerKeys, 0);
104
+ const definite = { ...derivable, stakerKeys };
105
+ const descriptorString = (0, pox5_1.createPox5LockupDescriptor)(definite);
106
+ const descriptor = wasm_utxo_1.Descriptor.fromString(descriptorString, 'definite');
107
+ const localWitnessScript = asmToScript(descriptor.toAsmString());
108
+ const unlockBytes = encodeTwoOfThreeUnlock(stakerKeys);
109
+ const earlyUnlockBytes = (0, bitcoin_staking_1.buildUnlockScript)(definite.earlyExitKey);
110
+ const sdkWitnessScript = Buffer.from((0, bitcoin_staking_1.buildLockScript)({
111
+ stxAddress: 'SP000000000000000000002Q6VF78',
112
+ unlockHeight: definite.unlockHeight,
113
+ unlockBytes,
114
+ earlyUnlockBytes,
115
+ validateEarlyUnlockBytes: false,
116
+ }));
117
+ assert.deepStrictEqual(localWitnessScript, sdkWitnessScript);
118
+ assert.ok(descriptor.toAsmString().includes('OP_SHA256 OP_PUSHBYTES_32'));
119
+ assert.ok(descriptor.toAsmString().includes('OP_EQUALVERIFY OP_PUSHBYTES_33'));
120
+ const localScriptPubKey = (0, pox5_1.createPox5LockupScriptPubKey)(definite);
121
+ const sdkScriptPubKey = Buffer.from((0, bitcoin_staking_1.buildLockOutputScript)({
122
+ stxAddress: 'SP000000000000000000002Q6VF78',
123
+ unlockHeight: definite.unlockHeight,
124
+ unlockBytes,
125
+ earlyUnlockBytes,
126
+ }));
127
+ assert.deepStrictEqual(localScriptPubKey, sdkScriptPubKey);
128
+ assert.strictEqual(wasm_utxo_1.address.fromOutputScriptWithCoin(localScriptPubKey, 'btc'), (0, bitcoin_staking_1.buildLockAddress)({
129
+ stxAddress: 'SP000000000000000000002Q6VF78',
130
+ unlockHeight: definite.unlockHeight,
131
+ unlockBytes,
132
+ earlyUnlockBytes,
133
+ network: 'mainnet',
134
+ validateEarlyUnlockBytes: false,
135
+ }));
136
+ });
137
+ it('supports derivation and preserves wildcard keys until an index is selected', function () {
138
+ const value = params();
139
+ const descriptor = wasm_utxo_1.Descriptor.fromString((0, pox5_1.createPox5LockupDescriptor)(value), 'derivable');
140
+ const wildcard = (0, pox5_1.parsePox5LockupDescriptor)(descriptor);
141
+ const derived = (0, pox5_1.parsePox5LockupDescriptor)(descriptor.atDerivationIndex(4));
142
+ assert.ok(wildcard);
143
+ assert.strictEqual(wildcard.stakerKeys, undefined);
144
+ assert.ok(wildcard.stakerKeyStrings.every((key) => key.endsWith('/*')));
145
+ assert.ok(derived?.stakerKeys);
146
+ assert.deepStrictEqual(derived?.stakerKeys, (0, pox5_1.derivePox5StakerKeys)(value.stakerKeys, 4));
147
+ });
148
+ it('rejects noncanonical parameter values and descriptor templates', function () {
149
+ assert.throws(() => (0, pox5_1.createPox5LockupDescriptor)(params({ unlockHeight: 0 })));
150
+ assert.throws(() => (0, pox5_1.createPox5LockupDescriptor)(params({ unlockHeight: 500000000 })));
151
+ assert.throws(() => (0, pox5_1.createPox5LockupDescriptor)(params({ stakerCommitment: Buffer.alloc(31) })));
152
+ assert.throws(() => (0, pox5_1.createPox5LockupDescriptor)(params({ earlyExitKey: Buffer.alloc(32) })));
153
+ assert.throws(() => (0, pox5_1.createPox5LockupDescriptor)(params({ stakerKeys: [getBip32Triple()[0], Buffer.alloc(33, 2), Buffer.alloc(33, 2)] })));
154
+ const validKey = params().earlyExitKey.toString('hex');
155
+ assert.strictEqual((0, pox5_1.parsePox5LockupDescriptor)(wasm_utxo_1.Descriptor.fromString(`wsh(pk(${validKey}))`, 'definite')), null);
156
+ });
157
+ });
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9wb3g1L2Rlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsbUNBQW9DO0FBRXBDLDZEQU1pQztBQUNqQyxnREFBOEQ7QUFDOUQsMERBQTBEO0FBRTFELDRDQU0yQjtBQUkzQixNQUFNLE9BQU8sR0FBMkI7SUFDdEMsSUFBSSxFQUFFLElBQUk7SUFDVixLQUFLLEVBQUUsSUFBSTtJQUNYLE9BQU8sRUFBRSxJQUFJO0lBQ2IsUUFBUSxFQUFFLElBQUk7SUFDZCxTQUFTLEVBQUUsSUFBSTtJQUNmLE9BQU8sRUFBRSxJQUFJO0lBQ2IsUUFBUSxFQUFFLElBQUk7SUFDZCxjQUFjLEVBQUUsSUFBSTtJQUNwQixTQUFTLEVBQUUsSUFBSTtJQUNmLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGdCQUFnQixFQUFFLElBQUk7SUFDdEIsT0FBTyxFQUFFLElBQUk7Q0FDZCxDQUFDO0FBRUYsU0FBUyxjQUFjO0lBQ3JCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUEsd0JBQVksRUFBQyxTQUFTLENBQUMsQ0FBQztJQUN0RCxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsS0FBaUI7SUFDL0IsT0FBTyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxZQUFpRCxFQUFFO0lBQ2pFLE1BQU0sVUFBVSxHQUFHLGNBQWMsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJ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LENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RCxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUEsZ0NBQXlCLEVBQUMsc0JBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxRQUFRLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2pILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQge1xuICBidWlsZExvY2tBZGRyZXNzLFxuICBidWlsZExvY2tPdXRwdXRTY3JpcHQsXG4gIGJ1aWxkTG9ja1NjcmlwdCxcbiAgYnVpbGRVbmxvY2tTY3JpcHQsXG4gIGNvbXB1dGVSZWdpc3RlclByZWltYWdlLFxufSBmcm9tICdAc3RhY2tzL2JpdGNvaW4tc3Rha2luZyc7XG5pbXBvcnQgeyBhZGRyZXNzLCBiaXAzMiwgRGVzY3JpcHRvciB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHsgZ2V0S2V5VHJpcGxlIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4by90ZXN0dXRpbHMnO1xuXG5pbXBvcnQge1xuICBjcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcixcbiAgY3JlYXRlUG94NUxvY2t1cFNjcmlwdFB1YktleSxcbiAgZGVyaXZlUG94NVN0YWtlcktleXMsXG4gIHBhcnNlUG94NUxvY2t1cERlc2NyaXB0b3IsXG4gIFBveDVMb2NrdXBEZXNjcmlwdG9yUGFyYW1zLFxufSBmcm9tICcuLi8uLi8uLi9zcmMvcG94NSc7XG5cbnR5cGUgQklQMzJJbnRlcmZhY2UgPSBiaXAzMi5CSVAzMkludGVyZmFjZTtcblxuY29uc3QgT1BDT0RFUzogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgT1BfMDogMHgwMCxcbiAgT1BfSUY6IDB4NjMsXG4gIE9QX0VMU0U6IDB4NjcsXG4gIE9QX0VORElGOiAweDY4LFxuICBPUF9WRVJJRlk6IDB4NjksXG4gIE9QX1NJWkU6IDB4ODIsXG4gIE9QX0VRVUFMOiAweDg3LFxuICBPUF9FUVVBTFZFUklGWTogMHg4OCxcbiAgT1BfU0hBMjU2OiAweGE4LFxuICBPUF9DSEVDS1NJRzogMHhhYyxcbiAgT1BfQ0hFQ0tNVUxUSVNJRzogMHhhZSxcbiAgT1BfQ0xUVjogMHhiMSxcbn07XG5cbmZ1bmN0aW9uIGdldEJpcDMyVHJpcGxlKCk6IFtCSVAzMkludGVyZmFjZSwgQklQMzJJbnRlcmZhY2UsIEJJUDMySW50ZXJmYWNlXSB7XG4gIGNvbnN0IFt1c2VyLCBiYWNrdXAsIGJpdGdvXSA9IGdldEtleVRyaXBsZSgnZGVmYXVsdCcpO1xuICByZXR1cm4gW3VzZXIsIGJhY2t1cCwgYml0Z29dO1xufVxuXG5mdW5jdGlvbiBzaGEyNTYodmFsdWU6IFVpbnQ4QXJyYXkpOiBCdWZmZXIge1xuICByZXR1cm4gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHZhbHVlKS5kaWdlc3QoKTtcbn1cblxuZnVuY3Rpb24gcGFyYW1zKG92ZXJyaWRlczogUGFydGlhbDxQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtcz4gPSB7fSk6IFBveDVMb2NrdXBEZXNjcmlwdG9yUGFyYW1zIHtcbiAgY29uc3Qgc3Rha2VyS2V5cyA9IGdldEJpcDMyVHJpcGxlKCk7XG4gIGNvbnN0IGVhcmx5RXhpdEtleSA9IEJ1ZmZlci5mcm9tKHN0YWtlcktleXNbMF0uZGVyaXZlKDkpLnB1YmxpY0tleSk7XG4gIHJldHVybiB7XG4gICAgdW5sb2NrSGVpZ2h0OiA4NDBfMDAwLFxuICAgIHN0YWtlckNvbW1pdG1lbnQ6IHNoYTI1Nihjb21wdXRlUmVnaXN0ZXJQcmVpbWFnZSgnU1AwMDAwMDAwMDAwMDAwMDAwMDAwMDJRNlZGNzgnKSksXG4gICAgZWFybHlFeGl0S2V5LFxuICAgIHN0YWtlcktleXMsXG4gICAgLi4ub3ZlcnJpZGVzLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhc21Ub1NjcmlwdChhc206IHN0cmluZyk6IEJ1ZmZlciB7XG4gIGNvbnN0IHRva2VucyA9IGFzbS5zcGxpdCgnICcpO1xuICBjb25zdCBjaHVua3M6IEJ1ZmZlcltdID0gW107XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0b2tlbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdO1xuICAgIGNvbnN0IHB1c2ggPSB0b2tlbi5tYXRjaCgvXk9QX1BVU0hCWVRFU18oXFxkKykkLyk7XG4gICAgaWYgKHB1c2gpIHtcbiAgICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmZyb20odG9rZW5zWysraW5kZXhdLCAnaGV4Jyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnl0ZXMubGVuZ3RoLCBOdW1iZXIocHVzaFsxXSkpO1xuICAgICAgY2h1bmtzLnB1c2goQnVmZmVyLm9mKGJ5dGVzLmxlbmd0aCksIGJ5dGVzKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBudW1iZXIgPSB0b2tlbi5tYXRjaCgvXk9QX1BVU0hOVU1fKFxcZCspJC8pO1xuICAgIGlmIChudW1iZXIpIHtcbiAgICAgIGNodW5rcy5wdXNoKEJ1ZmZlci5vZigweDUwICsgTnVtYmVyKG51bWJlclsxXSkpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBvcGNvZGUgPSBPUENPREVTW3Rva2VuXTtcbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwob3Bjb2RlLCB1bmRlZmluZWQsIGB1bnN1cHBvcnRlZCBBU00gdG9rZW4gJHt0b2tlbn1gKTtcbiAgICBjaHVua3MucHVzaChCdWZmZXIub2Yob3Bjb2RlKSk7XG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoY2h1bmtzKTtcbn1cblxuZnVuY3Rpb24gZW5jb2RlVHdvT2ZUaHJlZVVubG9jayhrZXlzOiBbQnVmZmVyLCBCdWZmZXIsIEJ1ZmZlcl0pOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmNvbmNhdChbQnVmZmVyLm9mKDB4NTIpLCAuLi5rZXlzLmZsYXRNYXAoKGtleSkgPT4gW0J1ZmZlci5vZigzMyksIGtleV0pLCBCdWZmZXIub2YoMHg1MywgMHhhZSldKTtcbn1cblxuZGVzY3JpYmUoJ1BvWC01IGxvY2t1cCBkZXNjcmlwdG9ycycsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3JlbmRlcnMgdGhlIHJlcXVpcmVkIGJ5dGUtaWRlbnRpY2FsIGNhbm9uaWNhbCBzY3JpcHQgYW5kIFAyV1NIIG91dHB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBkZXJpdmFibGUgPSBwYXJhbXMoKTtcbiAgICBjb25zdCBzdGFrZXJLZXlzID0gZGVyaXZlUG94NVN0YWtlcktleXMoXG4gICAgICBkZXJpdmFibGUuc3Rha2VyS2V5cyBhcyBbQklQMzJJbnRlcmZhY2UsIEJJUDMySW50ZXJmYWNlLCBCSVAzMkludGVyZmFjZV0sXG4gICAgICAwXG4gICAgKTtcbiAgICBjb25zdCBkZWZpbml0ZSA9IHsgLi4uZGVyaXZhYmxlLCBzdGFrZXJLZXlzIH07XG4gICAgY29uc3QgZGVzY3JpcHRvclN0cmluZyA9IGNyZWF0ZVBveDVMb2NrdXBEZXNjcmlwdG9yKGRlZmluaXRlKTtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gRGVzY3JpcHRvci5mcm9tU3RyaW5nKGRlc2NyaXB0b3JTdHJpbmcsICdkZWZpbml0ZScpO1xuICAgIGNvbnN0IGxvY2FsV2l0bmVzc1NjcmlwdCA9IGFzbVRvU2NyaXB0KGRlc2NyaXB0b3IudG9Bc21TdHJpbmcoKSk7XG4gICAgY29uc3QgdW5sb2NrQnl0ZXMgPSBlbmNvZGVUd29PZlRocmVlVW5sb2NrKHN0YWtlcktleXMpO1xuICAgIGNvbnN0IGVhcmx5VW5sb2NrQnl0ZXMgPSBidWlsZFVubG9ja1NjcmlwdChkZWZpbml0ZS5lYXJseUV4aXRLZXkpO1xuICAgIGNvbnN0IHNka1dpdG5lc3NTY3JpcHQgPSBCdWZmZXIuZnJvbShcbiAgICAgIGJ1aWxkTG9ja1NjcmlwdCh7XG4gICAgICAgIHN0eEFkZHJlc3M6ICdTUDAwMDAwMDAwMDAwMDAwMDAwMDAwMlE2VkY3OCcsXG4gICAgICAgIHVubG9ja0hlaWdodDogZGVmaW5pdGUudW5sb2NrSGVpZ2h0LFxuICAgICAgICB1bmxvY2tCeXRlcyxcbiAgICAgICAgZWFybHlVbmxvY2tCeXRlcyxcbiAgICAgICAgdmFsaWRhdGVFYXJseVVubG9ja0J5dGVzOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwobG9jYWxXaXRuZXNzU2NyaXB0LCBzZGtXaXRuZXNzU2NyaXB0KTtcbiAgICBhc3NlcnQub2soZGVzY3JpcHRvci50b0FzbVN0cmluZygpLmluY2x1ZGVzKCdPUF9TSEEyNTYgT1BfUFVTSEJZVEVTXzMyJykpO1xuICAgIGFzc2VydC5vayhkZXNjcmlwdG9yLnRvQXNtU3RyaW5nKCkuaW5jbHVkZXMoJ09QX0VRVUFMVkVSSUZZIE9QX1BVU0hCWVRFU18zMycpKTtcblxuICAgIGNvbnN0IGxvY2FsU2NyaXB0UHViS2V5ID0gY3JlYXRlUG94NUxvY2t1cFNjcmlwdFB1YktleShkZWZpbml0ZSk7XG4gICAgY29uc3Qgc2RrU2NyaXB0UHViS2V5ID0gQnVmZmVyLmZyb20oXG4gICAgICBidWlsZExvY2tPdXRwdXRTY3JpcHQoe1xuICAgICAgICBzdHhBZGRyZXNzOiAnU1AwMDAwMDAwMDAwMDAwMDAwMDAwMDJRNlZGNzgnLFxuICAgICAgICB1bmxvY2tIZWlnaHQ6IGRlZmluaXRlLnVubG9ja0hlaWdodCxcbiAgICAgICAgdW5sb2NrQnl0ZXMsXG4gICAgICAgIGVhcmx5VW5sb2NrQnl0ZXMsXG4gICAgICB9KVxuICAgICk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChsb2NhbFNjcmlwdFB1YktleSwgc2RrU2NyaXB0UHViS2V5KTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICBhZGRyZXNzLmZyb21PdXRwdXRTY3JpcHRXaXRoQ29pbihsb2NhbFNjcmlwdFB1YktleSwgJ2J0YycpLFxuICAgICAgYnVpbGRMb2NrQWRkcmVzcyh7XG4gICAgICAgIHN0eEFkZHJlc3M6ICdTUDAwMDAwMDAwMDAwMDAwMDAwMDAwMlE2VkY3OCcsXG4gICAgICAgIHVubG9ja0hlaWdodDogZGVmaW5pdGUudW5sb2NrSGVpZ2h0LFxuICAgICAgICB1bmxvY2tCeXRlcyxcbiAgICAgICAgZWFybHlVbmxvY2tCeXRlcyxcbiAgICAgICAgbmV0d29yazogJ21haW5uZXQnLFxuICAgICAgICB2YWxpZGF0ZUVhcmx5VW5sb2NrQnl0ZXM6IGZhbHNlLFxuICAgICAgfSlcbiAgICApO1xuICB9KTtcblxuICBpdCgnc3VwcG9ydHMgZGVyaXZhdGlvbiBhbmQgcHJlc2VydmVzIHdpbGRjYXJkIGtleXMgdW50aWwgYW4gaW5kZXggaXMgc2VsZWN0ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbXMoKTtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gRGVzY3JpcHRvci5mcm9tU3RyaW5nKGNyZWF0ZVBveDVMb2NrdXBEZXNjcmlwdG9yKHZhbHVlKSwgJ2Rlcml2YWJsZScpO1xuICAgIGNvbnN0IHdpbGRjYXJkID0gcGFyc2VQb3g1TG9ja3VwRGVzY3JpcHRvcihkZXNjcmlwdG9yKTtcbiAgICBjb25zdCBkZXJpdmVkID0gcGFyc2VQb3g1TG9ja3VwRGVzY3JpcHRvcihkZXNjcmlwdG9yLmF0RGVyaXZhdGlvbkluZGV4KDQpKTtcblxuICAgIGFzc2VydC5vayh3aWxkY2FyZCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHdpbGRjYXJkLnN0YWtlcktleXMsIHVuZGVmaW5lZCk7XG4gICAgYXNzZXJ0Lm9rKHdpbGRjYXJkLnN0YWtlcktleVN0cmluZ3MuZXZlcnkoKGtleSkgPT4ga2V5LmVuZHNXaXRoKCcvKicpKSk7XG4gICAgYXNzZXJ0Lm9rKGRlcml2ZWQ/LnN0YWtlcktleXMpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoXG4gICAgICBkZXJpdmVkPy5zdGFrZXJLZXlzLFxuICAgICAgZGVyaXZlUG94NVN0YWtlcktleXModmFsdWUuc3Rha2VyS2V5cyBhcyBbQklQMzJJbnRlcmZhY2UsIEJJUDMySW50ZXJmYWNlLCBCSVAzMkludGVyZmFjZV0sIDQpXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgbm9uY2Fub25pY2FsIHBhcmFtZXRlciB2YWx1ZXMgYW5kIGRlc2NyaXB0b3IgdGVtcGxhdGVzJywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gY3JlYXRlUG94NUxvY2t1cERlc2NyaXB0b3IocGFyYW1zKHsgdW5sb2NrSGVpZ2h0OiAwIH0pKSk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBjcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcihwYXJhbXMoeyB1bmxvY2tIZWlnaHQ6IDUwMF8wMDBfMDAwIH0pKSk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBjcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcihwYXJhbXMoeyBzdGFrZXJDb21taXRtZW50OiBCdWZmZXIuYWxsb2MoMzEpIH0pKSk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBjcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcihwYXJhbXMoeyBlYXJseUV4aXRLZXk6IEJ1ZmZlci5hbGxvYygzMikgfSkpKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+XG4gICAgICBjcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcihcbiAgICAgICAgcGFyYW1zKHsgc3Rha2VyS2V5czogW2dldEJpcDMyVHJpcGxlKClbMF0sIEJ1ZmZlci5hbGxvYygzMywgMiksIEJ1ZmZlci5hbGxvYygzMywgMildIH0pXG4gICAgICApXG4gICAgKTtcbiAgICBjb25zdCB2YWxpZEtleSA9IHBhcmFtcygpLmVhcmx5RXhpdEtleS50b1N0cmluZygnaGV4Jyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBhcnNlUG94NUxvY2t1cERlc2NyaXB0b3IoRGVzY3JpcHRvci5mcm9tU3RyaW5nKGB3c2gocGsoJHt2YWxpZEtleX0pKWAsICdkZWZpbml0ZScpKSwgbnVsbCk7XG4gIH0pO1xufSk7XG4iXX0=