Add payment preimage and hash to `ContentiousClaimable`
[rust-lightning] / lightning / src / chain / package.rs
index 2ab37484148e48402674c68a8b2503961dcebe12..786451ee50c834923f79e34bae478e7800f12c2b 100644 (file)
@@ -434,7 +434,6 @@ impl PackageSolvingData {
                                let chan_keys = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint);
                                let witness_script = chan_utils::get_htlc_redeemscript_with_explicit_keys(&outp.htlc, onchain_handler.opt_anchors(), &chan_keys.broadcaster_htlc_key, &chan_keys.countersignatory_htlc_key, &chan_keys.revocation_key);
 
-                               bumped_tx.lock_time = PackedLockTime(outp.htlc.cltv_expiry); // Right now we don't aggregate time-locked transaction, if we do we should set lock_time before to avoid breaking hash computation
                                if let Ok(sig) = onchain_handler.signer.sign_counterparty_htlc_transaction(&bumped_tx, i, &outp.htlc.amount_msat / 1000, &outp.per_commitment_point, &outp.htlc, &onchain_handler.secp_ctx) {
                                        let mut ser_sig = sig.serialize_der().to_vec();
                                        ser_sig.push(EcdsaSighashType::All as u8);
@@ -539,7 +538,7 @@ pub struct PackageTemplate {
        feerate_previous: u64,
        // Cache of next height at which fee-bumping and rebroadcast will be attempted. In
        // the future, we might abstract it to an observed mempool fluctuation.
-       height_timer: Option<u32>,
+       height_timer: u32,
        // Confirmation height of the claimed outputs set transaction. In case of reorg reaching
        // it, we wipe out and forget the package.
        height_original: u32,
@@ -558,13 +557,10 @@ impl PackageTemplate {
        pub(crate) fn set_feerate(&mut self, new_feerate: u64) {
                self.feerate_previous = new_feerate;
        }
-       pub(crate) fn timer(&self) -> Option<u32> {
-               if let Some(ref timer) = self.height_timer {
-                       return Some(*timer);
-               }
-               None
+       pub(crate) fn timer(&self) -> u32 {
+               self.height_timer
        }
-       pub(crate) fn set_timer(&mut self, new_timer: Option<u32>) {
+       pub(crate) fn set_timer(&mut self, new_timer: u32) {
                self.height_timer = new_timer;
        }
        pub(crate) fn outpoints(&self) -> Vec<&BitcoinOutPoint> {
@@ -708,12 +704,13 @@ impl PackageTemplate {
                htlcs
        }
        pub(crate) fn finalize_malleable_package<L: Deref, Signer: WriteableEcdsaChannelSigner>(
-               &self, onchain_handler: &mut OnchainTxHandler<Signer>, value: u64, destination_script: Script, logger: &L
+               &self, current_height: u32, onchain_handler: &mut OnchainTxHandler<Signer>, value: u64,
+               destination_script: Script, logger: &L
        ) -> Option<Transaction> where L::Target: Logger {
                debug_assert!(self.is_malleable());
                let mut bumped_tx = Transaction {
                        version: 2,
-                       lock_time: PackedLockTime::ZERO,
+                       lock_time: PackedLockTime(self.package_locktime(current_height)),
                        input: vec![],
                        output: vec![TxOut {
                                script_pubkey: destination_script,
@@ -837,7 +834,7 @@ impl PackageTemplate {
                        soonest_conf_deadline,
                        aggregable,
                        feerate_previous: 0,
-                       height_timer: None,
+                       height_timer: height_original,
                        height_original,
                }
        }
@@ -854,7 +851,7 @@ impl Writeable for PackageTemplate {
                        (0, self.soonest_conf_deadline, required),
                        (2, self.feerate_previous, required),
                        (4, self.height_original, required),
-                       (6, self.height_timer, option)
+                       (6, self.height_timer, required)
                });
                Ok(())
        }
@@ -893,13 +890,16 @@ impl Readable for PackageTemplate {
                        (4, height_original, required),
                        (6, height_timer, option),
                });
+               if height_timer.is_none() {
+                       height_timer = Some(height_original);
+               }
                Ok(PackageTemplate {
                        inputs,
                        malleability,
                        soonest_conf_deadline,
                        aggregable,
                        feerate_previous,
-                       height_timer,
+                       height_timer: height_timer.unwrap(),
                        height_original,
                })
        }
@@ -1177,12 +1177,9 @@ mod tests {
                let revk_outp = dumb_revk_output!(secp_ctx);
 
                let mut package = PackageTemplate::build_package(txid, 0, revk_outp, 1000, true, 100);
-               let timer_none = package.timer();
-               assert!(timer_none.is_none());
-               package.set_timer(Some(100));
-               if let Some(timer_some) = package.timer() {
-                       assert_eq!(timer_some, 100);
-               } else { panic!() }
+               assert_eq!(package.timer(), 100);
+               package.set_timer(101);
+               assert_eq!(package.timer(), 101);
        }
 
        #[test]