Skip to content

Commit 251ced3

Browse files
OttoAllmendingerllm-git
andcommitted
feat(utxo-staking): rename and document descriptor methods
Renames getTimelockMiniscriptNode to getStakingTimelockMiniscriptNode for clarity. Also renames getSlashingDescriptor to getUnbondingTimelockDescriptor to better reflect its purpose. Added JSDoc comments to descriptor methods to improve understanding of the different spend paths. Issue: BTC-2143 Co-authored-by: llm-git <[email protected]>
1 parent 2f5d6e1 commit 251ced3

File tree

2 files changed

+30
-11
lines changed

2 files changed

+30
-11
lines changed

modules/utxo-staking/src/babylon/descriptor.ts

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,22 @@ export class BabylonDescriptorBuilder {
5555
);
5656
}
5757

58-
getTimelockMiniscriptNode(): ast.MiniscriptNode {
58+
/** Spend path with the staker key and the staking timelock */
59+
getStakingTimelockMiniscriptNode(): ast.MiniscriptNode {
5960
return { and_v: [pk(this.stakerKey), { older: this.stakingTimeLock }] };
6061
}
6162

63+
/** Spend path with the staker key and the unbonding timelock */
64+
getUnbondingTimelockMiniscriptNode(): ast.MiniscriptNode {
65+
return { and_v: [pk(this.stakerKey), { older: this.unbondingTimeLock }] };
66+
}
67+
68+
/** Spend path with the staker key and the covenant keys */
6269
getUnbondingMiniscriptNode(): ast.MiniscriptNode {
6370
return { and_v: [pk(this.stakerKey), { multi_a: multiArgs(this.covenantThreshold, this.covenantKeys) }] };
6471
}
6572

73+
/** Spend path with the finality provider keys and the covenant keys */
6674
getSlashingMiniscriptNode(): ast.MiniscriptNode {
6775
return {
6876
and_v: [
@@ -79,21 +87,31 @@ export class BabylonDescriptorBuilder {
7987
};
8088
}
8189

82-
getUnbondingTimelockMiniscriptNode(): ast.MiniscriptNode {
83-
return { and_v: [pk(this.stakerKey), { older: this.unbondingTimeLock }] };
84-
}
85-
90+
/**
91+
* Creates a descriptor for a staking output.
92+
*
93+
* Three spend paths:
94+
* - the slashing script,
95+
* - the unbonding script,
96+
* - the timelocked unstaking script.
97+
*/
8698
getStakingDescriptor(): Descriptor {
8799
return taprootScriptOnlyFromAst([
88100
this.getSlashingMiniscriptNode(),
89-
[this.getUnbondingMiniscriptNode(), this.getTimelockMiniscriptNode()],
101+
[this.getUnbondingMiniscriptNode(), this.getStakingTimelockMiniscriptNode()],
90102
]);
91103
}
92104

93-
getSlashingDescriptor(): Descriptor {
105+
/**
106+
* Creates a descriptor for the timelocked unbonding script.
107+
*/
108+
getUnbondingTimelockDescriptor(): Descriptor {
94109
return taprootScriptOnlyFromAst(this.getUnbondingTimelockMiniscriptNode());
95110
}
96111

112+
/**
113+
* Creates a descriptor with two script paths: the slashing script and the timelocked unbonding script.
114+
*/
97115
getUnbondingDescriptor(): Descriptor {
98116
return taprootScriptOnlyFromAst([this.getSlashingMiniscriptNode(), this.getUnbondingTimelockMiniscriptNode()]);
99117
}

modules/utxo-staking/test/unit/babylon/transactions.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ function spendStakingOutput(
132132
const selectTapLeafScript = Miniscript.fromString(
133133
ast.formatNode(
134134
type === 'unstaking'
135-
? descriptorBuilder.getTimelockMiniscriptNode()
135+
? descriptorBuilder.getStakingTimelockMiniscriptNode()
136136
: descriptorBuilder.getUnbondingMiniscriptNode()
137137
),
138138
'tap'
@@ -223,7 +223,7 @@ function assertEqualScripts(descriptorBuilder: BabylonDescriptorBuilder, builder
223223
for (const [key, script] of Object.entries(builder) as [keyof vendor.StakingScripts, Buffer][]) {
224224
switch (key) {
225225
case 'timelockScript':
226-
assertEqualsMiniscript(script, descriptorBuilder.getTimelockMiniscriptNode());
226+
assertEqualsMiniscript(script, descriptorBuilder.getStakingTimelockMiniscriptNode());
227227
break;
228228
case 'unbondingScript':
229229
assertEqualsMiniscript(script, descriptorBuilder.getUnbondingMiniscriptNode());
@@ -292,8 +292,9 @@ function describeWithKeys(
292292
descriptorBuilder.getStakingDescriptor()
293293
);
294294
assertEqualOutputScript(
295+
/* I don't know why this is called deriveSlashingOutput */
295296
vendor.deriveSlashingOutput(vendorBuilder.buildScripts(), bitcoinjslib.networks.bitcoin),
296-
descriptorBuilder.getSlashingDescriptor()
297+
descriptorBuilder.getUnbondingTimelockDescriptor()
297298
);
298299
assertEqualOutputScript(
299300
vendor.deriveUnbondingOutputInfo(vendorBuilder.buildScripts(), bitcoinjslib.networks.bitcoin),
@@ -308,7 +309,7 @@ function describeWithKeys(
308309
assert(parsed);
309310
assert.deepStrictEqual(parsed.slashingMiniscriptNode, descriptorBuilder.getSlashingMiniscriptNode());
310311
assert.deepStrictEqual(parsed.unbondingMiniscriptNode, descriptorBuilder.getUnbondingMiniscriptNode());
311-
assert.deepStrictEqual(parsed.timelockMiniscriptNode, descriptorBuilder.getTimelockMiniscriptNode());
312+
assert.deepStrictEqual(parsed.timelockMiniscriptNode, descriptorBuilder.getStakingTimelockMiniscriptNode());
312313
});
313314

314315
describe('Transaction Sets', async function () {

0 commit comments

Comments
 (0)