@bitgo-beta/utxo-descriptors 0.0.1-beta.236 → 0.0.1-beta.237

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,3 @@
1
1
  export * as sbtc from './sbtc';
2
+ export * as pox5 from './pox5';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -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/esm/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export * as sbtc from './sbtc';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBhcyBzYnRjIGZyb20gJy4vc2J0Yyc7XG4iXX0=
2
+ export * as pox5 from './pox5';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxLQUFLLElBQUksTUFBTSxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBhcyBzYnRjIGZyb20gJy4vc2J0Yyc7XG5leHBvcnQgKiBhcyBwb3g1IGZyb20gJy4vcG94NSc7XG4iXX0=
@@ -0,0 +1,22 @@
1
+ import { bip32 } 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): string;
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,EAAc,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,MAAM,CAoBrF;AAED,wEAAwE;AACxE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,0BAA0B,EAAE,eAAe,SAAI,GAAG,MAAM,CAQ5G;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,73 @@
1
+ import { ast, Descriptor } from '@bitgo/wasm-utxo';
2
+ function validateCompressedKey(key, field) {
3
+ if (key.length !== 33 || (key[0] !== 0x02 && key[0] !== 0x03)) {
4
+ throw new Error(`${field} must be a 33-byte compressed public key`);
5
+ }
6
+ }
7
+ function isBip32Triple(keys) {
8
+ return keys.every((key) => !Buffer.isBuffer(key));
9
+ }
10
+ function asDescriptorKey(key, field) {
11
+ if (Buffer.isBuffer(key)) {
12
+ validateCompressedKey(key, field);
13
+ return key.toString('hex');
14
+ }
15
+ return key.neutered().toBase58() + '/*';
16
+ }
17
+ function validateParams(params) {
18
+ if (!Number.isSafeInteger(params.unlockHeight) || params.unlockHeight <= 0 || params.unlockHeight >= 500000000) {
19
+ throw new Error(`unlockHeight (${params.unlockHeight}) must be a positive block height below 500000000`);
20
+ }
21
+ if (params.stakerCommitment.length !== 32) {
22
+ throw new Error(`stakerCommitment must be 32 bytes (got ${params.stakerCommitment.length})`);
23
+ }
24
+ validateCompressedKey(params.earlyExitKey, 'earlyExitKey');
25
+ const bufferCount = params.stakerKeys.filter(Buffer.isBuffer).length;
26
+ if (bufferCount !== 0 && bufferCount !== params.stakerKeys.length) {
27
+ throw new Error('stakerKeys must contain either three BIP32 keys or three compressed public keys');
28
+ }
29
+ params.stakerKeys.forEach((key, index) => {
30
+ if (Buffer.isBuffer(key)) {
31
+ validateCompressedKey(key, `stakerKeys[${index}]`);
32
+ }
33
+ });
34
+ }
35
+ /**
36
+ * Build the canonical PoX-5 P2WSH descriptor. The post-CLTV and early-exit
37
+ * paths share BitGo's standard 2-of-3 compressed-key multisig tail.
38
+ */
39
+ export function createPox5LockupDescriptor(params) {
40
+ validateParams(params);
41
+ const stakerKeys = params.stakerKeys.map((key, index) => asDescriptorKey(key, `stakerKeys[${index}]`));
42
+ const miniscript = {
43
+ and_v: [
44
+ {
45
+ 'v:or_i': [
46
+ { after: params.unlockHeight },
47
+ {
48
+ and_v: [
49
+ { 'v:sha256': params.stakerCommitment.toString('hex') },
50
+ { pk: params.earlyExitKey.toString('hex') },
51
+ ],
52
+ },
53
+ ],
54
+ },
55
+ { multi: [2, ...stakerKeys] },
56
+ ],
57
+ };
58
+ return ast.formatNode({ wsh: miniscript });
59
+ }
60
+ /** Compile the PoX-5 P2WSH scriptPubKey at a BIP32 derivation index. */
61
+ export function createPox5LockupScriptPubKey(params, derivationIndex = 0) {
62
+ const descriptor = createPox5LockupDescriptor(params);
63
+ if (isBip32Triple(params.stakerKeys)) {
64
+ return Buffer.from(Descriptor.fromString(descriptor, 'derivable').atDerivationIndex(derivationIndex).scriptPubkey());
65
+ }
66
+ return Buffer.from(Descriptor.fromString(descriptor, 'definite').scriptPubkey());
67
+ }
68
+ /** Derive the compressed staker keys needed to prepare a witness at an index. */
69
+ export function derivePox5StakerKeys(stakerKeys, index) {
70
+ const keys = stakerKeys.map((key) => Buffer.from(key.derive(index).publicKey));
71
+ return [keys[0], keys[1], keys[2]];
72
+ }
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wb3g1L2Rlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBUyxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQWUxRCxTQUFTLHFCQUFxQixDQUFDLEdBQVcsRUFBRSxLQUFhO0lBQ3ZELElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzlELE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLDBDQUEwQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FDcEIsSUFBOEM7SUFFOUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsR0FBa0IsRUFBRSxLQUFhO0lBQ3hELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3pCLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsQyxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMxQyxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsTUFBa0M7SUFDeEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLE1BQU0s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QUFDO0FBRUQsaUZBQWlGO0FBQ2pGLE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsVUFBNEQsRUFDNUQsS0FBYTtJQUViLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQy9FLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3QsIGJpcDMyLCBEZXNjcmlwdG9yIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbnR5cGUgQklQMzJJbnRlcmZhY2UgPSBiaXAzMi5CSVAzMkludGVyZmFjZTtcblxuZXhwb3J0IHR5cGUgUG94NVN0YWtlcktleSA9IEJJUDMySW50ZXJmYWNlIHwgQnVmZmVyO1xuXG5leHBvcnQgdHlwZSBQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtcyA9IHtcbiAgdW5sb2NrSGVpZ2h0OiBudW1iZXI7XG4gIC8qKiBzaGEyNTYoc2hhMjU2KENsYXJpdHkgY29uc2Vuc3VzIHByaW5jaXBhbCBieXRlcykpLiAqL1xuICBzdGFrZXJDb21taXRtZW50OiBCdWZmZXI7XG4gIGVhcmx5RXhpdEtleTogQnVmZmVyO1xuICAvKiogVXNlciwgYmFja3VwLCBhbmQgQml0R28ga2V5cywgYWxsIEJJUDMyIG9yIGFsbCBjb25jcmV0ZSBjb21wcmVzc2VkIGtleXMuICovXG4gIHN0YWtlcktleXM6IFtQb3g1U3Rha2VyS2V5LCBQb3g1U3Rha2VyS2V5LCBQb3g1U3Rha2VyS2V5XTtcbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ29tcHJlc3NlZEtleShrZXk6IEJ1ZmZlciwgZmllbGQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoa2V5Lmxlbmd0aCAhPT0gMzMgfHwgKGtleVswXSAhPT0gMHgwMiAmJiBrZXlbMF0gIT09IDB4MDMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2ZpZWxkfSBtdXN0IGJlIGEgMzMtYnl0ZSBjb21wcmVzc2VkIHB1YmxpYyBrZXlgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0JpcDMyVHJpcGxlKFxuICBrZXlzOiBQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtc1snc3Rha2VyS2V5cyddXG4pOiBrZXlzIGlzIFtCSVAzMkludGVyZmFjZSwgQklQMzJJbnRlcmZhY2UsIEJJUDMySW50ZXJmYWNlXSB7XG4gIHJldHVybiBrZXlzLmV2ZXJ5KChrZXkpID0+ICFCdWZmZXIuaXNCdWZmZXIoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIGFzRGVzY3JpcHRvcktleShrZXk6IFBveDVTdGFrZXJLZXksIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGtleSkpIHtcbiAgICB2YWxpZGF0ZUNvbXByZXNzZWRLZXkoa2V5LCBmaWVsZCk7XG4gICAgcmV0dXJuIGtleS50b1N0cmluZygnaGV4Jyk7XG4gIH1cbiAgcmV0dXJuIGtleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgKyAnLyonO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVBhcmFtcyhwYXJhbXM6IFBveDVMb2NrdXBEZXNjcmlwdG9yUGFyYW1zKTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIocGFyYW1zLnVubG9ja0hlaWdodCkgfHwgcGFyYW1zLnVubG9ja0hlaWdodCA8PSAwIHx8IHBhcmFtcy51bmxvY2tIZWlnaHQgPj0gNTAwXzAwMF8wMDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVubG9ja0hlaWdodCAoJHtwYXJhbXMudW5sb2NrSGVpZ2h0fSkgbXVzdCBiZSBhIHBvc2l0aXZlIGJsb2NrIGhlaWdodCBiZWxvdyA1MDAwMDAwMDBgKTtcbiAgfVxuICBpZiAocGFyYW1zLnN0YWtlckNvbW1pdG1lbnQubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgc3Rha2VyQ29tbWl0bWVudCBtdXN0IGJlIDMyIGJ5dGVzIChnb3QgJHtwYXJhbXMuc3Rha2VyQ29tbWl0bWVudC5sZW5ndGh9KWApO1xuICB9XG4gIHZhbGlkYXRlQ29tcHJlc3NlZEtleShwYXJhbXMuZWFybHlFeGl0S2V5LCAnZWFybHlFeGl0S2V5Jyk7XG5cbiAgY29uc3QgYnVmZmVyQ291bnQgPSBwYXJhbXMuc3Rha2VyS2V5cy5maWx0ZXIoQnVmZmVyLmlzQnVmZmVyKS5sZW5ndGg7XG4gIGlmIChidWZmZXJDb3VudCAhPT0gMCAmJiBidWZmZXJDb3VudCAhPT0gcGFyYW1zLnN0YWtlcktleXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzdGFrZXJLZXlzIG11c3QgY29udGFpbiBlaXRoZXIgdGhyZWUgQklQMzIga2V5cyBvciB0aHJlZSBjb21wcmVzc2VkIHB1YmxpYyBrZXlzJyk7XG4gIH1cbiAgcGFyYW1zLnN0YWtlcktleXMuZm9yRWFjaCgoa2V5LCBpbmRleCkgPT4ge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgICAgdmFsaWRhdGVDb21wcmVzc2VkS2V5KGtleSwgYHN0YWtlcktleXNbJHtpbmRleH1dYCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgY2Fub25pY2FsIFBvWC01IFAyV1NIIGRlc2NyaXB0b3IuIFRoZSBwb3N0LUNMVFYgYW5kIGVhcmx5LWV4aXRcbiAqIHBhdGhzIHNoYXJlIEJpdEdvJ3Mgc3RhbmRhcmQgMi1vZi0zIGNvbXByZXNzZWQta2V5IG11bHRpc2lnIHRhaWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcihwYXJhbXM6IFBveDVMb2NrdXBEZXNjcmlwdG9yUGFyYW1zKTogc3RyaW5nIHtcbiAgdmFsaWRhdGVQYXJhbXMocGFyYW1zKTtcbiAgY29uc3Qgc3Rha2VyS2V5cyA9IHBhcmFtcy5zdGFrZXJLZXlzLm1hcCgoa2V5LCBpbmRleCkgPT4gYXNEZXNjcmlwdG9yS2V5KGtleSwgYHN0YWtlcktleXNbJHtpbmRleH1dYCkpO1xuICBjb25zdCBtaW5pc2NyaXB0OiBhc3QuTWluaXNjcmlwdE5vZGUgPSB7XG4gICAgYW5kX3Y6IFtcbiAgICAgIHtcbiAgICAgICAgJ3Y6b3JfaSc6IFtcbiAgICAgICAgICB7IGFmdGVyOiBwYXJhbXMudW5sb2NrSGVpZ2h0IH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYW5kX3Y6IFtcbiAgICAgICAgICAgICAgeyAndjpzaGEyNTYnOiBwYXJhbXMuc3Rha2VyQ29tbWl0bWVudC50b1N0cmluZygnaGV4JykgfSxcbiAgICAgICAgICAgICAgeyBwazogcGFyYW1zLmVhcmx5RXhpdEtleS50b1N0cmluZygnaGV4JykgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7IG11bHRpOiBbMiwgLi4uc3Rha2VyS2V5c10gfSxcbiAgICBdLFxuICB9O1xuICByZXR1cm4gYXN0LmZvcm1hdE5vZGUoeyB3c2g6IG1pbmlzY3JpcHQgfSk7XG59XG5cbi8qKiBDb21waWxlIHRoZSBQb1gtNSBQMldTSCBzY3JpcHRQdWJLZXkgYXQgYSBCSVAzMiBkZXJpdmF0aW9uIGluZGV4LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBveDVMb2NrdXBTY3JpcHRQdWJLZXkocGFyYW1zOiBQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtcywgZGVyaXZhdGlvbkluZGV4ID0gMCk6IEJ1ZmZlciB7XG4gIGNvbnN0IGRlc2NyaXB0b3IgPSBjcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcihwYXJhbXMpO1xuICBpZiAoaXNCaXAzMlRyaXBsZShwYXJhbXMuc3Rha2VyS2V5cykpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgICBEZXNjcmlwdG9yLmZyb21TdHJpbmcoZGVzY3JpcHRvciwgJ2Rlcml2YWJsZScpLmF0RGVyaXZhdGlvbkluZGV4KGRlcml2YXRpb25JbmRleCkuc2NyaXB0UHVia2V5KClcbiAgICApO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbShEZXNjcmlwdG9yLmZyb21TdHJpbmcoZGVzY3JpcHRvciwgJ2RlZmluaXRlJykuc2NyaXB0UHVia2V5KCkpO1xufVxuXG4vKiogRGVyaXZlIHRoZSBjb21wcmVzc2VkIHN0YWtlciBrZXlzIG5lZWRlZCB0byBwcmVwYXJlIGEgd2l0bmVzcyBhdCBhbiBpbmRleC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVQb3g1U3Rha2VyS2V5cyhcbiAgc3Rha2VyS2V5czogW0JJUDMySW50ZXJmYWNlLCBCSVAzMkludGVyZmFjZSwgQklQMzJJbnRlcmZhY2VdLFxuICBpbmRleDogbnVtYmVyXG4pOiBbQnVmZmVyLCBCdWZmZXIsIEJ1ZmZlcl0ge1xuICBjb25zdCBrZXlzID0gc3Rha2VyS2V5cy5tYXAoKGtleSkgPT4gQnVmZmVyLmZyb20oa2V5LmRlcml2ZShpbmRleCkucHVibGljS2V5KSk7XG4gIHJldHVybiBba2V5c1swXSwga2V5c1sxXSwga2V5c1syXV07XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ export * from './descriptor';
2
+ export * from './parseDescriptor';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -0,0 +1,3 @@
1
+ export * from './descriptor';
2
+ export * from './parseDescriptor';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcG94NS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9kZXNjcmlwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vcGFyc2VEZXNjcmlwdG9yJztcbiJdfQ==
@@ -0,0 +1,16 @@
1
+ import { Descriptor, ast } from '@bitgo/wasm-utxo';
2
+ export type ParsedPox5LockupDescriptor = {
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
+ /**
11
+ * Parse only the canonical PoX-5 descriptor template. Other descriptors return
12
+ * null; malformed fields within the template throw so callers cannot finalize
13
+ * a script under an ambiguous policy.
14
+ */
15
+ export declare function parsePox5LockupDescriptor(descriptor: Descriptor | ast.DescriptorNode): ParsedPox5LockupDescriptor | null;
16
+ //# 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,EAAE,MAAM,kBAAkB,CAAC;AAG1D,MAAM,MAAM,0BAA0B,GAAG;IACvC,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;AA2CF;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,UAAU,GAAG,GAAG,CAAC,cAAc,GAC1C,0BAA0B,GAAG,IAAI,CAmDnC"}
@@ -0,0 +1,93 @@
1
+ import { BIP32, Descriptor, ast } from '@bitgo/wasm-utxo';
2
+ import { PatternMatcher } from '@bitgo-beta/utxo-core/descriptor';
3
+ const COMPRESSED_KEY = /^(02|03)[0-9a-fA-F]{64}$/;
4
+ const XPUB_WITH_INDEX = /^([1-9A-HJ-NP-Za-km-z]+)\/(\d+)$/;
5
+ function asNumber(value, field) {
6
+ if (typeof value !== 'number') {
7
+ throw new Error(`${field} must be a number`);
8
+ }
9
+ return value;
10
+ }
11
+ function asString(value, field) {
12
+ if (typeof value !== 'string') {
13
+ throw new Error(`${field} must be a string`);
14
+ }
15
+ return value;
16
+ }
17
+ function parseCompressedKey(value, field) {
18
+ if (!COMPRESSED_KEY.test(value)) {
19
+ throw new Error(`${field} must be a compressed public key`);
20
+ }
21
+ return Buffer.from(value, 'hex');
22
+ }
23
+ function resolveStakerKey(value) {
24
+ if (COMPRESSED_KEY.test(value)) {
25
+ return Buffer.from(value, 'hex');
26
+ }
27
+ const match = value.match(XPUB_WITH_INDEX);
28
+ if (!match) {
29
+ return undefined;
30
+ }
31
+ const [, xpub, indexString] = match;
32
+ const index = Number.parseInt(indexString, 10);
33
+ try {
34
+ return Buffer.from(BIP32.fromBase58(xpub).derive(index).publicKey);
35
+ }
36
+ catch {
37
+ return undefined;
38
+ }
39
+ }
40
+ /**
41
+ * Parse only the canonical PoX-5 descriptor template. Other descriptors return
42
+ * null; malformed fields within the template throw so callers cannot finalize
43
+ * a script under an ambiguous policy.
44
+ */
45
+ export function parsePox5LockupDescriptor(descriptor) {
46
+ const matcher = new PatternMatcher();
47
+ const descriptorNode = descriptor instanceof Descriptor ? ast.fromDescriptor(descriptor) : descriptor;
48
+ const matched = matcher.match(descriptorNode, { wsh: { $var: 'miniscript' } });
49
+ if (!matched) {
50
+ return null;
51
+ }
52
+ const miniscriptNode = matched.miniscript;
53
+ const pattern = {
54
+ and_v: [
55
+ {
56
+ 'v:or_i': [
57
+ { after: { $var: 'unlockHeight' } },
58
+ { and_v: [{ 'v:sha256': { $var: 'stakerCommitment' } }, { pk: { $var: 'earlyExitKey' } }] },
59
+ ],
60
+ },
61
+ { multi: { $var: 'stakerMulti' } },
62
+ ],
63
+ };
64
+ const fields = matcher.match(miniscriptNode, pattern);
65
+ if (!fields) {
66
+ return null;
67
+ }
68
+ const unlockHeight = asNumber(fields.unlockHeight, 'after argument');
69
+ if (!Number.isSafeInteger(unlockHeight) || unlockHeight <= 0 || unlockHeight >= 500000000) {
70
+ throw new Error(`unlockHeight (${unlockHeight}) must be a positive block height below 500000000`);
71
+ }
72
+ const commitmentHex = asString(fields.stakerCommitment, 'sha256 commitment');
73
+ if (!/^[0-9a-fA-F]{64}$/.test(commitmentHex)) {
74
+ throw new Error('stakerCommitment must be 32 bytes');
75
+ }
76
+ const earlyExitKey = parseCompressedKey(asString(fields.earlyExitKey, 'early exit key'), 'earlyExitKey');
77
+ if (!Array.isArray(fields.stakerMulti) || fields.stakerMulti.length !== 4 || fields.stakerMulti[0] !== 2) {
78
+ throw new Error('staker multi must be a 2-of-3 multisig');
79
+ }
80
+ const stakerKeyStrings = fields.stakerMulti.slice(1).map((key, index) => asString(key, `staker key ${index}`));
81
+ const resolvedKeys = stakerKeyStrings.map(resolveStakerKey);
82
+ return {
83
+ unlockHeight,
84
+ stakerCommitment: Buffer.from(commitmentHex, 'hex'),
85
+ earlyExitKey,
86
+ stakerKeyStrings: [stakerKeyStrings[0], stakerKeyStrings[1], stakerKeyStrings[2]],
87
+ stakerKeys: resolvedKeys.every((key) => key !== undefined)
88
+ ? [resolvedKeys[0], resolvedKeys[1], resolvedKeys[2]]
89
+ : undefined,
90
+ miniscriptNode,
91
+ };
92
+ }
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VEZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BveDUvcGFyc2VEZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELE9BQU8sRUFBVyxjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQVczRSxNQUFNLGNBQWMsR0FBRywwQkFBMEIsQ0FBQztBQUNsRCxNQUFNLGVBQWUsR0FBRyxrQ0FBa0MsQ0FBQztBQUUzRCxTQUFTLFFBQVEsQ0FBQyxLQUFjLEVBQUUsS0FBYTtJQUM3QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLG1CQUFtQixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLEtBQWMsRUFBRSxLQUFhO0lBQzdDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssbUJBQW1CLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxLQUFhLEVBQUUsS0FBYTtJQUN0RCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLGtDQUFrQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsS0FBYTtJQUNyQyxJ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QUMsU0FBUztRQUNiLGNBQWM7S0FDZixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJJUDMyLCBEZXNjcmlwdG9yLCBhc3QgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IFBhdHRlcm4sIFBhdHRlcm5NYXRjaGVyIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1jb3JlL2Rlc2NyaXB0b3InO1xuXG5leHBvcnQgdHlwZSBQYXJzZWRQb3g1TG9ja3VwRGVzY3JpcHRvciA9IHtcbiAgdW5sb2NrSGVpZ2h0OiBudW1iZXI7XG4gIHN0YWtlckNvbW1pdG1lbnQ6IEJ1ZmZlcjtcbiAgZWFybHlFeGl0S2V5OiBCdWZmZXI7XG4gIHN0YWtlcktleVN0cmluZ3M6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXTtcbiAgc3Rha2VyS2V5czogW0J1ZmZlciwgQnVmZmVyLCBCdWZmZXJdIHwgdW5kZWZpbmVkO1xuICBtaW5pc2NyaXB0Tm9kZTogYXN0Lk1pbmlzY3JpcHROb2RlO1xufTtcblxuY29uc3QgQ09NUFJFU1NFRF9LRVkgPSAvXigwMnwwMylbMC05YS1mQS1GXXs2NH0kLztcbmNvbnN0IFhQVUJfV0lUSF9JTkRFWCA9IC9eKFsxLTlBLUhKLU5QLVphLWttLXpdKylcXC8oXFxkKykkLztcblxuZnVuY3Rpb24gYXNOdW1iZXIodmFsdWU6IHVua25vd24sIGZpZWxkOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZH0gbXVzdCBiZSBhIG51bWJlcmApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYXNTdHJpbmcodmFsdWU6IHVua25vd24sIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZH0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gcGFyc2VDb21wcmVzc2VkS2V5KHZhbHVlOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcpOiBCdWZmZXIge1xuICBpZiAoIUNPTVBSRVNTRURfS0VZLnRlc3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2ZpZWxkfSBtdXN0IGJlIGEgY29tcHJlc3NlZCBwdWJsaWMga2V5YCk7XG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlLCAnaGV4Jyk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTdGFrZXJLZXkodmFsdWU6IHN0cmluZyk6IEJ1ZmZlciB8IHVuZGVmaW5lZCB7XG4gIGlmIChDT01QUkVTU0VEX0tFWS50ZXN0KHZhbHVlKSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSwgJ2hleCcpO1xuICB9XG4gIGNvbnN0IG1hdGNoID0gdmFsdWUubWF0Y2goWFBVQl9XSVRIX0lOREVYKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgWywgeHB1YiwgaW5kZXhTdHJpbmddID0gbWF0Y2g7XG4gIGNvbnN0IGluZGV4ID0gTnVtYmVyLnBhcnNlSW50KGluZGV4U3RyaW5nLCAxMCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKEJJUDMyLmZyb21CYXNlNTgoeHB1YikuZGVyaXZlKGluZGV4KS5wdWJsaWNLZXkpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2Ugb25seSB0aGUgY2Fub25pY2FsIFBvWC01IGRlc2NyaXB0b3IgdGVtcGxhdGUuIE90aGVyIGRlc2NyaXB0b3JzIHJldHVyblxuICogbnVsbDsgbWFsZm9ybWVkIGZpZWxkcyB3aXRoaW4gdGhlIHRlbXBsYXRlIHRocm93IHNvIGNhbGxlcnMgY2Fubm90IGZpbmFsaXplXG4gKiBhIHNjcmlwdCB1bmRlciBhbiBhbWJpZ3VvdXMgcG9saWN5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQb3g1TG9ja3VwRGVzY3JpcHRvcihcbiAgZGVzY3JpcHRvcjogRGVzY3JpcHRvciB8IGFzdC5EZXNjcmlwdG9yTm9kZVxuKTogUGFyc2VkUG94NUxvY2t1cERlc2NyaXB0b3IgfCBudWxsIHtcbiAgY29uc3QgbWF0Y2hlciA9IG5ldyBQYXR0ZXJuTWF0Y2hlcigpO1xuICBjb25zdCBkZXNjcmlwdG9yTm9kZSA9IGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBEZXNjcmlwdG9yID8gYXN0LmZyb21EZXNjcmlwdG9yKGRlc2NyaXB0b3IpIDogZGVzY3JpcHRvcjtcbiAgY29uc3QgbWF0Y2hlZCA9IG1hdGNoZXIubWF0Y2goZGVzY3JpcHRvck5vZGUsIHsgd3NoOiB7ICR2YXI6ICdtaW5pc2NyaXB0JyB9IH0pO1xuICBpZiAoIW1hdGNoZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG1pbmlzY3JpcHROb2RlID0gbWF0Y2hlZC5taW5pc2NyaXB0IGFzIGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgY29uc3QgcGF0dGVybjogUGF0dGVybiA9IHtcbiAgICBhbmRfdjogW1xuICAgICAge1xuICAgICAgICAndjpvcl9pJzogW1xuICAgICAgICAgIHsgYWZ0ZXI6IHsgJHZhcjogJ3VubG9ja0hlaWdodCcgfSB9LFxuICAgICAgICAgIHsgYW5kX3Y6IFt7ICd2OnNoYTI1Nic6IHsgJHZhcjogJ3N0YWtlckNvbW1pdG1lbnQnIH0gfSwgeyBwazogeyAkdmFyOiAnZWFybHlFeGl0S2V5JyB9IH1dIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgeyBtdWx0aTogeyAkdmFyOiAnc3Rha2VyTXVsdGknIH0gfSxcbiAgICBdLFxuICB9O1xuICBjb25zdCBmaWVsZHMgPSBtYXRjaGVyLm1hdGNoKG1pbmlzY3JpcHROb2RlLCBwYXR0ZXJuKTtcbiAgaWYgKCFmaWVsZHMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHVubG9ja0hlaWdodCA9IGFzTnVtYmVyKGZpZWxkcy51bmxvY2tIZWlnaHQsICdhZnRlciBhcmd1bWVudCcpO1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHVubG9ja0hlaWdodCkgfHwgdW5sb2NrSGVpZ2h0IDw9IDAgfHwgdW5sb2NrSGVpZ2h0ID49IDUwMF8wMDBfMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bmxvY2tIZWlnaHQgKCR7dW5sb2NrSGVpZ2h0fSkgbXVzdCBiZSBhIHBvc2l0aXZlIGJsb2NrIGhlaWdodCBiZWxvdyA1MDAwMDAwMDBgKTtcbiAgfVxuICBjb25zdCBjb21taXRtZW50SGV4ID0gYXNTdHJpbmcoZmllbGRzLnN0YWtlckNvbW1pdG1lbnQsICdzaGEyNTYgY29tbWl0bWVudCcpO1xuICBpZiAoIS9eWzAtOWEtZkEtRl17NjR9JC8udGVzdChjb21taXRtZW50SGV4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignc3Rha2VyQ29tbWl0bWVudCBtdXN0IGJlIDMyIGJ5dGVzJyk7XG4gIH1cbiAgY29uc3QgZWFybHlFeGl0S2V5ID0gcGFyc2VDb21wcmVzc2VkS2V5KGFzU3RyaW5nKGZpZWxkcy5lYXJseUV4aXRLZXksICdlYXJseSBleGl0IGtleScpLCAnZWFybHlFeGl0S2V5Jyk7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGZpZWxkcy5zdGFrZXJNdWx0aSkgfHwgZmllbGRzLnN0YWtlck11bHRpLmxlbmd0aCAhPT0gNCB8fCBmaWVsZHMuc3Rha2VyTXVsdGlbMF0gIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YWtlciBtdWx0aSBtdXN0IGJlIGEgMi1vZi0zIG11bHRpc2lnJyk7XG4gIH1cbiAgY29uc3Qgc3Rha2VyS2V5U3RyaW5ncyA9IGZpZWxkcy5zdGFrZXJNdWx0aS5zbGljZSgxKS5tYXAoKGtleSwgaW5kZXgpID0+IGFzU3RyaW5nKGtleSwgYHN0YWtlciBrZXkgJHtpbmRleH1gKSk7XG4gIGNvbnN0IHJlc29sdmVkS2V5cyA9IHN0YWtlcktleVN0cmluZ3MubWFwKHJlc29sdmVTdGFrZXJLZXkpO1xuXG4gIHJldHVybiB7XG4gICAgdW5sb2NrSGVpZ2h0LFxuICAgIHN0YWtlckNvbW1pdG1lbnQ6IEJ1ZmZlci5mcm9tKGNvbW1pdG1lbnRIZXgsICdoZXgnKSxcbiAgICBlYXJseUV4aXRLZXksXG4gICAgc3Rha2VyS2V5U3RyaW5nczogW3N0YWtlcktleVN0cmluZ3NbMF0sIHN0YWtlcktleVN0cmluZ3NbMV0sIHN0YWtlcktleVN0cmluZ3NbMl1dLFxuICAgIHN0YWtlcktleXM6IHJlc29sdmVkS2V5cy5ldmVyeSgoa2V5KToga2V5IGlzIEJ1ZmZlciA9PiBrZXkgIT09IHVuZGVmaW5lZClcbiAgICAgID8gW3Jlc29sdmVkS2V5c1swXSwgcmVzb2x2ZWRLZXlzWzFdLCByZXNvbHZlZEtleXNbMl1dXG4gICAgICA6IHVuZGVmaW5lZCxcbiAgICBtaW5pc2NyaXB0Tm9kZSxcbiAgfTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitgo-beta/utxo-descriptors",
3
- "version": "0.0.1-beta.236",
3
+ "version": "0.0.1-beta.237",
4
4
  "description": "BitGo SDK for building UTXO descriptors",
5
5
  "main": "./dist/cjs/src/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -59,8 +59,11 @@
59
59
  ]
60
60
  },
61
61
  "dependencies": {
62
- "@bitgo-beta/utxo-core": "1.8.1-beta.1103",
63
- "@bitgo/wasm-utxo": "^4.27.0"
62
+ "@bitgo-beta/utxo-core": "1.8.1-beta.1104",
63
+ "@bitgo/wasm-utxo": "^4.39.0"
64
64
  },
65
- "gitHead": "39312ef87f9b7e17279e06cfa32249ee5b56199f"
65
+ "devDependencies": {
66
+ "@stacks/bitcoin-staking": "7.6.0"
67
+ },
68
+ "gitHead": "73e22c9de84e4393b28fc7697eed36a7c361fb5d"
66
69
  }