From: Matt Corallo Date: Fri, 21 May 2021 21:02:03 +0000 (+0000) Subject: Expose the timelock of transaction packages X-Git-Tag: v0.0.98~13^2~6 X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=commitdiff_plain;h=9bd87e9c9d52782371acd843db863490583e2cf5;p=rust-lightning Expose the timelock of transaction packages --- diff --git a/lightning/src/chain/package.rs b/lightning/src/chain/package.rs index bb4460431..a73394689 100644 --- a/lightning/src/chain/package.rs +++ b/lightning/src/chain/package.rs @@ -387,6 +387,21 @@ impl PackageSolvingData { _ => { panic!("API Error!"); } } } + fn absolute_tx_timelock(&self, output_conf_height: u32) -> u32 { + // Get the absolute timelock at which this output can be spent given the height at which + // this output was confirmed. We use `output_conf_height + 1` as a safe default as we can + // be confirmed in the next block and transactions with time lock `current_height + 1` + // always propagate. + let absolute_timelock = match self { + PackageSolvingData::RevokedOutput(_) => output_conf_height + 1, + PackageSolvingData::RevokedHTLCOutput(_) => output_conf_height + 1, + PackageSolvingData::CounterpartyOfferedHTLCOutput(_) => output_conf_height + 1, + PackageSolvingData::CounterpartyReceivedHTLCOutput(ref outp) => std::cmp::max(outp.htlc.cltv_expiry, output_conf_height + 1), + PackageSolvingData::HolderHTLCOutput(ref outp) => std::cmp::max(outp.cltv_expiry, output_conf_height + 1), + PackageSolvingData::HolderFundingOutput(_) => output_conf_height + 1, + }; + absolute_timelock + } } impl Writeable for PackageSolvingData { @@ -598,6 +613,10 @@ impl PackageTemplate { } amounts } + 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_weight(&self, destination_script: &Script) -> usize { let mut inputs_weight = 0; let mut witnesses_weight = 2; // count segwit flags