@bitgo/utxo-staking 1.42.0 → 1.43.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/src/index.d.ts +1 -0
- package/dist/cjs/src/index.d.ts.map +1 -1
- package/dist/cjs/src/index.js +3 -2
- package/dist/cjs/src/pox5/index.d.ts +2 -0
- package/dist/cjs/src/pox5/index.d.ts.map +1 -0
- package/dist/cjs/src/pox5/index.js +18 -0
- package/dist/cjs/src/pox5/witness.d.ts +16 -0
- package/dist/cjs/src/pox5/witness.d.ts.map +1 -0
- package/dist/cjs/src/pox5/witness.js +44 -0
- package/dist/cjs/test/unit/pox5/witness.d.ts +2 -0
- package/dist/cjs/test/unit/pox5/witness.d.ts.map +1 -0
- package/dist/cjs/test/unit/pox5/witness.js +87 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/pox5/index.d.ts +2 -0
- package/dist/esm/pox5/index.d.ts.map +1 -0
- package/dist/esm/pox5/index.js +2 -0
- package/dist/esm/pox5/witness.d.ts +16 -0
- package/dist/esm/pox5/witness.d.ts.map +1 -0
- package/dist/esm/pox5/witness.js +40 -0
- package/package.json +6 -5
package/dist/cjs/src/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC"}
|
package/dist/cjs/src/index.js
CHANGED
|
@@ -33,7 +33,8 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.babylon = exports.coreDao = void 0;
|
|
36
|
+
exports.pox5 = exports.babylon = exports.coreDao = void 0;
|
|
37
37
|
exports.coreDao = __importStar(require("./coreDao"));
|
|
38
38
|
exports.babylon = __importStar(require("./babylon"));
|
|
39
|
-
|
|
39
|
+
exports.pox5 = __importStar(require("./pox5"));
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscURBQXFDO0FBQ3JDLHFEQUFxQztBQUNyQywrQ0FBK0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBhcyBjb3JlRGFvIGZyb20gJy4vY29yZURhbyc7XG5leHBvcnQgKiBhcyBiYWJ5bG9uIGZyb20gJy4vYmFieWxvbic7XG5leHBvcnQgKiBhcyBwb3g1IGZyb20gJy4vcG94NSc7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/pox5/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./witness"), exports);
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcG94NS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNENBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi93aXRuZXNzJztcbiJdfQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ast, Descriptor, Psbt } from '@bitgo/wasm-utxo';
|
|
2
|
+
type Pox5Descriptor = Descriptor | ast.DescriptorNode;
|
|
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];
|
|
8
|
+
};
|
|
9
|
+
/** Finalize the post-CLTV 2-of-3 PoX-5 spend branch. */
|
|
10
|
+
export declare function finalizePox5LocktimePath(psbt: Psbt, inputIndex: number, params: Pox5FinalizerParams): void;
|
|
11
|
+
/** Finalize the principal-preimage early-exit 2-of-3 PoX-5 spend branch. */
|
|
12
|
+
export declare function finalizePox5EarlyExitPath(psbt: Psbt, inputIndex: number, params: Pox5FinalizerParams & {
|
|
13
|
+
principalPreimage: Buffer;
|
|
14
|
+
}): void;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=witness.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.finalizePox5LocktimePath = finalizePox5LocktimePath;
|
|
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');
|
|
12
|
+
}
|
|
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
|
+
}
|
|
26
|
+
/** Finalize the post-CLTV 2-of-3 PoX-5 spend branch. */
|
|
27
|
+
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
|
+
}
|
|
32
|
+
psbt.finalizeInput(inputIndex);
|
|
33
|
+
}
|
|
34
|
+
/** Finalize the principal-preimage early-exit 2-of-3 PoX-5 spend branch. */
|
|
35
|
+
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);
|
|
42
|
+
psbt.finalizeInput(inputIndex);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0bmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wb3g1L3dpdG5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFvQ0EsNERBTUM7QUFHRCw4REFZQztBQXpERCxtQ0FBb0M7QUFFcEMsZ0RBQXlEO0FBQ3pELDhEQUErQztBQVcvQyxTQUFTLG1CQUFtQixDQUFDLE1BQTJCO0lBQ3RELE1BQU0sTUFBTSxHQUFHLHVCQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRkFBZ0YsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkYsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsVUFBMEI7SUFDL0MsT0FBTyxVQUFVLFlBQVksc0JBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxzQkFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3ZILENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxJQUFVLEVBQUUsVUFBa0IsRUFBRSxNQUEyQjtJQUMvRSxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQyxJQUFJLENBQUMseUJBQXlCLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM3RSxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsd0RBQXdEO0FBQ3hELFNBQWdCLHdCQUF3QixDQUFDLElBQVUsRUFBRSxVQUFrQixFQUFFLE1BQTJCO0lBQ2xHLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3RELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLFNBQWdCLHlCQUF5QixDQUN2QyxJQUFVLEVBQ1YsVUFBa0IsRUFDbEIsTUFBMkQ7SUFFM0QsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdEQsTUFBTSxZQUFZLEdBQUcsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNwRixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sSUFBSSxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUM3RCxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcblxuaW1wb3J0IHsgYXN0LCBEZXNjcmlwdG9yLCBQc2J0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgeyBwb3g1IH0gZnJvbSAnQGJpdGdvL3V0eG8tZGVzY3JpcHRvcnMnO1xuXG50eXBlIFBveDVEZXNjcmlwdG9yID0gRGVzY3JpcHRvciB8IGFzdC5EZXNjcmlwdG9yTm9kZTtcblxuZXhwb3J0IHR5cGUgUG94NUZpbmFsaXplclBhcmFtcyA9IHtcbiAgLyoqIEEgZGVmaW5pdGUgb3IgZGVyaXZhdGlvbi1pbmRleGVkIGNhbm9uaWNhbCBQb1gtNSBkZXNjcmlwdG9yLiAqL1xuICBkZXNjcmlwdG9yOiBQb3g1RGVzY3JpcHRvcjtcbiAgLyoqIFRoZSBkZXJpdmVkIHVzZXIsIGJhY2t1cCwgYW5kIEJpdEdvIGtleXMgaW4gZGVzY3JpcHRvciBvcmRlci4gKi9cbiAgc3Rha2VyS2V5czogW0J1ZmZlciwgQnVmZmVyLCBCdWZmZXJdO1xufTtcblxuZnVuY3Rpb24gZ2V0UGFyc2VkRGVzY3JpcHRvcihwYXJhbXM6IFBveDVGaW5hbGl6ZXJQYXJhbXMpIHtcbiAgY29uc3QgcGFyc2VkID0gcG94NS5wYXJzZVBveDVMb2NrdXBEZXNjcmlwdG9yKHBhcmFtcy5kZXNjcmlwdG9yKTtcbiAgaWYgKCFwYXJzZWQgfHwgIXBhcnNlZC5zdGFrZXJLZXlzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkZXNjcmlwdG9yIG11c3QgYmUgYSBkZWZpbml0ZSBvciBkZXJpdmF0aW9uLWluZGV4ZWQgY2Fub25pY2FsIFBvWC01IGRlc2NyaXB0b3InKTtcbiAgfVxuICBpZiAoIXBhcnNlZC5zdGFrZXJLZXlzLmV2ZXJ5KChrZXksIGluZGV4KSA9PiBrZXkuZXF1YWxzKHBhcmFtcy5zdGFrZXJLZXlzW2luZGV4XSkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzdGFrZXJLZXlzIG11c3QgbWF0Y2ggdGhlIGNhbm9uaWNhbCBkZXNjcmlwdG9yIG9yZGVyJyk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gZ2V0RGVzY3JpcHRvcihkZXNjcmlwdG9yOiBQb3g1RGVzY3JpcHRvcik6IERlc2NyaXB0b3Ige1xuICByZXR1cm4gZGVzY3JpcHRvciBpbnN0YW5jZW9mIERlc2NyaXB0b3IgPyBkZXNjcmlwdG9yIDogRGVzY3JpcHRvci5mcm9tU3RyaW5nKGFzdC5mb3JtYXROb2RlKGRlc2NyaXB0b3IpLCAnZGVmaW5pdGUnKTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUlucHV0KHBzYnQ6IFBzYnQsIGlucHV0SW5kZXg6IG51bWJlciwgcGFyYW1zOiBQb3g1RmluYWxpemVyUGFyYW1zKSB7XG4gIGNvbnN0IHBhcnNlZCA9IGdldFBhcnNlZERlc2NyaXB0b3IocGFyYW1zKTtcbiAgcHNidC51cGRhdGVJbnB1dFdpdGhEZXNjcmlwdG9yKGlucHV0SW5kZXgsIGdldERlc2NyaXB0b3IocGFyYW1zLmRlc2NyaXB0b3IpKTtcbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqIEZpbmFsaXplIHRoZSBwb3N0LUNMVFYgMi1vZi0zIFBvWC01IHNwZW5kIGJyYW5jaC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZVBveDVMb2NrdGltZVBhdGgocHNidDogUHNidCwgaW5wdXRJbmRleDogbnVtYmVyLCBwYXJhbXM6IFBveDVGaW5hbGl6ZXJQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgcGFyc2VkID0gcHJlcGFyZUlucHV0KHBzYnQsIGlucHV0SW5kZXgsIHBhcmFtcyk7XG4gIGlmIChwc2J0LmxvY2tUaW1lKCkgPCBwYXJzZWQudW5sb2NrSGVpZ2h0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB0cmFuc2FjdGlvbiBsb2NrdGltZSBtdXN0IGJlIGF0IGxlYXN0ICR7cGFyc2VkLnVubG9ja0hlaWdodH1gKTtcbiAgfVxuICBwc2J0LmZpbmFsaXplSW5wdXQoaW5wdXRJbmRleCk7XG59XG5cbi8qKiBGaW5hbGl6ZSB0aGUgcHJpbmNpcGFsLXByZWltYWdlIGVhcmx5LWV4aXQgMi1vZi0zIFBvWC01IHNwZW5kIGJyYW5jaC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZVBveDVFYXJseUV4aXRQYXRoKFxuICBwc2J0OiBQc2J0LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHBhcmFtczogUG94NUZpbmFsaXplclBhcmFtcyAmIHsgcHJpbmNpcGFsUHJlaW1hZ2U6IEJ1ZmZlciB9XG4pOiB2b2lkIHtcbiAgY29uc3QgcGFyc2VkID0gcHJlcGFyZUlucHV0KHBzYnQsIGlucHV0SW5kZXgsIHBhcmFtcyk7XG4gIGNvbnN0IHByZWltYWdlSGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShwYXJhbXMucHJpbmNpcGFsUHJlaW1hZ2UpLmRpZ2VzdCgpO1xuICBpZiAoIXByZWltYWdlSGFzaC5lcXVhbHMocGFyc2VkLnN0YWtlckNvbW1pdG1lbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcmluY2lwYWxQcmVpbWFnZSBkb2VzIG5vdCBtYXRjaCB0aGUgZGVzY3JpcHRvciBzdGFrZXJDb21taXRtZW50Jyk7XG4gIH1cbiAgcHNidC5hZGRTaGEyNTZQcmVpbWFnZShpbnB1dEluZGV4LCBwYXJhbXMucHJpbmNpcGFsUHJlaW1hZ2UpO1xuICBwc2J0LmZpbmFsaXplSW5wdXQoaW5wdXRJbmRleCk7XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"witness.d.ts","sourceRoot":"","sources":["../../../../../test/unit/pox5/witness.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const assert = __importStar(require("assert"));
|
|
37
|
+
const crypto_1 = require("crypto");
|
|
38
|
+
const utxo_descriptors_1 = require("@bitgo/utxo-descriptors");
|
|
39
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
40
|
+
const testutils_1 = require("@bitgo/wasm-utxo/testutils");
|
|
41
|
+
const pox5_1 = require("../../../src/pox5");
|
|
42
|
+
const UNLOCK_HEIGHT = 840000;
|
|
43
|
+
function sha256(value) {
|
|
44
|
+
return (0, crypto_1.createHash)('sha256').update(value).digest();
|
|
45
|
+
}
|
|
46
|
+
function createPox5Psbt(lockTime, includeEarlyExitSignature) {
|
|
47
|
+
const [user, backup, bitgo] = (0, testutils_1.getKeyTriple)('utxo-staking-pox5');
|
|
48
|
+
const earlyExit = (0, testutils_1.getKey)('utxo-staking-pox5-early-exit');
|
|
49
|
+
const principalPreimage = Buffer.alloc(32, 0x42);
|
|
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'),
|
|
58
|
+
stakerKeys,
|
|
59
|
+
};
|
|
60
|
+
const descriptor = params.descriptor;
|
|
61
|
+
const scriptPubKey = descriptor.scriptPubkey();
|
|
62
|
+
const psbt = wasm_utxo_1.Psbt.create(2, lockTime);
|
|
63
|
+
psbt.addInput('01'.repeat(32), 0, 100000n, scriptPubKey, 0xfffffffe);
|
|
64
|
+
psbt.addOutput(scriptPubKey, 90000n);
|
|
65
|
+
psbt.updateInputWithDescriptor(0, descriptor);
|
|
66
|
+
for (const key of includeEarlyExitSignature ? [user, backup, earlyExit] : [user, backup]) {
|
|
67
|
+
assert.ok(key.privateKey, 'test key must include private key material');
|
|
68
|
+
psbt.signWithPrv(key.privateKey);
|
|
69
|
+
}
|
|
70
|
+
return { psbt, params, principalPreimage };
|
|
71
|
+
}
|
|
72
|
+
describe('PoX-5 witness finalization', function () {
|
|
73
|
+
it('finalizes the CLTV branch through the native Miniscript finalizer', function () {
|
|
74
|
+
const { psbt, params } = createPox5Psbt(UNLOCK_HEIGHT, false);
|
|
75
|
+
(0, pox5_1.finalizePox5LocktimePath)(psbt, 0, params);
|
|
76
|
+
assert.deepStrictEqual(psbt.getPartialSignatures(0), []);
|
|
77
|
+
assert.ok(psbt.extractTransaction().toBytes().length > 0);
|
|
78
|
+
});
|
|
79
|
+
it('registers the principal preimage and finalizes the early-exit branch', function () {
|
|
80
|
+
const { psbt, params, principalPreimage } = createPox5Psbt(0, true);
|
|
81
|
+
assert.throws(() => (0, pox5_1.finalizePox5EarlyExitPath)(psbt, 0, { ...params, principalPreimage: Buffer.alloc(32) }), /principalPreimage/);
|
|
82
|
+
(0, pox5_1.finalizePox5EarlyExitPath)(psbt, 0, { ...params, principalPreimage });
|
|
83
|
+
assert.deepStrictEqual(psbt.getPartialSignatures(0), []);
|
|
84
|
+
assert.ok(psbt.extractTransaction().toBytes().length > 0);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0bmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9wb3g1L3dpdG5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsbUNBQW9DO0FBRXBDLDhEQUErQztBQUMvQyxnREFBb0Q7QUFDcEQsMERBQWtFO0FBRWxFLDRDQUE2RztBQUU3RyxNQUFNLGFBQWEsR0FBRyxNQUFPLENBQUM7QUFFOUIsU0FBUyxNQUFNLENBQUMsS0FBaUI7SUFDL0IsT0FBTyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FDckIsUUFBZ0IsRUFDaEIseUJBQWtDO0lBTWxDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUEsd0JBQVksRUFBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sU0FBUyxHQUFHLElBQUEsa0JBQU0sRUFBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ3pELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FJM0csQ0FBQztJQUNGLE1BQU0sTUFBTSxHQUF3QjtRQUNsQyxVQUFVLEVBQUUsc0JBQVUsQ0FBQyxVQUFVLENBQy9CLHVCQUFJLENBQUMsMEJBQTBCLENBQUM7WUFDOUIsWUFBWSxFQUFF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QUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBwb3g1IH0gZnJvbSAnQGJpdGdvL3V0eG8tZGVzY3JpcHRvcnMnO1xuaW1wb3J0IHsgRGVzY3JpcHRvciwgUHNidCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHsgZ2V0S2V5LCBnZXRLZXlUcmlwbGUgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvL3Rlc3R1dGlscyc7XG5cbmltcG9ydCB7IGZpbmFsaXplUG94NUVhcmx5RXhpdFBhdGgsIGZpbmFsaXplUG94NUxvY2t0aW1lUGF0aCwgUG94NUZpbmFsaXplclBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL3NyYy9wb3g1JztcblxuY29uc3QgVU5MT0NLX0hFSUdIVCA9IDg0MF8wMDA7XG5cbmZ1bmN0aW9uIHNoYTI1Nih2YWx1ZTogVWludDhBcnJheSk6IEJ1ZmZlciB7XG4gIHJldHVybiBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUodmFsdWUpLmRpZ2VzdCgpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQb3g1UHNidChcbiAgbG9ja1RpbWU6IG51bWJlcixcbiAgaW5jbHVkZUVhcmx5RXhpdFNpZ25hdHVyZTogYm9vbGVhblxuKToge1xuICBwc2J0OiBQc2J0O1xuICBwYXJhbXM6IFBveDVGaW5hbGl6ZXJQYXJhbXM7XG4gIHByaW5jaXBhbFByZWltYWdlOiBCdWZmZXI7XG59IHtcbiAgY29uc3QgW3VzZXIsIGJhY2t1cCwgYml0Z29dID0gZ2V0S2V5VHJpcGxlKCd1dHhvLXN0YWtpbmctcG94NScpO1xuICBjb25zdCBlYXJseUV4aXQgPSBnZXRLZXkoJ3V0eG8tc3Rha2luZy1wb3g1LWVhcmx5LWV4aXQnKTtcbiAgY29uc3QgcHJpbmNpcGFsUHJlaW1hZ2UgPSBCdWZmZXIuYWxsb2MoMzIsIDB4NDIpO1xuICBjb25zdCBzdGFrZXJLZXlzID0gW0J1ZmZlci5mcm9tKHVzZXIucHVibGljS2V5KSwgQnVmZmVyLmZyb20oYmFja3VwLnB1YmxpY0tleSksIEJ1ZmZlci5mcm9tKGJpdGdvLnB1YmxpY0tleSldIGFzIFtcbiAgICBCdWZmZXIsXG4gICAgQnVmZmVyLFxuICAgIEJ1ZmZlclxuICBdO1xuICBjb25zdCBwYXJhbXM6IFBveDVGaW5hbGl6ZXJQYXJhbXMgPSB7XG4gICAgZGVzY3JpcHRvcjogRGVzY3JpcHRvci5mcm9tU3RyaW5nKFxuICAgICAgcG94NS5jcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcih7XG4gICAgICAgIHVubG9ja0hlaWdodDogVU5MT0NLX0hFSUdIVCxcbiAgICAgICAgc3Rha2VyQ29tbWl0bWVudDogc2hhMjU2KHByaW5jaXBhbFByZWltYWdlKSxcbiAgICAgICAgZWFybHlFeGl0S2V5OiBCdWZmZXIuZnJvbShlYXJseUV4aXQucHVibGljS2V5KSxcbiAgICAgICAgc3Rha2VyS2V5cyxcbiAgICAgIH0pLFxuICAgICAgJ2RlZmluaXRlJ1xuICAgICksXG4gICAgc3Rha2VyS2V5cyxcbiAgfTtcbiAgY29uc3QgZGVzY3JpcHRvciA9IHBhcmFtcy5kZXNjcmlwdG9yIGFzIERlc2NyaXB0b3I7XG4gIGNvbnN0IHNjcmlwdFB1YktleSA9IGRlc2NyaXB0b3Iuc2NyaXB0UHVia2V5KCk7XG4gIGNvbnN0IHBzYnQgPSBQc2J0LmNyZWF0ZSgyLCBsb2NrVGltZSk7XG4gIHBzYnQuYWRkSW5wdXQoJzAxJy5yZXBlYXQoMzIpLCAwLCAxMDBfMDAwbiwgc2NyaXB0UHViS2V5LCAweGZmZmZmZmZlKTtcbiAgcHNidC5hZGRPdXRwdXQoc2NyaXB0UHViS2V5LCA5MF8wMDBuKTtcbiAgcHNidC51cGRhdGVJbnB1dFdpdGhEZXNjcmlwdG9yKDAsIGRlc2NyaXB0b3IpO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGluY2x1ZGVFYXJseUV4aXRTaWduYXR1cmUgPyBbdXNlciwgYmFja3VwLCBlYXJseUV4aXRdIDogW3VzZXIsIGJhY2t1cF0pIHtcbiAgICBhc3NlcnQub2soa2V5LnByaXZhdGVLZXksICd0ZXN0IGtleSBtdXN0IGluY2x1ZGUgcHJpdmF0ZSBrZXkgbWF0ZXJpYWwnKTtcbiAgICBwc2J0LnNpZ25XaXRoUHJ2KGtleS5wcml2YXRlS2V5KTtcbiAgfVxuICByZXR1cm4geyBwc2J0LCBwYXJhbXMsIHByaW5jaXBhbFByZWltYWdlIH07XG59XG5cbmRlc2NyaWJlKCdQb1gtNSB3aXRuZXNzIGZpbmFsaXphdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ2ZpbmFsaXplcyB0aGUgQ0xUViBicmFuY2ggdGhyb3VnaCB0aGUgbmF0aXZlIE1pbmlzY3JpcHQgZmluYWxpemVyJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHsgcHNidCwgcGFyYW1zIH0gPSBjcmVhdGVQb3g1UHNidChVTkxPQ0tfSEVJR0hULCBmYWxzZSk7XG5cbiAgICBmaW5hbGl6ZVBveDVMb2NrdGltZVBhdGgocHNidCwgMCwgcGFyYW1zKTtcblxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocHNidC5nZXRQYXJ0aWFsU2lnbmF0dXJlcygwKSwgW10pO1xuICAgIGFzc2VydC5vayhwc2J0LmV4dHJhY3RUcmFuc2FjdGlvbigpLnRvQnl0ZXMoKS5sZW5ndGggPiAwKTtcbiAgfSk7XG5cbiAgaXQoJ3JlZ2lzdGVycyB0aGUgcHJpbmNpcGFsIHByZWltYWdlIGFuZCBmaW5hbGl6ZXMgdGhlIGVhcmx5LWV4aXQgYnJhbmNoJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHsgcHNidCwgcGFyYW1zLCBwcmluY2lwYWxQcmVpbWFnZSB9ID0gY3JlYXRlUG94NVBzYnQoMCwgdHJ1ZSk7XG5cbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4gZmluYWxpemVQb3g1RWFybHlFeGl0UGF0aChwc2J0LCAwLCB7IC4uLnBhcmFtcywgcHJpbmNpcGFsUHJlaW1hZ2U6IEJ1ZmZlci5hbGxvYygzMikgfSksXG4gICAgICAvcHJpbmNpcGFsUHJlaW1hZ2UvXG4gICAgKTtcbiAgICBmaW5hbGl6ZVBveDVFYXJseUV4aXRQYXRoKHBzYnQsIDAsIHsgLi4ucGFyYW1zLCBwcmluY2lwYWxQcmVpbWFnZSB9KTtcblxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocHNidC5nZXRQYXJ0aWFsU2lnbmF0dXJlcygwKSwgW10pO1xuICAgIGFzc2VydC5vayhwc2J0LmV4dHJhY3RUcmFuc2FjdGlvbigpLnRvQnl0ZXMoKS5sZW5ndGggPiAwKTtcbiAgfSk7XG59KTtcbiJdfQ==
|