@bitgo-beta/utxo-descriptors 0.0.1-beta.37 → 0.0.1-beta.371
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/src/index.d.ts +1 -0
- package/dist/cjs/src/index.d.ts.map +1 -1
- package/dist/cjs/src/index.js +3 -2
- package/dist/cjs/src/pox5/descriptor.d.ts +22 -0
- package/dist/cjs/src/pox5/descriptor.d.ts.map +1 -0
- package/dist/cjs/src/pox5/descriptor.js +79 -0
- package/dist/cjs/src/pox5/index.d.ts +6 -0
- package/dist/cjs/src/pox5/index.d.ts.map +1 -0
- package/dist/cjs/src/pox5/index.js +22 -0
- package/dist/cjs/src/pox5/input.d.ts +28 -0
- package/dist/cjs/src/pox5/input.d.ts.map +1 -0
- package/dist/cjs/src/pox5/input.js +47 -0
- package/dist/cjs/src/pox5/parseDescriptor.d.ts +20 -0
- package/dist/cjs/src/pox5/parseDescriptor.d.ts.map +1 -0
- package/dist/cjs/src/pox5/parseDescriptor.js +113 -0
- 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/validation.d.ts +12 -0
- package/dist/cjs/src/pox5/validation.d.ts.map +1 -0
- package/dist/cjs/src/pox5/validation.js +70 -0
- package/dist/cjs/src/sbtc/parseDescriptor.d.ts +8 -0
- package/dist/cjs/src/sbtc/parseDescriptor.d.ts.map +1 -1
- package/dist/cjs/src/sbtc/parseDescriptor.js +7 -1
- package/dist/cjs/test/unit/pox5/descriptor.d.ts +2 -0
- package/dist/cjs/test/unit/pox5/descriptor.d.ts.map +1 -0
- package/dist/cjs/test/unit/pox5/descriptor.js +163 -0
- package/dist/cjs/test/unit/pox5/input.d.ts +2 -0
- package/dist/cjs/test/unit/pox5/input.d.ts.map +1 -0
- package/dist/cjs/test/unit/pox5/input.js +113 -0
- 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 +87 -0
- package/dist/cjs/test/unit/pox5/validation.d.ts +2 -0
- package/dist/cjs/test/unit/pox5/validation.d.ts.map +1 -0
- package/dist/cjs/test/unit/pox5/validation.js +99 -0
- package/dist/cjs/test/unit/sbtc/parseDescriptor.js +14 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/pox5/descriptor.d.ts +22 -0
- package/dist/esm/pox5/descriptor.d.ts.map +1 -0
- package/dist/esm/pox5/descriptor.js +74 -0
- package/dist/esm/pox5/index.d.ts +6 -0
- package/dist/esm/pox5/index.d.ts.map +1 -0
- package/dist/esm/pox5/index.js +6 -0
- package/dist/esm/pox5/input.d.ts +28 -0
- package/dist/esm/pox5/input.d.ts.map +1 -0
- package/dist/esm/pox5/input.js +43 -0
- package/dist/esm/pox5/parseDescriptor.d.ts +20 -0
- package/dist/esm/pox5/parseDescriptor.d.ts.map +1 -0
- package/dist/esm/pox5/parseDescriptor.js +109 -0
- 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/validation.d.ts +12 -0
- package/dist/esm/pox5/validation.d.ts.map +1 -0
- package/dist/esm/pox5/validation.js +65 -0
- package/dist/esm/sbtc/parseDescriptor.d.ts +8 -0
- package/dist/esm/sbtc/parseDescriptor.d.ts.map +1 -1
- package/dist/esm/sbtc/parseDescriptor.js +7 -1
- package/package.json +8 -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,IAAI,MAAM,QAAQ,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC"}
|
package/dist/cjs/src/index.js
CHANGED
|
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.sbtc = void 0;
|
|
36
|
+
exports.pox5 = exports.sbtc = void 0;
|
|
37
37
|
exports.sbtc = __importStar(require("./sbtc"));
|
|
38
|
-
|
|
38
|
+
exports.pox5 = __importStar(require("./pox5"));
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQStCO0FBQy9CLCtDQUErQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGFzIHNidGMgZnJvbSAnLi9zYnRjJztcbmV4cG9ydCAqIGFzIHBveDUgZnJvbSAnLi9wb3g1JztcbiJdfQ==
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { bip32, Descriptor } from '@bitgo/wasm-utxo';
|
|
2
|
+
type BIP32Interface = bip32.BIP32Interface;
|
|
3
|
+
export type Pox5StakerKey = BIP32Interface | Buffer;
|
|
4
|
+
export type Pox5LockupDescriptorParams = {
|
|
5
|
+
unlockHeight: number;
|
|
6
|
+
/** sha256(sha256(Clarity consensus principal bytes)). */
|
|
7
|
+
stakerCommitment: Buffer;
|
|
8
|
+
earlyExitKey: Buffer;
|
|
9
|
+
/** User, backup, and BitGo keys, all BIP32 or all concrete compressed keys. */
|
|
10
|
+
stakerKeys: [Pox5StakerKey, Pox5StakerKey, Pox5StakerKey];
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Build the canonical PoX-5 P2WSH descriptor. The post-CLTV and early-exit
|
|
14
|
+
* paths share BitGo's standard 2-of-3 compressed-key multisig tail.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createPox5LockupDescriptor(params: Pox5LockupDescriptorParams): Descriptor;
|
|
17
|
+
/** Compile the PoX-5 P2WSH scriptPubKey at a BIP32 derivation index. */
|
|
18
|
+
export declare function createPox5LockupScriptPubKey(params: Pox5LockupDescriptorParams, derivationIndex?: number): Buffer;
|
|
19
|
+
/** Derive the compressed staker keys needed to prepare a witness at an index. */
|
|
20
|
+
export declare function derivePox5StakerKeys(stakerKeys: [BIP32Interface, BIP32Interface, BIP32Interface], index: number): [Buffer, Buffer, Buffer];
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=descriptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../../../src/pox5/descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE1D,KAAK,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;AAE3C,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,MAAM,CAAC;AAEpD,MAAM,MAAM,0BAA0B,GAAG;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,UAAU,EAAE,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;CAC3D,CAAC;AA0CF;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,0BAA0B,GAAG,UAAU,CAqBzF;AAED,wEAAwE;AACxE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,0BAA0B,EAAE,eAAe,SAAI,GAAG,MAAM,CAM5G;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC,EAC5D,KAAK,EAAE,MAAM,GACZ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAG1B"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createPox5LockupDescriptor = createPox5LockupDescriptor;
|
|
4
|
+
exports.createPox5LockupScriptPubKey = createPox5LockupScriptPubKey;
|
|
5
|
+
exports.derivePox5StakerKeys = derivePox5StakerKeys;
|
|
6
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
7
|
+
function validateCompressedKey(key, field) {
|
|
8
|
+
if (key.length !== 33 || (key[0] !== 0x02 && key[0] !== 0x03)) {
|
|
9
|
+
throw new Error(`${field} must be a 33-byte compressed public key`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function isBip32Triple(keys) {
|
|
13
|
+
return keys.every((key) => !Buffer.isBuffer(key));
|
|
14
|
+
}
|
|
15
|
+
function asDescriptorKey(key, field) {
|
|
16
|
+
if (Buffer.isBuffer(key)) {
|
|
17
|
+
validateCompressedKey(key, field);
|
|
18
|
+
return key.toString('hex');
|
|
19
|
+
}
|
|
20
|
+
return key.neutered().toBase58() + '/*';
|
|
21
|
+
}
|
|
22
|
+
function validateParams(params) {
|
|
23
|
+
if (!Number.isSafeInteger(params.unlockHeight) || params.unlockHeight <= 0 || params.unlockHeight >= 500000000) {
|
|
24
|
+
throw new Error(`unlockHeight (${params.unlockHeight}) must be a positive block height below 500000000`);
|
|
25
|
+
}
|
|
26
|
+
if (params.stakerCommitment.length !== 32) {
|
|
27
|
+
throw new Error(`stakerCommitment must be 32 bytes (got ${params.stakerCommitment.length})`);
|
|
28
|
+
}
|
|
29
|
+
validateCompressedKey(params.earlyExitKey, 'earlyExitKey');
|
|
30
|
+
const bufferCount = params.stakerKeys.filter(Buffer.isBuffer).length;
|
|
31
|
+
if (bufferCount !== 0 && bufferCount !== params.stakerKeys.length) {
|
|
32
|
+
throw new Error('stakerKeys must contain either three BIP32 keys or three compressed public keys');
|
|
33
|
+
}
|
|
34
|
+
params.stakerKeys.forEach((key, index) => {
|
|
35
|
+
if (Buffer.isBuffer(key)) {
|
|
36
|
+
validateCompressedKey(key, `stakerKeys[${index}]`);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build the canonical PoX-5 P2WSH descriptor. The post-CLTV and early-exit
|
|
42
|
+
* paths share BitGo's standard 2-of-3 compressed-key multisig tail.
|
|
43
|
+
*/
|
|
44
|
+
function createPox5LockupDescriptor(params) {
|
|
45
|
+
validateParams(params);
|
|
46
|
+
const stakerKeys = params.stakerKeys.map((key, index) => asDescriptorKey(key, `stakerKeys[${index}]`));
|
|
47
|
+
const miniscript = {
|
|
48
|
+
and_v: [
|
|
49
|
+
{
|
|
50
|
+
'v:or_i': [
|
|
51
|
+
{ after: params.unlockHeight },
|
|
52
|
+
{
|
|
53
|
+
and_v: [
|
|
54
|
+
{ 'v:sha256': params.stakerCommitment.toString('hex') },
|
|
55
|
+
{ pk: params.earlyExitKey.toString('hex') },
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
{ multi: [2, ...stakerKeys] },
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
const descriptorString = wasm_utxo_1.ast.formatNode({ wsh: miniscript });
|
|
64
|
+
return wasm_utxo_1.Descriptor.fromString(descriptorString, isBip32Triple(params.stakerKeys) ? 'derivable' : 'definite');
|
|
65
|
+
}
|
|
66
|
+
/** Compile the PoX-5 P2WSH scriptPubKey at a BIP32 derivation index. */
|
|
67
|
+
function createPox5LockupScriptPubKey(params, derivationIndex = 0) {
|
|
68
|
+
const descriptor = createPox5LockupDescriptor(params);
|
|
69
|
+
if (isBip32Triple(params.stakerKeys)) {
|
|
70
|
+
return Buffer.from(descriptor.atDerivationIndex(derivationIndex).scriptPubkey());
|
|
71
|
+
}
|
|
72
|
+
return Buffer.from(descriptor.scriptPubkey());
|
|
73
|
+
}
|
|
74
|
+
/** Derive the compressed staker keys needed to prepare a witness at an index. */
|
|
75
|
+
function derivePox5StakerKeys(stakerKeys, index) {
|
|
76
|
+
const keys = stakerKeys.map((key) => Buffer.from(key.derive(index).publicKey));
|
|
77
|
+
return [keys[0], keys[1], keys[2]];
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wb3g1L2Rlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEyREEsZ0VBcUJDO0FBR0Qsb0VBTUM7QUFHRCxvREFNQztBQWxHRCxnREFBMEQ7QUFlMUQsU0FBUyxxQkFBcUIsQ0FBQyxHQUFXLEVBQUUsS0FBYTtJQUN2RCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM5RCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSywwQ0FBMEMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQ3BCLElBQThDO0lBRTlDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEdBQWtCLEVBQUUsS0FBYTtJQUN4RCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN6QixxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEMsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDMUMsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLE1BQWtDO0lBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxNQUFN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LE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7QUFDaEQsQ0FBQztBQUVELGlGQUFpRjtBQUNqRixTQUFnQixvQkFBb0IsQ0FDbEMsVUFBNEQsRUFDNUQsS0FBYTtJQUViLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQy9FLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3QsIGJpcDMyLCBEZXNjcmlwdG9yIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbnR5cGUgQklQMzJJbnRlcmZhY2UgPSBiaXAzMi5CSVAzMkludGVyZmFjZTtcblxuZXhwb3J0IHR5cGUgUG94NVN0YWtlcktleSA9IEJJUDMySW50ZXJmYWNlIHwgQnVmZmVyO1xuXG5leHBvcnQgdHlwZSBQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtcyA9IHtcbiAgdW5sb2NrSGVpZ2h0OiBudW1iZXI7XG4gIC8qKiBzaGEyNTYoc2hhMjU2KENsYXJpdHkgY29uc2Vuc3VzIHByaW5jaXBhbCBieXRlcykpLiAqL1xuICBzdGFrZXJDb21taXRtZW50OiBCdWZmZXI7XG4gIGVhcmx5RXhpdEtleTogQnVmZmVyO1xuICAvKiogVXNlciwgYmFja3VwLCBhbmQgQml0R28ga2V5cywgYWxsIEJJUDMyIG9yIGFsbCBjb25jcmV0ZSBjb21wcmVzc2VkIGtleXMuICovXG4gIHN0YWtlcktleXM6IFtQb3g1U3Rha2VyS2V5LCBQb3g1U3Rha2VyS2V5LCBQb3g1U3Rha2VyS2V5XTtcbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ29tcHJlc3NlZEtleShrZXk6IEJ1ZmZlciwgZmllbGQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoa2V5Lmxlbmd0aCAhPT0gMzMgfHwgKGtleVswXSAhPT0gMHgwMiAmJiBrZXlbMF0gIT09IDB4MDMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2ZpZWxkfSBtdXN0IGJlIGEgMzMtYnl0ZSBjb21wcmVzc2VkIHB1YmxpYyBrZXlgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0JpcDMyVHJpcGxlKFxuICBrZXlzOiBQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtc1snc3Rha2VyS2V5cyddXG4pOiBrZXlzIGlzIFtCSVAzMkludGVyZmFjZSwgQklQMzJJbnRlcmZhY2UsIEJJUDMySW50ZXJmYWNlXSB7XG4gIHJldHVybiBrZXlzLmV2ZXJ5KChrZXkpID0+ICFCdWZmZXIuaXNCdWZmZXIoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIGFzRGVzY3JpcHRvcktleShrZXk6IFBveDVTdGFrZXJLZXksIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGtleSkpIHtcbiAgICB2YWxpZGF0ZUNvbXByZXNzZWRLZXkoa2V5LCBmaWVsZCk7XG4gICAgcmV0dXJuIGtleS50b1N0cmluZygnaGV4Jyk7XG4gIH1cbiAgcmV0dXJuIGtleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgKyAnLyonO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVBhcmFtcyhwYXJhbXM6IFBveDVMb2NrdXBEZXNjcmlwdG9yUGFyYW1zKTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIocGFyYW1zLnVubG9ja0hlaWdodCkgfHwgcGFyYW1zLnVubG9ja0hlaWdodCA8PSAwIHx8IHBhcmFtcy51bmxvY2tIZWlnaHQgPj0gNTAwXzAwMF8wMDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVubG9ja0hlaWdodCAoJHtwYXJhbXMudW5sb2NrSGVpZ2h0fSkgbXVzdCBiZSBhIHBvc2l0aXZlIGJsb2NrIGhlaWdodCBiZWxvdyA1MDAwMDAwMDBgKTtcbiAgfVxuICBpZiAocGFyYW1zLnN0YWtlckNvbW1pdG1lbnQubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgc3Rha2VyQ29tbWl0bWVudCBtdXN0IGJlIDMyIGJ5dGVzIChnb3QgJHtwYXJhbXMuc3Rha2VyQ29tbWl0bWVudC5sZW5ndGh9KWApO1xuICB9XG4gIHZhbGlkYXRlQ29tcHJlc3NlZEtleShwYXJhbXMuZWFybHlFeGl0S2V5LCAnZWFybHlFeGl0S2V5Jyk7XG5cbiAgY29uc3QgYnVmZmVyQ291bnQgPSBwYXJhbXMuc3Rha2VyS2V5cy5maWx0ZXIoQnVmZmVyLmlzQnVmZmVyKS5sZW5ndGg7XG4gIGlmIChidWZmZXJDb3VudCAhPT0gMCAmJiBidWZmZXJDb3VudCAhPT0gcGFyYW1zLnN0YWtlcktleXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzdGFrZXJLZXlzIG11c3QgY29udGFpbiBlaXRoZXIgdGhyZWUgQklQMzIga2V5cyBvciB0aHJlZSBjb21wcmVzc2VkIHB1YmxpYyBrZXlzJyk7XG4gIH1cbiAgcGFyYW1zLnN0YWtlcktleXMuZm9yRWFjaCgoa2V5LCBpbmRleCkgPT4ge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgICAgdmFsaWRhdGVDb21wcmVzc2VkS2V5KGtleSwgYHN0YWtlcktleXNbJHtpbmRleH1dYCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgY2Fub25pY2FsIFBvWC01IFAyV1NIIGRlc2NyaXB0b3IuIFRoZSBwb3N0LUNMVFYgYW5kIGVhcmx5LWV4aXRcbiAqIHBhdGhzIHNoYXJlIEJpdEdvJ3Mgc3RhbmRhcmQgMi1vZi0zIGNvbXByZXNzZWQta2V5IG11bHRpc2lnIHRhaWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcihwYXJhbXM6IFBveDVMb2NrdXBEZXNjcmlwdG9yUGFyYW1zKTogRGVzY3JpcHRvciB7XG4gIHZhbGlkYXRlUGFyYW1zKHBhcmFtcyk7XG4gIGNvbnN0IHN0YWtlcktleXMgPSBwYXJhbXMuc3Rha2VyS2V5cy5tYXAoKGtleSwgaW5kZXgpID0+IGFzRGVzY3JpcHRvcktleShrZXksIGBzdGFrZXJLZXlzWyR7aW5kZXh9XWApKTtcbiAgY29uc3QgbWluaXNjcmlwdDogYXN0Lk1pbmlzY3JpcHROb2RlID0ge1xuICAgIGFuZF92OiBbXG4gICAgICB7XG4gICAgICAgICd2Om9yX2knOiBbXG4gICAgICAgICAgeyBhZnRlcjogcGFyYW1zLnVubG9ja0hlaWdodCB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFuZF92OiBbXG4gICAgICAgICAgICAgIHsgJ3Y6c2hhMjU2JzogcGFyYW1zLnN0YWtlckNvbW1pdG1lbnQudG9TdHJpbmcoJ2hleCcpIH0sXG4gICAgICAgICAgICAgIHsgcGs6IHBhcmFtcy5lYXJseUV4aXRLZXkudG9TdHJpbmcoJ2hleCcpIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgeyBtdWx0aTogWzIsIC4uLnN0YWtlcktleXNdIH0sXG4gICAgXSxcbiAgfTtcbiAgY29uc3QgZGVzY3JpcHRvclN0cmluZyA9IGFzdC5mb3JtYXROb2RlKHsgd3NoOiBtaW5pc2NyaXB0IH0pO1xuICByZXR1cm4gRGVzY3JpcHRvci5mcm9tU3RyaW5nKGRlc2NyaXB0b3JTdHJpbmcsIGlzQmlwMzJUcmlwbGUocGFyYW1zLnN0YWtlcktleXMpID8gJ2Rlcml2YWJsZScgOiAnZGVmaW5pdGUnKTtcbn1cblxuLyoqIENvbXBpbGUgdGhlIFBvWC01IFAyV1NIIHNjcmlwdFB1YktleSBhdCBhIEJJUDMyIGRlcml2YXRpb24gaW5kZXguICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUG94NUxvY2t1cFNjcmlwdFB1YktleShwYXJhbXM6IFBveDVMb2NrdXBEZXNjcmlwdG9yUGFyYW1zLCBkZXJpdmF0aW9uSW5kZXggPSAwKTogQnVmZmVyIHtcbiAgY29uc3QgZGVzY3JpcHRvciA9IGNyZWF0ZVBveDVMb2NrdXBEZXNjcmlwdG9yKHBhcmFtcyk7XG4gIGlmIChpc0JpcDMyVHJpcGxlKHBhcmFtcy5zdGFrZXJLZXlzKSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShkZXNjcmlwdG9yLmF0RGVyaXZhdGlvbkluZGV4KGRlcml2YXRpb25JbmRleCkuc2NyaXB0UHVia2V5KCkpO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbShkZXNjcmlwdG9yLnNjcmlwdFB1YmtleSgpKTtcbn1cblxuLyoqIERlcml2ZSB0aGUgY29tcHJlc3NlZCBzdGFrZXIga2V5cyBuZWVkZWQgdG8gcHJlcGFyZSBhIHdpdG5lc3MgYXQgYW4gaW5kZXguICovXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlUG94NVN0YWtlcktleXMoXG4gIHN0YWtlcktleXM6IFtCSVAzMkludGVyZmFjZSwgQklQMzJJbnRlcmZhY2UsIEJJUDMySW50ZXJmYWNlXSxcbiAgaW5kZXg6IG51bWJlclxuKTogW0J1ZmZlciwgQnVmZmVyLCBCdWZmZXJdIHtcbiAgY29uc3Qga2V5cyA9IHN0YWtlcktleXMubWFwKChrZXkpID0+IEJ1ZmZlci5mcm9tKGtleS5kZXJpdmUoaW5kZXgpLnB1YmxpY0tleSkpO1xuICByZXR1cm4gW2tleXNbMF0sIGtleXNbMV0sIGtleXNbMl1dO1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/pox5/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./descriptor"), exports);
|
|
18
|
+
__exportStar(require("./parseDescriptor"), exports);
|
|
19
|
+
__exportStar(require("./input"), exports);
|
|
20
|
+
__exportStar(require("./validation"), exports);
|
|
21
|
+
__exportStar(require("./recovery"), exports);
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcG94NS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQTZCO0FBQzdCLG9EQUFrQztBQUNsQywwQ0FBd0I7QUFDeEIsK0NBQTZCO0FBQzdCLDZDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZGVzY3JpcHRvcic7XG5leHBvcnQgKiBmcm9tICcuL3BhcnNlRGVzY3JpcHRvcic7XG5leHBvcnQgKiBmcm9tICcuL2lucHV0JztcbmV4cG9ydCAqIGZyb20gJy4vdmFsaWRhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3JlY292ZXJ5JztcbiJdfQ==
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Descriptor, Psbt, descriptorWallet } from '@bitgo/wasm-utxo';
|
|
2
|
+
import { Pox5DescriptorInfo } from './parseDescriptor';
|
|
3
|
+
type ResolvedPox5DescriptorInfo = Pox5DescriptorInfo & {
|
|
4
|
+
stakerKeys: [Buffer, Buffer, Buffer];
|
|
5
|
+
};
|
|
6
|
+
export type Pox5DescriptorMatch = {
|
|
7
|
+
/** The concrete descriptor whose script matches the input. */
|
|
8
|
+
descriptor: Descriptor;
|
|
9
|
+
/** The derivation index used for a wildcard descriptor, if any. */
|
|
10
|
+
index: number | undefined;
|
|
11
|
+
info: ResolvedPox5DescriptorInfo;
|
|
12
|
+
};
|
|
13
|
+
/** A canonical PoX-5 descriptor match bound to a native PSBT input. */
|
|
14
|
+
export type Pox5InputMatch = Pox5DescriptorMatch & {
|
|
15
|
+
inputIndex: number;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Find and parse a canonical PoX-5 descriptor for a native PSBT input projection.
|
|
19
|
+
*
|
|
20
|
+
* Foreign root derivations are ignored by the shared native descriptor matcher. A
|
|
21
|
+
* match is returned only when all three staker keys can be resolved at the matched
|
|
22
|
+
* descriptor index.
|
|
23
|
+
*/
|
|
24
|
+
export declare function findPox5DescriptorForInput(input: descriptorWallet.PsbtInput, descriptors: descriptorWallet.DescriptorMap): Pox5DescriptorMatch | undefined;
|
|
25
|
+
/** Find and parse a canonical PoX-5 descriptor for one native PSBT input. */
|
|
26
|
+
export declare function matchPox5Input(psbt: Psbt, inputIndex: number, descriptors: descriptorWallet.DescriptorMap): Pox5InputMatch | undefined;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../../src/pox5/input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEtE,OAAO,EAAE,kBAAkB,EAA6B,MAAM,mBAAmB,CAAC;AAElF,KAAK,0BAA0B,GAAG,kBAAkB,GAAG;IACrD,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,8DAA8D;IAC9D,UAAU,EAAE,UAAU,CAAC;IACvB,mEAAmE;IACnE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,EAAE,0BAA0B,CAAC;CAClC,CAAC;AAEF,uEAAuE;AACvE,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG;IACjD,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAMF;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,gBAAgB,CAAC,SAAS,EACjC,WAAW,EAAE,gBAAgB,CAAC,aAAa,GAC1C,mBAAmB,GAAG,SAAS,CAsBjC;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAC5B,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,gBAAgB,CAAC,aAAa,GAC1C,cAAc,GAAG,SAAS,CAI5B"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findPox5DescriptorForInput = findPox5DescriptorForInput;
|
|
4
|
+
exports.matchPox5Input = matchPox5Input;
|
|
5
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
6
|
+
const parseDescriptor_1 = require("./parseDescriptor");
|
|
7
|
+
function getConcreteDescriptor(descriptor, index) {
|
|
8
|
+
return index === undefined ? descriptor : descriptor.atDerivationIndex(index);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Find and parse a canonical PoX-5 descriptor for a native PSBT input projection.
|
|
12
|
+
*
|
|
13
|
+
* Foreign root derivations are ignored by the shared native descriptor matcher. A
|
|
14
|
+
* match is returned only when all three staker keys can be resolved at the matched
|
|
15
|
+
* descriptor index.
|
|
16
|
+
*/
|
|
17
|
+
function findPox5DescriptorForInput(input, descriptors) {
|
|
18
|
+
try {
|
|
19
|
+
const matched = wasm_utxo_1.descriptorWallet.findDescriptorForInput(input, descriptors);
|
|
20
|
+
if (!matched) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const descriptor = getConcreteDescriptor(matched.descriptor, matched.index);
|
|
24
|
+
const info = (0, parseDescriptor_1.parsePox5LockupDescriptor)(descriptor);
|
|
25
|
+
if (!info?.stakerKeys) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
descriptor,
|
|
30
|
+
index: matched.index,
|
|
31
|
+
info: {
|
|
32
|
+
...info,
|
|
33
|
+
stakerKeys: info.stakerKeys,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Find and parse a canonical PoX-5 descriptor for one native PSBT input. */
|
|
42
|
+
function matchPox5Input(psbt, inputIndex, descriptors) {
|
|
43
|
+
const input = psbt.getInputs()[inputIndex];
|
|
44
|
+
const match = input ? findPox5DescriptorForInput(input, descriptors) : undefined;
|
|
45
|
+
return match ? { ...match, inputIndex } : undefined;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcG94NS9pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWdDQSxnRUF5QkM7QUFHRCx3Q0FRQztBQXBFRCxnREFBc0U7QUFFdEUsdURBQWtGO0FBbUJsRixTQUFTLHFCQUFxQixDQUFDLFVBQXNCLEVBQUUsS0FBeUI7SUFDOUUsT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoRixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQ3hDLEtBQWlDLEVBQ2pDLFdBQTJDO0lBRTNDLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLDRCQUFnQixDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUUsTUFBTSxJQUFJLEdBQUcsSUFBQSwyQ0FBeUIsRUFBQyxVQUFVLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPO1lBQ0wsVUFBVTtZQUNWLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztZQUNwQixJQUFJLEVBQUU7Z0JBQ0osR0FBRyxJQUFJO2dCQUNQLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTthQUM1QjtTQUNGLENBQUM7SUFDSixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsU0FBZ0IsY0FBYyxDQUM1QixJQUFVLEVBQ1YsVUFBa0IsRUFDbEIsV0FBMkM7SUFFM0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDakYsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN0RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzY3JpcHRvciwgUHNidCwgZGVzY3JpcHRvcldhbGxldCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG5pbXBvcnQgeyBQb3g1RGVzY3JpcHRvckluZm8sIHBhcnNlUG94NUxvY2t1cERlc2NyaXB0b3IgfSBmcm9tICcuL3BhcnNlRGVzY3JpcHRvcic7XG5cbnR5cGUgUmVzb2x2ZWRQb3g1RGVzY3JpcHRvckluZm8gPSBQb3g1RGVzY3JpcHRvckluZm8gJiB7XG4gIHN0YWtlcktleXM6IFtCdWZmZXIsIEJ1ZmZlciwgQnVmZmVyXTtcbn07XG5cbmV4cG9ydCB0eXBlIFBveDVEZXNjcmlwdG9yTWF0Y2ggPSB7XG4gIC8qKiBUaGUgY29uY3JldGUgZGVzY3JpcHRvciB3aG9zZSBzY3JpcHQgbWF0Y2hlcyB0aGUgaW5wdXQuICovXG4gIGRlc2NyaXB0b3I6IERlc2NyaXB0b3I7XG4gIC8qKiBUaGUgZGVyaXZhdGlvbiBpbmRleCB1c2VkIGZvciBhIHdpbGRjYXJkIGRlc2NyaXB0b3IsIGlmIGFueS4gKi9cbiAgaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgaW5mbzogUmVzb2x2ZWRQb3g1RGVzY3JpcHRvckluZm87XG59O1xuXG4vKiogQSBjYW5vbmljYWwgUG9YLTUgZGVzY3JpcHRvciBtYXRjaCBib3VuZCB0byBhIG5hdGl2ZSBQU0JUIGlucHV0LiAqL1xuZXhwb3J0IHR5cGUgUG94NUlucHV0TWF0Y2ggPSBQb3g1RGVzY3JpcHRvck1hdGNoICYge1xuICBpbnB1dEluZGV4OiBudW1iZXI7XG59O1xuXG5mdW5jdGlvbiBnZXRDb25jcmV0ZURlc2NyaXB0b3IoZGVzY3JpcHRvcjogRGVzY3JpcHRvciwgaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCk6IERlc2NyaXB0b3Ige1xuICByZXR1cm4gaW5kZXggPT09IHVuZGVmaW5lZCA/IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9yLmF0RGVyaXZhdGlvbkluZGV4KGluZGV4KTtcbn1cblxuLyoqXG4gKiBGaW5kIGFuZCBwYXJzZSBhIGNhbm9uaWNhbCBQb1gtNSBkZXNjcmlwdG9yIGZvciBhIG5hdGl2ZSBQU0JUIGlucHV0IHByb2plY3Rpb24uXG4gKlxuICogRm9yZWlnbiByb290IGRlcml2YXRpb25zIGFyZSBpZ25vcmVkIGJ5IHRoZSBzaGFyZWQgbmF0aXZlIGRlc2NyaXB0b3IgbWF0Y2hlci4gQVxuICogbWF0Y2ggaXMgcmV0dXJuZWQgb25seSB3aGVuIGFsbCB0aHJlZSBzdGFrZXIga2V5cyBjYW4gYmUgcmVzb2x2ZWQgYXQgdGhlIG1hdGNoZWRcbiAqIGRlc2NyaXB0b3IgaW5kZXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUG94NURlc2NyaXB0b3JGb3JJbnB1dChcbiAgaW5wdXQ6IGRlc2NyaXB0b3JXYWxsZXQuUHNidElucHV0LFxuICBkZXNjcmlwdG9yczogZGVzY3JpcHRvcldhbGxldC5EZXNjcmlwdG9yTWFwXG4pOiBQb3g1RGVzY3JpcHRvck1hdGNoIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtYXRjaGVkID0gZGVzY3JpcHRvcldhbGxldC5maW5kRGVzY3JpcHRvckZvcklucHV0KGlucHV0LCBkZXNjcmlwdG9ycyk7XG4gICAgaWYgKCFtYXRjaGVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBkZXNjcmlwdG9yID0gZ2V0Q29uY3JldGVEZXNjcmlwdG9yKG1hdGNoZWQuZGVzY3JpcHRvciwgbWF0Y2hlZC5pbmRleCk7XG4gICAgY29uc3QgaW5mbyA9IHBhcnNlUG94NUxvY2t1cERlc2NyaXB0b3IoZGVzY3JpcHRvcik7XG4gICAgaWYgKCFpbmZvPy5zdGFrZXJLZXlzKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZGVzY3JpcHRvcixcbiAgICAgIGluZGV4OiBtYXRjaGVkLmluZGV4LFxuICAgICAgaW5mbzoge1xuICAgICAgICAuLi5pbmZvLFxuICAgICAgICBzdGFrZXJLZXlzOiBpbmZvLnN0YWtlcktleXMsXG4gICAgICB9LFxuICAgIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqIEZpbmQgYW5kIHBhcnNlIGEgY2Fub25pY2FsIFBvWC01IGRlc2NyaXB0b3IgZm9yIG9uZSBuYXRpdmUgUFNCVCBpbnB1dC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaFBveDVJbnB1dChcbiAgcHNidDogUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyLFxuICBkZXNjcmlwdG9yczogZGVzY3JpcHRvcldhbGxldC5EZXNjcmlwdG9yTWFwXG4pOiBQb3g1SW5wdXRNYXRjaCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGlucHV0ID0gcHNidC5nZXRJbnB1dHMoKVtpbnB1dEluZGV4XTtcbiAgY29uc3QgbWF0Y2ggPSBpbnB1dCA/IGZpbmRQb3g1RGVzY3JpcHRvckZvcklucHV0KGlucHV0LCBkZXNjcmlwdG9ycykgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBtYXRjaCA/IHsgLi4ubWF0Y2gsIGlucHV0SW5kZXggfSA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Descriptor, ast } from '@bitgo/wasm-utxo';
|
|
2
|
+
export type Pox5DescriptorInfo = {
|
|
3
|
+
unlockHeight: number;
|
|
4
|
+
stakerCommitment: Buffer;
|
|
5
|
+
earlyExitKey: Buffer;
|
|
6
|
+
stakerKeyStrings: [string, string, string];
|
|
7
|
+
stakerKeys: [Buffer, Buffer, Buffer] | undefined;
|
|
8
|
+
miniscriptNode: ast.MiniscriptNode;
|
|
9
|
+
};
|
|
10
|
+
/** @deprecated Use Pox5DescriptorInfo instead. */
|
|
11
|
+
export type ParsedPox5LockupDescriptor = Pox5DescriptorInfo;
|
|
12
|
+
/**
|
|
13
|
+
* Parse only the canonical PoX-5 descriptor template. Other descriptors return
|
|
14
|
+
* undefined; malformed fields within the template throw so callers cannot finalize
|
|
15
|
+
* a script under an ambiguous policy.
|
|
16
|
+
*/
|
|
17
|
+
export declare function parsePox5LockupDescriptor(descriptor: Descriptor | ast.DescriptorNode): Pox5DescriptorInfo | undefined;
|
|
18
|
+
/** Serialize the canonical 2-of-3 staker subscript for a concrete PoX-5 descriptor. */
|
|
19
|
+
export declare function getPox5UnlockBytes(descriptor: Descriptor): Buffer;
|
|
20
|
+
//# sourceMappingURL=parseDescriptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseDescriptor.d.ts","sourceRoot":"","sources":["../../../../src/pox5/parseDescriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,UAAU,EAAE,GAAG,EAAoB,MAAM,kBAAkB,CAAC;AAI5E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACjD,cAAc,EAAE,GAAG,CAAC,cAAc,CAAC;CACpC,CAAC;AAEF,kDAAkD;AAClD,MAAM,MAAM,0BAA0B,GAAG,kBAAkB,CAAC;AA2C5D;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,UAAU,GAAG,GAAG,CAAC,cAAc,GAAG,kBAAkB,GAAG,SAAS,CAmDrH;AAED,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAiBjE"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parsePox5LockupDescriptor = parsePox5LockupDescriptor;
|
|
4
|
+
exports.getPox5UnlockBytes = getPox5UnlockBytes;
|
|
5
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
6
|
+
const COMPRESSED_KEY = /^(02|03)[0-9a-fA-F]{64}$/;
|
|
7
|
+
const XPUB_WITH_INDEX = /^([1-9A-HJ-NP-Za-km-z]+)\/(\d+)$/;
|
|
8
|
+
function asNumber(value, field) {
|
|
9
|
+
if (typeof value !== 'number') {
|
|
10
|
+
throw new Error(`${field} must be a number`);
|
|
11
|
+
}
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
function asString(value, field) {
|
|
15
|
+
if (typeof value !== 'string') {
|
|
16
|
+
throw new Error(`${field} must be a string`);
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
function parseCompressedKey(value, field) {
|
|
21
|
+
if (!COMPRESSED_KEY.test(value)) {
|
|
22
|
+
throw new Error(`${field} must be a compressed public key`);
|
|
23
|
+
}
|
|
24
|
+
return Buffer.from(value, 'hex');
|
|
25
|
+
}
|
|
26
|
+
function resolveStakerKey(value) {
|
|
27
|
+
if (COMPRESSED_KEY.test(value)) {
|
|
28
|
+
return Buffer.from(value, 'hex');
|
|
29
|
+
}
|
|
30
|
+
const match = value.match(XPUB_WITH_INDEX);
|
|
31
|
+
if (!match) {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
const [, xpub, indexString] = match;
|
|
35
|
+
const index = Number.parseInt(indexString, 10);
|
|
36
|
+
try {
|
|
37
|
+
return Buffer.from(wasm_utxo_1.BIP32.fromBase58(xpub).derive(index).publicKey);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Parse only the canonical PoX-5 descriptor template. Other descriptors return
|
|
45
|
+
* undefined; malformed fields within the template throw so callers cannot finalize
|
|
46
|
+
* a script under an ambiguous policy.
|
|
47
|
+
*/
|
|
48
|
+
function parsePox5LockupDescriptor(descriptor) {
|
|
49
|
+
const matcher = new wasm_utxo_1.descriptorWallet.PatternMatcher();
|
|
50
|
+
const descriptorNode = descriptor instanceof wasm_utxo_1.Descriptor ? wasm_utxo_1.ast.fromDescriptor(descriptor) : descriptor;
|
|
51
|
+
const matched = matcher.match(descriptorNode, { wsh: { $var: 'miniscript' } });
|
|
52
|
+
if (!matched) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
const miniscriptNode = matched.miniscript;
|
|
56
|
+
const pattern = {
|
|
57
|
+
and_v: [
|
|
58
|
+
{
|
|
59
|
+
'v:or_i': [
|
|
60
|
+
{ after: { $var: 'unlockHeight' } },
|
|
61
|
+
{ and_v: [{ 'v:sha256': { $var: 'stakerCommitment' } }, { pk: { $var: 'earlyExitKey' } }] },
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
{ multi: { $var: 'stakerMulti' } },
|
|
65
|
+
],
|
|
66
|
+
};
|
|
67
|
+
const fields = matcher.match(miniscriptNode, pattern);
|
|
68
|
+
if (!fields) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
const unlockHeight = asNumber(fields.unlockHeight, 'after argument');
|
|
72
|
+
if (!Number.isSafeInteger(unlockHeight) || unlockHeight <= 0 || unlockHeight >= 500000000) {
|
|
73
|
+
throw new Error(`unlockHeight (${unlockHeight}) must be a positive block height below 500000000`);
|
|
74
|
+
}
|
|
75
|
+
const commitmentHex = asString(fields.stakerCommitment, 'sha256 commitment');
|
|
76
|
+
if (!/^[0-9a-fA-F]{64}$/.test(commitmentHex)) {
|
|
77
|
+
throw new Error('stakerCommitment must be 32 bytes');
|
|
78
|
+
}
|
|
79
|
+
const earlyExitKey = parseCompressedKey(asString(fields.earlyExitKey, 'early exit key'), 'earlyExitKey');
|
|
80
|
+
if (!Array.isArray(fields.stakerMulti) || fields.stakerMulti.length !== 4 || fields.stakerMulti[0] !== 2) {
|
|
81
|
+
throw new Error('staker multi must be a 2-of-3 multisig');
|
|
82
|
+
}
|
|
83
|
+
const stakerKeyStrings = fields.stakerMulti.slice(1).map((key, index) => asString(key, `staker key ${index}`));
|
|
84
|
+
const resolvedKeys = stakerKeyStrings.map(resolveStakerKey);
|
|
85
|
+
return {
|
|
86
|
+
unlockHeight,
|
|
87
|
+
stakerCommitment: Buffer.from(commitmentHex, 'hex'),
|
|
88
|
+
earlyExitKey,
|
|
89
|
+
stakerKeyStrings: [stakerKeyStrings[0], stakerKeyStrings[1], stakerKeyStrings[2]],
|
|
90
|
+
stakerKeys: resolvedKeys.every((key) => key !== undefined)
|
|
91
|
+
? [resolvedKeys[0], resolvedKeys[1], resolvedKeys[2]]
|
|
92
|
+
: undefined,
|
|
93
|
+
miniscriptNode,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** Serialize the canonical 2-of-3 staker subscript for a concrete PoX-5 descriptor. */
|
|
97
|
+
function getPox5UnlockBytes(descriptor) {
|
|
98
|
+
const parsed = parsePox5LockupDescriptor(descriptor);
|
|
99
|
+
if (!parsed) {
|
|
100
|
+
throw new Error('Descriptor is not a canonical PoX-5 lockup descriptor');
|
|
101
|
+
}
|
|
102
|
+
if (!parsed.stakerKeys) {
|
|
103
|
+
throw new Error('PoX-5 descriptor keys must be concrete before deriving unlockBytes');
|
|
104
|
+
}
|
|
105
|
+
const keyPushes = parsed.stakerKeys.map((key, index) => {
|
|
106
|
+
if (key.length !== 33 || (key[0] !== 0x02 && key[0] !== 0x03)) {
|
|
107
|
+
throw new Error(`PoX-5 staker key ${index} must be a 33-byte compressed public key`);
|
|
108
|
+
}
|
|
109
|
+
return Buffer.concat([Buffer.of(key.length), key]);
|
|
110
|
+
});
|
|
111
|
+
return Buffer.concat([Buffer.of(0x52), ...keyPushes, Buffer.of(0x53, 0xae)]);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VEZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BveDUvcGFyc2VEZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBOERBLDhEQW1EQztBQUdELGdEQWlCQztBQXJJRCxnREFBNEU7QUFnQjVFLE1BQU0sY0FBYyxHQUFHLDBCQUEwQixDQUFDO0FBQ2xELE1BQU0sZUFBZSxHQUFHLGtDQUFrQyxDQUFDO0FBRTNELFNBQVMsUUFBUSxDQUFDLEtBQWMsRUFBRSxLQUFhO0lBQzdDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssbUJBQW1CLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBYyxFQUFFLEtBQWE7SUFDN0MsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQ3RELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssa0NBQWtDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFhO0lBQ3JDLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLE9BQU8sTUFBTSxD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QUFDdkYsU0FBZ0Isa0JBQWtCLENBQUMsVUFBc0I7SUFDdkQsTUFBTSxNQUFNLEdBQUcseUJBQXlCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0VBQW9FLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDckQsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDOUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsS0FBSywwQ0FBMEMsQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLFNBQVMsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJJUDMyLCBEZXNjcmlwdG9yLCBhc3QsIGRlc2NyaXB0b3JXYWxsZXQgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcblxudHlwZSBQYXR0ZXJuID0gZGVzY3JpcHRvcldhbGxldC5QYXR0ZXJuO1xuXG5leHBvcnQgdHlwZSBQb3g1RGVzY3JpcHRvckluZm8gPSB7XG4gIHVubG9ja0hlaWdodDogbnVtYmVyO1xuICBzdGFrZXJDb21taXRtZW50OiBCdWZmZXI7XG4gIGVhcmx5RXhpdEtleTogQnVmZmVyO1xuICBzdGFrZXJLZXlTdHJpbmdzOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ107XG4gIHN0YWtlcktleXM6IFtCdWZmZXIsIEJ1ZmZlciwgQnVmZmVyXSB8IHVuZGVmaW5lZDtcbiAgbWluaXNjcmlwdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZTtcbn07XG5cbi8qKiBAZGVwcmVjYXRlZCBVc2UgUG94NURlc2NyaXB0b3JJbmZvIGluc3RlYWQuICovXG5leHBvcnQgdHlwZSBQYXJzZWRQb3g1TG9ja3VwRGVzY3JpcHRvciA9IFBveDVEZXNjcmlwdG9ySW5mbztcblxuY29uc3QgQ09NUFJFU1NFRF9LRVkgPSAvXigwMnwwMylbMC05YS1mQS1GXXs2NH0kLztcbmNvbnN0IFhQVUJfV0lUSF9JTkRFWCA9IC9eKFsxLTlBLUhKLU5QLVphLWttLXpdKylcXC8oXFxkKykkLztcblxuZnVuY3Rpb24gYXNOdW1iZXIodmFsdWU6IHVua25vd24sIGZpZWxkOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZH0gbXVzdCBiZSBhIG51bWJlcmApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYXNTdHJpbmcodmFsdWU6IHVua25vd24sIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZH0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gcGFyc2VDb21wcmVzc2VkS2V5KHZhbHVlOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcpOiBCdWZmZXIge1xuICBpZiAoIUNPTVBSRVNTRURfS0VZLnRlc3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2ZpZWxkfSBtdXN0IGJlIGEgY29tcHJlc3NlZCBwdWJsaWMga2V5YCk7XG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlLCAnaGV4Jyk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTdGFrZXJLZXkodmFsdWU6IHN0cmluZyk6IEJ1ZmZlciB8IHVuZGVmaW5lZCB7XG4gIGlmIChDT01QUkVTU0VEX0tFWS50ZXN0KHZhbHVlKSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSwgJ2hleCcpO1xuICB9XG4gIGNvbnN0IG1hdGNoID0gdmFsdWUubWF0Y2goWFBVQl9XSVRIX0lOREVYKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgWywgeHB1YiwgaW5kZXhTdHJpbmddID0gbWF0Y2g7XG4gIGNvbnN0IGluZGV4ID0gTnVtYmVyLnBhcnNlSW50KGluZGV4U3RyaW5nLCAxMCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKEJJUDMyLmZyb21CYXNlNTgoeHB1YikuZGVyaXZlKGluZGV4KS5wdWJsaWNLZXkpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2Ugb25seSB0aGUgY2Fub25pY2FsIFBvWC01IGRlc2NyaXB0b3IgdGVtcGxhdGUuIE90aGVyIGRlc2NyaXB0b3JzIHJldHVyblxuICogdW5kZWZpbmVkOyBtYWxmb3JtZWQgZmllbGRzIHdpdGhpbiB0aGUgdGVtcGxhdGUgdGhyb3cgc28gY2FsbGVycyBjYW5ub3QgZmluYWxpemVcbiAqIGEgc2NyaXB0IHVuZGVyIGFuIGFtYmlndW91cyBwb2xpY3kuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBveDVMb2NrdXBEZXNjcmlwdG9yKGRlc2NyaXB0b3I6IERlc2NyaXB0b3IgfCBhc3QuRGVzY3JpcHRvck5vZGUpOiBQb3g1RGVzY3JpcHRvckluZm8gfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaGVyID0gbmV3IGRlc2NyaXB0b3JXYWxsZXQuUGF0dGVybk1hdGNoZXIoKTtcbiAgY29uc3QgZGVzY3JpcHRvck5vZGUgPSBkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGVzY3JpcHRvciA/IGFzdC5mcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKSA6IGRlc2NyaXB0b3I7XG4gIGNvbnN0IG1hdGNoZWQgPSBtYXRjaGVyLm1hdGNoKGRlc2NyaXB0b3JOb2RlLCB7IHdzaDogeyAkdmFyOiAnbWluaXNjcmlwdCcgfSB9KTtcbiAgaWYgKCFtYXRjaGVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG1pbmlzY3JpcHROb2RlID0gbWF0Y2hlZC5taW5pc2NyaXB0IGFzIGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgY29uc3QgcGF0dGVybjogUGF0dGVybiA9IHtcbiAgICBhbmRfdjogW1xuICAgICAge1xuICAgICAgICAndjpvcl9pJzogW1xuICAgICAgICAgIHsgYWZ0ZXI6IHsgJHZhcjogJ3VubG9ja0hlaWdodCcgfSB9LFxuICAgICAgICAgIHsgYW5kX3Y6IFt7ICd2OnNoYTI1Nic6IHsgJHZhcjogJ3N0YWtlckNvbW1pdG1lbnQnIH0gfSwgeyBwazogeyAkdmFyOiAnZWFybHlFeGl0S2V5JyB9IH1dIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgeyBtdWx0aTogeyAkdmFyOiAnc3Rha2VyTXVsdGknIH0gfSxcbiAgICBdLFxuICB9O1xuICBjb25zdCBmaWVsZHMgPSBtYXRjaGVyLm1hdGNoKG1pbmlzY3JpcHROb2RlLCBwYXR0ZXJuKTtcbiAgaWYgKCFmaWVsZHMpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgdW5sb2NrSGVpZ2h0ID0gYXNOdW1iZXIoZmllbGRzLnVubG9ja0hlaWdodCwgJ2FmdGVyIGFyZ3VtZW50Jyk7XG4gIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIodW5sb2NrSGVpZ2h0KSB8fCB1bmxvY2tIZWlnaHQgPD0gMCB8fCB1bmxvY2tIZWlnaHQgPj0gNTAwXzAwMF8wMDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVubG9ja0hlaWdodCAoJHt1bmxvY2tIZWlnaHR9KSBtdXN0IGJlIGEgcG9zaXRpdmUgYmxvY2sgaGVpZ2h0IGJlbG93IDUwMDAwMDAwMGApO1xuICB9XG4gIGNvbnN0IGNvbW1pdG1lbnRIZXggPSBhc1N0cmluZyhmaWVsZHMuc3Rha2VyQ29tbWl0bWVudCwgJ3NoYTI1NiBjb21taXRtZW50Jyk7XG4gIGlmICghL15bMC05YS1mQS1GXXs2NH0kLy50ZXN0KGNvbW1pdG1lbnRIZXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzdGFrZXJDb21taXRtZW50IG11c3QgYmUgMzIgYnl0ZXMnKTtcbiAgfVxuICBjb25zdCBlYXJseUV4aXRLZXkgPSBwYXJzZUNvbXByZXNzZWRLZXkoYXNTdHJpbmcoZmllbGRzLmVhcmx5RXhpdEtleSwgJ2Vhcmx5IGV4aXQga2V5JyksICdlYXJseUV4aXRLZXknKTtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoZmllbGRzLnN0YWtlck11bHRpKSB8fCBmaWVsZHMuc3Rha2VyTXVsdGkubGVuZ3RoICE9PSA0IHx8IGZpZWxkcy5zdGFrZXJNdWx0aVswXSAhPT0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcignc3Rha2VyIG11bHRpIG11c3QgYmUgYSAyLW9mLTMgbXVsdGlzaWcnKTtcbiAgfVxuICBjb25zdCBzdGFrZXJLZXlTdHJpbmdzID0gZmllbGRzLnN0YWtlck11bHRpLnNsaWNlKDEpLm1hcCgoa2V5LCBpbmRleCkgPT4gYXNTdHJpbmcoa2V5LCBgc3Rha2VyIGtleSAke2luZGV4fWApKTtcbiAgY29uc3QgcmVzb2x2ZWRLZXlzID0gc3Rha2VyS2V5U3RyaW5ncy5tYXAocmVzb2x2ZVN0YWtlcktleSk7XG5cbiAgcmV0dXJuIHtcbiAgICB1bmxvY2tIZWlnaHQsXG4gICAgc3Rha2VyQ29tbWl0bWVudDogQnVmZmVyLmZyb20oY29tbWl0bWVudEhleCwgJ2hleCcpLFxuICAgIGVhcmx5RXhpdEtleSxcbiAgICBzdGFrZXJLZXlTdHJpbmdzOiBbc3Rha2VyS2V5U3RyaW5nc1swXSwgc3Rha2VyS2V5U3RyaW5nc1sxXSwgc3Rha2VyS2V5U3RyaW5nc1syXV0sXG4gICAgc3Rha2VyS2V5czogcmVzb2x2ZWRLZXlzLmV2ZXJ5KChrZXkpOiBrZXkgaXMgQnVmZmVyID0+IGtleSAhPT0gdW5kZWZpbmVkKVxuICAgICAgPyBbcmVzb2x2ZWRLZXlzWzBdLCByZXNvbHZlZEtleXNbMV0sIHJlc29sdmVkS2V5c1syXV1cbiAgICAgIDogdW5kZWZpbmVkLFxuICAgIG1pbmlzY3JpcHROb2RlLFxuICB9O1xufVxuXG4vKiogU2VyaWFsaXplIHRoZSBjYW5vbmljYWwgMi1vZi0zIHN0YWtlciBzdWJzY3JpcHQgZm9yIGEgY29uY3JldGUgUG9YLTUgZGVzY3JpcHRvci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3g1VW5sb2NrQnl0ZXMoZGVzY3JpcHRvcjogRGVzY3JpcHRvcik6IEJ1ZmZlciB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlUG94NUxvY2t1cERlc2NyaXB0b3IoZGVzY3JpcHRvcik7XG4gIGlmICghcGFyc2VkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEZXNjcmlwdG9yIGlzIG5vdCBhIGNhbm9uaWNhbCBQb1gtNSBsb2NrdXAgZGVzY3JpcHRvcicpO1xuICB9XG4gIGlmICghcGFyc2VkLnN0YWtlcktleXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvWC01IGRlc2NyaXB0b3Iga2V5cyBtdXN0IGJlIGNvbmNyZXRlIGJlZm9yZSBkZXJpdmluZyB1bmxvY2tCeXRlcycpO1xuICB9XG5cbiAgY29uc3Qga2V5UHVzaGVzID0gcGFyc2VkLnN0YWtlcktleXMubWFwKChrZXksIGluZGV4KSA9PiB7XG4gICAgaWYgKGtleS5sZW5ndGggIT09IDMzIHx8IChrZXlbMF0gIT09IDB4MDIgJiYga2V5WzBdICE9PSAweDAzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQb1gtNSBzdGFrZXIga2V5ICR7aW5kZXh9IG11c3QgYmUgYSAzMy1ieXRlIGNvbXByZXNzZWQgcHVibGljIGtleWApO1xuICAgIH1cbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbQnVmZmVyLm9mKGtleS5sZW5ndGgpLCBrZXldKTtcbiAgfSk7XG5cbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5vZigweDUyKSwgLi4ua2V5UHVzaGVzLCBCdWZmZXIub2YoMHg1MywgMHhhZSldKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Psbt } from '@bitgo/wasm-utxo';
|
|
2
|
+
import type { Pox5InputMatch } from './input';
|
|
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 Pox5InputMatch[]): void;
|
|
6
|
+
/** Validate that a canonical PoX-5 input can use the principal-preimage branch. */
|
|
7
|
+
export declare function assertPox5EarlyExitSpend(psbt: Psbt, input: 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: Pox5InputMatch): Pox5SpendBranch;
|
|
11
|
+
/** Add validated principal-preimage metadata for an early-exit spend. */
|
|
12
|
+
export declare function preparePox5EarlyExit(psbt: Psbt, inputIndex: number, input: 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;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C,eAAO,MAAM,sBAAsB,YAAc,CAAC;AA4BlD,uFAAuF;AACvF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,cAAc,EAAE,GAAG,IAAI,CAqB3F;AAED,mFAAmF;AACnF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,CAEhF;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,YAAY,CAAC;AAExD,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,GAAG,eAAe,CAMpF;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,cAAc,EACrB,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 validation_1 = require("./validation");
|
|
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
|
+
(0, validation_1.assertPox5PrincipalPreimage)(input.info, principalPreimage);
|
|
73
|
+
psbt.addSha256Preimage(inputIndex, principalPreimage);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcG94NS9yZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFrQ0EsMERBcUJDO0FBR0QsNERBRUM7QUFLRCw4Q0FNQztBQUdELG9EQVlDO0FBdEZELGdEQUFxRDtBQUdyRCw2Q0FBMkQ7QUFFOUMsUUFBQSxzQkFBc0IsR0FBRyxTQUFXLENBQUM7QUFFbEQsU0FBUyxzQkFBc0IsQ0FBQyxZQUFvQjtJQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLFlBQVksSUFBSSw4QkFBc0IsRUFBRSxDQUFDO1FBQ3ZHLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELDhCQUFzQixFQUFFLENBQUMsQ0FBQztJQUN6RyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsNkJBQTZCLENBQUMsUUFBZ0I7SUFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsSUFBSSxRQUFRLElBQUksOEJBQXNCLEVBQUUsQ0FBQztRQUMxRixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCw4QkFBc0IsRUFBRSxDQUFDLENBQUM7SUFDNUYsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLDBCQUEwQixDQUFDLElBQVUsRUFBRSxLQUFxQjtJQUNuRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sZ0JBQWdCLEdBQUcsdUJBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25HLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxL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QixFQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUMzRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFDeEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBzYnQsIFRyYW5zYWN0aW9uIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbmltcG9ydCB0eXBlIHsgUG94NUlucHV0TWF0Y2ggfSBmcm9tICcuL2lucHV0JztcbmltcG9ydCB7IGFzc2VydFBveDVQcmluY2lwYWxQcmVpbWFnZSB9IGZyb20gJy4vdmFsaWRhdGlvbic7XG5cbmV4cG9ydCBjb25zdCBQT1g1X01BWF9VTkxPQ0tfSEVJR0hUID0gNTAwXzAwMF8wMDA7XG5cbmZ1bmN0aW9uIGFzc2VydFBveDVVbmxvY2tIZWlnaHQodW5sb2NrSGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih1bmxvY2tIZWlnaHQpIHx8IHVubG9ja0hlaWdodCA8PSAwIHx8IHVubG9ja0hlaWdodCA+PSBQT1g1X01BWF9VTkxPQ0tfSEVJR0hUKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQb1gtNSB1bmxvY2sgaGVpZ2h0IG11c3QgYmUgYSBwb3NpdGl2ZSBibG9jayBoZWlnaHQgYmVsb3cgJHtQT1g1X01BWF9VTkxPQ0tfSEVJR0hUfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFBveDVCbG9ja0hlaWdodExvY2t0aW1lKGxvY2tUaW1lOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihsb2NrVGltZSkgfHwgbG9ja1RpbWUgPCAwIHx8IGxvY2tUaW1lID49IFBPWDVfTUFYX1VOTE9DS19IRUlHSFQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBvWC01IG5Mb2NrVGltZSBtdXN0IGJlIGEgYmxvY2sgaGVpZ2h0IGJlbG93ICR7UE9YNV9NQVhfVU5MT0NLX0hFSUdIVH1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNYXRjaGVkVHJhbnNhY3Rpb25JbnB1dChwc2J0OiBQc2J0LCBtYXRjaDogUG94NUlucHV0TWF0Y2gpIHtcbiAgY29uc3QgcHNidElucHV0ID0gcHNidC5nZXRJbnB1dHMoKVttYXRjaC5pbnB1dEluZGV4XTtcbiAgY29uc3QgdHJhbnNhY3Rpb25JbnB1dCA9IFRyYW5zYWN0aW9uLmZyb21CeXRlcyhwc2J0LmdldFVuc2lnbmVkVHgoKSkuZ2V0SW5wdXRzKClbbWF0Y2guaW5wdXRJbmRleF07XG4gIGNvbnN0IGRlc2NyaXB0b3JTY3JpcHQgPSBCdWZmZXIuZnJvbShtYXRjaC5kZXNjcmlwdG9yLnNjcmlwdFB1YmtleSgpKTtcbiAgaWYgKFxuICAgICFwc2J0SW5wdXQ/LndpdG5lc3NVdHhvIHx8XG4gICAgIXRyYW5zYWN0aW9uSW5wdXQgfHxcbiAgICAhQnVmZmVyLmZyb20ocHNidElucHV0LndpdG5lc3NVdHhvLnNjcmlwdCkuZXF1YWxzKGRlc2NyaXB0b3JTY3JpcHQpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUG9YLTUgZGVzY3JpcHRvciBtYXRjaCBkb2VzIG5vdCBtYXRjaCBQU0JUIGlucHV0ICR7bWF0Y2guaW5wdXRJbmRleH1gKTtcbiAgfVxuICByZXR1cm4gdHJhbnNhY3Rpb25JbnB1dDtcbn1cblxuLyoqIFZhbGlkYXRlIHRoZSBwb3N0LUNMVFYgcG9saWN5IGZvciBhbGwgY2Fub25pY2FsIFBvWC01IGlucHV0cyBpbiBhIHJlY292ZXJ5IFBTQlQuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UG94NUxvY2t0aW1lU3BlbmQocHNidDogUHNidCwgaW5wdXRzOiByZWFkb25seSBQb3g1SW5wdXRNYXRjaFtdKTogdm9pZCB7XG4gIGlmIChpbnB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQb1gtNSBsb2NrdXAgZGVzY3JpcHRvciBtYXRjaCBpcyByZXF1aXJlZCcpO1xuICB9XG5cbiAgY29uc3QgdW5sb2NrSGVpZ2h0cyA9IGlucHV0cy5tYXAoKGlucHV0KSA9PiB7XG4gICAgY29uc3QgeyB1bmxvY2tIZWlnaHQgfSA9IGlucHV0LmluZm87XG4gICAgYXNzZXJ0UG94NVVubG9ja0hlaWdodCh1bmxvY2tIZWlnaHQpO1xuICAgIHJldHVybiB1bmxvY2tIZWlnaHQ7XG4gIH0pO1xuICBjb25zdCBsb2NrVGltZSA9IHBzYnQubG9ja1RpbWUoKTtcbiAgYXNzZXJ0UG94NUJsb2NrSGVpZ2h0TG9ja3RpbWUobG9ja1RpbWUpO1xuICBjb25zdCByZXF1aXJlZExvY2tUaW1lID0gTWF0aC5tYXgoLi4udW5sb2NrSGVpZ2h0cyk7XG4gIGlmIChsb2NrVGltZSA8IHJlcXVpcmVkTG9ja1RpbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBvWC01IG5Mb2NrVGltZSBtdXN0IGJlIGF0IGxlYXN0ICR7cmVxdWlyZWRMb2NrVGltZX1gKTtcbiAgfVxuICBmb3IgKGNvbnN0IGlucHV0IG9mIGlucHV0cykge1xuICAgIGlmIChnZXRNYXRjaGVkVHJhbnNhY3Rpb25JbnB1dChwc2J0LCBpbnB1dCkuc2VxdWVuY2UgPT09IDB4ZmZmZmZmZmYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUG9YLTUgbG9ja3RpbWUgc3BlbmQgaW5wdXQgJHtpbnB1dC5pbnB1dEluZGV4fSBtdXN0IHVzZSBhIG5vbi1maW5hbCBzZXF1ZW5jZWApO1xuICAgIH1cbiAgfVxufVxuXG4vKiogVmFsaWRhdGUgdGhhdCBhIGNhbm9uaWNhbCBQb1gtNSBpbnB1dCBjYW4gdXNlIHRoZSBwcmluY2lwYWwtcHJlaW1hZ2UgYnJhbmNoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFBveDVFYXJseUV4aXRTcGVuZChwc2J0OiBQc2J0LCBpbnB1dDogUG94NUlucHV0TWF0Y2gpOiB2b2lkIHtcbiAgZ2V0TWF0Y2hlZFRyYW5zYWN0aW9uSW5wdXQocHNidCwgaW5wdXQpO1xufVxuXG5leHBvcnQgdHlwZSBQb3g1U3BlbmRCcmFuY2ggPSAnbG9ja3RpbWUnIHwgJ2Vhcmx5LWV4aXQnO1xuXG4vKiogQ2xhc3NpZnkgYSBQb1gtNSBzcGVuZCBmcm9tIG5hdGl2ZSBwcmluY2lwYWwtcHJlaW1hZ2UgbWV0YWRhdGEuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlQb3g1U3BlbmQocHNidDogUHNidCwgaW5wdXQ6IFBveDVJbnB1dE1hdGNoKTogUG94NVNwZW5kQnJhbmNoIHtcbiAgZ2V0TWF0Y2hlZFRyYW5zYWN0aW9uSW5wdXQocHNidCwgaW5wdXQpO1xuICBjb25zdCBoYXNQcmluY2lwYWxQcmVpbWFnZSA9IHBzYnRcbiAgICAuZ2V0SW5wdXRLZXlWYWx1ZXMoaW5wdXQuaW5wdXRJbmRleClcbiAgICAuc29tZSgocmVjb3JkKSA9PiByZWNvcmQudHlwZSA9PT0gJ2tub3duJyAmJiByZWNvcmQua2V5ID09PSAnUFNCVF9JTl9TSEEyNTYnKTtcbiAgcmV0dXJuIGhhc1ByaW5jaXBhbFByZWltYWdlID8gJ2Vhcmx5LWV4aXQnIDogJ2xvY2t0aW1lJztcbn1cblxuLyoqIEFkZCB2YWxpZGF0ZWQgcHJpbmNpcGFsLXByZWltYWdlIG1ldGFkYXRhIGZvciBhbiBlYXJseS1leGl0IHNwZW5kLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVQb3g1RWFybHlFeGl0KFxuICBwc2J0OiBQc2J0LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIGlucHV0OiBQb3g1SW5wdXRNYXRjaCxcbiAgcHJpbmNpcGFsUHJlaW1hZ2U6IFVpbnQ4QXJyYXlcbik6IHZvaWQge1xuICBpZiAoaW5wdXRJbmRleCAhPT0gaW5wdXQuaW5wdXRJbmRleCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUG9YLTUgZGVzY3JpcHRvciBtYXRjaCBiZWxvbmdzIHRvIFBTQlQgaW5wdXQgJHtpbnB1dC5pbnB1dEluZGV4fSwgbm90ICR7aW5wdXRJbmRleH1gKTtcbiAgfVxuICBhc3NlcnRQb3g1RWFybHlFeGl0U3BlbmQocHNidCwgaW5wdXQpO1xuICBhc3NlcnRQb3g1UHJpbmNpcGFsUHJlaW1hZ2UoaW5wdXQuaW5mbywgcHJpbmNpcGFsUHJlaW1hZ2UpO1xuICBwc2J0LmFkZFNoYTI1NlByZWltYWdlKGlucHV0SW5kZXgsIHByaW5jaXBhbFByZWltYWdlKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Psbt, type Descriptor } from '@bitgo/wasm-utxo';
|
|
2
|
+
import { Pox5DescriptorInfo } from './parseDescriptor';
|
|
3
|
+
/**
|
|
4
|
+
* Read the principal preimage committed by a canonical PoX-5 descriptor from a
|
|
5
|
+
* native PSBT input. The PSBT_IN_SHA256 key data is the descriptor commitment.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getPox5PrincipalPreimage(psbt: Psbt, inputIndex: number, descriptor: Pox5DescriptorInfo | Descriptor | import('@bitgo/wasm-utxo').ast.DescriptorNode): Buffer;
|
|
8
|
+
/** Verify that a principal preimage is committed by a canonical PoX-5 descriptor. */
|
|
9
|
+
export declare function assertPox5PrincipalPreimage(descriptor: Pox5DescriptorInfo | Descriptor | import('@bitgo/wasm-utxo').ast.DescriptorNode, principalPreimage: Uint8Array): void;
|
|
10
|
+
/** Alias for callers that prefer validation terminology. */
|
|
11
|
+
export declare function validatePox5PrincipalPreimage(descriptor: Pox5DescriptorInfo | Descriptor | import('@bitgo/wasm-utxo').ast.DescriptorNode, principalPreimage: Uint8Array): void;
|
|
12
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../src/pox5/validation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAA0B,MAAM,kBAAkB,CAAC;AAEjF,OAAO,EAAE,kBAAkB,EAA6B,MAAM,mBAAmB,CAAC;AAUlF;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,GAAG,UAAU,GAAG,OAAO,kBAAkB,EAAE,GAAG,CAAC,cAAc,GAC1F,MAAM,CA0BR;AAwBD,qFAAqF;AACrF,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,kBAAkB,GAAG,UAAU,GAAG,OAAO,kBAAkB,EAAE,GAAG,CAAC,cAAc,EAC3F,iBAAiB,EAAE,UAAU,GAC5B,IAAI,CASN;AAED,4DAA4D;AAC5D,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,kBAAkB,GAAG,UAAU,GAAG,OAAO,kBAAkB,EAAE,GAAG,CAAC,cAAc,EAC3F,iBAAiB,EAAE,UAAU,GAC5B,IAAI,CAEN"}
|