- pub(crate) fn package_timelock(&self) -> u32 {
- self.inputs.iter().map(|(_, outp)| outp.absolute_tx_timelock(self.height_original))
- .max().expect("There must always be at least one output to spend in a PackageTemplate")
+ pub(crate) fn package_locktime(&self, current_height: u32) -> u32 {
+ let locktime = self.inputs.iter().map(|(_, outp)| outp.absolute_tx_timelock(current_height))
+ .max().expect("There must always be at least one output to spend in a PackageTemplate");
+
+ // If we ever try to aggregate a `HolderHTLCOutput`s with another output type, we'll likely
+ // end up with an incorrect transaction locktime since the counterparty has included it in
+ // its HTLC signature. This should never happen unless we decide to aggregate outputs across
+ // different channel commitments.
+ #[cfg(debug_assertions)] {
+ if self.inputs.iter().any(|(_, outp)|
+ if let PackageSolvingData::HolderHTLCOutput(outp) = outp {
+ outp.preimage.is_some()
+ } else {
+ false
+ }
+ ) {
+ debug_assert_eq!(locktime, 0);
+ };
+ for timeout_htlc_expiry in self.inputs.iter().filter_map(|(_, outp)|
+ if let PackageSolvingData::HolderHTLCOutput(outp) = outp {
+ if outp.preimage.is_none() {
+ Some(outp.cltv_expiry)
+ } else { None }
+ } else { None }
+ ) {
+ debug_assert_eq!(locktime, timeout_htlc_expiry);
+ }
+ }
+
+ locktime