@bitgo/utxo-staking 1.43.2 → 2.0.0

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 * from './witness';
2
+ export * from './recovery';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/pox5/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/pox5/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
@@ -15,4 +15,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./witness"), exports);
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcG94NS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNENBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi93aXRuZXNzJztcbiJdfQ==
18
+ __exportStar(require("./recovery"), exports);
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcG94NS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNENBQTBCO0FBQzFCLDZDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vd2l0bmVzcyc7XG5leHBvcnQgKiBmcm9tICcuL3JlY292ZXJ5JztcbiJdfQ==
@@ -0,0 +1,13 @@
1
+ import { Psbt } from '@bitgo/wasm-utxo';
2
+ import { pox5 } from '@bitgo/utxo-descriptors';
3
+ export declare const POX5_MAX_UNLOCK_HEIGHT = 500000000;
4
+ /** Validate the post-CLTV policy for all canonical PoX-5 inputs in a recovery PSBT. */
5
+ export declare function assertPox5LocktimeSpend(psbt: Psbt, inputs: readonly pox5.Pox5InputMatch[]): void;
6
+ /** Validate that a canonical PoX-5 input can use the principal-preimage branch. */
7
+ export declare function assertPox5EarlyExitSpend(psbt: Psbt, input: pox5.Pox5InputMatch): void;
8
+ export type Pox5SpendBranch = 'locktime' | 'early-exit';
9
+ /** Classify a PoX-5 spend from native principal-preimage metadata. */
10
+ export declare function classifyPox5Spend(psbt: Psbt, input: pox5.Pox5InputMatch): Pox5SpendBranch;
11
+ /** Add validated principal-preimage metadata for an early-exit spend. */
12
+ export declare function preparePox5EarlyExit(psbt: Psbt, inputIndex: number, input: pox5.Pox5InputMatch, principalPreimage: Uint8Array): void;
13
+ //# sourceMappingURL=recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../src/pox5/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAE/C,eAAO,MAAM,sBAAsB,YAAc,CAAC;AA4BlD,uFAAuF;AACvF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAqBhG;AAED,mFAAmF;AACnF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAErF;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,YAAY,CAAC;AAExD,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,GAAG,eAAe,CAMzF;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,IAAI,CAAC,cAAc,EAC1B,iBAAiB,EAAE,UAAU,GAC5B,IAAI,CAON"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POX5_MAX_UNLOCK_HEIGHT = void 0;
4
+ exports.assertPox5LocktimeSpend = assertPox5LocktimeSpend;
5
+ exports.assertPox5EarlyExitSpend = assertPox5EarlyExitSpend;
6
+ exports.classifyPox5Spend = classifyPox5Spend;
7
+ exports.preparePox5EarlyExit = preparePox5EarlyExit;
8
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
9
+ const utxo_descriptors_1 = require("@bitgo/utxo-descriptors");
10
+ exports.POX5_MAX_UNLOCK_HEIGHT = 500000000;
11
+ function assertPox5UnlockHeight(unlockHeight) {
12
+ if (!Number.isSafeInteger(unlockHeight) || unlockHeight <= 0 || unlockHeight >= exports.POX5_MAX_UNLOCK_HEIGHT) {
13
+ throw new Error(`PoX-5 unlock height must be a positive block height below ${exports.POX5_MAX_UNLOCK_HEIGHT}`);
14
+ }
15
+ }
16
+ function assertPox5BlockHeightLocktime(lockTime) {
17
+ if (!Number.isSafeInteger(lockTime) || lockTime < 0 || lockTime >= exports.POX5_MAX_UNLOCK_HEIGHT) {
18
+ throw new Error(`PoX-5 nLockTime must be a block height below ${exports.POX5_MAX_UNLOCK_HEIGHT}`);
19
+ }
20
+ }
21
+ function getMatchedTransactionInput(psbt, match) {
22
+ const psbtInput = psbt.getInputs()[match.inputIndex];
23
+ const transactionInput = wasm_utxo_1.Transaction.fromBytes(psbt.getUnsignedTx()).getInputs()[match.inputIndex];
24
+ const descriptorScript = Buffer.from(match.descriptor.scriptPubkey());
25
+ if (!psbtInput?.witnessUtxo ||
26
+ !transactionInput ||
27
+ !Buffer.from(psbtInput.witnessUtxo.script).equals(descriptorScript)) {
28
+ throw new Error(`PoX-5 descriptor match does not match PSBT input ${match.inputIndex}`);
29
+ }
30
+ return transactionInput;
31
+ }
32
+ /** Validate the post-CLTV policy for all canonical PoX-5 inputs in a recovery PSBT. */
33
+ function assertPox5LocktimeSpend(psbt, inputs) {
34
+ if (inputs.length === 0) {
35
+ throw new Error('PoX-5 lockup descriptor match is required');
36
+ }
37
+ const unlockHeights = inputs.map((input) => {
38
+ const { unlockHeight } = input.info;
39
+ assertPox5UnlockHeight(unlockHeight);
40
+ return unlockHeight;
41
+ });
42
+ const lockTime = psbt.lockTime();
43
+ assertPox5BlockHeightLocktime(lockTime);
44
+ const requiredLockTime = Math.max(...unlockHeights);
45
+ if (lockTime < requiredLockTime) {
46
+ throw new Error(`PoX-5 nLockTime must be at least ${requiredLockTime}`);
47
+ }
48
+ for (const input of inputs) {
49
+ if (getMatchedTransactionInput(psbt, input).sequence === 0xffffffff) {
50
+ throw new Error(`PoX-5 locktime spend input ${input.inputIndex} must use a non-final sequence`);
51
+ }
52
+ }
53
+ }
54
+ /** Validate that a canonical PoX-5 input can use the principal-preimage branch. */
55
+ function assertPox5EarlyExitSpend(psbt, input) {
56
+ getMatchedTransactionInput(psbt, input);
57
+ }
58
+ /** Classify a PoX-5 spend from native principal-preimage metadata. */
59
+ function classifyPox5Spend(psbt, input) {
60
+ getMatchedTransactionInput(psbt, input);
61
+ const hasPrincipalPreimage = psbt
62
+ .getInputKeyValues(input.inputIndex)
63
+ .some((record) => record.type === 'known' && record.key === 'PSBT_IN_SHA256');
64
+ return hasPrincipalPreimage ? 'early-exit' : 'locktime';
65
+ }
66
+ /** Add validated principal-preimage metadata for an early-exit spend. */
67
+ function preparePox5EarlyExit(psbt, inputIndex, input, principalPreimage) {
68
+ if (inputIndex !== input.inputIndex) {
69
+ throw new Error(`PoX-5 descriptor match belongs to PSBT input ${input.inputIndex}, not ${inputIndex}`);
70
+ }
71
+ assertPox5EarlyExitSpend(psbt, input);
72
+ utxo_descriptors_1.pox5.assertPox5PrincipalPreimage(input.info, principalPreimage);
73
+ psbt.addSha256Preimage(inputIndex, principalPreimage);
74
+ }
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcG94NS9yZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFnQ0EsMERBcUJDO0FBR0QsNERBRUM7QUFLRCw4Q0FNQztBQUdELG9EQVlDO0FBcEZELGdEQUFxRDtBQUNyRCw4REFBK0M7QUFFbEMsUUFBQSxzQkFBc0IsR0FBRyxTQUFXLENBQUM7QUFFbEQsU0FBUyxzQkFBc0IsQ0FBQyxZQUFvQjtJQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLFlBQVksSUFBSSw4QkFBc0IsRUFBRSxDQUFDO1FBQ3ZHLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELDhCQUFzQixFQUFFLENBQUMsQ0FBQztJQUN6RyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsNkJBQTZCLENBQUMsUUFBZ0I7SUFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsSUFBSSxRQUFRLElBQUksOEJBQXNCLEVBQUUsQ0FBQztRQUMxRixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCw4QkFBc0IsRUFBRSxDQUFDLENBQUM7SUFDNUYsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLDBCQUEwQixDQUFDLElBQVUsRUFBRSxLQUEwQjtJQUN4RSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sZ0JBQWdCLEdBQUcsdUJBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25HLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxL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LDJCQUEyQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNoRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFDeEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBzYnQsIFRyYW5zYWN0aW9uIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgeyBwb3g1IH0gZnJvbSAnQGJpdGdvL3V0eG8tZGVzY3JpcHRvcnMnO1xuXG5leHBvcnQgY29uc3QgUE9YNV9NQVhfVU5MT0NLX0hFSUdIVCA9IDUwMF8wMDBfMDAwO1xuXG5mdW5jdGlvbiBhc3NlcnRQb3g1VW5sb2NrSGVpZ2h0KHVubG9ja0hlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIodW5sb2NrSGVpZ2h0KSB8fCB1bmxvY2tIZWlnaHQgPD0gMCB8fCB1bmxvY2tIZWlnaHQgPj0gUE9YNV9NQVhfVU5MT0NLX0hFSUdIVCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUG9YLTUgdW5sb2NrIGhlaWdodCBtdXN0IGJlIGEgcG9zaXRpdmUgYmxvY2sgaGVpZ2h0IGJlbG93ICR7UE9YNV9NQVhfVU5MT0NLX0hFSUdIVH1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRQb3g1QmxvY2tIZWlnaHRMb2NrdGltZShsb2NrVGltZTogbnVtYmVyKTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIobG9ja1RpbWUpIHx8IGxvY2tUaW1lIDwgMCB8fCBsb2NrVGltZSA+PSBQT1g1X01BWF9VTkxPQ0tfSEVJR0hUKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQb1gtNSBuTG9ja1RpbWUgbXVzdCBiZSBhIGJsb2NrIGhlaWdodCBiZWxvdyAke1BPWDVfTUFYX1VOTE9DS19IRUlHSFR9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TWF0Y2hlZFRyYW5zYWN0aW9uSW5wdXQocHNidDogUHNidCwgbWF0Y2g6IHBveDUuUG94NUlucHV0TWF0Y2gpIHtcbiAgY29uc3QgcHNidElucHV0ID0gcHNidC5nZXRJbnB1dHMoKVttYXRjaC5pbnB1dEluZGV4XTtcbiAgY29uc3QgdHJhbnNhY3Rpb25JbnB1dCA9IFRyYW5zYWN0aW9uLmZyb21CeXRlcyhwc2J0LmdldFVuc2lnbmVkVHgoKSkuZ2V0SW5wdXRzKClbbWF0Y2guaW5wdXRJbmRleF07XG4gIGNvbnN0IGRlc2NyaXB0b3JTY3JpcHQgPSBCdWZmZXIuZnJvbShtYXRjaC5kZXNjcmlwdG9yLnNjcmlwdFB1YmtleSgpKTtcbiAgaWYgKFxuICAgICFwc2J0SW5wdXQ/LndpdG5lc3NVdHhvIHx8XG4gICAgIXRyYW5zYWN0aW9uSW5wdXQgfHxcbiAgICAhQnVmZmVyLmZyb20ocHNidElucHV0LndpdG5lc3NVdHhvLnNjcmlwdCkuZXF1YWxzKGRlc2NyaXB0b3JTY3JpcHQpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUG9YLTUgZGVzY3JpcHRvciBtYXRjaCBkb2VzIG5vdCBtYXRjaCBQU0JUIGlucHV0ICR7bWF0Y2guaW5wdXRJbmRleH1gKTtcbiAgfVxuICByZXR1cm4gdHJhbnNhY3Rpb25JbnB1dDtcbn1cblxuLyoqIFZhbGlkYXRlIHRoZSBwb3N0LUNMVFYgcG9saWN5IGZvciBhbGwgY2Fub25pY2FsIFBvWC01IGlucHV0cyBpbiBhIHJlY292ZXJ5IFBTQlQuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UG94NUxvY2t0aW1lU3BlbmQocHNidDogUHNidCwgaW5wdXRzOiByZWFkb25seSBwb3g1LlBveDVJbnB1dE1hdGNoW10pOiB2b2lkIHtcbiAgaWYgKGlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvWC01IGxvY2t1cCBkZXNjcmlwdG9yIG1hdGNoIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICBjb25zdCB1bmxvY2tIZWlnaHRzID0gaW5wdXRzLm1hcCgoaW5wdXQpID0+IHtcbiAgICBjb25zdCB7IHVubG9ja0hlaWdodCB9ID0gaW5wdXQuaW5mbztcbiAgICBhc3NlcnRQb3g1VW5sb2NrSGVpZ2h0KHVubG9ja0hlaWdodCk7XG4gICAgcmV0dXJuIHVubG9ja0hlaWdodDtcbiAgfSk7XG4gIGNvbnN0IGxvY2tUaW1lID0gcHNidC5sb2NrVGltZSgpO1xuICBhc3NlcnRQb3g1QmxvY2tIZWlnaHRMb2NrdGltZShsb2NrVGltZSk7XG4gIGNvbnN0IHJlcXVpcmVkTG9ja1RpbWUgPSBNYXRoLm1heCguLi51bmxvY2tIZWlnaHRzKTtcbiAgaWYgKGxvY2tUaW1lIDwgcmVxdWlyZWRMb2NrVGltZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUG9YLTUgbkxvY2tUaW1lIG11c3QgYmUgYXQgbGVhc3QgJHtyZXF1aXJlZExvY2tUaW1lfWApO1xuICB9XG4gIGZvciAoY29uc3QgaW5wdXQgb2YgaW5wdXRzKSB7XG4gICAgaWYgKGdldE1hdGNoZWRUcmFuc2FjdGlvbklucHV0KHBzYnQsIGlucHV0KS5zZXF1ZW5jZSA9PT0gMHhmZmZmZmZmZikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQb1gtNSBsb2NrdGltZSBzcGVuZCBpbnB1dCAke2lucHV0LmlucHV0SW5kZXh9IG11c3QgdXNlIGEgbm9uLWZpbmFsIHNlcXVlbmNlYCk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBWYWxpZGF0ZSB0aGF0IGEgY2Fub25pY2FsIFBvWC01IGlucHV0IGNhbiB1c2UgdGhlIHByaW5jaXBhbC1wcmVpbWFnZSBicmFuY2guICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UG94NUVhcmx5RXhpdFNwZW5kKHBzYnQ6IFBzYnQsIGlucHV0OiBwb3g1LlBveDVJbnB1dE1hdGNoKTogdm9pZCB7XG4gIGdldE1hdGNoZWRUcmFuc2FjdGlvbklucHV0KHBzYnQsIGlucHV0KTtcbn1cblxuZXhwb3J0IHR5cGUgUG94NVNwZW5kQnJhbmNoID0gJ2xvY2t0aW1lJyB8ICdlYXJseS1leGl0JztcblxuLyoqIENsYXNzaWZ5IGEgUG9YLTUgc3BlbmQgZnJvbSBuYXRpdmUgcHJpbmNpcGFsLXByZWltYWdlIG1ldGFkYXRhLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5UG94NVNwZW5kKHBzYnQ6IFBzYnQsIGlucHV0OiBwb3g1LlBveDVJbnB1dE1hdGNoKTogUG94NVNwZW5kQnJhbmNoIHtcbiAgZ2V0TWF0Y2hlZFRyYW5zYWN0aW9uSW5wdXQocHNidCwgaW5wdXQpO1xuICBjb25zdCBoYXNQcmluY2lwYWxQcmVpbWFnZSA9IHBzYnRcbiAgICAuZ2V0SW5wdXRLZXlWYWx1ZXMoaW5wdXQuaW5wdXRJbmRleClcbiAgICAuc29tZSgocmVjb3JkKSA9PiByZWNvcmQudHlwZSA9PT0gJ2tub3duJyAmJiByZWNvcmQua2V5ID09PSAnUFNCVF9JTl9TSEEyNTYnKTtcbiAgcmV0dXJuIGhhc1ByaW5jaXBhbFByZWltYWdlID8gJ2Vhcmx5LWV4aXQnIDogJ2xvY2t0aW1lJztcbn1cblxuLyoqIEFkZCB2YWxpZGF0ZWQgcHJpbmNpcGFsLXByZWltYWdlIG1ldGFkYXRhIGZvciBhbiBlYXJseS1leGl0IHNwZW5kLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVQb3g1RWFybHlFeGl0KFxuICBwc2J0OiBQc2J0LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIGlucHV0OiBwb3g1LlBveDVJbnB1dE1hdGNoLFxuICBwcmluY2lwYWxQcmVpbWFnZTogVWludDhBcnJheVxuKTogdm9pZCB7XG4gIGlmIChpbnB1dEluZGV4ICE9PSBpbnB1dC5pbnB1dEluZGV4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQb1gtNSBkZXNjcmlwdG9yIG1hdGNoIGJlbG9uZ3MgdG8gUFNCVCBpbnB1dCAke2lucHV0LmlucHV0SW5kZXh9LCBub3QgJHtpbnB1dEluZGV4fWApO1xuICB9XG4gIGFzc2VydFBveDVFYXJseUV4aXRTcGVuZChwc2J0LCBpbnB1dCk7XG4gIHBveDUuYXNzZXJ0UG94NVByaW5jaXBhbFByZWltYWdlKGlucHV0LmluZm8sIHByaW5jaXBhbFByZWltYWdlKTtcbiAgcHNidC5hZGRTaGEyNTZQcmVpbWFnZShpbnB1dEluZGV4LCBwcmluY2lwYWxQcmVpbWFnZSk7XG59XG4iXX0=
@@ -1,16 +1,13 @@
1
- import { ast, Descriptor, Psbt } from '@bitgo/wasm-utxo';
2
- type Pox5Descriptor = Descriptor | ast.DescriptorNode;
1
+ import { Psbt } from '@bitgo/wasm-utxo';
2
+ import { pox5 } from '@bitgo/utxo-descriptors';
3
3
  export type Pox5FinalizerParams = {
4
- /** A definite or derivation-indexed canonical PoX-5 descriptor. */
5
- descriptor: Pox5Descriptor;
6
- /** The derived user, backup, and BitGo keys in descriptor order. */
7
- stakerKeys: [Buffer, Buffer, Buffer];
4
+ /** The canonical descriptor match for the input being finalized. */
5
+ match: pox5.Pox5InputMatch;
8
6
  };
