@bitgo-beta/utxo-descriptors 0.0.1-beta.32 → 0.0.1-beta.320
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 +5 -0
- package/dist/cjs/src/pox5/index.d.ts.map +1 -0
- package/dist/cjs/src/pox5/index.js +21 -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 +18 -0
- package/dist/cjs/src/pox5/parseDescriptor.d.ts.map +1 -0
- package/dist/cjs/src/pox5/parseDescriptor.js +95 -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 +157 -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/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 +5 -0
- package/dist/esm/pox5/index.d.ts.map +1 -0
- package/dist/esm/pox5/index.js +5 -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 +18 -0
- package/dist/esm/pox5/parseDescriptor.d.ts.map +1 -0
- package/dist/esm/pox5/parseDescriptor.js +92 -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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcG94NS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQTZCO0FBQzdCLG9EQUFrQztBQUNsQywwQ0FBd0I7QUFDeEIsK0NBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9kZXNjcmlwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vcGFyc2VEZXNjcmlwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vaW5wdXQnO1xuZXhwb3J0ICogZnJvbSAnLi92YWxpZGF0aW9uJztcbiJdfQ==
|
|
@@ -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,18 @@
|
|
|
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
|
+
//# 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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parsePox5LockupDescriptor = parsePox5LockupDescriptor;
|
|
4
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
5
|
+
const COMPRESSED_KEY = /^(02|03)[0-9a-fA-F]{64}$/;
|
|
6
|
+
const XPUB_WITH_INDEX = /^([1-9A-HJ-NP-Za-km-z]+)\/(\d+)$/;
|
|
7
|
+
function asNumber(value, field) {
|
|
8
|
+
if (typeof value !== 'number') {
|
|
9
|
+
throw new Error(`${field} must be a number`);
|
|
10
|
+
}
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
function asString(value, field) {
|
|
14
|
+
if (typeof value !== 'string') {
|
|
15
|
+
throw new Error(`${field} must be a string`);
|
|
16
|
+
}
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
function parseCompressedKey(value, field) {
|
|
20
|
+
if (!COMPRESSED_KEY.test(value)) {
|
|
21
|
+
throw new Error(`${field} must be a compressed public key`);
|
|
22
|
+
}
|
|
23
|
+
return Buffer.from(value, 'hex');
|
|
24
|
+
}
|
|
25
|
+
function resolveStakerKey(value) {
|
|
26
|
+
if (COMPRESSED_KEY.test(value)) {
|
|
27
|
+
return Buffer.from(value, 'hex');
|
|
28
|
+
}
|
|
29
|
+
const match = value.match(XPUB_WITH_INDEX);
|
|
30
|
+
if (!match) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
const [, xpub, indexString] = match;
|
|
34
|
+
const index = Number.parseInt(indexString, 10);
|
|
35
|
+
try {
|
|
36
|
+
return Buffer.from(wasm_utxo_1.BIP32.fromBase58(xpub).derive(index).publicKey);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Parse only the canonical PoX-5 descriptor template. Other descriptors return
|
|
44
|
+
* undefined; malformed fields within the template throw so callers cannot finalize
|
|
45
|
+
* a script under an ambiguous policy.
|
|
46
|
+
*/
|
|
47
|
+
function parsePox5LockupDescriptor(descriptor) {
|
|
48
|
+
const matcher = new wasm_utxo_1.descriptorWallet.PatternMatcher();
|
|
49
|
+
const descriptorNode = descriptor instanceof wasm_utxo_1.Descriptor ? wasm_utxo_1.ast.fromDescriptor(descriptor) : descriptor;
|
|
50
|
+
const matched = matcher.match(descriptorNode, { wsh: { $var: 'miniscript' } });
|
|
51
|
+
if (!matched) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
const miniscriptNode = matched.miniscript;
|
|
55
|
+
const pattern = {
|
|
56
|
+
and_v: [
|
|
57
|
+
{
|
|
58
|
+
'v:or_i': [
|
|
59
|
+
{ after: { $var: 'unlockHeight' } },
|
|
60
|
+
{ and_v: [{ 'v:sha256': { $var: 'stakerCommitment' } }, { pk: { $var: 'earlyExitKey' } }] },
|
|
61
|
+
],
|
|
62
|
+
},
|
|
63
|
+
{ multi: { $var: 'stakerMulti' } },
|
|
64
|
+
],
|
|
65
|
+
};
|
|
66
|
+
const fields = matcher.match(miniscriptNode, pattern);
|
|
67
|
+
if (!fields) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
const unlockHeight = asNumber(fields.unlockHeight, 'after argument');
|
|
71
|
+
if (!Number.isSafeInteger(unlockHeight) || unlockHeight <= 0 || unlockHeight >= 500000000) {
|
|
72
|
+
throw new Error(`unlockHeight (${unlockHeight}) must be a positive block height below 500000000`);
|
|
73
|
+
}
|
|
74
|
+
const commitmentHex = asString(fields.stakerCommitment, 'sha256 commitment');
|
|
75
|
+
if (!/^[0-9a-fA-F]{64}$/.test(commitmentHex)) {
|
|
76
|
+
throw new Error('stakerCommitment must be 32 bytes');
|
|
77
|
+
}
|
|
78
|
+
const earlyExitKey = parseCompressedKey(asString(fields.earlyExitKey, 'early exit key'), 'earlyExitKey');
|
|
79
|
+
if (!Array.isArray(fields.stakerMulti) || fields.stakerMulti.length !== 4 || fields.stakerMulti[0] !== 2) {
|
|
80
|
+
throw new Error('staker multi must be a 2-of-3 multisig');
|
|
81
|
+
}
|
|
82
|
+
const stakerKeyStrings = fields.stakerMulti.slice(1).map((key, index) => asString(key, `staker key ${index}`));
|
|
83
|
+
const resolvedKeys = stakerKeyStrings.map(resolveStakerKey);
|
|
84
|
+
return {
|
|
85
|
+
unlockHeight,
|
|
86
|
+
stakerCommitment: Buffer.from(commitmentHex, 'hex'),
|
|
87
|
+
earlyExitKey,
|
|
88
|
+
stakerKeyStrings: [stakerKeyStrings[0], stakerKeyStrings[1], stakerKeyStrings[2]],
|
|
89
|
+
stakerKeys: resolvedKeys.every((key) => key !== undefined)
|
|
90
|
+
? [resolvedKeys[0], resolvedKeys[1], resolvedKeys[2]]
|
|
91
|
+
: undefined,
|
|
92
|
+
miniscriptNode,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VEZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BveDUvcGFyc2VEZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBOERBLDhEQW1EQztBQWpIRCxnREFBNEU7QUFnQjVFLE1BQU0sY0FBYyxHQUFHLDBCQUEwQixDQUFDO0FBQ2xELE1BQU0sZUFBZSxHQUFHLGtDQUFrQyxDQUFDO0FBRTNELFNBQVMsUUFBUSxDQUFDLEtBQWMsRUFBRSxLQUFhO0lBQzdDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssbUJBQW1CLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBYyxFQUFFLEtBQWE7SUFDN0MsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQ3RELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssa0NBQWtDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFhO0lBQ3JDLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FB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cnQgeyBCSVAzMiwgRGVzY3JpcHRvciwgYXN0LCBkZXNjcmlwdG9yV2FsbGV0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbnR5cGUgUGF0dGVybiA9IGRlc2NyaXB0b3JXYWxsZXQuUGF0dGVybjtcblxuZXhwb3J0IHR5cGUgUG94NURlc2NyaXB0b3JJbmZvID0ge1xuICB1bmxvY2tIZWlnaHQ6IG51bWJlcjtcbiAgc3Rha2VyQ29tbWl0bWVudDogQnVmZmVyO1xuICBlYXJseUV4aXRLZXk6IEJ1ZmZlcjtcbiAgc3Rha2VyS2V5U3RyaW5nczogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddO1xuICBzdGFrZXJLZXlzOiBbQnVmZmVyLCBCdWZmZXIsIEJ1ZmZlcl0gfCB1bmRlZmluZWQ7XG4gIG1pbmlzY3JpcHROb2RlOiBhc3QuTWluaXNjcmlwdE5vZGU7XG59O1xuXG4vKiogQGRlcHJlY2F0ZWQgVXNlIFBveDVEZXNjcmlwdG9ySW5mbyBpbnN0ZWFkLiAqL1xuZXhwb3J0IHR5cGUgUGFyc2VkUG94NUxvY2t1cERlc2NyaXB0b3IgPSBQb3g1RGVzY3JpcHRvckluZm87XG5cbmNvbnN0IENPTVBSRVNTRURfS0VZID0gL14oMDJ8MDMpWzAtOWEtZkEtRl17NjR9JC87XG5jb25zdCBYUFVCX1dJVEhfSU5ERVggPSAvXihbMS05QS1ISi1OUC1aYS1rbS16XSspXFwvKFxcZCspJC87XG5cbmZ1bmN0aW9uIGFzTnVtYmVyKHZhbHVlOiB1bmtub3duLCBmaWVsZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmllbGR9IG11c3QgYmUgYSBudW1iZXJgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlOiB1bmtub3duLCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmllbGR9IG11c3QgYmUgYSBzdHJpbmdgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ29tcHJlc3NlZEtleSh2YWx1ZTogc3RyaW5nLCBmaWVsZDogc3RyaW5nKTogQnVmZmVyIHtcbiAgaWYgKCFDT01QUkVTU0VEX0tFWS50ZXN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZH0gbXVzdCBiZSBhIGNvbXByZXNzZWQgcHVibGljIGtleWApO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSwgJ2hleCcpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlU3Rha2VyS2V5KHZhbHVlOiBzdHJpbmcpOiBCdWZmZXIgfCB1bmRlZmluZWQge1xuICBpZiAoQ09NUFJFU1NFRF9LRVkudGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUsICdoZXgnKTtcbiAgfVxuICBjb25zdCBtYXRjaCA9IHZhbHVlLm1hdGNoKFhQVUJfV0lUSF9JTkRFWCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IFssIHhwdWIsIGluZGV4U3RyaW5nXSA9IG1hdGNoO1xuICBjb25zdCBpbmRleCA9IE51bWJlci5wYXJzZUludChpbmRleFN0cmluZywgMTApO1xuICB0cnkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShCSVAzMi5mcm9tQmFzZTU4KHhwdWIpLmRlcml2ZShpbmRleCkucHVibGljS2V5KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlIG9ubHkgdGhlIGNhbm9uaWNhbCBQb1gtNSBkZXNjcmlwdG9yIHRlbXBsYXRlLiBPdGhlciBkZXNjcmlwdG9ycyByZXR1cm5cbiAqIHVuZGVmaW5lZDsgbWFsZm9ybWVkIGZpZWxkcyB3aXRoaW4gdGhlIHRlbXBsYXRlIHRocm93IHNvIGNhbGxlcnMgY2Fubm90IGZpbmFsaXplXG4gKiBhIHNjcmlwdCB1bmRlciBhbiBhbWJpZ3VvdXMgcG9saWN5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQb3g1TG9ja3VwRGVzY3JpcHRvcihkZXNjcmlwdG9yOiBEZXNjcmlwdG9yIHwgYXN0LkRlc2NyaXB0b3JOb2RlKTogUG94NURlc2NyaXB0b3JJbmZvIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2hlciA9IG5ldyBkZXNjcmlwdG9yV2FsbGV0LlBhdHRlcm5NYXRjaGVyKCk7XG4gIGNvbnN0IGRlc2NyaXB0b3JOb2RlID0gZGVzY3JpcHRvciBpbnN0YW5jZW9mIERlc2NyaXB0b3IgPyBhc3QuZnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcikgOiBkZXNjcmlwdG9yO1xuICBjb25zdCBtYXRjaGVkID0gbWF0Y2hlci5tYXRjaChkZXNjcmlwdG9yTm9kZSwgeyB3c2g6IHsgJHZhcjogJ21pbmlzY3JpcHQnIH0gfSk7XG4gIGlmICghbWF0Y2hlZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBtaW5pc2NyaXB0Tm9kZSA9IG1hdGNoZWQubWluaXNjcmlwdCBhcyBhc3QuTWluaXNjcmlwdE5vZGU7XG4gIGNvbnN0IHBhdHRlcm46IFBhdHRlcm4gPSB7XG4gICAgYW5kX3Y6IFtcbiAgICAgIHtcbiAgICAgICAgJ3Y6b3JfaSc6IFtcbiAgICAgICAgICB7IGFmdGVyOiB7ICR2YXI6ICd1bmxvY2tIZWlnaHQnIH0gfSxcbiAgICAgICAgICB7IGFuZF92OiBbeyAndjpzaGEyNTYnOiB7ICR2YXI6ICdzdGFrZXJDb21taXRtZW50JyB9IH0sIHsgcGs6IHsgJHZhcjogJ2Vhcmx5RXhpdEtleScgfSB9XSB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHsgbXVsdGk6IHsgJHZhcjogJ3N0YWtlck11bHRpJyB9IH0sXG4gICAgXSxcbiAgfTtcbiAgY29uc3QgZmllbGRzID0gbWF0Y2hlci5tYXRjaChtaW5pc2NyaXB0Tm9kZSwgcGF0dGVybik7XG4gIGlmICghZmllbGRzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHVubG9ja0hlaWdodCA9IGFzTnVtYmVyKGZpZWxkcy51bmxvY2tIZWlnaHQsICdhZnRlciBhcmd1bWVudCcpO1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHVubG9ja0hlaWdodCkgfHwgdW5sb2NrSGVpZ2h0IDw9IDAgfHwgdW5sb2NrSGVpZ2h0ID49IDUwMF8wMDBfMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bmxvY2tIZWlnaHQgKCR7dW5sb2NrSGVpZ2h0fSkgbXVzdCBiZSBhIHBvc2l0aXZlIGJsb2NrIGhlaWdodCBiZWxvdyA1MDAwMDAwMDBgKTtcbiAgfVxuICBjb25zdCBjb21taXRtZW50SGV4ID0gYXNTdHJpbmcoZmllbGRzLnN0YWtlckNvbW1pdG1lbnQsICdzaGEyNTYgY29tbWl0bWVudCcpO1xuICBpZiAoIS9eWzAtOWEtZkEtRl17NjR9JC8udGVzdChjb21taXRtZW50SGV4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignc3Rha2VyQ29tbWl0bWVudCBtdXN0IGJlIDMyIGJ5dGVzJyk7XG4gIH1cbiAgY29uc3QgZWFybHlFeGl0S2V5ID0gcGFyc2VDb21wcmVzc2VkS2V5KGFzU3RyaW5nKGZpZWxkcy5lYXJseUV4aXRLZXksICdlYXJseSBleGl0IGtleScpLCAnZWFybHlFeGl0S2V5Jyk7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGZpZWxkcy5zdGFrZXJNdWx0aSkgfHwgZmllbGRzLnN0YWtlck11bHRpLmxlbmd0aCAhPT0gNCB8fCBmaWVsZHMuc3Rha2VyTXVsdGlbMF0gIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YWtlciBtdWx0aSBtdXN0IGJlIGEgMi1vZi0zIG11bHRpc2lnJyk7XG4gIH1cbiAgY29uc3Qgc3Rha2VyS2V5U3RyaW5ncyA9IGZpZWxkcy5zdGFrZXJNdWx0aS5zbGljZSgxKS5tYXAoKGtleSwgaW5kZXgpID0+IGFzU3RyaW5nKGtleSwgYHN0YWtlciBrZXkgJHtpbmRleH1gKSk7XG4gIGNvbnN0IHJlc29sdmVkS2V5cyA9IHN0YWtlcktleVN0cmluZ3MubWFwKHJlc29sdmVTdGFrZXJLZXkpO1xuXG4gIHJldHVybiB7XG4gICAgdW5sb2NrSGVpZ2h0LFxuICAgIHN0YWtlckNvbW1pdG1lbnQ6IEJ1ZmZlci5mcm9tKGNvbW1pdG1lbnRIZXgsICdoZXgnKSxcbiAgICBlYXJseUV4aXRLZXksXG4gICAgc3Rha2VyS2V5U3RyaW5nczogW3N0YWtlcktleVN0cmluZ3NbMF0sIHN0YWtlcktleVN0cmluZ3NbMV0sIHN0YWtlcktleVN0cmluZ3NbMl1dLFxuICAgIHN0YWtlcktleXM6IHJlc29sdmVkS2V5cy5ldmVyeSgoa2V5KToga2V5IGlzIEJ1ZmZlciA9PiBrZXkgIT09IHVuZGVmaW5lZClcbiAgICAgID8gW3Jlc29sdmVkS2V5c1swXSwgcmVzb2x2ZWRLZXlzWzFdLCByZXNvbHZlZEtleXNbMl1dXG4gICAgICA6IHVuZGVmaW5lZCxcbiAgICBtaW5pc2NyaXB0Tm9kZSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getPox5PrincipalPreimage = getPox5PrincipalPreimage;
|
|
4
|
+
exports.assertPox5PrincipalPreimage = assertPox5PrincipalPreimage;
|
|
5
|
+
exports.validatePox5PrincipalPreimage = validatePox5PrincipalPreimage;
|
|
6
|
+
const crypto_1 = require("crypto");
|
|
7
|
+
const parseDescriptor_1 = require("./parseDescriptor");
|
|
8
|
+
const SHA256_INPUT_KEY = 'PSBT_IN_SHA256';
|
|
9
|
+
function isSha256InputKeyValue(keyValue) {
|
|
10
|
+
return keyValue.type === 'known' && keyValue.key === SHA256_INPUT_KEY;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Read the principal preimage committed by a canonical PoX-5 descriptor from a
|
|
14
|
+
* native PSBT input. The PSBT_IN_SHA256 key data is the descriptor commitment.
|
|
15
|
+
*/
|
|
16
|
+
function getPox5PrincipalPreimage(psbt, inputIndex, descriptor) {
|
|
17
|
+
const info = getPox5DescriptorInfo(descriptor);
|
|
18
|
+
const records = psbt
|
|
19
|
+
.getInputKeyValues(inputIndex)
|
|
20
|
+
.filter(isSha256InputKeyValue)
|
|
21
|
+
.filter((record) => Buffer.from(record.keyData).equals(info.stakerCommitment));
|
|
22
|
+
if (records.length !== 1) {
|
|
23
|
+
throw new Error(`expected exactly one ${SHA256_INPUT_KEY} record matching the descriptor commitment, found ${records.length}`);
|
|
24
|
+
}
|
|
25
|
+
const [record] = records;
|
|
26
|
+
if (record.keyData.length !== 32) {
|
|
27
|
+
throw new Error(`${SHA256_INPUT_KEY} digest must be 32 bytes`);
|
|
28
|
+
}
|
|
29
|
+
if (record.value.length !== 32) {
|
|
30
|
+
throw new Error(`${SHA256_INPUT_KEY} preimage must be 32 bytes`);
|
|
31
|
+
}
|
|
32
|
+
const preimage = Buffer.from(record.value);
|
|
33
|
+
const digest = (0, crypto_1.createHash)('sha256').update(preimage).digest();
|
|
34
|
+
if (!digest.equals(Buffer.from(record.keyData))) {
|
|
35
|
+
throw new Error(`${SHA256_INPUT_KEY} digest does not match its preimage`);
|
|
36
|
+
}
|
|
37
|
+
return preimage;
|
|
38
|
+
}
|
|
39
|
+
function isPox5DescriptorInfo(value) {
|
|
40
|
+
return (value !== null &&
|
|
41
|
+
typeof value === 'object' &&
|
|
42
|
+
'stakerCommitment' in value &&
|
|
43
|
+
Buffer.isBuffer(value.stakerCommitment));
|
|
44
|
+
}
|
|
45
|
+
function getPox5DescriptorInfo(descriptor) {
|
|
46
|
+
if (isPox5DescriptorInfo(descriptor)) {
|
|
47
|
+
return descriptor;
|
|
48
|
+
}
|
|
49
|
+
const info = (0, parseDescriptor_1.parsePox5LockupDescriptor)(descriptor);
|
|
50
|
+
if (!info) {
|
|
51
|
+
throw new Error('descriptor is not a canonical PoX-5 lockup descriptor');
|
|
52
|
+
}
|
|
53
|
+
return info;
|
|
54
|
+
}
|
|
55
|
+
/** Verify that a principal preimage is committed by a canonical PoX-5 descriptor. */
|
|
56
|
+
function assertPox5PrincipalPreimage(descriptor, principalPreimage) {
|
|
57
|
+
if (principalPreimage.length !== 32) {
|
|
58
|
+
throw new Error('principalPreimage must be 32 bytes');
|
|
59
|
+
}
|
|
60
|
+
const info = getPox5DescriptorInfo(descriptor);
|
|
61
|
+
const digest = (0, crypto_1.createHash)('sha256').update(principalPreimage).digest();
|
|
62
|
+
if (!digest.equals(info.stakerCommitment)) {
|
|
63
|
+
throw new Error('principalPreimage does not match the descriptor stakerCommitment');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Alias for callers that prefer validation terminology. */
|
|
67
|
+
function validatePox5PrincipalPreimage(descriptor, principalPreimage) {
|
|
68
|
+
assertPox5PrincipalPreimage(descriptor, principalPreimage);
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wb3g1L3ZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFrQkEsNERBOEJDO0FBeUJELGtFQVlDO0FBR0Qsc0VBS0M7QUE3RkQsbUNBQW9DO0FBSXBDLHVEQUFrRjtBQUVsRixNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0FBSTFDLFNBQVMscUJBQXFCLENBQUMsUUFBMkI7SUFDeEQsT0FBTyxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxRQUFRLENBQUMsR0FBRyxLQUFLLGdCQUFnQixDQUFDO0FBQ3hFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQix3QkFBd0IsQ0FDdEMsSUFBVSxFQUNWLFVBQWtCLEVBQ2xCLFVBQTJGO0lBRTNGLE1BQU0sSUFBSSxHQUFHLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sT0FBTyxHQUFHLElBQUk7U0FDakIsaUJBQWlCLENBQUMsVUFBVSxDQUFDO1NBQzdCLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztTQUM3QixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksS0FBSyxDQUNiLHdCQUF3QixnQkFBZ0IscURBQXFELE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FDOUcsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLGdCQUFnQiwwQkFBMEIsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxnQkFBZ0IsNEJBQTRCLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM5RCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLGdCQUFnQixxQ0FBcUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxLQUFjO0lBQzFDLE9BQU8sQ0FDTCxLQUFLLEtBQUssSUFBSTtRQUNkLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsa0JBQWtCLElBQUksS0FBSztRQUMzQixNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUN4QyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQzVCLFVBQTJGO0lBRTNGLElBQUksb0JBQW9CLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNyQyxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBQSwyQ0FBeUIsRUFBQyxVQUFVLENBQUMsQ0FBQztJQUNuRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixTQUFnQiwyQkFBMkIsQ0FDekMsVUFBMkYsRUFDM0YsaUJBQTZCO0lBRTdCLElBQUksaUJBQWlCLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDL0MsTUFBTSxNQUFNLEdBQUcsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3ZFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7UUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7QUFDSCxDQUFDO0FBRUQsNERBQTREO0FBQzVELFNBQWdCLDZCQUE2QixDQUMzQyxVQUEyRixFQUMzRixpQkFBNkI7SUFFN0IsMkJBQTJCLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFDN0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBQc2J0LCB0eXBlIERlc2NyaXB0b3IsIHR5cGUgUHNidElucHV0S2V5VmFsdWUgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcblxuaW1wb3J0IHsgUG94NURlc2NyaXB0b3JJbmZvLCBwYXJzZVBveDVMb2NrdXBEZXNjcmlwdG9yIH0gZnJvbSAnLi9wYXJzZURlc2NyaXB0b3InO1xuXG5jb25zdCBTSEEyNTZfSU5QVVRfS0VZID0gJ1BTQlRfSU5fU0hBMjU2JztcblxudHlwZSBTaGEyNTZJbnB1dEtleVZhbHVlID0gRXh0cmFjdDxQc2J0SW5wdXRLZXlWYWx1ZSwgeyB0eXBlOiAna25vd24nIH0+O1xuXG5mdW5jdGlvbiBpc1NoYTI1NklucHV0S2V5VmFsdWUoa2V5VmFsdWU6IFBzYnRJbnB1dEtleVZhbHVlKToga2V5VmFsdWUgaXMgU2hhMjU2SW5wdXRLZXlWYWx1ZSB7XG4gIHJldHVybiBrZXlWYWx1ZS50eXBlID09PSAna25vd24nICYmIGtleVZhbHVlLmtleSA9PT0gU0hBMjU2X0lOUFVUX0tFWTtcbn1cblxuLyoqXG4gKiBSZWFkIHRoZSBwcmluY2lwYWwgcHJlaW1hZ2UgY29tbWl0dGVkIGJ5IGEgY2Fub25pY2FsIFBvWC01IGRlc2NyaXB0b3IgZnJvbSBhXG4gKiBuYXRpdmUgUFNCVCBpbnB1dC4gVGhlIFBTQlRfSU5fU0hBMjU2IGtleSBkYXRhIGlzIHRoZSBkZXNjcmlwdG9yIGNvbW1pdG1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3g1UHJpbmNpcGFsUHJlaW1hZ2UoXG4gIHBzYnQ6IFBzYnQsXG4gIGlucHV0SW5kZXg6IG51bWJlcixcbiAgZGVzY3JpcHRvcjogUG94NURlc2NyaXB0b3JJbmZvIHwgRGVzY3JpcHRvciB8IGltcG9ydCgnQGJpdGdvL3dhc20tdXR4bycpLmFzdC5EZXNjcmlwdG9yTm9kZVxuKTogQnVmZmVyIHtcbiAgY29uc3QgaW5mbyA9IGdldFBveDVEZXNjcmlwdG9ySW5mbyhkZXNjcmlwdG9yKTtcbiAgY29uc3QgcmVjb3JkcyA9IHBzYnRcbiAgICAuZ2V0SW5wdXRLZXlWYWx1ZXMoaW5wdXRJbmRleClcbiAgICAuZmlsdGVyKGlzU2hhMjU2SW5wdXRLZXlWYWx1ZSlcbiAgICAuZmlsdGVyKChyZWNvcmQpID0+IEJ1ZmZlci5mcm9tKHJlY29yZC5rZXlEYXRhKS5lcXVhbHMoaW5mby5zdGFrZXJDb21taXRtZW50KSk7XG4gIGlmIChyZWNvcmRzLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBleHBlY3RlZCBleGFjdGx5IG9uZSAke1NIQTI1Nl9JTlBVVF9LRVl9IHJlY29yZCBtYXRjaGluZyB0aGUgZGVzY3JpcHRvciBjb21taXRtZW50LCBmb3VuZCAke3JlY29yZHMubGVuZ3RofWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgW3JlY29yZF0gPSByZWNvcmRzO1xuICBpZiAocmVjb3JkLmtleURhdGEubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtTSEEyNTZfSU5QVVRfS0VZfSBkaWdlc3QgbXVzdCBiZSAzMiBieXRlc2ApO1xuICB9XG4gIGlmIChyZWNvcmQudmFsdWUubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtTSEEyNTZfSU5QVVRfS0VZfSBwcmVpbWFnZSBtdXN0IGJlIDMyIGJ5dGVzYCk7XG4gIH1cblxuICBjb25zdCBwcmVpbWFnZSA9IEJ1ZmZlci5mcm9tKHJlY29yZC52YWx1ZSk7XG4gIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShwcmVpbWFnZSkuZGlnZXN0KCk7XG4gIGlmICghZGlnZXN0LmVxdWFscyhCdWZmZXIuZnJvbShyZWNvcmQua2V5RGF0YSkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke1NIQTI1Nl9JTlBVVF9LRVl9IGRpZ2VzdCBkb2VzIG5vdCBtYXRjaCBpdHMgcHJlaW1hZ2VgKTtcbiAgfVxuICByZXR1cm4gcHJlaW1hZ2U7XG59XG5cbmZ1bmN0aW9uIGlzUG94NURlc2NyaXB0b3JJbmZvKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUG94NURlc2NyaXB0b3JJbmZvIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAnc3Rha2VyQ29tbWl0bWVudCcgaW4gdmFsdWUgJiZcbiAgICBCdWZmZXIuaXNCdWZmZXIodmFsdWUuc3Rha2VyQ29tbWl0bWVudClcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0UG94NURlc2NyaXB0b3JJbmZvKFxuICBkZXNjcmlwdG9yOiBQb3g1RGVzY3JpcHRvckluZm8gfCBEZXNjcmlwdG9yIHwgaW1wb3J0KCdAYml0Z28vd2FzbS11dHhvJykuYXN0LkRlc2NyaXB0b3JOb2RlXG4pOiBQb3g1RGVzY3JpcHRvckluZm8ge1xuICBpZiAoaXNQb3g1RGVzY3JpcHRvckluZm8oZGVzY3JpcHRvcikpIHtcbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfVxuICBjb25zdCBpbmZvID0gcGFyc2VQb3g1TG9ja3VwRGVzY3JpcHRvcihkZXNjcmlwdG9yKTtcbiAgaWYgKCFpbmZvKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkZXNjcmlwdG9yIGlzIG5vdCBhIGNhbm9uaWNhbCBQb1gtNSBsb2NrdXAgZGVzY3JpcHRvcicpO1xuICB9XG4gIHJldHVybiBpbmZvO1xufVxuXG4vKiogVmVyaWZ5IHRoYXQgYSBwcmluY2lwYWwgcHJlaW1hZ2UgaXMgY29tbWl0dGVkIGJ5IGEgY2Fub25pY2FsIFBvWC01IGRlc2NyaXB0b3IuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UG94NVByaW5jaXBhbFByZWltYWdlKFxuICBkZXNjcmlwdG9yOiBQb3g1RGVzY3JpcHRvckluZm8gfCBEZXNjcmlwdG9yIHwgaW1wb3J0KCdAYml0Z28vd2FzbS11dHhvJykuYXN0LkRlc2NyaXB0b3JOb2RlLFxuICBwcmluY2lwYWxQcmVpbWFnZTogVWludDhBcnJheVxuKTogdm9pZCB7XG4gIGlmIChwcmluY2lwYWxQcmVpbWFnZS5sZW5ndGggIT09IDMyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcmluY2lwYWxQcmVpbWFnZSBtdXN0IGJlIDMyIGJ5dGVzJyk7XG4gIH1cbiAgY29uc3QgaW5mbyA9IGdldFBveDVEZXNjcmlwdG9ySW5mbyhkZXNjcmlwdG9yKTtcbiAgY29uc3QgZGlnZXN0ID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHByaW5jaXBhbFByZWltYWdlKS5kaWdlc3QoKTtcbiAgaWYgKCFkaWdlc3QuZXF1YWxzKGluZm8uc3Rha2VyQ29tbWl0bWVudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByaW5jaXBhbFByZWltYWdlIGRvZXMgbm90IG1hdGNoIHRoZSBkZXNjcmlwdG9yIHN0YWtlckNvbW1pdG1lbnQnKTtcbiAgfVxufVxuXG4vKiogQWxpYXMgZm9yIGNhbGxlcnMgdGhhdCBwcmVmZXIgdmFsaWRhdGlvbiB0ZXJtaW5vbG9neS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVBveDVQcmluY2lwYWxQcmVpbWFnZShcbiAgZGVzY3JpcHRvcjogUG94NURlc2NyaXB0b3JJbmZvIHwgRGVzY3JpcHRvciB8IGltcG9ydCgnQGJpdGdvL3dhc20tdXR4bycpLmFzdC5EZXNjcmlwdG9yTm9kZSxcbiAgcHJpbmNpcGFsUHJlaW1hZ2U6IFVpbnQ4QXJyYXlcbik6IHZvaWQge1xuICBhc3NlcnRQb3g1UHJpbmNpcGFsUHJlaW1hZ2UoZGVzY3JpcHRvciwgcHJpbmNpcGFsUHJlaW1hZ2UpO1xufVxuIl19
|
|
@@ -30,6 +30,14 @@ export type ParsedSbtcDepositDescriptor = {
|
|
|
30
30
|
depositMiniscriptNode: ast.MiniscriptNode;
|
|
31
31
|
/** Raw miniscript AST for the reclaim leaf (second tap-tree leaf). */
|
|
32
32
|
reclaimMiniscriptNode: ast.MiniscriptNode;
|
|
33
|
+
/**
|
|
34
|
+
* The three raw `multi_a` key entries from the reclaim leaf, exactly as
|
|
35
|
+
* they appear in the descriptor — `xpub.../*` for derivable descriptors and
|
|
36
|
+
* 64-hex-char x-only keys for definite descriptors. Useful for callers that
|
|
37
|
+
* need the original xpub form (e.g. to round-trip back to a descriptor
|
|
38
|
+
* builder) and don't want the resolved `reclaimKeys` buffers.
|
|
39
|
+
*/
|
|
40
|
+
reclaimKeyStrings: [string, string, string];
|
|
33
41
|
};
|
|
34
42
|
/**
|
|
35
43
|
* Parse an sBTC peg-in deposit descriptor and return its components.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseDescriptor.d.ts","sourceRoot":"","sources":["../../../../src/sbtc/parseDescriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,UAAU,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAK1D;;;;;;;GAOG;AACH,MAAM,MAAM,2BAA2B,GAAG;IACxC,kEAAkE;IAClE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,eAAe,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;;OAQG;IACH,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAClD,qEAAqE;IACrE,qBAAqB,EAAE,GAAG,CAAC,cAAc,CAAC;IAC1C,sEAAsE;IACtE,qBAAqB,EAAE,GAAG,CAAC,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"parseDescriptor.d.ts","sourceRoot":"","sources":["../../../../src/sbtc/parseDescriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,UAAU,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAK1D;;;;;;;GAOG;AACH,MAAM,MAAM,2BAA2B,GAAG;IACxC,kEAAkE;IAClE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,eAAe,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;;OAQG;IACH,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAClD,qEAAqE;IACrE,qBAAqB,EAAE,GAAG,CAAC,cAAc,CAAC;IAC1C,sEAAsE;IACtE,qBAAqB,EAAE,GAAG,CAAC,cAAc,CAAC;IAC1C;;;;;;OAMG;IACH,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C,CAAC;AAwJF;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,UAAU,GAAG,GAAG,CAAC,cAAc,GAC1C,2BAA2B,GAAG,IAAI,CA8CpC"}
|