Dry-up InputMaterial::Funding
[rust-lightning] / lightning / src / ln / onchaintx.rs
index 3b8238ddcae3d0b3f79d2cb63dbb4ea96eab10ad..186793581cea9cd05f9d281b77074508c72ba8c7 100644 (file)
@@ -142,7 +142,6 @@ macro_rules! subtract_high_prio_fee {
 /// do RBF bumping if possible.
 pub struct OnchainTxHandler<ChanSigner: ChannelKeys> {
        destination_script: Script,
-       funding_redeemscript: Script,
        local_commitment: Option<LocalCommitmentTransaction>,
        prev_local_commitment: Option<LocalCommitmentTransaction>,
        local_csv: u16,
@@ -185,7 +184,6 @@ pub struct OnchainTxHandler<ChanSigner: ChannelKeys> {
 impl<ChanSigner: ChannelKeys + Writeable> OnchainTxHandler<ChanSigner> {
        pub(crate) fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
                self.destination_script.write(writer)?;
-               self.funding_redeemscript.write(writer)?;
                self.local_commitment.write(writer)?;
                self.prev_local_commitment.write(writer)?;
 
@@ -231,7 +229,6 @@ impl<ChanSigner: ChannelKeys + Writeable> OnchainTxHandler<ChanSigner> {
 impl<ChanSigner: ChannelKeys + Readable> ReadableArgs<Arc<Logger>> for OnchainTxHandler<ChanSigner> {
        fn read<R: ::std::io::Read>(reader: &mut R, logger: Arc<Logger>) -> Result<Self, DecodeError> {
                let destination_script = Readable::read(reader)?;
-               let funding_redeemscript = Readable::read(reader)?;
 
                let local_commitment = Readable::read(reader)?;
                let prev_local_commitment = Readable::read(reader)?;
@@ -285,7 +282,6 @@ impl<ChanSigner: ChannelKeys + Readable> ReadableArgs<Arc<Logger>> for OnchainTx
 
                Ok(OnchainTxHandler {
                        destination_script,
-                       funding_redeemscript,
                        local_commitment,
                        prev_local_commitment,
                        local_csv,
@@ -300,13 +296,12 @@ impl<ChanSigner: ChannelKeys + Readable> ReadableArgs<Arc<Logger>> for OnchainTx
 }
 
 impl<ChanSigner: ChannelKeys> OnchainTxHandler<ChanSigner> {
-       pub(super) fn new(destination_script: Script, keys: ChanSigner, funding_redeemscript: Script, local_csv: u16, logger: Arc<Logger>) -> Self {
+       pub(super) fn new(destination_script: Script, keys: ChanSigner, local_csv: u16, logger: Arc<Logger>) -> Self {
 
                let key_storage = keys;
 
                OnchainTxHandler {
                        destination_script,
-                       funding_redeemscript,
                        local_commitment: None,
                        prev_local_commitment: None,
                        local_csv,
@@ -536,16 +531,11 @@ impl<ChanSigner: ChannelKeys> OnchainTxHandler<ChanSigner> {
                                                }
                                                return None;
                                        },
-                                       &InputMaterial::Funding { ref channel_value } => {
-                                               let signed_tx = self.get_fully_signed_local_tx(*channel_value).unwrap();
-                                               let mut amt_outputs = 0;
-                                               for outp in signed_tx.output.iter() {
-                                                       amt_outputs += outp.value;
-                                               }
-                                               let feerate = (channel_value - amt_outputs) * 1000 / signed_tx.get_weight() as u64;
+                                       &InputMaterial::Funding {} => {
+                                               let signed_tx = self.get_fully_signed_local_tx().unwrap();
                                                // Timer set to $NEVER given we can't bump tx without anchor outputs
                                                log_trace!(self, "Going to broadcast Local Transaction {} claiming funding output {} from {}...", signed_tx.txid(), outp.vout, outp.txid);
-                                               return Some((None, feerate, signed_tx));
+                                               return Some((None, self.local_commitment.as_ref().unwrap().feerate_per_kw, signed_tx));
                                        }
                                        _ => unreachable!()
                                }
@@ -585,17 +575,17 @@ impl<ChanSigner: ChannelKeys> OnchainTxHandler<ChanSigner> {
 
                // Generate claim transactions and track them to bump if necessary at
                // height timer expiration (i.e in how many blocks we're going to take action).
-               for claim in new_claims {
-                       let mut claim_material = ClaimTxBumpMaterial { height_timer: None, feerate_previous: 0, soonest_timelock: claim.0, per_input_material: claim.1.clone() };
+               for (soonest_timelock, claim) in new_claims.drain(..) {
+                       let mut claim_material = ClaimTxBumpMaterial { height_timer: None, feerate_previous: 0, soonest_timelock, per_input_material: claim };
                        if let Some((new_timer, new_feerate, tx)) = self.generate_claim_tx(height, &claim_material, &*fee_estimator) {
                                claim_material.height_timer = new_timer;
                                claim_material.feerate_previous = new_feerate;
                                let txid = tx.txid();
-                               self.pending_claim_requests.insert(txid, claim_material);
-                               for k in claim.1.keys() {
+                               for k in claim_material.per_input_material.keys() {
                                        log_trace!(self, "Registering claiming request for {}:{}", k.txid, k.vout);
                                        self.claimable_outpoints.insert(k.clone(), (txid, height));
                                }
+                               self.pending_claim_requests.insert(txid, claim_material);
                                log_trace!(self, "Broadcast onchain {}", log_tx!(tx));
                                broadcaster.broadcast_transaction(&tx);
                        }
@@ -790,19 +780,19 @@ impl<ChanSigner: ChannelKeys> OnchainTxHandler<ChanSigner> {
        // have empty local commitment transaction if a ChannelMonitor is asked to force-close just after Channel::get_outbound_funding_created,
        // before providing a initial commitment transaction. For outbound channel, init ChannelMonitor at Channel::funding_signed, there is nothing
        // to monitor before.
-       pub(super) fn get_fully_signed_local_tx(&mut self, channel_value_satoshis: u64) -> Option<Transaction> {
+       pub(super) fn get_fully_signed_local_tx(&mut self) -> Option<Transaction> {
                if let Some(ref mut local_commitment) = self.local_commitment {
-                       self.key_storage.sign_local_commitment(local_commitment, &self.funding_redeemscript, channel_value_satoshis, &self.secp_ctx);
+                       self.key_storage.sign_local_commitment(local_commitment, &self.secp_ctx);
                        return Some(local_commitment.with_valid_witness().clone());
                }
                None
        }
 
        #[cfg(test)]
-       pub(super) fn get_fully_signed_copy_local_tx(&mut self, channel_value_satoshis: u64) -> Option<Transaction> {
+       pub(super) fn get_fully_signed_copy_local_tx(&mut self) -> Option<Transaction> {
                if let Some(ref mut local_commitment) = self.local_commitment {
                        let mut local_commitment = local_commitment.clone();
-                       self.key_storage.unsafe_sign_local_commitment(&mut local_commitment, &self.funding_redeemscript, channel_value_satoshis, &self.secp_ctx);
+                       self.key_storage.unsafe_sign_local_commitment(&mut local_commitment, &self.secp_ctx);
                        return Some(local_commitment.with_valid_witness().clone());
                }
                None