9
7
  /** Finalize the post-CLTV 2-of-3 PoX-5 spend branch. */
10
8
  export declare function finalizePox5LocktimePath(psbt: Psbt, inputIndex: number, params: Pox5FinalizerParams): void;
11
9
  /** Finalize the principal-preimage early-exit 2-of-3 PoX-5 spend branch. */
12
10
  export declare function finalizePox5EarlyExitPath(psbt: Psbt, inputIndex: number, params: Pox5FinalizerParams & {
13
- principalPreimage: Buffer;
11
+ principalPreimage: Uint8Array;
14
12
  }): void;
15
- export {};
16
13
  //# sourceMappingURL=witness.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"witness.d.ts","sourceRoot":"","sources":["../../../../src/pox5/witness.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGzD,KAAK,cAAc,GAAG,UAAU,GAAG,GAAG,CAAC,cAAc,CAAC;AAEtD,MAAM,MAAM,mBAAmB,GAAG;IAChC,mEAAmE;IACnE,UAAU,EAAE,cAAc,CAAC;IAC3B,oEAAoE;IACpE,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,CAAC;AAuBF,wDAAwD;AACxD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAM1G;AAED,4EAA4E;AAC5E,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,mBAAmB,GAAG;IAAE,iBAAiB,EAAE,MAAM,CAAA;CAAE,GAC1D,IAAI,CAQN"}
