@bitgo/utxo-staking 1.43.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/src/pox5/index.d.ts +1 -0
- package/dist/cjs/src/pox5/index.d.ts.map +1 -1
- package/dist/cjs/src/pox5/index.js +2 -1
- package/dist/cjs/src/pox5/recovery.d.ts +13 -0
- package/dist/cjs/src/pox5/recovery.d.ts.map +1 -0
- package/dist/cjs/src/pox5/recovery.js +75 -0
- package/dist/cjs/src/pox5/witness.d.ts +5 -8
- package/dist/cjs/src/pox5/witness.d.ts.map +1 -1
- package/dist/cjs/src/pox5/witness.js +11 -30
- package/dist/cjs/test/unit/pox5/recovery.d.ts +2 -0
- package/dist/cjs/test/unit/pox5/recovery.d.ts.map +1 -0
- package/dist/cjs/test/unit/pox5/recovery.js +88 -0
- package/dist/cjs/test/unit/pox5/witness.js +12 -12
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/pox5/index.d.ts +1 -0
- package/dist/esm/pox5/index.d.ts.map +1 -1
- package/dist/esm/pox5/index.js +2 -1
- package/dist/esm/pox5/recovery.d.ts +13 -0
- package/dist/esm/pox5/recovery.d.ts.map +1 -0
- package/dist/esm/pox5/recovery.js +68 -0
- package/dist/esm/pox5/witness.d.ts +5 -8
- package/dist/esm/pox5/witness.d.ts.map +1 -1
- package/dist/esm/pox5/witness.js +11 -30
- package/package.json +5 -5
package/dist/esm/pox5/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pox5/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pox5/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
|
package/dist/esm/pox5/index.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export * from './witness';
|
|
2
|
-
|
|
2
|
+
export * from './recovery';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcG94NS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vd2l0bmVzcyc7XG5leHBvcnQgKiBmcm9tICcuL3JlY292ZXJ5JztcbiJdfQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Psbt } from '@bitgo/wasm-utxo';
|
|
2
|
+
import { pox5 } from '@bitgo/utxo-descriptors';
|
|
3
|
+
export declare const POX5_MAX_UNLOCK_HEIGHT = 500000000;
|
|
4
|
+
/** Validate the post-CLTV policy for all canonical PoX-5 inputs in a recovery PSBT. */
|
|
5
|
+
export declare function assertPox5LocktimeSpend(psbt: Psbt, inputs: readonly pox5.Pox5InputMatch[]): void;
|
|
6
|
+
/** Validate that a canonical PoX-5 input can use the principal-preimage branch. */
|
|
7
|
+
export declare function assertPox5EarlyExitSpend(psbt: Psbt, input: pox5.Pox5InputMatch): void;
|
|
8
|
+
export type Pox5SpendBranch = 'locktime' | 'early-exit';
|
|
9
|
+
/** Classify a PoX-5 spend from native principal-preimage metadata. */
|
|
10
|
+
export declare function classifyPox5Spend(psbt: Psbt, input: pox5.Pox5InputMatch): Pox5SpendBranch;
|
|
11
|
+
/** Add validated principal-preimage metadata for an early-exit spend. */
|
|
12
|
+
export declare function preparePox5EarlyExit(psbt: Psbt, inputIndex: number, input: pox5.Pox5InputMatch, principalPreimage: Uint8Array): void;
|
|
13
|
+
//# sourceMappingURL=recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../src/pox5/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAE/C,eAAO,MAAM,sBAAsB,YAAc,CAAC;AA4BlD,uFAAuF;AACvF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAqBhG;AAED,mFAAmF;AACnF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAErF;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,YAAY,CAAC;AAExD,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,GAAG,eAAe,CAMzF;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,IAAI,CAAC,cAAc,EAC1B,iBAAiB,EAAE,UAAU,GAC5B,IAAI,CAON"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Transaction } from '@bitgo/wasm-utxo';
|
|
2
|
+
import { pox5 } from '@bitgo/utxo-descriptors';
|
|
3
|
+
export const POX5_MAX_UNLOCK_HEIGHT = 500000000;
|
|
4
|
+
function assertPox5UnlockHeight(unlockHeight) {
|
|
5
|
+
if (!Number.isSafeInteger(unlockHeight) || unlockHeight <= 0 || unlockHeight >= POX5_MAX_UNLOCK_HEIGHT) {
|
|
6
|
+
throw new Error(`PoX-5 unlock height must be a positive block height below ${POX5_MAX_UNLOCK_HEIGHT}`);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function assertPox5BlockHeightLocktime(lockTime) {
|
|
10
|
+
if (!Number.isSafeInteger(lockTime) || lockTime < 0 || lockTime >= POX5_MAX_UNLOCK_HEIGHT) {
|
|
11
|
+
throw new Error(`PoX-5 nLockTime must be a block height below ${POX5_MAX_UNLOCK_HEIGHT}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function getMatchedTransactionInput(psbt, match) {
|
|
15
|
+
const psbtInput = psbt.getInputs()[match.inputIndex];
|
|
16
|
+
const transactionInput = Transaction.fromBytes(psbt.getUnsignedTx()).getInputs()[match.inputIndex];
|
|
17
|
+
const descriptorScript = Buffer.from(match.descriptor.scriptPubkey());
|
|
18
|
+
if (!psbtInput?.witnessUtxo ||
|
|
19
|
+
!transactionInput ||
|
|
20
|
+
!Buffer.from(psbtInput.witnessUtxo.script).equals(descriptorScript)) {
|
|
21
|
+
throw new Error(`PoX-5 descriptor match does not match PSBT input ${match.inputIndex}`);
|
|
22
|
+
}
|
|
23
|
+
return transactionInput;
|
|
24
|
+
}
|
|
25
|
+
/** Validate the post-CLTV policy for all canonical PoX-5 inputs in a recovery PSBT. */
|
|
26
|
+
export function assertPox5LocktimeSpend(psbt, inputs) {
|
|
27
|
+
if (inputs.length === 0) {
|
|
28
|
+
throw new Error('PoX-5 lockup descriptor match is required');
|
|
29
|
+
}
|
|
30
|
+
const unlockHeights = inputs.map((input) => {
|
|
31
|
+
const { unlockHeight } = input.info;
|
|
32
|
+
assertPox5UnlockHeight(unlockHeight);
|
|
33
|
+
return unlockHeight;
|
|
34
|
+
});
|
|
35
|
+
const lockTime = psbt.lockTime();
|
|
36
|
+
assertPox5BlockHeightLocktime(lockTime);
|
|
37
|
+
const requiredLockTime = Math.max(...unlockHeights);
|
|
38
|
+
if (lockTime < requiredLockTime) {
|
|
39
|
+
throw new Error(`PoX-5 nLockTime must be at least ${requiredLockTime}`);
|
|
40
|
+
}
|
|
41
|
+
for (const input of inputs) {
|
|
42
|
+
if (getMatchedTransactionInput(psbt, input).sequence === 0xffffffff) {
|
|
43
|
+
throw new Error(`PoX-5 locktime spend input ${input.inputIndex} must use a non-final sequence`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Validate that a canonical PoX-5 input can use the principal-preimage branch. */
|
|
48
|
+
export function assertPox5EarlyExitSpend(psbt, input) {
|
|
49
|
+
getMatchedTransactionInput(psbt, input);
|
|
50
|
+
}
|
|
51
|
+
/** Classify a PoX-5 spend from native principal-preimage metadata. */
|
|
52
|
+
export function classifyPox5Spend(psbt, input) {
|
|
53
|
+
getMatchedTransactionInput(psbt, input);
|
|
54
|
+
const hasPrincipalPreimage = psbt
|
|
55
|
+
.getInputKeyValues(input.inputIndex)
|
|
56
|
+
.some((record) => record.type === 'known' && record.key === 'PSBT_IN_SHA256');
|
|
57
|
+
return hasPrincipalPreimage ? 'early-exit' : 'locktime';
|
|
58
|
+
}
|
|
59
|
+
/** Add validated principal-preimage metadata for an early-exit spend. */
|
|
60
|
+
export function preparePox5EarlyExit(psbt, inputIndex, input, principalPreimage) {
|
|
61
|
+
if (inputIndex !== input.inputIndex) {
|
|
62
|
+
throw new Error(`PoX-5 descriptor match belongs to PSBT input ${input.inputIndex}, not ${inputIndex}`);
|
|
63
|
+
}
|
|
64
|
+
assertPox5EarlyExitSpend(psbt, input);
|
|
65
|
+
pox5.assertPox5PrincipalPreimage(input.info, principalPreimage);
|
|
66
|
+
psbt.addSha256Preimage(inputIndex, principalPreimage);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcG94NS9yZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVEsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDckQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLFNBQVcsQ0FBQztBQUVsRCxTQUFTLHNCQUFzQixDQUFDLFlBQW9CO0lBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksSUFBSSxDQUFDLElBQUksWUFBWSxJQUFJLHNCQUFzQixFQUFFLENBQUM7UUFDdkcsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO0lBQ3pHLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyw2QkFBNkIsQ0FBQyxRQUFnQjtJQUNyRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxJQUFJLFFBQVEsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1FBQzFGLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELHNCQUFzQixFQUFFLENBQUMsQ0FBQztJQUM1RixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsMEJBQTBCLENBQUMsSUFBVSxFQUFFLEtBQTBCO0lBQ3hFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckQsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRyxNQUFNLGdCQUFnQixHQUFHLE1BQU0s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LEtBQUssQ0FBQyxDQUFDO0lBQ3RDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDaEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQc2J0LCBUcmFuc2FjdGlvbiB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHsgcG94NSB9IGZyb20gJ0BiaXRnby91dHhvLWRlc2NyaXB0b3JzJztcblxuZXhwb3J0IGNvbnN0IFBPWDVfTUFYX1VOTE9DS19IRUlHSFQgPSA1MDBfMDAwXzAwMDtcblxuZnVuY3Rpb24gYXNzZXJ0UG94NVVubG9ja0hlaWdodCh1bmxvY2tIZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHVubG9ja0hlaWdodCkgfHwgdW5sb2NrSGVpZ2h0IDw9IDAgfHwgdW5sb2NrSGVpZ2h0ID49IFBPWDVfTUFYX1VOTE9DS19IRUlHSFQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBvWC01IHVubG9jayBoZWlnaHQgbXVzdCBiZSBhIHBvc2l0aXZlIGJsb2NrIGhlaWdodCBiZWxvdyAke1BPWDVfTUFYX1VOTE9DS19IRUlHSFR9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0UG94NUJsb2NrSGVpZ2h0TG9ja3RpbWUobG9ja1RpbWU6IG51bWJlcik6IHZvaWQge1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGxvY2tUaW1lKSB8fCBsb2NrVGltZSA8IDAgfHwgbG9ja1RpbWUgPj0gUE9YNV9NQVhfVU5MT0NLX0hFSUdIVCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUG9YLTUgbkxvY2tUaW1lIG11c3QgYmUgYSBibG9jayBoZWlnaHQgYmVsb3cgJHtQT1g1X01BWF9VTkxPQ0tfSEVJR0hUfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1hdGNoZWRUcmFuc2FjdGlvbklucHV0KHBzYnQ6IFBzYnQsIG1hdGNoOiBwb3g1LlBveDVJbnB1dE1hdGNoKSB7XG4gIGNvbnN0IHBzYnRJbnB1dCA9IHBzYnQuZ2V0SW5wdXRzKClbbWF0Y2guaW5wdXRJbmRleF07XG4gIGNvbnN0IHRyYW5zYWN0aW9uSW5wdXQgPSBUcmFuc2FjdGlvbi5mcm9tQnl0ZXMocHNidC5nZXRVbnNpZ25lZFR4KCkpLmdldElucHV0cygpW21hdGNoLmlucHV0SW5kZXhdO1xuICBjb25zdCBkZXNjcmlwdG9yU2NyaXB0ID0gQnVmZmVyLmZyb20obWF0Y2guZGVzY3JpcHRvci5zY3JpcHRQdWJrZXkoKSk7XG4gIGlmIChcbiAgICAhcHNidElucHV0Py53aXRuZXNzVXR4byB8fFxuICAgICF0cmFuc2FjdGlvbklucHV0IHx8XG4gICAgIUJ1ZmZlci5mcm9tKHBzYnRJbnB1dC53aXRuZXNzVXR4by5zY3JpcHQpLmVxdWFscyhkZXNjcmlwdG9yU2NyaXB0KVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBvWC01IGRlc2NyaXB0b3IgbWF0Y2ggZG9lcyBub3QgbWF0Y2ggUFNCVCBpbnB1dCAke21hdGNoLmlucHV0SW5kZXh9YCk7XG4gIH1cbiAgcmV0dXJuIHRyYW5zYWN0aW9uSW5wdXQ7XG59XG5cbi8qKiBWYWxpZGF0ZSB0aGUgcG9zdC1DTFRWIHBvbGljeSBmb3IgYWxsIGNhbm9uaWNhbCBQb1gtNSBpbnB1dHMgaW4gYSByZWNvdmVyeSBQU0JULiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFBveDVMb2NrdGltZVNwZW5kKHBzYnQ6IFBzYnQsIGlucHV0czogcmVhZG9ubHkgcG94NS5Qb3g1SW5wdXRNYXRjaFtdKTogdm9pZCB7XG4gIGlmIChpbnB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQb1gtNSBsb2NrdXAgZGVzY3JpcHRvciBtYXRjaCBpcyByZXF1aXJlZCcpO1xuICB9XG5cbiAgY29uc3QgdW5sb2NrSGVpZ2h0cyA9IGlucHV0cy5tYXAoKGlucHV0KSA9PiB7XG4gICAgY29uc3QgeyB1bmxvY2tIZWlnaHQgfSA9IGlucHV0LmluZm87XG4gICAgYXNzZXJ0UG94NVVubG9ja0hlaWdodCh1bmxvY2tIZWlnaHQpO1xuICAgIHJldHVybiB1bmxvY2tIZWlnaHQ7XG4gIH0pO1xuICBjb25zdCBsb2NrVGltZSA9IHBzYnQubG9ja1RpbWUoKTtcbiAgYXNzZXJ0UG94NUJsb2NrSGVpZ2h0TG9ja3RpbWUobG9ja1RpbWUpO1xuICBjb25zdCByZXF1aXJlZExvY2tUaW1lID0gTWF0aC5tYXgoLi4udW5sb2NrSGVpZ2h0cyk7XG4gIGlmIChsb2NrVGltZSA8IHJlcXVpcmVkTG9ja1RpbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBvWC01IG5Mb2NrVGltZSBtdXN0IGJlIGF0IGxlYXN0ICR7cmVxdWlyZWRMb2NrVGltZX1gKTtcbiAgfVxuICBmb3IgKGNvbnN0IGlucHV0IG9mIGlucHV0cykge1xuICAgIGlmIChnZXRNYXRjaGVkVHJhbnNhY3Rpb25JbnB1dChwc2J0LCBpbnB1dCkuc2VxdWVuY2UgPT09IDB4ZmZmZmZmZmYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUG9YLTUgbG9ja3RpbWUgc3BlbmQgaW5wdXQgJHtpbnB1dC5pbnB1dEluZGV4fSBtdXN0IHVzZSBhIG5vbi1maW5hbCBzZXF1ZW5jZWApO1xuICAgIH1cbiAgfVxufVxuXG4vKiogVmFsaWRhdGUgdGhhdCBhIGNhbm9uaWNhbCBQb1gtNSBpbnB1dCBjYW4gdXNlIHRoZSBwcmluY2lwYWwtcHJlaW1hZ2UgYnJhbmNoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFBveDVFYXJseUV4aXRTcGVuZChwc2J0OiBQc2J0LCBpbnB1dDogcG94NS5Qb3g1SW5wdXRNYXRjaCk6IHZvaWQge1xuICBnZXRNYXRjaGVkVHJhbnNhY3Rpb25JbnB1dChwc2J0LCBpbnB1dCk7XG59XG5cbmV4cG9ydCB0eXBlIFBveDVTcGVuZEJyYW5jaCA9ICdsb2NrdGltZScgfCAnZWFybHktZXhpdCc7XG5cbi8qKiBDbGFzc2lmeSBhIFBvWC01IHNwZW5kIGZyb20gbmF0aXZlIHByaW5jaXBhbC1wcmVpbWFnZSBtZXRhZGF0YS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeVBveDVTcGVuZChwc2J0OiBQc2J0LCBpbnB1dDogcG94NS5Qb3g1SW5wdXRNYXRjaCk6IFBveDVTcGVuZEJyYW5jaCB7XG4gIGdldE1hdGNoZWRUcmFuc2FjdGlvbklucHV0KHBzYnQsIGlucHV0KTtcbiAgY29uc3QgaGFzUHJpbmNpcGFsUHJlaW1hZ2UgPSBwc2J0XG4gICAgLmdldElucHV0S2V5VmFsdWVzKGlucHV0LmlucHV0SW5kZXgpXG4gICAgLnNvbWUoKHJlY29yZCkgPT4gcmVjb3JkLnR5cGUgPT09ICdrbm93bicgJiYgcmVjb3JkLmtleSA9PT0gJ1BTQlRfSU5fU0hBMjU2Jyk7XG4gIHJldHVybiBoYXNQcmluY2lwYWxQcmVpbWFnZSA/ICdlYXJseS1leGl0JyA6ICdsb2NrdGltZSc7XG59XG5cbi8qKiBBZGQgdmFsaWRhdGVkIHByaW5jaXBhbC1wcmVpbWFnZSBtZXRhZGF0YSBmb3IgYW4gZWFybHktZXhpdCBzcGVuZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlUG94NUVhcmx5RXhpdChcbiAgcHNidDogUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyLFxuICBpbnB1dDogcG94NS5Qb3g1SW5wdXRNYXRjaCxcbiAgcHJpbmNpcGFsUHJlaW1hZ2U6IFVpbnQ4QXJyYXlcbik6IHZvaWQge1xuICBpZiAoaW5wdXRJbmRleCAhPT0gaW5wdXQuaW5wdXRJbmRleCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUG9YLTUgZGVzY3JpcHRvciBtYXRjaCBiZWxvbmdzIHRvIFBTQlQgaW5wdXQgJHtpbnB1dC5pbnB1dEluZGV4fSwgbm90ICR7aW5wdXRJbmRleH1gKTtcbiAgfVxuICBhc3NlcnRQb3g1RWFybHlFeGl0U3BlbmQocHNidCwgaW5wdXQpO1xuICBwb3g1LmFzc2VydFBveDVQcmluY2lwYWxQcmVpbWFnZShpbnB1dC5pbmZvLCBwcmluY2lwYWxQcmVpbWFnZSk7XG4gIHBzYnQuYWRkU2hhMjU2UHJlaW1hZ2UoaW5wdXRJbmRleCwgcHJpbmNpcGFsUHJlaW1hZ2UpO1xufVxuIl19
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Psbt } from '@bitgo/wasm-utxo';
|
|
2
|
+
import { pox5 } from '@bitgo/utxo-descriptors';
|
|
3
3
|
export type Pox5FinalizerParams = {
|
|
4
|
-
/**
|
|
5
|
-
|
|
6
|
-
/** The derived user, backup, and BitGo keys in descriptor order. */
|
|
7
|
-
stakerKeys: [Buffer, Buffer, Buffer];
|
|
4
|
+
/** The canonical descriptor match for the input being finalized. */
|
|
5
|
+
match: pox5.Pox5InputMatch;
|
|
8
6
|
};
|
|
9
7
|
/** Finalize the post-CLTV 2-of-3 PoX-5 spend branch. */
|
|
10
8
|
export declare function finalizePox5LocktimePath(psbt: Psbt, inputIndex: number, params: Pox5FinalizerParams): void;
|
|
11
9
|
/** Finalize the principal-preimage early-exit 2-of-3 PoX-5 spend branch. */
|
|
12
10
|
export declare function finalizePox5EarlyExitPath(psbt: Psbt, inputIndex: number, params: Pox5FinalizerParams & {
|
|
13
|
-
principalPreimage:
|
|
11
|
+
principalPreimage: Uint8Array;
|
|
14
12
|
}): void;
|
|
15
|
-
export {};
|
|
16
13
|
//# sourceMappingURL=witness.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"witness.d.ts","sourceRoot":"","sources":["../../../src/pox5/witness.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"witness.d.ts","sourceRoot":"","sources":["../../../src/pox5/witness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAI/C,MAAM,MAAM,mBAAmB,GAAG;IAChC,oEAAoE;IACpE,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC;CAC5B,CAAC;AAQF,wDAAwD;AACxD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAK1G;AAED,4EAA4E;AAC5E,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,mBAAmB,GAAG;IAAE,iBAAiB,EAAE,UAAU,CAAA;CAAE,GAC9D,IAAI,CAKN"}
|
package/dist/esm/pox5/witness.js
CHANGED
|
@@ -1,40 +1,21 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const parsed = pox5.parsePox5LockupDescriptor(params.descriptor);
|
|
6
|
-
if (!parsed || !parsed.stakerKeys) {
|
|
7
|
-
throw new Error('descriptor must be a definite or derivation-indexed canonical PoX-5 descriptor');
|
|
1
|
+
import { assertPox5LocktimeSpend, preparePox5EarlyExit } from './recovery';
|
|
2
|
+
function assertFinalizerInputIndex(inputIndex, match) {
|
|
3
|
+
if (inputIndex !== match.inputIndex) {
|
|
4
|
+
throw new Error(`PoX-5 descriptor match belongs to PSBT input ${match.inputIndex}, not ${inputIndex}`);
|
|
8
5
|
}
|
|
9
|
-
if (!parsed.stakerKeys.every((key, index) => key.equals(params.stakerKeys[index]))) {
|
|
10
|
-
throw new Error('stakerKeys must match the canonical descriptor order');
|
|
11
|
-
}
|
|
12
|
-
return parsed;
|
|
13
|
-
}
|
|
14
|
-
function getDescriptor(descriptor) {
|
|
15
|
-
return descriptor instanceof Descriptor ? descriptor : Descriptor.fromString(ast.formatNode(descriptor), 'definite');
|
|
16
|
-
}
|
|
17
|
-
function prepareInput(psbt, inputIndex, params) {
|
|
18
|
-
const parsed = getParsedDescriptor(params);
|
|
19
|
-
psbt.updateInputWithDescriptor(inputIndex, getDescriptor(params.descriptor));
|
|
20
|
-
return parsed;
|
|
21
6
|
}
|
|
22
7
|
/** Finalize the post-CLTV 2-of-3 PoX-5 spend branch. */
|
|
23
8
|
export function finalizePox5LocktimePath(psbt, inputIndex, params) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
9
|
+
assertFinalizerInputIndex(inputIndex, params.match);
|
|
10
|
+
assertPox5LocktimeSpend(psbt, [params.match]);
|
|
11
|
+
psbt.updateInputWithDescriptor(inputIndex, params.match.descriptor);
|
|
28
12
|
psbt.finalizeInput(inputIndex);
|
|
29
13
|
}
|
|
30
14
|
/** Finalize the principal-preimage early-exit 2-of-3 PoX-5 spend branch. */
|
|
31
15
|
export function finalizePox5EarlyExitPath(psbt, inputIndex, params) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
throw new Error('principalPreimage does not match the descriptor stakerCommitment');
|
|
36
|
-
}
|
|
37
|
-
psbt.addSha256Preimage(inputIndex, params.principalPreimage);
|
|
16
|
+
assertFinalizerInputIndex(inputIndex, params.match);
|
|
17
|
+
preparePox5EarlyExit(psbt, inputIndex, params.match, params.principalPreimage);
|
|
18
|
+
psbt.updateInputWithDescriptor(inputIndex, params.match.descriptor);
|
|
38
19
|
psbt.finalizeInput(inputIndex);
|
|
39
20
|
}
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0bmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wb3g1L3dpdG5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLHVCQUF1QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBTzNFLFNBQVMseUJBQXlCLENBQUMsVUFBa0IsRUFBRSxLQUEwQjtJQUMvRSxJQUFJLFVBQVUsS0FBSyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsS0FBSyxDQUFDLFVBQVUsU0FBUyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3pHLENBQUM7QUFDSCxDQUFDO0FBRUQsd0RBQXdEO0FBQ3hELE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxJQUFVLEVBQUUsVUFBa0IsRUFBRSxNQUEyQjtJQUNsRyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELHVCQUF1QixDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxJQUFVLEVBQ1YsVUFBa0IsRUFDbEIsTUFBK0Q7SUFFL0QseUJBQXlCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDL0UsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BFLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBzYnQgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IHBveDUgfSBmcm9tICdAYml0Z28vdXR4by1kZXNjcmlwdG9ycyc7XG5cbmltcG9ydCB7IGFzc2VydFBveDVMb2NrdGltZVNwZW5kLCBwcmVwYXJlUG94NUVhcmx5RXhpdCB9IGZyb20gJy4vcmVjb3ZlcnknO1xuXG5leHBvcnQgdHlwZSBQb3g1RmluYWxpemVyUGFyYW1zID0ge1xuICAvKiogVGhlIGNhbm9uaWNhbCBkZXNjcmlwdG9yIG1hdGNoIGZvciB0aGUgaW5wdXQgYmVpbmcgZmluYWxpemVkLiAqL1xuICBtYXRjaDogcG94NS5Qb3g1SW5wdXRNYXRjaDtcbn07XG5cbmZ1bmN0aW9uIGFzc2VydEZpbmFsaXplcklucHV0SW5kZXgoaW5wdXRJbmRleDogbnVtYmVyLCBtYXRjaDogcG94NS5Qb3g1SW5wdXRNYXRjaCk6IHZvaWQge1xuICBpZiAoaW5wdXRJbmRleCAhPT0gbWF0Y2guaW5wdXRJbmRleCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUG9YLTUgZGVzY3JpcHRvciBtYXRjaCBiZWxvbmdzIHRvIFBTQlQgaW5wdXQgJHttYXRjaC5pbnB1dEluZGV4fSwgbm90ICR7aW5wdXRJbmRleH1gKTtcbiAgfVxufVxuXG4vKiogRmluYWxpemUgdGhlIHBvc3QtQ0xUViAyLW9mLTMgUG9YLTUgc3BlbmQgYnJhbmNoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplUG94NUxvY2t0aW1lUGF0aChwc2J0OiBQc2J0LCBpbnB1dEluZGV4OiBudW1iZXIsIHBhcmFtczogUG94NUZpbmFsaXplclBhcmFtcyk6IHZvaWQge1xuICBhc3NlcnRGaW5hbGl6ZXJJbnB1dEluZGV4KGlucHV0SW5kZXgsIHBhcmFtcy5tYXRjaCk7XG4gIGFzc2VydFBveDVMb2NrdGltZVNwZW5kKHBzYnQsIFtwYXJhbXMubWF0Y2hdKTtcbiAgcHNidC51cGRhdGVJbnB1dFdpdGhEZXNjcmlwdG9yKGlucHV0SW5kZXgsIHBhcmFtcy5tYXRjaC5kZXNjcmlwdG9yKTtcbiAgcHNidC5maW5hbGl6ZUlucHV0KGlucHV0SW5kZXgpO1xufVxuXG4vKiogRmluYWxpemUgdGhlIHByaW5jaXBhbC1wcmVpbWFnZSBlYXJseS1leGl0IDItb2YtMyBQb1gtNSBzcGVuZCBicmFuY2guICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWxpemVQb3g1RWFybHlFeGl0UGF0aChcbiAgcHNidDogUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyLFxuICBwYXJhbXM6IFBveDVGaW5hbGl6ZXJQYXJhbXMgJiB7IHByaW5jaXBhbFByZWltYWdlOiBVaW50OEFycmF5IH1cbik6IHZvaWQge1xuICBhc3NlcnRGaW5hbGl6ZXJJbnB1dEluZGV4KGlucHV0SW5kZXgsIHBhcmFtcy5tYXRjaCk7XG4gIHByZXBhcmVQb3g1RWFybHlFeGl0KHBzYnQsIGlucHV0SW5kZXgsIHBhcmFtcy5tYXRjaCwgcGFyYW1zLnByaW5jaXBhbFByZWltYWdlKTtcbiAgcHNidC51cGRhdGVJbnB1dFdpdGhEZXNjcmlwdG9yKGlucHV0SW5kZXgsIHBhcmFtcy5tYXRjaC5kZXNjcmlwdG9yKTtcbiAgcHNidC5maW5hbGl6ZUlucHV0KGlucHV0SW5kZXgpO1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitgo/utxo-staking",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "BitGo SDK for build UTXO staking transactions",
|
|
5
5
|
"main": "./dist/cjs/src/index.js",
|
|
6
6
|
"module": "./dist/esm/index.js",
|
|
@@ -61,10 +61,10 @@
|
|
|
61
61
|
"dependencies": {
|
|
62
62
|
"@babylonlabs-io/babylon-proto-ts": "1.7.2",
|
|
63
63
|
"@bitgo/babylonlabs-io-btc-staking-ts": "^3.5.2",
|
|
64
|
-
"@bitgo/utxo-core": "^1.41.
|
|
65
|
-
"@bitgo/utxo-descriptors": "^
|
|
64
|
+
"@bitgo/utxo-core": "^1.41.4",
|
|
65
|
+
"@bitgo/utxo-descriptors": "^2.0.0",
|
|
66
66
|
"@bitgo/utxo-lib": "^11.24.4",
|
|
67
|
-
"@bitgo/wasm-utxo": "^5.
|
|
67
|
+
"@bitgo/wasm-utxo": "^5.3.0",
|
|
68
68
|
"bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4",
|
|
69
69
|
"bip322-js": "^2.0.0",
|
|
70
70
|
"bitcoinjs-lib": "^6.1.7",
|
|
@@ -75,5 +75,5 @@
|
|
|
75
75
|
"devDependencies": {
|
|
76
76
|
"yargs": "^17.7.2"
|
|
77
77
|
},
|
|
78
|
-
"gitHead": "
|
|
78
|
+
"gitHead": "818acf3bf5f9dd9e8404231087bd67edb564af18"
|
|
79
79
|
}
|