@bitgo-beta/utxo-descriptors 0.0.1-beta.235 → 0.0.1-beta.237
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/src/index.d.ts +1 -0
- package/dist/cjs/src/index.d.ts.map +1 -1
- package/dist/cjs/src/index.js +3 -2
- package/dist/cjs/src/pox5/descriptor.d.ts +22 -0
- package/dist/cjs/src/pox5/descriptor.d.ts.map +1 -0
- package/dist/cjs/src/pox5/descriptor.js +78 -0
- package/dist/cjs/src/pox5/index.d.ts +3 -0
- package/dist/cjs/src/pox5/index.d.ts.map +1 -0
- package/dist/cjs/src/pox5/index.js +19 -0
- package/dist/cjs/src/pox5/parseDescriptor.d.ts +16 -0
- package/dist/cjs/src/pox5/parseDescriptor.d.ts.map +1 -0
- package/dist/cjs/src/pox5/parseDescriptor.js +96 -0
- package/dist/cjs/test/unit/pox5/descriptor.d.ts +2 -0
- package/dist/cjs/test/unit/pox5/descriptor.d.ts.map +1 -0
- package/dist/cjs/test/unit/pox5/descriptor.js +158 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/pox5/descriptor.d.ts +22 -0
- package/dist/esm/pox5/descriptor.d.ts.map +1 -0
- package/dist/esm/pox5/descriptor.js +73 -0
- package/dist/esm/pox5/index.d.ts +3 -0
- package/dist/esm/pox5/index.d.ts.map +1 -0
- package/dist/esm/pox5/index.js +3 -0
- package/dist/esm/pox5/parseDescriptor.d.ts +16 -0
- package/dist/esm/pox5/parseDescriptor.d.ts.map +1 -0
- package/dist/esm/pox5/parseDescriptor.js +93 -0
- package/package.json +7 -4
package/dist/cjs/src/index.d.ts
CHANGED
|
@@ -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/cjs/src/index.js
CHANGED
|
@@ -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
|
-
|
|
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 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VEZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BveDUvcGFyc2VEZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMERBLDhEQXFEQztBQS9HRCxnREFBMEQ7QUFDMUQsaUVBQTJFO0FBVzNFLE1BQU0sY0FBYyxHQUFHLDBCQUEwQixDQUFDO0FBQ2xELE1BQU0sZUFBZSxHQUFHLGtDQUFrQyxDQUFDO0FBRTNELFNBQVMsUUFBUSxDQUFDLEtBQWMsRUFBRSxLQUFhO0lBQzdDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssbUJBQW1CLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBYyxFQUFFLEtBQWE7SUFDN0MsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQ3RELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssa0NBQWtDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFhO0lBQ3JDLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLE9BQU8sTUFBTSxD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cnQgeyBCSVAzMiwgRGVzY3JpcHRvciwgYXN0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgeyBQYXR0ZXJuLCBQYXR0ZXJuTWF0Y2hlciB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tY29yZS9kZXNjcmlwdG9yJztcblxuZXhwb3J0IHR5cGUgUGFyc2VkUG94NUxvY2t1cERlc2NyaXB0b3IgPSB7XG4gIHVubG9ja0hlaWdodDogbnVtYmVyO1xuICBzdGFrZXJDb21taXRtZW50OiBCdWZmZXI7XG4gIGVhcmx5RXhpdEtleTogQnVmZmVyO1xuICBzdGFrZXJLZXlTdHJpbmdzOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ107XG4gIHN0YWtlcktleXM6IFtCdWZmZXIsIEJ1ZmZlciwgQnVmZmVyXSB8IHVuZGVmaW5lZDtcbiAgbWluaXNjcmlwdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZTtcbn07XG5cbmNvbnN0IENPTVBSRVNTRURfS0VZID0gL14oMDJ8MDMpWzAtOWEtZkEtRl17NjR9JC87XG5jb25zdCBYUFVCX1dJVEhfSU5ERVggPSAvXihbMS05QS1ISi1OUC1aYS1rbS16XSspXFwvKFxcZCspJC87XG5cbmZ1bmN0aW9uIGFzTnVtYmVyKHZhbHVlOiB1bmtub3duLCBmaWVsZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmllbGR9IG11c3QgYmUgYSBudW1iZXJgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlOiB1bmtub3duLCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmllbGR9IG11c3QgYmUgYSBzdHJpbmdgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ29tcHJlc3NlZEtleSh2YWx1ZTogc3RyaW5nLCBmaWVsZDogc3RyaW5nKTogQnVmZmVyIHtcbiAgaWYgKCFDT01QUkVTU0VEX0tFWS50ZXN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZH0gbXVzdCBiZSBhIGNvbXByZXNzZWQgcHVibGljIGtleWApO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSwgJ2hleCcpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlU3Rha2VyS2V5KHZhbHVlOiBzdHJpbmcpOiBCdWZmZXIgfCB1bmRlZmluZWQge1xuICBpZiAoQ09NUFJFU1NFRF9LRVkudGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUsICdoZXgnKTtcbiAgfVxuICBjb25zdCBtYXRjaCA9IHZhbHVlLm1hdGNoKFhQVUJfV0lUSF9JTkRFWCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IFssIHhwdWIsIGluZGV4U3RyaW5nXSA9IG1hdGNoO1xuICBjb25zdCBpbmRleCA9IE51bWJlci5wYXJzZUludChpbmRleFN0cmluZywgMTApO1xuICB0cnkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShCSVAzMi5mcm9tQmFzZTU4KHhwdWIpLmRlcml2ZShpbmRleCkucHVibGljS2V5KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlIG9ubHkgdGhlIGNhbm9uaWNhbCBQb1gtNSBkZXNjcmlwdG9yIHRlbXBsYXRlLiBPdGhlciBkZXNjcmlwdG9ycyByZXR1cm5cbiAqIG51bGw7IG1hbGZvcm1lZCBmaWVsZHMgd2l0aGluIHRoZSB0ZW1wbGF0ZSB0aHJvdyBzbyBjYWxsZXJzIGNhbm5vdCBmaW5hbGl6ZVxuICogYSBzY3JpcHQgdW5kZXIgYW4gYW1iaWd1b3VzIHBvbGljeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUG94NUxvY2t1cERlc2NyaXB0b3IoXG4gIGRlc2NyaXB0b3I6IERlc2NyaXB0b3IgfCBhc3QuRGVzY3JpcHRvck5vZGVcbik6IFBhcnNlZFBveDVMb2NrdXBEZXNjcmlwdG9yIHwgbnVsbCB7XG4gIGNvbnN0IG1hdGNoZXIgPSBuZXcgUGF0dGVybk1hdGNoZXIoKTtcbiAgY29uc3QgZGVzY3JpcHRvck5vZGUgPSBkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGVzY3JpcHRvciA/IGFzdC5mcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKSA6IGRlc2NyaXB0b3I7XG4gIGNvbnN0IG1hdGNoZWQgPSBtYXRjaGVyLm1hdGNoKGRlc2NyaXB0b3JOb2RlLCB7IHdzaDogeyAkdmFyOiAnbWluaXNjcmlwdCcgfSB9KTtcbiAgaWYgKCFtYXRjaGVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBtaW5pc2NyaXB0Tm9kZSA9IG1hdGNoZWQubWluaXNjcmlwdCBhcyBhc3QuTWluaXNjcmlwdE5vZGU7XG4gIGNvbnN0IHBhdHRlcm46IFBhdHRlcm4gPSB7XG4gICAgYW5kX3Y6IFtcbiAgICAgIHtcbiAgICAgICAgJ3Y6b3JfaSc6IFtcbiAgICAgICAgICB7IGFmdGVyOiB7ICR2YXI6ICd1bmxvY2tIZWlnaHQnIH0gfSxcbiAgICAgICAgICB7IGFuZF92OiBbeyAndjpzaGEyNTYnOiB7ICR2YXI6ICdzdGFrZXJDb21taXRtZW50JyB9IH0sIHsgcGs6IHsgJHZhcjogJ2Vhcmx5RXhpdEtleScgfSB9XSB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHsgbXVsdGk6IHsgJHZhcjogJ3N0YWtlck11bHRpJyB9IH0sXG4gICAgXSxcbiAgfTtcbiAgY29uc3QgZmllbGRzID0gbWF0Y2hlci5tYXRjaChtaW5pc2NyaXB0Tm9kZSwgcGF0dGVybik7XG4gIGlmICghZmllbGRzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB1bmxvY2tIZWlnaHQgPSBhc051bWJlcihmaWVsZHMudW5sb2NrSGVpZ2h0LCAnYWZ0ZXIgYXJndW1lbnQnKTtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih1bmxvY2tIZWlnaHQpIHx8IHVubG9ja0hlaWdodCA8PSAwIHx8IHVubG9ja0hlaWdodCA+PSA1MDBfMDAwXzAwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdW5sb2NrSGVpZ2h0ICgke3VubG9ja0hlaWdodH0pIG11c3QgYmUgYSBwb3NpdGl2ZSBibG9jayBoZWlnaHQgYmVsb3cgNTAwMDAwMDAwYCk7XG4gIH1cbiAgY29uc3QgY29tbWl0bWVudEhleCA9IGFzU3RyaW5nKGZpZWxkcy5zdGFrZXJDb21taXRtZW50LCAnc2hhMjU2IGNvbW1pdG1lbnQnKTtcbiAgaWYgKCEvXlswLTlhLWZBLUZdezY0fSQvLnRlc3QoY29tbWl0bWVudEhleCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YWtlckNvbW1pdG1lbnQgbXVzdCBiZSAzMiBieXRlcycpO1xuICB9XG4gIGNvbnN0IGVhcmx5RXhpdEtleSA9IHBhcnNlQ29tcHJlc3NlZEtleShhc1N0cmluZyhmaWVsZHMuZWFybHlFeGl0S2V5LCAnZWFybHkgZXhpdCBrZXknKSwgJ2Vhcmx5RXhpdEtleScpO1xuXG4gIGlmICghQXJyYXkuaXNBcnJheShmaWVsZHMuc3Rha2VyTXVsdGkpIHx8IGZpZWxkcy5zdGFrZXJNdWx0aS5sZW5ndGggIT09IDQgfHwgZmllbGRzLnN0YWtlck11bHRpWzBdICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzdGFrZXIgbXVsdGkgbXVzdCBiZSBhIDItb2YtMyBtdWx0aXNpZycpO1xuICB9XG4gIGNvbnN0IHN0YWtlcktleVN0cmluZ3MgPSBmaWVsZHMuc3Rha2VyTXVsdGkuc2xpY2UoMSkubWFwKChrZXksIGluZGV4KSA9PiBhc1N0cmluZyhrZXksIGBzdGFrZXIga2V5ICR7aW5kZXh9YCkpO1xuICBjb25zdCByZXNvbHZlZEtleXMgPSBzdGFrZXJLZXlTdHJpbmdzLm1hcChyZXNvbHZlU3Rha2VyS2V5KTtcblxuICByZXR1cm4ge1xuICAgIHVubG9ja0hlaWdodCxcbiAgICBzdGFrZXJDb21taXRtZW50OiBCdWZmZXIuZnJvbShjb21taXRtZW50SGV4LCAnaGV4JyksXG4gICAgZWFybHlFeGl0S2V5LFxuICAgIHN0YWtlcktleVN0cmluZ3M6IFtzdGFrZXJLZXlTdHJpbmdzWzBdLCBzdGFrZXJLZXlTdHJpbmdzWzFdLCBzdGFrZXJLZXlTdHJpbmdzWzJdXSxcbiAgICBzdGFrZXJLZXlzOiByZXNvbHZlZEtleXMuZXZlcnkoKGtleSk6IGtleSBpcyBCdWZmZXIgPT4ga2V5ICE9PSB1bmRlZmluZWQpXG4gICAgICA/IFtyZXNvbHZlZEtleXNbMF0sIHJlc29sdmVkS2V5c1sxXSwgcmVzb2x2ZWRLZXlzWzJdXVxuICAgICAgOiB1bmRlZmluZWQsXG4gICAgbWluaXNjcmlwdE5vZGUsXG4gIH07XG59XG4iXX0=
|
|
@@ -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=
|