descriptors: add a helper to get the value of the timelock
This commit is contained in:
parent
0fd57db8a8
commit
ee86a1bd5e
@ -335,6 +335,43 @@ impl InheritanceDescriptor {
|
|||||||
.expect("All pubkeys are derived, no wildcard.");
|
.expect("All pubkeys are derived, no wildcard.");
|
||||||
DerivedInheritanceDescriptor(desc)
|
DerivedInheritanceDescriptor(desc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the value (in blocks) of the relative timelock for the heir's spending path.
|
||||||
|
pub fn timelock_value(&self) -> u32 {
|
||||||
|
let wsh_desc = match &self.0 {
|
||||||
|
descriptor::Descriptor::Wsh(desc) => desc,
|
||||||
|
_ => unreachable!(),
|
||||||
|
};
|
||||||
|
let ms = match wsh_desc.as_inner() {
|
||||||
|
descriptor::WshInner::Ms(ms) => ms,
|
||||||
|
_ => unreachable!(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let policy = ms
|
||||||
|
.lift()
|
||||||
|
.expect("Lifting can't fail on a Miniscript")
|
||||||
|
.normalized();
|
||||||
|
let subs = match policy {
|
||||||
|
SemanticPolicy::Threshold(1, subs) => subs,
|
||||||
|
_ => unreachable!(),
|
||||||
|
};
|
||||||
|
let heir_subs = subs
|
||||||
|
.iter()
|
||||||
|
.find_map(|s| match s {
|
||||||
|
SemanticPolicy::Threshold(2, subs) => Some(subs),
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
.expect("Always present");
|
||||||
|
let csv = heir_subs
|
||||||
|
.iter()
|
||||||
|
.find_map(|s| match s {
|
||||||
|
SemanticPolicy::Older(csv) => Some(csv),
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
.expect("Always present");
|
||||||
|
|
||||||
|
*csv
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DerivedInheritanceDescriptor {
|
impl DerivedInheritanceDescriptor {
|
||||||
@ -391,5 +428,17 @@ mod tests {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn inheritance_descriptor_tl_value() {
|
||||||
|
let desc = InheritanceDescriptor::from_str("wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/*),older(1),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/*)))").unwrap();
|
||||||
|
assert_eq!(desc.timelock_value(), 1);
|
||||||
|
|
||||||
|
let desc = InheritanceDescriptor::from_str("wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/*),older(42000),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/*)))").unwrap();
|
||||||
|
assert_eq!(desc.timelock_value(), 42000);
|
||||||
|
|
||||||
|
let desc = InheritanceDescriptor::from_str("wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/*),older(65535),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/*)))").unwrap();
|
||||||
|
assert_eq!(desc.timelock_value(), 0xffff);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: test error conditions of deserialization.
|
// TODO: test error conditions of deserialization.
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user