1
+ {"version":3,"file":"witness.d.ts","sourceRoot":"","sources":["../../../../src/pox5/witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAI/C,MAAM,MAAM,mBAAmB,GAAG;IAChC,oEAAoE;IACpE,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC;CAC5B,CAAC;AAQF,wDAAwD;AACxD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAK1G;AAED,4EAA4E;AAC5E,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,mBAAmB,GAAG;IAAE,iBAAiB,EAAE,UAAU,CAAA;CAAE,GAC9D,IAAI,CAKN"}
@@ -2,43 +2,24 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.finalizePox5LocktimePath = finalizePox5LocktimePath;
4
4
  exports.finalizePox5EarlyExitPath = finalizePox5EarlyExitPath;
5
- const crypto_1 = require("crypto");
6
- const wasm_utxo_1 = require("@bitgo/wasm-utxo");
7
- const utxo_descriptors_1 = require("@bitgo/utxo-descriptors");
8
- function getParsedDescriptor(params) {
9
- const parsed = utxo_descriptors_1.pox5.parsePox5LockupDescriptor(params.descriptor);
10
- if (!parsed || !parsed.stakerKeys) {
11
- throw new Error('descriptor must be a definite or derivation-indexed canonical PoX-5 descriptor');
5
+ const recovery_1 = require("./recovery");
6
+ function assertFinalizerInputIndex(inputIndex, match) {
7
+ if (inputIndex !== match.inputIndex) {
8
+ throw new Error(`PoX-5 descriptor match belongs to PSBT input ${match.inputIndex}, not ${inputIndex}`);
12
9
  }
13
- if (!parsed.stakerKeys.every((key, index) => key.equals(params.stakerKeys[index]))) {
14
- throw new Error('stakerKeys must match the canonical descriptor order');
15
- }
16
- return parsed;
17
- }
18
- function getDescriptor(descriptor) {
19
- return descriptor instanceof wasm_utxo_1.Descriptor ? descriptor : wasm_utxo_1.Descriptor.fromString(wasm_utxo_1.ast.formatNode(descriptor), 'definite');
20
- }
21
- function prepareInput(psbt, inputIndex, params) {
22
- const parsed = getParsedDescriptor(params);
23
- psbt.updateInputWithDescriptor(inputIndex, getDescriptor(params.descriptor));
24
- return parsed;
25
10
  }
26
11
  /** Finalize the post-CLTV 2-of-3 PoX-5 spend branch. */
27
12
  function finalizePox5LocktimePath(psbt, inputIndex, params) {
28
- const parsed = prepareInput(psbt, inputIndex, params);
29
- if (psbt.lockTime() < parsed.unlockHeight) {
30
- throw new Error(`transaction locktime must be at least ${parsed.unlockHeight}`);
31
- }
13
+ assertFinalizerInputIndex(inputIndex, params.match);
14
+ (0, recovery_1.assertPox5LocktimeSpend)(psbt, [params.match]);
15
+ psbt.updateInputWithDescriptor(inputIndex, params.match.descriptor);
32
16
  psbt.finalizeInput(inputIndex);
33
17
  }
34
18
  /** Finalize the principal-preimage early-exit 2-of-3 PoX-5 spend branch. */
35
19
  function finalizePox5EarlyExitPath(psbt, inputIndex, params) {
36
- const parsed = prepareInput(psbt, inputIndex, params);
37
- const preimageHash = (0, crypto_1.createHash)('sha256').update(params.principalPreimage).digest();
38
- if (!preimageHash.equals(parsed.stakerCommitment)) {
39
- throw new Error('principalPreimage does not match the descriptor stakerCommitment');
40
- }
41
- psbt.addSha256Preimage(inputIndex, params.principalPreimage);
20
+ assertFinalizerInputIndex(inputIndex, params.match);
21
+ (0, recovery_1.preparePox5EarlyExit)(psbt, inputIndex, params.match, params.principalPreimage);
22
+ psbt.updateInputWithDescriptor(inputIndex, params.match.descriptor);
42
23
  psbt.finalizeInput(inputIndex);
43
24
  }
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0bmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wb3g1L3dpdG5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFvQ0EsNERBTUM7QUFHRCw4REFZQztBQXpERCxtQ0FBb0M7QUFFcEMsZ0RBQXlEO0FBQ3pELDhEQUErQztBQVcvQyxTQUFTLG1CQUFtQixDQUFDLE1BQTJCO0lBQ3RELE1BQU0sTUFBTSxHQUFHLHVCQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRkFBZ0YsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkYsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsVUFBMEI7SUFDL0MsT0FBTyxVQUFVLFlBQVksc0JBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxzQkFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3ZILENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxJQUFVLEVBQUUsVUFBa0IsRUFBRSxNQUEyQjtJQUMvRSxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQyxJQUFJLENBQUMseUJBQXlCLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM3RSxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsd0RBQXdEO0FBQ3hELFNBQWdCLHdCQUF3QixDQUFDLElBQVUsRUFBRSxVQUFrQixFQUFFLE1BQTJCO0lBQ2xHLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3RELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLFNBQWdCLHlCQUF5QixDQUN2QyxJQUFVLEVBQ1YsVUFBa0IsRUFDbEIsTUFBMkQ7SUFFM0QsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdEQsTUFBTSxZQUFZLEdBQUcsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNwRixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sSUFBSSxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUM3RCxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcblxuaW1wb3J0IHsgYXN0LCBEZXNjcmlwdG9yLCBQc2J0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgeyBwb3g1IH0gZnJvbSAnQGJpdGdvL3V0eG8tZGVzY3JpcHRvcnMnO1xuXG50eXBlIFBveDVEZXNjcmlwdG9yID0gRGVzY3JpcHRvciB8IGFzdC5EZXNjcmlwdG9yTm9kZTtcblxuZXhwb3J0IHR5cGUgUG94NUZpbmFsaXplclBhcmFtcyA9IHtcbiAgLyoqIEEgZGVmaW5pdGUgb3IgZGVyaXZhdGlvbi1pbmRleGVkIGNhbm9uaWNhbCBQb1gtNSBkZXNjcmlwdG9yLiAqL1xuICBkZXNjcmlwdG9yOiBQb3g1RGVzY3JpcHRvcjtcbiAgLyoqIFRoZSBkZXJpdmVkIHVzZXIsIGJhY2t1cCwgYW5kIEJpdEdvIGtleXMgaW4gZGVzY3JpcHRvciBvcmRlci4gKi9cbiAgc3Rha2VyS2V5czogW0J1ZmZlciwgQnVmZmVyLCBCdWZmZXJdO1xufTtcblxuZnVuY3Rpb24gZ2V0UGFyc2VkRGVzY3JpcHRvcihwYXJhbXM6IFBveDVGaW5hbGl6ZXJQYXJhbXMpIHtcbiAgY29uc3QgcGFyc2VkID0gcG94NS5wYXJzZVBveDVMb2NrdXBEZXNjcmlwdG9yKHBhcmFtcy5kZXNjcmlwdG9yKTtcbiAgaWYgKCFwYXJzZWQgfHwgIXBhcnNlZC5zdGFrZXJLZXlzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkZXNjcmlwdG9yIG11c3QgYmUgYSBkZWZpbml0ZSBvciBkZXJpdmF0aW9uLWluZGV4ZWQgY2Fub25pY2FsIFBvWC01IGRlc2NyaXB0b3InKTtcbiAgfVxuICBpZiAoIXBhcnNlZC5zdGFrZXJLZXlzLmV2ZXJ5KChrZXksIGluZGV4KSA9PiBrZXkuZXF1YWxzKHBhcmFtcy5zdGFrZXJLZXlzW2luZGV4XSkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzdGFrZXJLZXlzIG11c3QgbWF0Y2ggdGhlIGNhbm9uaWNhbCBkZXNjcmlwdG9yIG9yZGVyJyk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gZ2V0RGVzY3JpcHRvcihkZXNjcmlwdG9yOiBQb3g1RGVzY3JpcHRvcik6IERlc2NyaXB0b3Ige1xuICByZXR1cm4gZGVzY3JpcHRvciBpbnN0YW5jZW9mIERlc2NyaXB0b3IgPyBkZXNjcmlwdG9yIDogRGVzY3JpcHRvci5mcm9tU3RyaW5nKGFzdC5mb3JtYXROb2RlKGRlc2NyaXB0b3IpLCAnZGVmaW5pdGUnKTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUlucHV0KHBzYnQ6IFBzYnQsIGlucHV0SW5kZXg6IG51bWJlciwgcGFyYW1zOiBQb3g1RmluYWxpemVyUGFyYW1zKSB7XG4gIGNvbnN0IHBhcnNlZCA9IGdldFBhcnNlZERlc2NyaXB0b3IocGFyYW1zKTtcbiAgcHNidC51cGRhdGVJbnB1dFdpdGhEZXNjcmlwdG9yKGlucHV0SW5kZXgsIGdldERlc2NyaXB0b3IocGFyYW1zLmRlc2NyaXB0b3IpKTtcbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqIEZpbmFsaXplIHRoZSBwb3N0LUNMVFYgMi1vZi0zIFBvWC01IHNwZW5kIGJyYW5jaC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZVBveDVMb2NrdGltZVBhdGgocHNidDogUHNidCwgaW5wdXRJbmRleDogbnVtYmVyLCBwYXJhbXM6IFBveDVGaW5hbGl6ZXJQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgcGFyc2VkID0gcHJlcGFyZUlucHV0KHBzYnQsIGlucHV0SW5kZXgsIHBhcmFtcyk7XG4gIGlmIChwc2J0LmxvY2tUaW1lKCkgPCBwYXJzZWQudW5sb2NrSGVpZ2h0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB0cmFuc2FjdGlvbiBsb2NrdGltZSBtdXN0IGJlIGF0IGxlYXN0ICR7cGFyc2VkLnVubG9ja0hlaWdodH1gKTtcbiAgfVxuICBwc2J0LmZpbmFsaXplSW5wdXQoaW5wdXRJbmRleCk7XG59XG5cbi8qKiBGaW5hbGl6ZSB0aGUgcHJpbmNpcGFsLXByZWltYWdlIGVhcmx5LWV4aXQgMi1vZi0zIFBvWC01IHNwZW5kIGJyYW5jaC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZVBveDVFYXJseUV4aXRQYXRoKFxuICBwc2J0OiBQc2J0LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHBhcmFtczogUG94NUZpbmFsaXplclBhcmFtcyAmIHsgcHJpbmNpcGFsUHJlaW1hZ2U6IEJ1ZmZlciB9XG4pOiB2b2lkIHtcbiAgY29uc3QgcGFyc2VkID0gcHJlcGFyZUlucHV0KHBzYnQsIGlucHV0SW5kZXgsIHBhcmFtcyk7XG4gIGNvbnN0IHByZWltYWdlSGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShwYXJhbXMucHJpbmNpcGFsUHJlaW1hZ2UpLmRpZ2VzdCgpO1xuICBpZiAoIXByZWltYWdlSGFzaC5lcXVhbHMocGFyc2VkLnN0YWtlckNvbW1pdG1lbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcmluY2lwYWxQcmVpbWFnZSBkb2VzIG5vdCBtYXRjaCB0aGUgZGVzY3JpcHRvciBzdGFrZXJDb21taXRtZW50Jyk7XG4gIH1cbiAgcHNidC5hZGRTaGEyNTZQcmVpbWFnZShpbnB1dEluZGV4LCBwYXJhbXMucHJpbmNpcGFsUHJlaW1hZ2UpO1xuICBwc2J0LmZpbmFsaXplSW5wdXQoaW5wdXRJbmRleCk7XG59XG4iXX0=
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0bmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wb3g1L3dpdG5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFpQkEsNERBS0M7QUFHRCw4REFTQztBQS9CRCx5Q0FBMkU7QUFPM0UsU0FBUyx5QkFBeUIsQ0FBQyxVQUFrQixFQUFFLEtBQTBCO0lBQy9FLElBQUksVUFBVSxLQUFLLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxLQUFLLENBQUMsVUFBVSxTQUFTLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDekcsQ0FBQztBQUNILENBQUM7QUFFRCx3REFBd0Q7QUFDeEQsU0FBZ0Isd0JBQXdCLENBQUMsSUFBVSxFQUFFLFVBQWtCLEVBQUUsTUFBMkI7SUFDbEcseUJBQXlCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxJQUFBLGtDQUF1QixFQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsU0FBZ0IseUJBQXlCLENBQ3ZDLElBQVUsRUFDVixVQUFrQixFQUNsQixNQUErRDtJQUUvRCx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELElBQUEsK0JBQW9CLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQy9FLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQc2J0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgeyBwb3g1IH0gZnJvbSAnQGJpdGdvL3V0eG8tZGVzY3JpcHRvcnMnO1xuXG5pbXBvcnQgeyBhc3NlcnRQb3g1TG9ja3RpbWVTcGVuZCwgcHJlcGFyZVBveDVFYXJseUV4aXQgfSBmcm9tICcuL3JlY292ZXJ5JztcblxuZXhwb3J0IHR5cGUgUG94NUZpbmFsaXplclBhcmFtcyA9IHtcbiAgLyoqIFRoZSBjYW5vbmljYWwgZGVzY3JpcHRvciBtYXRjaCBmb3IgdGhlIGlucHV0IGJlaW5nIGZpbmFsaXplZC4gKi9cbiAgbWF0Y2g6IHBveDUuUG94NUlucHV0TWF0Y2g7XG59O1xuXG5mdW5jdGlvbiBhc3NlcnRGaW5hbGl6ZXJJbnB1dEluZGV4KGlucHV0SW5kZXg6IG51bWJlciwgbWF0Y2g6IHBveDUuUG94NUlucHV0TWF0Y2gpOiB2b2lkIHtcbiAgaWYgKGlucHV0SW5kZXggIT09IG1hdGNoLmlucHV0SW5kZXgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBvWC01IGRlc2NyaXB0b3IgbWF0Y2ggYmVsb25ncyB0byBQU0JUIGlucHV0ICR7bWF0Y2guaW5wdXRJbmRleH0sIG5vdCAke2lucHV0SW5kZXh9YCk7XG4gIH1cbn1cblxuLyoqIEZpbmFsaXplIHRoZSBwb3N0LUNMVFYgMi1vZi0zIFBvWC01IHNwZW5kIGJyYW5jaC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZVBveDVMb2NrdGltZVBhdGgocHNidDogUHNidCwgaW5wdXRJbmRleDogbnVtYmVyLCBwYXJhbXM6IFBveDVGaW5hbGl6ZXJQYXJhbXMpOiB2b2lkIHtcbiAgYXNzZXJ0RmluYWxpemVySW5wdXRJbmRleChpbnB1dEluZGV4LCBwYXJhbXMubWF0Y2gpO1xuICBhc3NlcnRQb3g1TG9ja3RpbWVTcGVuZChwc2J0LCBbcGFyYW1zLm1hdGNoXSk7XG4gIHBzYnQudXBkYXRlSW5wdXRXaXRoRGVzY3JpcHRvcihpbnB1dEluZGV4LCBwYXJhbXMubWF0Y2guZGVzY3JpcHRvcik7XG4gIHBzYnQuZmluYWxpemVJbnB1dChpbnB1dEluZGV4KTtcbn1cblxuLyoqIEZpbmFsaXplIHRoZSBwcmluY2lwYWwtcHJlaW1hZ2UgZWFybHktZXhpdCAyLW9mLTMgUG9YLTUgc3BlbmQgYnJhbmNoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplUG94NUVhcmx5RXhpdFBhdGgoXG4gIHBzYnQ6IFBzYnQsXG4gIGlucHV0SW5kZXg6IG51bWJlcixcbiAgcGFyYW1zOiBQb3g1RmluYWxpemVyUGFyYW1zICYgeyBwcmluY2lwYWxQcmVpbWFnZTogVWludDhBcnJheSB9XG4pOiB2b2lkIHtcbiAgYXNzZXJ0RmluYWxpemVySW5wdXRJbmRleChpbnB1dEluZGV4LCBwYXJhbXMubWF0Y2gpO1xuICBwcmVwYXJlUG94NUVhcmx5RXhpdChwc2J0LCBpbnB1dEluZGV4LCBwYXJhbXMubWF0Y2gsIHBhcmFtcy5wcmluY2lwYWxQcmVpbWFnZSk7XG4gIHBzYnQudXBkYXRlSW5wdXRXaXRoRGVzY3JpcHRvcihpbnB1dEluZGV4LCBwYXJhbXMubWF0Y2guZGVzY3JpcHRvcik7XG4gIHBzYnQuZmluYWxpemVJbnB1dChpbnB1dEluZGV4KTtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../../test/unit/pox5/recovery.ts"],"names":[],"mappings":""}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("assert/strict"));
7
+ const crypto_1 = require("crypto");
8
+ const utxo_descriptors_1 = require("@bitgo/utxo-descriptors");
9
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
10
+ const testutils_1 = require("@bitgo/wasm-utxo/testutils");
11
+ const pox5_1 = require("../../../src/pox5");
12
+ const UNLOCK_HEIGHT = 840000;
13
+ function sha256(value) {
14
+ return (0, crypto_1.createHash)('sha256').update(value).digest();
15
+ }
16
+ function createPox5RecoveryPsbt(lockTime, sequence = 0xfffffffe, unlockHeight = UNLOCK_HEIGHT) {
17
+ const [user, backup, bitgo] = (0, testutils_1.getKeyTriple)('utxo-staking-pox5-recovery');
18
+ const earlyExit = (0, testutils_1.getKey)('utxo-staking-pox5-recovery-early-exit');
19
+ const principalPreimage = Buffer.alloc(32, 0x42);
20
+ const descriptor = utxo_descriptors_1.pox5.createPox5LockupDescriptor({
21
+ unlockHeight,
22
+ stakerCommitment: sha256(principalPreimage),
23
+ earlyExitKey: Buffer.from(earlyExit.publicKey),
24
+ stakerKeys: [Buffer.from(user.publicKey), Buffer.from(backup.publicKey), Buffer.from(bitgo.publicKey)],
25
+ });
26
+ const concreteDescriptor = descriptor;
27
+ const psbt = wasm_utxo_1.Psbt.create(2, lockTime);
28
+ psbt.addInput('01'.repeat(32), 0, 100000n, concreteDescriptor.scriptPubkey(), sequence);
29
+ psbt.addOutput(concreteDescriptor.scriptPubkey(), 90000n);
30
+ psbt.updateInputWithDescriptor(0, concreteDescriptor);
31
+ const match = utxo_descriptors_1.pox5.matchPox5Input(psbt, 0, new Map([['pox5', concreteDescriptor]]));
32
+ strict_1.default.ok(match);
33
+ return { psbt, match: match, principalPreimage };
34
+ }
35
+ describe('PoX-5 spend policy', function () {
36
+ it('allows the early-exit branch regardless of nLockTime', function () {
37
+ const locktimeSpend = createPox5RecoveryPsbt(UNLOCK_HEIGHT);
38
+ const earlyExitSpend = createPox5RecoveryPsbt(0);
39
+ const timestampLocktime = createPox5RecoveryPsbt(pox5_1.POX5_MAX_UNLOCK_HEIGHT);
40
+ strict_1.default.doesNotThrow(() => (0, pox5_1.assertPox5EarlyExitSpend)(locktimeSpend.psbt, locktimeSpend.match));
41
+ strict_1.default.doesNotThrow(() => (0, pox5_1.assertPox5EarlyExitSpend)(earlyExitSpend.psbt, earlyExitSpend.match));
42
+ strict_1.default.doesNotThrow(() => (0, pox5_1.assertPox5EarlyExitSpend)(timestampLocktime.psbt, timestampLocktime.match));
43
+ });
44
+ it('classifies the spend from native principal-preimage metadata', function () {
45
+ const locktimeSpend = createPox5RecoveryPsbt(UNLOCK_HEIGHT);
46
+ strict_1.default.equal((0, pox5_1.classifyPox5Spend)(locktimeSpend.psbt, locktimeSpend.match), 'locktime');
47
+ const earlyExitSpend = createPox5RecoveryPsbt(0);
48
+ (0, pox5_1.preparePox5EarlyExit)(earlyExitSpend.psbt, 0, earlyExitSpend.match, earlyExitSpend.principalPreimage);
49
+ strict_1.default.equal((0, pox5_1.classifyPox5Spend)(earlyExitSpend.psbt, earlyExitSpend.match), 'early-exit');
50
+ });
51
+ it('enforces the block-height and unlock-height boundaries', function () {
52
+ const atHeight = createPox5RecoveryPsbt(UNLOCK_HEIGHT);
53
+ const aboveHeight = createPox5RecoveryPsbt(UNLOCK_HEIGHT + 1);
54
+ const belowHeight = createPox5RecoveryPsbt(UNLOCK_HEIGHT - 1);
55
+ const timestampLocktime = createPox5RecoveryPsbt(pox5_1.POX5_MAX_UNLOCK_HEIGHT);
56
+ strict_1.default.doesNotThrow(() => (0, pox5_1.assertPox5LocktimeSpend)(atHeight.psbt, [atHeight.match]));
57
+ strict_1.default.doesNotThrow(() => (0, pox5_1.assertPox5LocktimeSpend)(aboveHeight.psbt, [aboveHeight.match]));
58
+ strict_1.default.throws(() => (0, pox5_1.assertPox5LocktimeSpend)(belowHeight.psbt, [belowHeight.match]), /at least/);
59
+ strict_1.default.throws(() => (0, pox5_1.assertPox5LocktimeSpend)(timestampLocktime.psbt, [timestampLocktime.match]), /block height below/);
60
+ });
61
+ it('requires non-final sequences for locktime spends', function () {
62
+ const final = createPox5RecoveryPsbt(UNLOCK_HEIGHT, 0xffffffff);
63
+ const nonFinal = createPox5RecoveryPsbt(UNLOCK_HEIGHT, 0xfffffffe);
64
+ strict_1.default.throws(() => (0, pox5_1.assertPox5LocktimeSpend)(final.psbt, [final.match]), /non-final sequence/);
65
+ strict_1.default.doesNotThrow(() => (0, pox5_1.assertPox5LocktimeSpend)(nonFinal.psbt, [nonFinal.match]));
66
+ });
67
+ it('allows final sequences on unrelated transaction inputs', function () {
68
+ const { psbt, match } = createPox5RecoveryPsbt(UNLOCK_HEIGHT);
69
+ psbt.addInput('02'.repeat(32), 0, 10000n, new Uint8Array([0x51]), 0xffffffff);
70
+ strict_1.default.doesNotThrow(() => (0, pox5_1.assertPox5LocktimeSpend)(psbt, [match]));
71
+ });
72
+ it('requires an input match to remain bound to its original PSBT input', function () {
73
+ const { psbt, match, principalPreimage } = createPox5RecoveryPsbt(0);
74
+ strict_1.default.throws(() => (0, pox5_1.preparePox5EarlyExit)(psbt, 1, match, principalPreimage), /belongs to PSBT input/);
75
+ });
76
+ it('adds a validated principal preimage through the native PSBT API', function () {
77
+ const earlyExitSpend = createPox5RecoveryPsbt(0);
78
+ (0, pox5_1.preparePox5EarlyExit)(earlyExitSpend.psbt, 0, earlyExitSpend.match, earlyExitSpend.principalPreimage);
79
+ const records = earlyExitSpend.psbt
80
+ .getInputKeyValues(0)
81
+ .filter((record) => record.type === 'known' && record.key === 'PSBT_IN_SHA256');
82
+ strict_1.default.equal(records.length, 1);
83
+ const [record] = records;
84
+ strict_1.default.deepStrictEqual(Buffer.from(record.keyData), sha256(earlyExitSpend.principalPreimage));
85
+ strict_1.default.deepStrictEqual(Buffer.from(record.value), earlyExitSpend.principalPreimage);
86
+ });
87
+ });
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvcG94NS9yZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDJEQUFtQztBQUNuQyxtQ0FBb0M7QUFFcEMsOERBQStDO0FBQy9DLGdEQUF5RDtBQUN6RCwwREFBa0U7QUFFbEUsNENBTTJCO0FBSTNCLE1BQU0sYUFBYSxHQUFHLE1BQU8sQ0FBQztBQUU5QixTQUFTLE1BQU0sQ0FBQyxLQUFpQjtJQUMvQixPQUFPLElBQUEsbUJBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDckQsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQzdCLFFBQWdCLEVBQ2hCLFFBQVEsR0FBRyxVQUFVLEVBQ3JCLFlBQVksR0FBRyxhQUFhO0lBTTVCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUEsd0JBQVksRUFBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sU0FBUyxHQUFHLElBQUEsa0JBQU0sRUFBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakQsTUFBTSxVQUFVLEdBQUcsdUJBQUksQ0FBQywwQkFBMEIsQ0FBQztRQUNqRCxZQUFZO1FBQ1osZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDO1FBQzNDLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7UUFDOUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUs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LGlCQUFpQixDQUFDLENBQUM7UUFFckcsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUk7YUFDaEMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2FBQ3BCLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2xGLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUN6QixnQkFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUM5RixnQkFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUN0RixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQvc3RyaWN0JztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBwb3g1IH0gZnJvbSAnQGJpdGdvL3V0eG8tZGVzY3JpcHRvcnMnO1xuaW1wb3J0IHsgUHNidCwgdHlwZSBEZXNjcmlwdG9yIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgeyBnZXRLZXksIGdldEtleVRyaXBsZSB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8vdGVzdHV0aWxzJztcblxuaW1wb3J0IHtcbiAgYXNzZXJ0UG94NUVhcmx5RXhpdFNwZW5kLFxuICBhc3NlcnRQb3g1TG9ja3RpbWVTcGVuZCxcbiAgY2xhc3NpZnlQb3g1U3BlbmQsXG4gIFBPWDVfTUFYX1VOTE9DS19IRUlHSFQsXG4gIHByZXBhcmVQb3g1RWFybHlFeGl0LFxufSBmcm9tICcuLi8uLi8uLi9zcmMvcG94NSc7XG5cbnR5cGUgUG94NUlucHV0TWF0Y2ggPSBwb3g1LlBveDVJbnB1dE1hdGNoO1xuXG5jb25zdCBVTkxPQ0tfSEVJR0hUID0gODQwXzAwMDtcblxuZnVuY3Rpb24gc2hhMjU2KHZhbHVlOiBVaW50OEFycmF5KTogQnVmZmVyIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZSh2YWx1ZSkuZGlnZXN0KCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBveDVSZWNvdmVyeVBzYnQoXG4gIGxvY2tUaW1lOiBudW1iZXIsXG4gIHNlcXVlbmNlID0gMHhmZmZmZmZmZSxcbiAgdW5sb2NrSGVpZ2h0ID0gVU5MT0NLX0hFSUdIVFxuKToge1xuICBwc2J0OiBQc2J0O1xuICBtYXRjaDogUG94NUlucHV0TWF0Y2g7XG4gIHByaW5jaXBhbFByZWltYWdlOiBCdWZmZXI7XG59IHtcbiAgY29uc3QgW3VzZXIsIGJhY2t1cCwgYml0Z29dID0gZ2V0S2V5VHJpcGxlKCd1dHhvLXN0YWtpbmctcG94NS1yZWNvdmVyeScpO1xuICBjb25zdCBlYXJseUV4aXQgPSBnZXRLZXkoJ3V0eG8tc3Rha2luZy1wb3g1LXJlY292ZXJ5LWVhcmx5LWV4aXQnKTtcbiAgY29uc3QgcHJpbmNpcGFsUHJlaW1hZ2UgPSBCdWZmZXIuYWxsb2MoMzIsIDB4NDIpO1xuICBjb25zdCBkZXNjcmlwdG9yID0gcG94NS5jcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcih7XG4gICAgdW5sb2NrSGVpZ2h0LFxuICAgIHN0YWtlckNvbW1pdG1lbnQ6IHNoYTI1NihwcmluY2lwYWxQcmVpbWFnZSksXG4gICAgZWFybHlFeGl0S2V5OiBCdWZmZXIuZnJvbShlYXJseUV4aXQucHVibGljS2V5KSxcbiAgICBzdGFrZXJLZXlzOiBbQnVmZmVyLmZyb20odXNlci5wdWJsaWNLZXkpLCBCdWZmZXIuZnJvbShiYWNrdXAucHVibGljS2V5KSwgQnVmZmVyLmZyb20oYml0Z28ucHVibGljS2V5KV0sXG4gIH0pO1xuICBjb25zdCBjb25jcmV0ZURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yIGFzIERlc2NyaXB0b3I7XG4gIGNvbnN0IHBzYnQgPSBQc2J0LmNyZWF0ZSgyLCBsb2NrVGltZSk7XG4gIHBzYnQuYWRkSW5wdXQoJzAxJy5yZXBlYXQoMzIpLCAwLCAxMDBfMDAwbiwgY29uY3JldGVEZXNjcmlwdG9yLnNjcmlwdFB1YmtleSgpLCBzZXF1ZW5jZSk7XG4gIHBzYnQuYWRkT3V0cHV0KGNvbmNyZXRlRGVzY3JpcHRvci5zY3JpcHRQdWJrZXkoKSwgOTBfMDAwbik7XG4gIHBzYnQudXBkYXRlSW5wdXRXaXRoRGVzY3JpcHRvcigwLCBjb25jcmV0ZURlc2NyaXB0b3IpO1xuXG4gIGNvbnN0IG1hdGNoID0gcG94NS5tYXRjaFBveDVJbnB1dChwc2J0LCAwLCBuZXcgTWFwKFtbJ3BveDUnLCBjb25jcmV0ZURlc2NyaXB0b3JdXSkpO1xuICBhc3NlcnQub2sobWF0Y2gpO1xuICByZXR1cm4geyBwc2J0LCBtYXRjaDogbWF0Y2ggYXMgUG94NUlucHV0TWF0Y2gsIHByaW5jaXBhbFByZWltYWdlIH07XG59XG5cbmRlc2NyaWJlKCdQb1gtNSBzcGVuZCBwb2xpY3knLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdhbGxvd3MgdGhlIGVhcmx5LWV4aXQgYnJhbmNoIHJlZ2FyZGxlc3Mgb2YgbkxvY2tUaW1lJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGxvY2t0aW1lU3BlbmQgPSBjcmVhdGVQb3g1UmVjb3ZlcnlQc2J0KFVOTE9DS19IRUlHSFQpO1xuICAgIGNvbnN0IGVhcmx5RXhpdFNwZW5kID0gY3JlYXRlUG94NVJlY292ZXJ5UHNidCgwKTtcbiAgICBjb25zdCB0aW1lc3RhbXBMb2NrdGltZSA9IGNyZWF0ZVBveDVSZWNvdmVyeVBzYnQoUE9YNV9NQVhfVU5MT0NLX0hFSUdIVCk7XG5cbiAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IGFzc2VydFBveDVFYXJseUV4aXRTcGVuZChsb2NrdGltZVNwZW5kLnBzYnQsIGxvY2t0aW1lU3BlbmQubWF0Y2gpKTtcbiAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IGFzc2VydFBveDVFYXJseUV4aXRTcGVuZChlYXJseUV4aXRTcGVuZC5wc2J0LCBlYXJseUV4aXRTcGVuZC5tYXRjaCkpO1xuICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4gYXNzZXJ0UG94NUVhcmx5RXhpdFNwZW5kKHRpbWVzdGFtcExvY2t0aW1lLnBzYnQsIHRpbWVzdGFtcExvY2t0aW1lLm1hdGNoKSk7XG4gIH0pO1xuXG4gIGl0KCdjbGFzc2lmaWVzIHRoZSBzcGVuZCBmcm9tIG5hdGl2ZSBwcmluY2lwYWwtcHJlaW1hZ2UgbWV0YWRhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbG9ja3RpbWVTcGVuZCA9IGNyZWF0ZVBveDVSZWNvdmVyeVBzYnQoVU5MT0NLX0hFSUdIVCk7XG4gICAgYXNzZXJ0LmVxdWFsKGNsYXNzaWZ5UG94NVNwZW5kKGxvY2t0aW1lU3BlbmQucHNidCwgbG9ja3RpbWVTcGVuZC5tYXRjaCksICdsb2NrdGltZScpO1xuXG4gICAgY29uc3QgZWFybHlFeGl0U3BlbmQgPSBjcmVhdGVQb3g1UmVjb3ZlcnlQc2J0KDApO1xuICAgIHByZXBhcmVQb3g1RWFybHlFeGl0KGVhcmx5RXhpdFNwZW5kLnBzYnQsIDAsIGVhcmx5RXhpdFNwZW5kLm1hdGNoLCBlYXJseUV4aXRTcGVuZC5wcmluY2lwYWxQcmVpbWFnZSk7XG4gICAgYXNzZXJ0LmVxdWFsKGNsYXNzaWZ5UG94NVNwZW5kKGVhcmx5RXhpdFNwZW5kLnBzYnQsIGVhcmx5RXhpdFNwZW5kLm1hdGNoKSwgJ2Vhcmx5LWV4aXQnKTtcbiAgfSk7XG5cbiAgaXQoJ2VuZm9yY2VzIHRoZSBibG9jay1oZWlnaHQgYW5kIHVubG9jay1oZWlnaHQgYm91bmRhcmllcycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBhdEhlaWdodCA9IGNyZWF0ZVBveDVSZWNvdmVyeVBzYnQoVU5MT0NLX0hFSUdIVCk7XG4gICAgY29uc3QgYWJvdmVIZWlnaHQgPSBjcmVhdGVQb3g1UmVjb3ZlcnlQc2J0KFVOTE9DS19IRUlHSFQgKyAxKTtcbiAgICBjb25zdCBiZWxvd0hlaWdodCA9IGNyZWF0ZVBveDVSZWNvdmVyeVBzYnQoVU5MT0NLX0hFSUdIVCAtIDEpO1xuICAgIGNvbnN0IHRpbWVzdGFtcExvY2t0aW1lID0gY3JlYXRlUG94NVJlY292ZXJ5UHNidChQT1g1X01BWF9VTkxPQ0tfSEVJR0hUKTtcblxuICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4gYXNzZXJ0UG94NUxvY2t0aW1lU3BlbmQoYXRIZWlnaHQucHNidCwgW2F0SGVpZ2h0Lm1hdGNoXSkpO1xuICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4gYXNzZXJ0UG94NUxvY2t0aW1lU3BlbmQoYWJvdmVIZWlnaHQucHNidCwgW2Fib3ZlSGVpZ2h0Lm1hdGNoXSkpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYXNzZXJ0UG94NUxvY2t0aW1lU3BlbmQoYmVsb3dIZWlnaHQucHNidCwgW2JlbG93SGVpZ2h0Lm1hdGNoXSksIC9hdCBsZWFzdC8pO1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PiBhc3NlcnRQb3g1TG9ja3RpbWVTcGVuZCh0aW1lc3RhbXBMb2NrdGltZS5wc2J0LCBbdGltZXN0YW1wTG9ja3RpbWUubWF0Y2hdKSxcbiAgICAgIC9ibG9jayBoZWlnaHQgYmVsb3cvXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3JlcXVpcmVzIG5vbi1maW5hbCBzZXF1ZW5jZXMgZm9yIGxvY2t0aW1lIHNwZW5kcycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBmaW5hbCA9IGNyZWF0ZVBveDVSZWNvdmVyeVBzYnQoVU5MT0NLX0hFSUdIVCwgMHhmZmZmZmZmZik7XG4gICAgY29uc3Qgbm9uRmluYWwgPSBjcmVhdGVQb3g1UmVjb3ZlcnlQc2J0KFVOTE9DS19IRUlHSFQsIDB4ZmZmZmZmZmUpO1xuXG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBhc3NlcnRQb3g1TG9ja3RpbWVTcGVuZChmaW5hbC5wc2J0LCBbZmluYWwubWF0Y2hdKSwgL25vbi1maW5hbCBzZXF1ZW5jZS8pO1xuICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4gYXNzZXJ0UG94NUxvY2t0aW1lU3BlbmQobm9uRmluYWwucHNidCwgW25vbkZpbmFsLm1hdGNoXSkpO1xuICB9KTtcblxuICBpdCgnYWxsb3dzIGZpbmFsIHNlcXVlbmNlcyBvbiB1bnJlbGF0ZWQgdHJhbnNhY3Rpb24gaW5wdXRzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHsgcHNidCwgbWF0Y2ggfSA9IGNyZWF0ZVBveDVSZWNvdmVyeVBzYnQoVU5MT0NLX0hFSUdIVCk7XG4gICAgcHNidC5hZGRJbnB1dCgnMDInLnJlcGVhdCgzMiksIDAsIDEwXzAwMG4sIG5ldyBVaW50OEFycmF5KFsweDUxXSksIDB4ZmZmZmZmZmYpO1xuXG4gICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiBhc3NlcnRQb3g1TG9ja3RpbWVTcGVuZChwc2J0LCBbbWF0Y2hdKSk7XG4gIH0pO1xuXG4gIGl0KCdyZXF1aXJlcyBhbiBpbnB1dCBtYXRjaCB0byByZW1haW4gYm91bmQgdG8gaXRzIG9yaWdpbmFsIFBTQlQgaW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgeyBwc2J0LCBtYXRjaCwgcHJpbmNpcGFsUHJlaW1hZ2UgfSA9IGNyZWF0ZVBveDVSZWNvdmVyeVBzYnQoMCk7XG5cbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHByZXBhcmVQb3g1RWFybHlFeGl0KHBzYnQsIDEsIG1hdGNoLCBwcmluY2lwYWxQcmVpbWFnZSksIC9iZWxvbmdzIHRvIFBTQlQgaW5wdXQvKTtcbiAgfSk7XG5cbiAgaXQoJ2FkZHMgYSB2YWxpZGF0ZWQgcHJpbmNpcGFsIHByZWltYWdlIHRocm91Z2ggdGhlIG5hdGl2ZSBQU0JUIEFQSScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBlYXJseUV4aXRTcGVuZCA9IGNyZWF0ZVBveDVSZWNvdmVyeVBzYnQoMCk7XG5cbiAgICBwcmVwYXJlUG94NUVhcmx5RXhpdChlYXJseUV4aXRTcGVuZC5wc2J0LCAwLCBlYXJseUV4aXRTcGVuZC5tYXRjaCwgZWFybHlFeGl0U3BlbmQucHJpbmNpcGFsUHJlaW1hZ2UpO1xuXG4gICAgY29uc3QgcmVjb3JkcyA9IGVhcmx5RXhpdFNwZW5kLnBzYnRcbiAgICAgIC5nZXRJbnB1dEtleVZhbHVlcygwKVxuICAgICAgLmZpbHRlcigocmVjb3JkKSA9PiByZWNvcmQudHlwZSA9PT0gJ2tub3duJyAmJiByZWNvcmQua2V5ID09PSAnUFNCVF9JTl9TSEEyNTYnKTtcbiAgICBhc3NlcnQuZXF1YWwocmVjb3Jkcy5sZW5ndGgsIDEpO1xuICAgIGNvbnN0IFtyZWNvcmRdID0gcmVjb3JkcztcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKHJlY29yZC5rZXlEYXRhKSwgc2hhMjU2KGVhcmx5RXhpdFNwZW5kLnByaW5jaXBhbFByZWltYWdlKSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShyZWNvcmQudmFsdWUpLCBlYXJseUV4aXRTcGVuZC5wcmluY2lwYWxQcmVpbWFnZSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -48,21 +48,21 @@ function createPox5Psbt(lockTime, includeEarlyExitSignature) {
48
48
  const earlyExit = (0, testutils_1.getKey)('utxo-staking-pox5-early-exit');
49
49
  const principalPreimage = Buffer.alloc(32, 0x42);
50
50
  const stakerKeys = [Buffer.from(user.publicKey), Buffer.from(backup.publicKey), Buffer.from(bitgo.publicKey)];
51
- const params = {
52
- descriptor: wasm_utxo_1.Descriptor.fromString(utxo_descriptors_1.pox5.createPox5LockupDescriptor({
53
- unlockHeight: UNLOCK_HEIGHT,
54
- stakerCommitment: sha256(principalPreimage),
55
- earlyExitKey: Buffer.from(earlyExit.publicKey),
56
- stakerKeys,
57
- }), 'definite'),
51
+ const descriptor = utxo_descriptors_1.pox5.createPox5LockupDescriptor({
52
+ unlockHeight: UNLOCK_HEIGHT,
53
+ stakerCommitment: sha256(principalPreimage),
54
+ earlyExitKey: Buffer.from(earlyExit.publicKey),
58
55
  stakerKeys,
59
- };
60
- const descriptor = params.descriptor;
61
- const scriptPubKey = descriptor.scriptPubkey();
56
+ });
57
+ const paramsDescriptor = descriptor;
58
+ const scriptPubKey = paramsDescriptor.scriptPubkey();
62
59
  const psbt = wasm_utxo_1.Psbt.create(2, lockTime);
63
60
  psbt.addInput('01'.repeat(32), 0, 100000n, scriptPubKey, 0xfffffffe);
64
61
  psbt.addOutput(scriptPubKey, 90000n);
65
- psbt.updateInputWithDescriptor(0, descriptor);
62
+ psbt.updateInputWithDescriptor(0, paramsDescriptor);
63
+ const match = utxo_descriptors_1.pox5.matchPox5Input(psbt, 0, new Map([['pox5', paramsDescriptor]]));
64
+ assert.ok(match);
65
+ const params = { match: match };
66
66
  for (const key of includeEarlyExitSignature ? [user, backup, earlyExit] : [user, backup]) {
67
67
  assert.ok(key.privateKey, 'test key must include private key material');
68
68
  psbt.signWithPrv(key.privateKey);
@@ -84,4 +84,4 @@ describe('PoX-5 witness finalization', function () {
84
84
  assert.ok(psbt.extractTransaction().toBytes().length > 0);
85
85
  });
86
86
  });
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0bmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9wb3g1L3dpdG5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsbUNBQW9DO0FBRXBDLDhEQUErQztBQUMvQyxnREFBb0Q7QUFDcEQsMERBQWtFO0FBRWxFLDRDQUE2RztBQUU3RyxNQUFNLGFBQWEsR0FBRyxNQUFPLENBQUM7QUFFOUIsU0FBUyxNQUFNLENBQUMsS0FBaUI7SUFDL0IsT0FBTyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FDckIsUUFBZ0IsRUFDaEIseUJBQWtDO0lBTWxDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUEsd0JBQVksRUFBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sU0FBUyxHQUFHLElBQUEsa0JBQU0sRUFBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ3pELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FJM0csQ0FBQztJQUNGLE1BQU0sTUFBTSxHQUF3QjtRQUNsQyxVQUFVLEVBQUUsc0JBQVUsQ0FBQyxVQUFVLENBQy9CLHVCQUFJLENBQUMsMEJBQTBCLENBQUM7WUFDOUIsWUFBWSxFQUFF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QUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBwb3g1IH0gZnJvbSAnQGJpdGdvL3V0eG8tZGVzY3JpcHRvcnMnO1xuaW1wb3J0IHsgRGVzY3JpcHRvciwgUHNidCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHsgZ2V0S2V5LCBnZXRLZXlUcmlwbGUgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvL3Rlc3R1dGlscyc7XG5cbmltcG9ydCB7IGZpbmFsaXplUG94NUVhcmx5RXhpdFBhdGgsIGZpbmFsaXplUG94NUxvY2t0aW1lUGF0aCwgUG94NUZpbmFsaXplclBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL3NyYy9wb3g1JztcblxuY29uc3QgVU5MT0NLX0hFSUdIVCA9IDg0MF8wMDA7XG5cbmZ1bmN0aW9uIHNoYTI1Nih2YWx1ZTogVWludDhBcnJheSk6IEJ1ZmZlciB7XG4gIHJldHVybiBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUodmFsdWUpLmRpZ2VzdCgpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQb3g1UHNidChcbiAgbG9ja1RpbWU6IG51bWJlcixcbiAgaW5jbHVkZUVhcmx5RXhpdFNpZ25hdHVyZTogYm9vbGVhblxuKToge1xuICBwc2J0OiBQc2J0O1xuICBwYXJhbXM6IFBveDVGaW5hbGl6ZXJQYXJhbXM7XG4gIHByaW5jaXBhbFByZWltYWdlOiBCdWZmZXI7XG59IHtcbiAgY29uc3QgW3VzZXIsIGJhY2t1cCwgYml0Z29dID0gZ2V0S2V5VHJpcGxlKCd1dHhvLXN0YWtpbmctcG94NScpO1xuICBjb25zdCBlYXJseUV4aXQgPSBnZXRLZXkoJ3V0eG8tc3Rha2luZy1wb3g1LWVhcmx5LWV4aXQnKTtcbiAgY29uc3QgcHJpbmNpcGFsUHJlaW1hZ2UgPSBCdWZmZXIuYWxsb2MoMzIsIDB4NDIpO1xuICBjb25zdCBzdGFrZXJLZXlzID0gW0J1ZmZlci5mcm9tKHVzZXIucHVibGljS2V5KSwgQnVmZmVyLmZyb20oYmFja3VwLnB1YmxpY0tleSksIEJ1ZmZlci5mcm9tKGJpdGdvLnB1YmxpY0tleSldIGFzIFtcbiAgICBCdWZmZXIsXG4gICAgQnVmZmVyLFxuICAgIEJ1ZmZlclxuICBdO1xuICBjb25zdCBwYXJhbXM6IFBveDVGaW5hbGl6ZXJQYXJhbXMgPSB7XG4gICAgZGVzY3JpcHRvcjogRGVzY3JpcHRvci5mcm9tU3RyaW5nKFxuICAgICAgcG94NS5jcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcih7XG4gICAgICAgIHVubG9ja0hlaWdodDogVU5MT0NLX0hFSUdIVCxcbiAgICAgICAgc3Rha2VyQ29tbWl0bWVudDogc2hhMjU2KHByaW5jaXBhbFByZWltYWdlKSxcbiAgICAgICAgZWFybHlFeGl0S2V5OiBCdWZmZXIuZnJvbShlYXJseUV4aXQucHVibGljS2V5KSxcbiAgICAgICAgc3Rha2VyS2V5cyxcbiAgICAgIH0pLFxuICAgICAgJ2RlZmluaXRlJ1xuICAgICksXG4gICAgc3Rha2VyS2V5cyxcbiAgfTtcbiAgY29uc3QgZGVzY3JpcHRvciA9IHBhcmFtcy5kZXNjcmlwdG9yIGFzIERlc2NyaXB0b3I7XG4gIGNvbnN0IHNjcmlwdFB1YktleSA9IGRlc2NyaXB0b3Iuc2NyaXB0UHVia2V5KCk7XG4gIGNvbnN0IHBzYnQgPSBQc2J0LmNyZWF0ZSgyLCBsb2NrVGltZSk7XG4gIHBzYnQuYWRkSW5wdXQoJzAxJy5yZXBlYXQoMzIpLCAwLCAxMDBfMDAwbiwgc2NyaXB0UHViS2V5LCAweGZmZmZmZmZlKTtcbiAgcHNidC5hZGRPdXRwdXQoc2NyaXB0UHViS2V5LCA5MF8wMDBuKTtcbiAgcHNidC51cGRhdGVJbnB1dFdpdGhEZXNjcmlwdG9yKDAsIGRlc2NyaXB0b3IpO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGluY2x1ZGVFYXJseUV4aXRTaWduYXR1cmUgPyBbdXNlciwgYmFja3VwLCBlYXJseUV4aXRdIDogW3VzZXIsIGJhY2t1cF0pIHtcbiAgICBhc3NlcnQub2soa2V5LnByaXZhdGVLZXksICd0ZXN0IGtleSBtdXN0IGluY2x1ZGUgcHJpdmF0ZSBrZXkgbWF0ZXJpYWwnKTtcbiAgICBwc2J0LnNpZ25XaXRoUHJ2KGtleS5wcml2YXRlS2V5KTtcbiAgfVxuICByZXR1cm4geyBwc2J0LCBwYXJhbXMsIHByaW5jaXBhbFByZWltYWdlIH07XG59XG5cbmRlc2NyaWJlKCdQb1gtNSB3aXRuZXNzIGZpbmFsaXphdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ2ZpbmFsaXplcyB0aGUgQ0xUViBicmFuY2ggdGhyb3VnaCB0aGUgbmF0aXZlIE1pbmlzY3JpcHQgZmluYWxpemVyJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHsgcHNidCwgcGFyYW1zIH0gPSBjcmVhdGVQb3g1UHNidChVTkxPQ0tfSEVJR0hULCBmYWxzZSk7XG5cbiAgICBmaW5hbGl6ZVBveDVMb2NrdGltZVBhdGgocHNidCwgMCwgcGFyYW1zKTtcblxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocHNidC5nZXRQYXJ0aWFsU2lnbmF0dXJlcygwKSwgW10pO1xuICAgIGFzc2VydC5vayhwc2J0LmV4dHJhY3RUcmFuc2FjdGlvbigpLnRvQnl0ZXMoKS5sZW5ndGggPiAwKTtcbiAgfSk7XG5cbiAgaXQoJ3JlZ2lzdGVycyB0aGUgcHJpbmNpcGFsIHByZWltYWdlIGFuZCBmaW5hbGl6ZXMgdGhlIGVhcmx5LWV4aXQgYnJhbmNoJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHsgcHNidCwgcGFyYW1zLCBwcmluY2lwYWxQcmVpbWFnZSB9ID0gY3JlYXRlUG94NVBzYnQoMCwgdHJ1ZSk7XG5cbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4gZmluYWxpemVQb3g1RWFybHlFeGl0UGF0aChwc2J0LCAwLCB7IC4uLnBhcmFtcywgcHJpbmNpcGFsUHJlaW1hZ2U6IEJ1ZmZlci5hbGxvYygzMikgfSksXG4gICAgICAvcHJpbmNpcGFsUHJlaW1hZ2UvXG4gICAgKTtcbiAgICBmaW5hbGl6ZVBveDVFYXJseUV4aXRQYXRoKHBzYnQsIDAsIHsgLi4ucGFyYW1zLCBwcmluY2lwYWxQcmVpbWFnZSB9KTtcblxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocHNidC5nZXRQYXJ0aWFsU2lnbmF0dXJlcygwKSwgW10pO1xuICAgIGFzc2VydC5vayhwc2J0LmV4dHJhY3RUcmFuc2FjdGlvbigpLnRvQnl0ZXMoKS5sZW5ndGggPiAwKTtcbiAgfSk7XG59KTtcbiJdfQ==
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0bmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9wb3g1L3dpdG5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsbUNBQW9DO0FBRXBDLDhEQUErQztBQUMvQyxnREFBeUQ7QUFDekQsMERBQWtFO0FBRWxFLDRDQUFrSDtBQUlsSCxNQUFNLGFBQWEsR0FBRyxNQUFPLENBQUM7QUFFOUIsU0FBUyxNQUFNLENBQUMsS0FBaUI7SUFDL0IsT0FBTyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FDckIsUUFBZ0IsRUFDaEIseUJBQWtDO0lBTWxDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUEsd0JBQVksRUFBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sU0FBUyxHQUFHLElBQUEsa0JBQU0sRUFBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ3pELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FJM0csQ0FBQztJQUNGLE1BQU0sVUFBVSxHQUFHLHVCQUFJLENBQUMsMEJBQTBCLENBQUM7UUFDakQsWUFBWSxFQUFFLGFBQWE7UUFDM0IsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGlCQUFp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Q0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBwb3g1IH0gZnJvbSAnQGJpdGdvL3V0eG8tZGVzY3JpcHRvcnMnO1xuaW1wb3J0IHsgUHNidCwgdHlwZSBEZXNjcmlwdG9yIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgeyBnZXRLZXksIGdldEtleVRyaXBsZSB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8vdGVzdHV0aWxzJztcblxuaW1wb3J0IHsgZmluYWxpemVQb3g1RWFybHlFeGl0UGF0aCwgZmluYWxpemVQb3g1TG9ja3RpbWVQYXRoLCB0eXBlIFBveDVGaW5hbGl6ZXJQYXJhbXMgfSBmcm9tICcuLi8uLi8uLi9zcmMvcG94NSc7XG5cbnR5cGUgUG94NUlucHV0TWF0Y2ggPSBwb3g1LlBveDVJbnB1dE1hdGNoO1xuXG5jb25zdCBVTkxPQ0tfSEVJR0hUID0gODQwXzAwMDtcblxuZnVuY3Rpb24gc2hhMjU2KHZhbHVlOiBVaW50OEFycmF5KTogQnVmZmVyIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZSh2YWx1ZSkuZGlnZXN0KCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBveDVQc2J0KFxuICBsb2NrVGltZTogbnVtYmVyLFxuICBpbmNsdWRlRWFybHlFeGl0U2lnbmF0dXJlOiBib29sZWFuXG4pOiB7XG4gIHBzYnQ6IFBzYnQ7XG4gIHBhcmFtczogUG94NUZpbmFsaXplclBhcmFtcztcbiAgcHJpbmNpcGFsUHJlaW1hZ2U6IEJ1ZmZlcjtcbn0ge1xuICBjb25zdCBbdXNlciwgYmFja3VwLCBiaXRnb10gPSBnZXRLZXlUcmlwbGUoJ3V0eG8tc3Rha2luZy1wb3g1Jyk7XG4gIGNvbnN0IGVhcmx5RXhpdCA9IGdldEtleSgndXR4by1zdGFraW5nLXBveDUtZWFybHktZXhpdCcpO1xuICBjb25zdCBwcmluY2lwYWxQcmVpbWFnZSA9IEJ1ZmZlci5hbGxvYygzMiwgMHg0Mik7XG4gIGNvbnN0IHN0YWtlcktleXMgPSBbQnVmZmVyLmZyb20odXNlci5wdWJsaWNLZXkpLCBCdWZmZXIuZnJvbShiYWNrdXAucHVibGljS2V5KSwgQnVmZmVyLmZyb20oYml0Z28ucHVibGljS2V5KV0gYXMgW1xuICAgIEJ1ZmZlcixcbiAgICBCdWZmZXIsXG4gICAgQnVmZmVyXG4gIF07XG4gIGNvbnN0IGRlc2NyaXB0b3IgPSBwb3g1LmNyZWF0ZVBveDVMb2NrdXBEZXNjcmlwdG9yKHtcbiAgICB1bmxvY2tIZWlnaHQ6IFVOTE9DS19IRUlHSFQsXG4gICAgc3Rha2VyQ29tbWl0bWVudDogc2hhMjU2KHByaW5jaXBhbFByZWltYWdlKSxcbiAgICBlYXJseUV4aXRLZXk6IEJ1ZmZlci5mcm9tKGVhcmx5RXhpdC5wdWJsaWNLZXkpLFxuICAgIHN0YWtlcktleXMsXG4gIH0pO1xuICBjb25zdCBwYXJhbXNEZXNjcmlwdG9yID0gZGVzY3JpcHRvciBhcyBEZXNjcmlwdG9yO1xuICBjb25zdCBzY3JpcHRQdWJLZXkgPSBwYXJhbXNEZXNjcmlwdG9yLnNjcmlwdFB1YmtleSgpO1xuICBjb25zdCBwc2J0ID0gUHNidC5jcmVhdGUoMiwgbG9ja1RpbWUpO1xuICBwc2J0LmFkZElucHV0KCcwMScucmVwZWF0KDMyKSwgMCwgMTAwXzAwMG4sIHNjcmlwdFB1YktleSwgMHhmZmZmZmZmZSk7XG4gIHBzYnQuYWRkT3V0cHV0KHNjcmlwdFB1YktleSwgOTBfMDAwbik7XG4gIHBzYnQudXBkYXRlSW5wdXRXaXRoRGVzY3JpcHRvcigwLCBwYXJhbXNEZXNjcmlwdG9yKTtcblxuICBjb25zdCBtYXRjaCA9IHBveDUubWF0Y2hQb3g1SW5wdXQocHNidCwgMCwgbmV3IE1hcChbWydwb3g1JywgcGFyYW1zRGVzY3JpcHRvcl1dKSk7XG4gIGFzc2VydC5vayhtYXRjaCk7XG4gIGNvbnN0IHBhcmFtczogUG94NUZpbmFsaXplclBhcmFtcyA9IHsgbWF0Y2g6IG1hdGNoIGFzIFBveDVJbnB1dE1hdGNoIH07XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgaW5jbHVkZUVhcmx5RXhpdFNpZ25hdHVyZSA/IFt1c2VyLCBiYWNrdXAsIGVhcmx5RXhpdF0gOiBbdXNlciwgYmFja3VwXSkge1xuICAgIGFzc2VydC5vayhrZXkucHJpdmF0ZUtleSwgJ3Rlc3Qga2V5IG11c3QgaW5jbHVkZSBwcml2YXRlIGtleSBtYXRlcmlhbCcpO1xuICAgIHBzYnQuc2lnbldpdGhQcnYoa2V5LnByaXZhdGVLZXkpO1xuICB9XG4gIHJldHVybiB7IHBzYnQsIHBhcmFtcywgcHJpbmNpcGFsUHJlaW1hZ2UgfTtcbn1cblxuZGVzY3JpYmUoJ1BvWC01IHdpdG5lc3MgZmluYWxpemF0aW9uJywgZnVuY3Rpb24gKCkge1xuICBpdCgnZmluYWxpemVzIHRoZSBDTFRWIGJyYW5jaCB0aHJvdWdoIHRoZSBuYXRpdmUgTWluaXNjcmlwdCBmaW5hbGl6ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgeyBwc2J0LCBwYXJhbXMgfSA9IGNyZWF0ZVBveDVQc2J0KFVOTE9DS19IRUlHSFQsIGZhbHNlKTtcblxuICAgIGZpbmFsaXplUG94NUxvY2t0aW1lUGF0aChwc2J0LCAwLCBwYXJhbXMpO1xuXG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChwc2J0LmdldFBhcnRpYWxTaWduYXR1cmVzKDApLCBbXSk7XG4gICAgYXNzZXJ0Lm9rKHBzYnQuZXh0cmFjdFRyYW5zYWN0aW9uKCkudG9CeXRlcygpLmxlbmd0aCA+IDApO1xuICB9KTtcblxuICBpdCgncmVnaXN0ZXJzIHRoZSBwcmluY2lwYWwgcHJlaW1hZ2UgYW5kIGZpbmFsaXplcyB0aGUgZWFybHktZXhpdCBicmFuY2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgeyBwc2J0LCBwYXJhbXMsIHByaW5jaXBhbFByZWltYWdlIH0gPSBjcmVhdGVQb3g1UHNidCgwLCB0cnVlKTtcblxuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PiBmaW5hbGl6ZVBveDVFYXJseUV4aXRQYXRoKHBzYnQsIDAsIHsgLi4ucGFyYW1zLCBwcmluY2lwYWxQcmVpbWFnZTogQnVmZmVyLmFsbG9jKDMyKSB9KSxcbiAgICAgIC9wcmluY2lwYWxQcmVpbWFnZS9cbiAgICApO1xuICAgIGZpbmFsaXplUG94NUVhcmx5RXhpdFBhdGgocHNidCwgMCwgeyAuLi5wYXJhbXMsIHByaW5jaXBhbFByZWltYWdlIH0pO1xuXG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChwc2J0LmdldFBhcnRpYWxTaWduYXR1cmVzKDApLCBbXSk7XG4gICAgYXNzZXJ0Lm9rKHBzYnQuZXh0cmFjdFRyYW5zYWN0aW9uKCkudG9CeXRlcygpLmxlbmd0aCA+IDApO1xuICB9KTtcbn0pO1xuIl19