@bitgo-beta/utxo-staking 1.1.1-beta.1464 → 1.1.1-beta.1466
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/pox5/index.d.ts +1 -0
- package/dist/cjs/src/pox5/index.d.ts.map +1 -1
- package/dist/cjs/src/pox5/index.js +2 -1
- package/dist/cjs/src/pox5/recovery.d.ts +13 -0
- package/dist/cjs/src/pox5/recovery.d.ts.map +1 -0
- package/dist/cjs/src/pox5/recovery.js +75 -0
- package/dist/cjs/src/pox5/witness.d.ts +5 -8
- package/dist/cjs/src/pox5/witness.d.ts.map +1 -1
- package/dist/cjs/src/pox5/witness.js +11 -30
- package/dist/cjs/test/unit/pox5/recovery.d.ts +2 -0
- package/dist/cjs/test/unit/pox5/recovery.d.ts.map +1 -0
- package/dist/cjs/test/unit/pox5/recovery.js +88 -0
- package/dist/cjs/test/unit/pox5/witness.js +12 -12
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/pox5/index.d.ts +1 -0
- package/dist/esm/pox5/index.d.ts.map +1 -1
- package/dist/esm/pox5/index.js +2 -1
- package/dist/esm/pox5/recovery.d.ts +13 -0
- package/dist/esm/pox5/recovery.d.ts.map +1 -0
- package/dist/esm/pox5/recovery.js +68 -0
- package/dist/esm/pox5/witness.d.ts +5 -8
- package/dist/esm/pox5/witness.d.ts.map +1 -1
- package/dist/esm/pox5/witness.js +11 -30
- package/package.json +7 -7
|
@@ -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
|
-
|
|
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-beta/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,8BAA8B,CAAC;AAEpD,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-beta/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcG94NS9yZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFnQ0EsMERBcUJDO0FBR0QsNERBRUM7QUFLRCw4Q0FNQztBQUdELG9EQVlDO0FBcEZELGdEQUFxRDtBQUNyRCxtRUFBb0Q7QUFFdkMsUUFBQSxzQkFBc0IsR0FBRyxTQUFXLENBQUM7QUFFbEQsU0FBUyxzQkFBc0IsQ0FBQyxZQUFvQjtJQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLFlBQVksSUFBSSw4QkFBc0IsRUFBRSxDQUFDO1FBQ3ZHLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELDhCQUFzQixFQUFFLENBQUMsQ0FBQztJQUN6RyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsNkJBQTZCLENBQUMsUUFBZ0I7SUFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsSUFBSSxRQUFRLElBQUksOEJBQXNCLEVBQUUsQ0FBQztRQUMxRixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCw4QkFBc0IsRUFBRSxDQUFDLENBQUM7SUFDNUYsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLDBCQUEwQixDQUFDLElBQVUsRUFBRSxLQUEwQjtJQUN4RSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sZ0JBQWdCLEdBQUcsdUJBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25HLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxL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LDJCQUEyQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNoRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFDeEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBzYnQsIFRyYW5zYWN0aW9uIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgeyBwb3g1IH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1kZXNjcmlwdG9ycyc7XG5cbmV4cG9ydCBjb25zdCBQT1g1X01BWF9VTkxPQ0tfSEVJR0hUID0gNTAwXzAwMF8wMDA7XG5cbmZ1bmN0aW9uIGFzc2VydFBveDVVbmxvY2tIZWlnaHQodW5sb2NrSGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih1bmxvY2tIZWlnaHQpIHx8IHVubG9ja0hlaWdodCA8PSAwIHx8IHVubG9ja0hlaWdodCA+PSBQT1g1X01BWF9VTkxPQ0tfSEVJR0hUKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQb1gtNSB1bmxvY2sgaGVpZ2h0IG11c3QgYmUgYSBwb3NpdGl2ZSBibG9jayBoZWlnaHQgYmVsb3cgJHtQT1g1X01BWF9VTkxPQ0tfSEVJR0hUfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFBveDVCbG9ja0hlaWdodExvY2t0aW1lKGxvY2tUaW1lOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihsb2NrVGltZSkgfHwgbG9ja1RpbWUgPCAwIHx8IGxvY2tUaW1lID49IFBPWDVfTUFYX1VOTE9DS19IRUlHSFQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBvWC01IG5Mb2NrVGltZSBtdXN0IGJlIGEgYmxvY2sgaGVpZ2h0IGJlbG93ICR7UE9YNV9NQVhfVU5MT0NLX0hFSUdIVH1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNYXRjaGVkVHJhbnNhY3Rpb25JbnB1dChwc2J0OiBQc2J0LCBtYXRjaDogcG94NS5Qb3g1SW5wdXRNYXRjaCkge1xuICBjb25zdCBwc2J0SW5wdXQgPSBwc2J0LmdldElucHV0cygpW21hdGNoLmlucHV0SW5kZXhdO1xuICBjb25zdCB0cmFuc2FjdGlvbklucHV0ID0gVHJhbnNhY3Rpb24uZnJvbUJ5dGVzKHBzYnQuZ2V0VW5zaWduZWRUeCgpKS5nZXRJbnB1dHMoKVttYXRjaC5pbnB1dEluZGV4XTtcbiAgY29uc3QgZGVzY3JpcHRvclNjcmlwdCA9IEJ1ZmZlci5mcm9tKG1hdGNoLmRlc2NyaXB0b3Iuc2NyaXB0UHVia2V5KCkpO1xuICBpZiAoXG4gICAgIXBzYnRJbnB1dD8ud2l0bmVzc1V0eG8gfHxcbiAgICAhdHJhbnNhY3Rpb25JbnB1dCB8fFxuICAgICFCdWZmZXIuZnJvbShwc2J0SW5wdXQud2l0bmVzc1V0eG8uc2NyaXB0KS5lcXVhbHMoZGVzY3JpcHRvclNjcmlwdClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQb1gtNSBkZXNjcmlwdG9yIG1hdGNoIGRvZXMgbm90IG1hdGNoIFBTQlQgaW5wdXQgJHttYXRjaC5pbnB1dEluZGV4fWApO1xuICB9XG4gIHJldHVybiB0cmFuc2FjdGlvbklucHV0O1xufVxuXG4vKiogVmFsaWRhdGUgdGhlIHBvc3QtQ0xUViBwb2xpY3kgZm9yIGFsbCBjYW5vbmljYWwgUG9YLTUgaW5wdXRzIGluIGEgcmVjb3ZlcnkgUFNCVC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQb3g1TG9ja3RpbWVTcGVuZChwc2J0OiBQc2J0LCBpbnB1dHM6IHJlYWRvbmx5IHBveDUuUG94NUlucHV0TWF0Y2hbXSk6IHZvaWQge1xuICBpZiAoaW5wdXRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUG9YLTUgbG9ja3VwIGRlc2NyaXB0b3IgbWF0Y2ggaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGNvbnN0IHVubG9ja0hlaWdodHMgPSBpbnB1dHMubWFwKChpbnB1dCkgPT4ge1xuICAgIGNvbnN0IHsgdW5sb2NrSGVpZ2h0IH0gPSBpbnB1dC5pbmZvO1xuICAgIGFzc2VydFBveDVVbmxvY2tIZWlnaHQodW5sb2NrSGVpZ2h0KTtcbiAgICByZXR1cm4gdW5sb2NrSGVpZ2h0O1xuICB9KTtcbiAgY29uc3QgbG9ja1RpbWUgPSBwc2J0LmxvY2tUaW1lKCk7XG4gIGFzc2VydFBveDVCbG9ja0hlaWdodExvY2t0aW1lKGxvY2tUaW1lKTtcbiAgY29uc3QgcmVxdWlyZWRMb2NrVGltZSA9IE1hdGgubWF4KC4uLnVubG9ja0hlaWdodHMpO1xuICBpZiAobG9ja1RpbWUgPCByZXF1aXJlZExvY2tUaW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQb1gtNSBuTG9ja1RpbWUgbXVzdCBiZSBhdCBsZWFzdCAke3JlcXVpcmVkTG9ja1RpbWV9YCk7XG4gIH1cbiAgZm9yIChjb25zdCBpbnB1dCBvZiBpbnB1dHMpIHtcbiAgICBpZiAoZ2V0TWF0Y2hlZFRyYW5zYWN0aW9uSW5wdXQocHNidCwgaW5wdXQpLnNlcXVlbmNlID09PSAweGZmZmZmZmZmKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBvWC01IGxvY2t0aW1lIHNwZW5kIGlucHV0ICR7aW5wdXQuaW5wdXRJbmRleH0gbXVzdCB1c2UgYSBub24tZmluYWwgc2VxdWVuY2VgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIFZhbGlkYXRlIHRoYXQgYSBjYW5vbmljYWwgUG9YLTUgaW5wdXQgY2FuIHVzZSB0aGUgcHJpbmNpcGFsLXByZWltYWdlIGJyYW5jaC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQb3g1RWFybHlFeGl0U3BlbmQocHNidDogUHNidCwgaW5wdXQ6IHBveDUuUG94NUlucHV0TWF0Y2gpOiB2b2lkIHtcbiAgZ2V0TWF0Y2hlZFRyYW5zYWN0aW9uSW5wdXQocHNidCwgaW5wdXQpO1xufVxuXG5leHBvcnQgdHlwZSBQb3g1U3BlbmRCcmFuY2ggPSAnbG9ja3RpbWUnIHwgJ2Vhcmx5LWV4aXQnO1xuXG4vKiogQ2xhc3NpZnkgYSBQb1gtNSBzcGVuZCBmcm9tIG5hdGl2ZSBwcmluY2lwYWwtcHJlaW1hZ2UgbWV0YWRhdGEuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlQb3g1U3BlbmQocHNidDogUHNidCwgaW5wdXQ6IHBveDUuUG94NUlucHV0TWF0Y2gpOiBQb3g1U3BlbmRCcmFuY2gge1xuICBnZXRNYXRjaGVkVHJhbnNhY3Rpb25JbnB1dChwc2J0LCBpbnB1dCk7XG4gIGNvbnN0IGhhc1ByaW5jaXBhbFByZWltYWdlID0gcHNidFxuICAgIC5nZXRJbnB1dEtleVZhbHVlcyhpbnB1dC5pbnB1dEluZGV4KVxuICAgIC5zb21lKChyZWNvcmQpID0+IHJlY29yZC50eXBlID09PSAna25vd24nICYmIHJlY29yZC5rZXkgPT09ICdQU0JUX0lOX1NIQTI1NicpO1xuICByZXR1cm4gaGFzUHJpbmNpcGFsUHJlaW1hZ2UgPyAnZWFybHktZXhpdCcgOiAnbG9ja3RpbWUnO1xufVxuXG4vKiogQWRkIHZhbGlkYXRlZCBwcmluY2lwYWwtcHJlaW1hZ2UgbWV0YWRhdGEgZm9yIGFuIGVhcmx5LWV4aXQgc3BlbmQuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVBveDVFYXJseUV4aXQoXG4gIHBzYnQ6IFBzYnQsXG4gIGlucHV0SW5kZXg6IG51bWJlcixcbiAgaW5wdXQ6IHBveDUuUG94NUlucHV0TWF0Y2gsXG4gIHByaW5jaXBhbFByZWltYWdlOiBVaW50OEFycmF5XG4pOiB2b2lkIHtcbiAgaWYgKGlucHV0SW5kZXggIT09IGlucHV0LmlucHV0SW5kZXgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBvWC01IGRlc2NyaXB0b3IgbWF0Y2ggYmVsb25ncyB0byBQU0JUIGlucHV0ICR7aW5wdXQuaW5wdXRJbmRleH0sIG5vdCAke2lucHV0SW5kZXh9YCk7XG4gIH1cbiAgYXNzZXJ0UG94NUVhcmx5RXhpdFNwZW5kKHBzYnQsIGlucHV0KTtcbiAgcG94NS5hc3NlcnRQb3g1UHJpbmNpcGFsUHJlaW1hZ2UoaW5wdXQuaW5mbywgcHJpbmNpcGFsUHJlaW1hZ2UpO1xuICBwc2J0LmFkZFNoYTI1NlByZWltYWdlKGlucHV0SW5kZXgsIHByaW5jaXBhbFByZWltYWdlKTtcbn1cbiJdfQ==
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Psbt } from '@bitgo/wasm-utxo';
|
|
2
|
+
import { pox5 } from '@bitgo-beta/utxo-descriptors';
|
|
3
3
|
export type Pox5FinalizerParams = {
|
|
4
|
-
/**
|
|
5
|
-
|
|
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:
|
|
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":"
|
|
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,8BAA8B,CAAC;AAIpD,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
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0bmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wb3g1L3dpdG5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFpQkEsNERBS0M7QUFHRCw4REFTQztBQS9CRCx5Q0FBMkU7QUFPM0UsU0FBUyx5QkFBeUIsQ0FBQyxVQUFrQixFQUFFLEtBQTBCO0lBQy9FLElBQUksVUFBVSxLQUFLLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxLQUFLLENBQUMsVUFBVSxTQUFTLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDekcsQ0FBQztBQUNILENBQUM7QUFFRCx3REFBd0Q7QUFDeEQsU0FBZ0Isd0JBQXdCLENBQUMsSUFBVSxFQUFFLFVBQWtCLEVBQUUsTUFBMkI7SUFDbEcseUJBQXlCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxJQUFBLGtDQUF1QixFQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsU0FBZ0IseUJBQXlCLENBQ3ZDLElBQVUsRUFDVixVQUFrQixFQUNsQixNQUErRDtJQUUvRCx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELElBQUEsK0JBQW9CLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQy9FLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQc2J0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgeyBwb3g1IH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1kZXNjcmlwdG9ycyc7XG5cbmltcG9ydCB7IGFzc2VydFBveDVMb2NrdGltZVNwZW5kLCBwcmVwYXJlUG94NUVhcmx5RXhpdCB9IGZyb20gJy4vcmVjb3ZlcnknO1xuXG5leHBvcnQgdHlwZSBQb3g1RmluYWxpemVyUGFyYW1zID0ge1xuICAvKiogVGhlIGNhbm9uaWNhbCBkZXNjcmlwdG9yIG1hdGNoIGZvciB0aGUgaW5wdXQgYmVpbmcgZmluYWxpemVkLiAqL1xuICBtYXRjaDogcG94NS5Qb3g1SW5wdXRNYXRjaDtcbn07XG5cbmZ1bmN0aW9uIGFzc2VydEZpbmFsaXplcklucHV0SW5kZXgoaW5wdXRJbmRleDogbnVtYmVyLCBtYXRjaDogcG94NS5Qb3g1SW5wdXRNYXRjaCk6IHZvaWQge1xuICBpZiAoaW5wdXRJbmRleCAhPT0gbWF0Y2guaW5wdXRJbmRleCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUG9YLTUgZGVzY3JpcHRvciBtYXRjaCBiZWxvbmdzIHRvIFBTQlQgaW5wdXQgJHttYXRjaC5pbnB1dEluZGV4fSwgbm90ICR7aW5wdXRJbmRleH1gKTtcbiAgfVxufVxuXG4vKiogRmluYWxpemUgdGhlIHBvc3QtQ0xUViAyLW9mLTMgUG9YLTUgc3BlbmQgYnJhbmNoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplUG94NUxvY2t0aW1lUGF0aChwc2J0OiBQc2J0LCBpbnB1dEluZGV4OiBudW1iZXIsIHBhcmFtczogUG94NUZpbmFsaXplclBhcmFtcyk6IHZvaWQge1xuICBhc3NlcnRGaW5hbGl6ZXJJbnB1dEluZGV4KGlucHV0SW5kZXgsIHBhcmFtcy5tYXRjaCk7XG4gIGFzc2VydFBveDVMb2NrdGltZVNwZW5kKHBzYnQsIFtwYXJhbXMubWF0Y2hdKTtcbiAgcHNidC51cGRhdGVJbnB1dFdpdGhEZXNjcmlwdG9yKGlucHV0SW5kZXgsIHBhcmFtcy5tYXRjaC5kZXNjcmlwdG9yKTtcbiAgcHNidC5maW5hbGl6ZUlucHV0KGlucHV0SW5kZXgpO1xufVxuXG4vKiogRmluYWxpemUgdGhlIHByaW5jaXBhbC1wcmVpbWFnZSBlYXJseS1leGl0IDItb2YtMyBQb1gtNSBzcGVuZCBicmFuY2guICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWxpemVQb3g1RWFybHlFeGl0UGF0aChcbiAgcHNidDogUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyLFxuICBwYXJhbXM6IFBveDVGaW5hbGl6ZXJQYXJhbXMgJiB7IHByaW5jaXBhbFByZWltYWdlOiBVaW50OEFycmF5IH1cbik6IHZvaWQge1xuICBhc3NlcnRGaW5hbGl6ZXJJbnB1dEluZGV4KGlucHV0SW5kZXgsIHBhcmFtcy5tYXRjaCk7XG4gIHByZXBhcmVQb3g1RWFybHlFeGl0KHBzYnQsIGlucHV0SW5kZXgsIHBhcmFtcy5tYXRjaCwgcGFyYW1zLnByaW5jaXBhbFByZWltYWdlKTtcbiAgcHNidC51cGRhdGVJbnB1dFdpdGhEZXNjcmlwdG9yKGlucHV0SW5kZXgsIHBhcmFtcy5tYXRjaC5kZXNjcmlwdG9yKTtcbiAgcHNidC5maW5hbGl6ZUlucHV0KGlucHV0SW5kZXgpO1xufVxuIl19
|
|
@@ -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-beta/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvcG94NS9yZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDJEQUFtQztBQUNuQyxtQ0FBb0M7QUFFcEMsbUVBQW9EO0FBQ3BELGdEQUF5RDtBQUN6RCwwREFBa0U7QUFFbEUsNENBTTJCO0FBSTNCLE1BQU0sYUFBYSxHQUFHLE1BQU8sQ0FBQztBQUU5QixTQUFTLE1BQU0sQ0FBQyxLQUFpQjtJQUMvQixPQUFPLElBQUEsbUJBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDckQsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQzdCLFFBQWdCLEVBQ2hCLFFBQVEsR0FBRyxVQUFVLEVBQ3JCLFlBQVksR0FBRyxhQUFhO0lBTTVCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUEsd0JBQVksRUFBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sU0FBUyxHQUFHLElBQUEsa0JBQU0sRUFBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakQsTUFBTSxVQUFVLEdBQUcsdUJBQUksQ0FBQywwQkFBMEIsQ0FBQztRQUNqRCxZQUFZO1FBQ1osZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDO1FBQzNDLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7UUFDOUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDdkcsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxrQkFBa0IsR0FBRyxVQUF3QixDQUFDO0lBQ3BELE1BQU0sSUFBSSxHQUFHLGdCQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQVEsRUFBRSxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN6RixJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxFQUFFLE1BQU8sQ0FBQyxDQUFDO0lBQzNELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUV0RCxNQUFNLEtBQUssR0FBRyx1QkFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRixnQkFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQixPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUF1QixFQUFFLGlCQUFpQixFQUFFLENBQUM7QUFDckUsQ0FBQztBQUVELFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtJQUM3QixFQUFFLENBQUMsc0RBQXNELEVBQUU7UUFDekQsTUFBTSxhQUFhLEdBQUcsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUQsTUFBTSxjQUFjLEdBQUcsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsTUFBTSxpQkFBaUIsR0FBRyxzQkFBc0IsQ0FBQyw2QkFBc0IsQ0FBQyxDQUFDO1FBRXpFLGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsK0JBQXdCLEVBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM3RixnQkFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLCtCQUF3QixFQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDL0YsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSwrQkFBd0IsRUFBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN2RyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw4REFBOEQsRUFBRTtRQUNqRSxNQUFNLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxJQUFBLHdCQUFpQixFQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXJGLE1BQU0sY0FBYyxHQUFHLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELElBQUEsMkJBQW9CLEVBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsY0FBYyxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNyRyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxJQUFBLHdCQUFpQixFQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzNGLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHdEQUF3RCxFQUFFO1FBQzNELE1BQU0sUUFBUSxHQUFHLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sV0FBVyxHQUFHLHNCQUFzQixDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5RCxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUQsTUFBTSxpQkFBaUIsR0FBRyxzQkFBc0IsQ0FBQyw2QkFBc0IsQ0FBQyxDQUFDO1FBRXpFLGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsOEJBQXVCLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEYsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSw4QkFBdUIsRUFBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRixnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLDhCQUF1QixFQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNoRyxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FBQyxJQUFBLDhCQUF1QixFQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQ2hGLG9CQUFvQixDQUNyQixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUU7UUFDckQsTUFBTSxLQUFLLEdBQUcsc0JBQXNCLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sUUFBUSxHQUFHLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVuRSxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLDhCQUF1QixFQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQzlGLGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsOEJBQXVCLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEYsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0RBQXdELEVBQUU7UUFDM0QsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFL0UsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSw4QkFBdUIsRUFBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsb0VBQW9FLEVBQUU7UUFDdkUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyRSxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLDJCQUFvQixFQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixDQUFDLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUN4RyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpRUFBaUUsRUFBRTtRQUNwRSxNQUFNLGNBQWMsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVqRCxJQUFBLDJCQUFvQixFQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFckcsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUk7YUFDaEMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2FBQ3BCLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2xGLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUN6QixnQkFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUM5RixnQkFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUN0RixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQvc3RyaWN0JztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBwb3g1IH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1kZXNjcmlwdG9ycyc7XG5pbXBvcnQgeyBQc2J0LCB0eXBlIERlc2NyaXB0b3IgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IGdldEtleSwgZ2V0S2V5VHJpcGxlIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4by90ZXN0dXRpbHMnO1xuXG5pbXBvcnQge1xuICBhc3NlcnRQb3g1RWFybHlFeGl0U3BlbmQsXG4gIGFzc2VydFBveDVMb2NrdGltZVNwZW5kLFxuICBjbGFzc2lmeVBveDVTcGVuZCxcbiAgUE9YNV9NQVhfVU5MT0NLX0hFSUdIVCxcbiAgcHJlcGFyZVBveDVFYXJseUV4aXQsXG59IGZyb20gJy4uLy4uLy4uL3NyYy9wb3g1JztcblxudHlwZSBQb3g1SW5wdXRNYXRjaCA9IHBveDUuUG94NUlucHV0TWF0Y2g7XG5cbmNvbnN0IFVOTE9DS19IRUlHSFQgPSA4NDBfMDAwO1xuXG5mdW5jdGlvbiBzaGEyNTYodmFsdWU6IFVpbnQ4QXJyYXkpOiBCdWZmZXIge1xuICByZXR1cm4gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHZhbHVlKS5kaWdlc3QoKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUG94NVJlY292ZXJ5UHNidChcbiAgbG9ja1RpbWU6IG51bWJlcixcbiAgc2VxdWVuY2UgPSAweGZmZmZmZmZlLFxuICB1bmxvY2tIZWlnaHQgPSBVTkxPQ0tfSEVJR0hUXG4pOiB7XG4gIHBzYnQ6IFBzYnQ7XG4gIG1hdGNoOiBQb3g1SW5wdXRNYXRjaDtcbiAgcHJpbmNpcGFsUHJlaW1hZ2U6IEJ1ZmZlcjtcbn0ge1xuICBjb25zdCBbdXNlciwgYmFja3VwLCBiaXRnb10gPSBnZXRLZXlUcmlwbGUoJ3V0eG8tc3Rha2luZy1wb3g1LXJlY292ZXJ5Jyk7XG4gIGNvbnN0IGVhcmx5RXhpdCA9IGdldEtleSgndXR4by1zdGFraW5nLXBveDUtcmVjb3ZlcnktZWFybHktZXhpdCcpO1xuICBjb25zdCBwcmluY2lwYWxQcmVpbWFnZSA9IEJ1ZmZlci5hbGxvYygzMiwgMHg0Mik7XG4gIGNvbnN0IGRlc2NyaXB0b3IgPSBwb3g1LmNyZWF0ZVBveDVMb2NrdXBEZXNjcmlwdG9yKHtcbiAgICB1bmxvY2tIZWlnaHQsXG4gICAgc3Rha2VyQ29tbWl0bWVudDogc2hhMjU2KHByaW5jaXBhbFByZWltYWdlKSxcbiAgICBlYXJseUV4aXRLZXk6IEJ1ZmZlci5mcm9tKGVhcmx5RXhpdC5wdWJsaWNLZXkpLFxuICAgIHN0YWtlcktleXM6IFtCdWZmZXIuZnJvbSh1c2VyLnB1YmxpY0tleSksIEJ1ZmZlci5mcm9tKGJhY2t1cC5wdWJsaWNLZXkpLCBCdWZmZXIuZnJvbShiaXRnby5wdWJsaWNLZXkpXSxcbiAgfSk7XG4gIGNvbnN0IGNvbmNyZXRlRGVzY3JpcHRvciA9IGRlc2NyaXB0b3IgYXMgRGVzY3JpcHRvcjtcbiAgY29uc3QgcHNidCA9IFBzYnQuY3JlYXRlKDIsIGxvY2tUaW1lKTtcbiAgcHNidC5hZGRJbnB1dCgnMDEnLnJlcGVhdCgzMiksIDAsIDEwMF8wMDBuLCBjb25jcmV0ZURlc2NyaXB0b3Iuc2NyaXB0UHVia2V5KCksIHNlcXVlbmNlKTtcbiAgcHNidC5hZGRPdXRwdXQoY29uY3JldGVEZXNjcmlwdG9yLnNjcmlwdFB1YmtleSgpLCA5MF8wMDBuKTtcbiAgcHNidC51cGRhdGVJbnB1dFdpdGhEZXNjcmlwdG9yKDAsIGNvbmNyZXRlRGVzY3JpcHRvcik7XG5cbiAgY29uc3QgbWF0Y2ggPSBwb3g1Lm1hdGNoUG94NUlucHV0KHBzYnQsIDAsIG5ldyBNYXAoW1sncG94NScsIGNvbmNyZXRlRGVzY3JpcHRvcl1dKSk7XG4gIGFzc2VydC5vayhtYXRjaCk7XG4gIHJldHVybiB7IHBzYnQsIG1hdGNoOiBtYXRjaCBhcyBQb3g1SW5wdXRNYXRjaCwgcHJpbmNpcGFsUHJlaW1hZ2UgfTtcbn1cblxuZGVzY3JpYmUoJ1BvWC01IHNwZW5kIHBvbGljeScsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ2FsbG93cyB0aGUgZWFybHktZXhpdCBicmFuY2ggcmVnYXJkbGVzcyBvZiBuTG9ja1RpbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbG9ja3RpbWVTcGVuZCA9IGNyZWF0ZVBveDVSZWNvdmVyeVBzYnQoVU5MT0NLX0hFSUdIVCk7XG4gICAgY29uc3QgZWFybHlFeGl0U3BlbmQgPSBjcmVhdGVQb3g1UmVjb3ZlcnlQc2J0KDApO1xuICAgIGNvbnN0IHRpbWVzdGFtcExvY2t0aW1lID0gY3JlYXRlUG94NVJlY292ZXJ5UHNidChQT1g1X01BWF9VTkxPQ0tfSEVJR0hUKTtcblxuICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4gYXNzZXJ0UG94NUVhcmx5RXhpdFNwZW5kKGxvY2t0aW1lU3BlbmQucHNidCwgbG9ja3RpbWVTcGVuZC5tYXRjaCkpO1xuICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4gYXNzZXJ0UG94NUVhcmx5RXhpdFNwZW5kKGVhcmx5RXhpdFNwZW5kLnBzYnQsIGVhcmx5RXhpdFNwZW5kLm1hdGNoKSk7XG4gICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiBhc3NlcnRQb3g1RWFybHlFeGl0U3BlbmQodGltZXN0YW1wTG9ja3RpbWUucHNidCwgdGltZXN0YW1wTG9ja3RpbWUubWF0Y2gpKTtcbiAgfSk7XG5cbiAgaXQoJ2NsYXNzaWZpZXMgdGhlIHNwZW5kIGZyb20gbmF0aXZlIHByaW5jaXBhbC1wcmVpbWFnZSBtZXRhZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBsb2NrdGltZVNwZW5kID0gY3JlYXRlUG94NVJlY292ZXJ5UHNidChVTkxPQ0tfSEVJR0hUKTtcbiAgICBhc3NlcnQuZXF1YWwoY2xhc3NpZnlQb3g1U3BlbmQobG9ja3RpbWVTcGVuZC5wc2J0LCBsb2NrdGltZVNwZW5kLm1hdGNoKSwgJ2xvY2t0aW1lJyk7XG5cbiAgICBjb25zdCBlYXJseUV4aXRTcGVuZCA9IGNyZWF0ZVBveDVSZWNvdmVyeVBzYnQoMCk7XG4gICAgcHJlcGFyZVBveDVFYXJseUV4aXQoZWFybHlFeGl0U3BlbmQucHNidCwgMCwgZWFybHlFeGl0U3BlbmQubWF0Y2gsIGVhcmx5RXhpdFNwZW5kLnByaW5jaXBhbFByZWltYWdlKTtcbiAgICBhc3NlcnQuZXF1YWwoY2xhc3NpZnlQb3g1U3BlbmQoZWFybHlFeGl0U3BlbmQucHNidCwgZWFybHlFeGl0U3BlbmQubWF0Y2gpLCAnZWFybHktZXhpdCcpO1xuICB9KTtcblxuICBpdCgnZW5mb3JjZXMgdGhlIGJsb2NrLWhlaWdodCBhbmQgdW5sb2NrLWhlaWdodCBib3VuZGFyaWVzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGF0SGVpZ2h0ID0gY3JlYXRlUG94NVJlY292ZXJ5UHNidChVTkxPQ0tfSEVJR0hUKTtcbiAgICBjb25zdCBhYm92ZUhlaWdodCA9IGNyZWF0ZVBveDVSZWNvdmVyeVBzYnQoVU5MT0NLX0hFSUdIVCArIDEpO1xuICAgIGNvbnN0IGJlbG93SGVpZ2h0ID0gY3JlYXRlUG94NVJlY292ZXJ5UHNidChVTkxPQ0tfSEVJR0hUIC0gMSk7XG4gICAgY29uc3QgdGltZXN0YW1wTG9ja3RpbWUgPSBjcmVhdGVQb3g1UmVjb3ZlcnlQc2J0KFBPWDVfTUFYX1VOTE9DS19IRUlHSFQpO1xuXG4gICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiBhc3NlcnRQb3g1TG9ja3RpbWVTcGVuZChhdEhlaWdodC5wc2J0LCBbYXRIZWlnaHQubWF0Y2hdKSk7XG4gICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiBhc3NlcnRQb3g1TG9ja3RpbWVTcGVuZChhYm92ZUhlaWdodC5wc2J0LCBbYWJvdmVIZWlnaHQubWF0Y2hdKSk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBhc3NlcnRQb3g1TG9ja3RpbWVTcGVuZChiZWxvd0hlaWdodC5wc2J0LCBbYmVsb3dIZWlnaHQubWF0Y2hdKSwgL2F0IGxlYXN0Lyk7XG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+IGFzc2VydFBveDVMb2NrdGltZVNwZW5kKHRpbWVzdGFtcExvY2t0aW1lLnBzYnQsIFt0aW1lc3RhbXBMb2NrdGltZS5tYXRjaF0pLFxuICAgICAgL2Jsb2NrIGhlaWdodCBiZWxvdy9cbiAgICApO1xuICB9KTtcblxuICBpdCgncmVxdWlyZXMgbm9uLWZpbmFsIHNlcXVlbmNlcyBmb3IgbG9ja3RpbWUgc3BlbmRzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGZpbmFsID0gY3JlYXRlUG94NVJlY292ZXJ5UHNidChVTkxPQ0tfSEVJR0hULCAweGZmZmZmZmZmKTtcbiAgICBjb25zdCBub25GaW5hbCA9IGNyZWF0ZVBveDVSZWNvdmVyeVBzYnQoVU5MT0NLX0hFSUdIVCwgMHhmZmZmZmZmZSk7XG5cbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGFzc2VydFBveDVMb2NrdGltZVNwZW5kKGZpbmFsLnBzYnQsIFtmaW5hbC5tYXRjaF0pLCAvbm9uLWZpbmFsIHNlcXVlbmNlLyk7XG4gICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiBhc3NlcnRQb3g1TG9ja3RpbWVTcGVuZChub25GaW5hbC5wc2J0LCBbbm9uRmluYWwubWF0Y2hdKSk7XG4gIH0pO1xuXG4gIGl0KCdhbGxvd3MgZmluYWwgc2VxdWVuY2VzIG9uIHVucmVsYXRlZCB0cmFuc2FjdGlvbiBpbnB1dHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgeyBwc2J0LCBtYXRjaCB9ID0gY3JlYXRlUG94NVJlY292ZXJ5UHNidChVTkxPQ0tfSEVJR0hUKTtcbiAgICBwc2J0LmFkZElucHV0KCcwMicucmVwZWF0KDMyKSwgMCwgMTBfMDAwbiwgbmV3IFVpbnQ4QXJyYXkoWzB4NTFdKSwgMHhmZmZmZmZmZik7XG5cbiAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IGFzc2VydFBveDVMb2NrdGltZVNwZW5kKHBzYnQsIFttYXRjaF0pKTtcbiAgfSk7XG5cbiAgaXQoJ3JlcXVpcmVzIGFuIGlucHV0IG1hdGNoIHRvIHJlbWFpbiBib3VuZCB0byBpdHMgb3JpZ2luYWwgUFNCVCBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7IHBzYnQsIG1hdGNoLCBwcmluY2lwYWxQcmVpbWFnZSB9ID0gY3JlYXRlUG94NVJlY292ZXJ5UHNidCgwKTtcblxuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gcHJlcGFyZVBveDVFYXJseUV4aXQocHNidCwgMSwgbWF0Y2gsIHByaW5jaXBhbFByZWltYWdlKSwgL2JlbG9uZ3MgdG8gUFNCVCBpbnB1dC8pO1xuICB9KTtcblxuICBpdCgnYWRkcyBhIHZhbGlkYXRlZCBwcmluY2lwYWwgcHJlaW1hZ2UgdGhyb3VnaCB0aGUgbmF0aXZlIFBTQlQgQVBJJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGVhcmx5RXhpdFNwZW5kID0gY3JlYXRlUG94NVJlY292ZXJ5UHNidCgwKTtcblxuICAgIHByZXBhcmVQb3g1RWFybHlFeGl0KGVhcmx5RXhpdFNwZW5kLnBzYnQsIDAsIGVhcmx5RXhpdFNwZW5kLm1hdGNoLCBlYXJseUV4aXRTcGVuZC5wcmluY2lwYWxQcmVpbWFnZSk7XG5cbiAgICBjb25zdCByZWNvcmRzID0gZWFybHlFeGl0U3BlbmQucHNidFxuICAgICAgLmdldElucHV0S2V5VmFsdWVzKDApXG4gICAgICAuZmlsdGVyKChyZWNvcmQpID0+IHJlY29yZC50eXBlID09PSAna25vd24nICYmIHJlY29yZC5rZXkgPT09ICdQU0JUX0lOX1NIQTI1NicpO1xuICAgIGFzc2VydC5lcXVhbChyZWNvcmRzLmxlbmd0aCwgMSk7XG4gICAgY29uc3QgW3JlY29yZF0gPSByZWNvcmRzO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoQnVmZmVyLmZyb20ocmVjb3JkLmtleURhdGEpLCBzaGEyNTYoZWFybHlFeGl0U3BlbmQucHJpbmNpcGFsUHJlaW1hZ2UpKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKHJlY29yZC52YWx1ZSksIGVhcmx5RXhpdFNwZW5kLnByaW5jaXBhbFByZWltYWdlKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -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
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
|
61
|
-
const 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,
|
|
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,
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0bmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9wb3g1L3dpdG5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsbUNBQW9DO0FBRXBDLG1FQUFvRDtBQUNwRCxnREFBeUQ7QUFDekQsMERBQWtFO0FBRWxFLDRDQUFrSDtBQUlsSCxNQUFNLGFBQWEsR0FBRyxNQUFPLENBQUM7QUFFOUIsU0FBUyxNQUFNLENBQUMsS0FBaUI7SUFDL0IsT0FBTyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FDckIsUUFBZ0IsRUFDaEIseUJBQWtDO0lBTWxDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUEsd0JBQVksRUFBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sU0FBUyxHQUFHLElBQUEsa0JBQU0sRUFBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ3pELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FJM0csQ0FBQztJQUNGLE1BQU0sVUFBVSxHQUFHLHVCQUFJLENBQUMsMEJBQTBCLENBQUM7UUFDakQsWUFBWSxFQUFFLGFBQWE7UUFDM0IsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGlCQUFp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Q0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBwb3g1IH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1kZXNjcmlwdG9ycyc7XG5pbXBvcnQgeyBQc2J0LCB0eXBlIERlc2NyaXB0b3IgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IGdldEtleSwgZ2V0S2V5VHJpcGxlIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4by90ZXN0dXRpbHMnO1xuXG5pbXBvcnQgeyBmaW5hbGl6ZVBveDVFYXJseUV4aXRQYXRoLCBmaW5hbGl6ZVBveDVMb2NrdGltZVBhdGgsIHR5cGUgUG94NUZpbmFsaXplclBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL3NyYy9wb3g1JztcblxudHlwZSBQb3g1SW5wdXRNYXRjaCA9IHBveDUuUG94NUlucHV0TWF0Y2g7XG5cbmNvbnN0IFVOTE9DS19IRUlHSFQgPSA4NDBfMDAwO1xuXG5mdW5jdGlvbiBzaGEyNTYodmFsdWU6IFVpbnQ4QXJyYXkpOiBCdWZmZXIge1xuICByZXR1cm4gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHZhbHVlKS5kaWdlc3QoKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUG94NVBzYnQoXG4gIGxvY2tUaW1lOiBudW1iZXIsXG4gIGluY2x1ZGVFYXJseUV4aXRTaWduYXR1cmU6IGJvb2xlYW5cbik6IHtcbiAgcHNidDogUHNidDtcbiAgcGFyYW1zOiBQb3g1RmluYWxpemVyUGFyYW1zO1xuICBwcmluY2lwYWxQcmVpbWFnZTogQnVmZmVyO1xufSB7XG4gIGNvbnN0IFt1c2VyLCBiYWNrdXAsIGJpdGdvXSA9IGdldEtleVRyaXBsZSgndXR4by1zdGFraW5nLXBveDUnKTtcbiAgY29uc3QgZWFybHlFeGl0ID0gZ2V0S2V5KCd1dHhvLXN0YWtpbmctcG94NS1lYXJseS1leGl0Jyk7XG4gIGNvbnN0IHByaW5jaXBhbFByZWltYWdlID0gQnVmZmVyLmFsbG9jKDMyLCAweDQyKTtcbiAgY29uc3Qgc3Rha2VyS2V5cyA9IFtCdWZmZXIuZnJvbSh1c2VyLnB1YmxpY0tleSksIEJ1ZmZlci5mcm9tKGJhY2t1cC5wdWJsaWNLZXkpLCBCdWZmZXIuZnJvbShiaXRnby5wdWJsaWNLZXkpXSBhcyBbXG4gICAgQnVmZmVyLFxuICAgIEJ1ZmZlcixcbiAgICBCdWZmZXJcbiAgXTtcbiAgY29uc3QgZGVzY3JpcHRvciA9IHBveDUuY3JlYXRlUG94NUxvY2t1cERlc2NyaXB0b3Ioe1xuICAgIHVubG9ja0hlaWdodDogVU5MT0NLX0hFSUdIVCxcbiAgICBzdGFrZXJDb21taXRtZW50OiBzaGEyNTYocHJpbmNpcGFsUHJlaW1hZ2UpLFxuICAgIGVhcmx5RXhpdEtleTogQnVmZmVyLmZyb20oZWFybHlFeGl0LnB1YmxpY0tleSksXG4gICAgc3Rha2VyS2V5cyxcbiAgfSk7XG4gIGNvbnN0IHBhcmFtc0Rlc2NyaXB0b3IgPSBkZXNjcmlwdG9yIGFzIERlc2NyaXB0b3I7XG4gIGNvbnN0IHNjcmlwdFB1YktleSA9IHBhcmFtc0Rlc2NyaXB0b3Iuc2NyaXB0UHVia2V5KCk7XG4gIGNvbnN0IHBzYnQgPSBQc2J0LmNyZWF0ZSgyLCBsb2NrVGltZSk7XG4gIHBzYnQuYWRkSW5wdXQoJzAxJy5yZXBlYXQoMzIpLCAwLCAxMDBfMDAwbiwgc2NyaXB0UHViS2V5LCAweGZmZmZmZmZlKTtcbiAgcHNidC5hZGRPdXRwdXQoc2NyaXB0UHViS2V5LCA5MF8wMDBuKTtcbiAgcHNidC51cGRhdGVJbnB1dFdpdGhEZXNjcmlwdG9yKDAsIHBhcmFtc0Rlc2NyaXB0b3IpO1xuXG4gIGNvbnN0IG1hdGNoID0gcG94NS5tYXRjaFBveDVJbnB1dChwc2J0LCAwLCBuZXcgTWFwKFtbJ3BveDUnLCBwYXJhbXNEZXNjcmlwdG9yXV0pKTtcbiAgYXNzZXJ0Lm9rKG1hdGNoKTtcbiAgY29uc3QgcGFyYW1zOiBQb3g1RmluYWxpemVyUGFyYW1zID0geyBtYXRjaDogbWF0Y2ggYXMgUG94NUlucHV0TWF0Y2ggfTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBpbmNsdWRlRWFybHlFeGl0U2lnbmF0dXJlID8gW3VzZXIsIGJhY2t1cCwgZWFybHlFeGl0XSA6IFt1c2VyLCBiYWNrdXBdKSB7XG4gICAgYXNzZXJ0Lm9rKGtleS5wcml2YXRlS2V5LCAndGVzdCBrZXkgbXVzdCBpbmNsdWRlIHByaXZhdGUga2V5IG1hdGVyaWFsJyk7XG4gICAgcHNidC5zaWduV2l0aFBydihrZXkucHJpdmF0ZUtleSk7XG4gIH1cbiAgcmV0dXJuIHsgcHNidCwgcGFyYW1zLCBwcmluY2lwYWxQcmVpbWFnZSB9O1xufVxuXG5kZXNjcmliZSgnUG9YLTUgd2l0bmVzcyBmaW5hbGl6YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdmaW5hbGl6ZXMgdGhlIENMVFYgYnJhbmNoIHRocm91Z2ggdGhlIG5hdGl2ZSBNaW5pc2NyaXB0IGZpbmFsaXplcicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7IHBzYnQsIHBhcmFtcyB9ID0gY3JlYXRlUG94NVBzYnQoVU5MT0NLX0hFSUdIVCwgZmFsc2UpO1xuXG4gICAgZmluYWxpemVQb3g1TG9ja3RpbWVQYXRoKHBzYnQsIDAsIHBhcmFtcyk7XG5cbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBzYnQuZ2V0UGFydGlhbFNpZ25hdHVyZXMoMCksIFtdKTtcbiAgICBhc3NlcnQub2socHNidC5leHRyYWN0VHJhbnNhY3Rpb24oKS50b0J5dGVzKCkubGVuZ3RoID4gMCk7XG4gIH0pO1xuXG4gIGl0KCdyZWdpc3RlcnMgdGhlIHByaW5jaXBhbCBwcmVpbWFnZSBhbmQgZmluYWxpemVzIHRoZSBlYXJseS1leGl0IGJyYW5jaCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7IHBzYnQsIHBhcmFtcywgcHJpbmNpcGFsUHJlaW1hZ2UgfSA9IGNyZWF0ZVBveDVQc2J0KDAsIHRydWUpO1xuXG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+IGZpbmFsaXplUG94NUVhcmx5RXhpdFBhdGgocHNidCwgMCwgeyAuLi5wYXJhbXMsIHByaW5jaXBhbFByZWltYWdlOiBCdWZmZXIuYWxsb2MoMzIpIH0pLFxuICAgICAgL3ByaW5jaXBhbFByZWltYWdlL1xuICAgICk7XG4gICAgZmluYWxpemVQb3g1RWFybHlFeGl0UGF0aChwc2J0LCAwLCB7IC4uLnBhcmFtcywgcHJpbmNpcGFsUHJlaW1hZ2UgfSk7XG5cbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBzYnQuZ2V0UGFydGlhbFNpZ25hdHVyZXMoMCksIFtdKTtcbiAgICBhc3NlcnQub2socHNidC5leHRyYWN0VHJhbnNhY3Rpb24oKS50b0J5dGVzKCkubGVuZ3RoID4gMCk7XG4gIH0pO1xufSk7XG4iXX0=
|