- /// Add local signature for a htlc transaction, do nothing if a cached signed transaction is
- /// already present
- pub fn add_htlc_sig<T: secp256k1::Signing>(&mut self, htlc_base_key: &SecretKey, htlc_index: u32, preimage: Option<PaymentPreimage>, local_csv: u16, secp_ctx: &Secp256k1<T>) {
- if self.local_keys.is_none() || self.feerate_per_kw.is_none() { return; }
- let local_keys = self.local_keys.as_ref().unwrap();
- let txid = self.txid();
- for this_htlc in self.per_htlc.iter_mut() {
- if this_htlc.0.transaction_output_index.unwrap() == htlc_index {
- if this_htlc.2.is_some() { return; } // we already have a cached htlc transaction at provided index
- let mut htlc_tx = build_htlc_transaction(&txid, self.feerate_per_kw.unwrap(), local_csv, &this_htlc.0, &local_keys.a_delayed_payment_key, &local_keys.revocation_key);
- if !this_htlc.0.offered && preimage.is_none() { return; } // if we don't have preimage for HTLC-Success, don't try to generate
- let htlc_secret = if !this_htlc.0.offered { preimage } else { None }; // if we have a preimage for HTLC-Timeout, don't use it that's likely a duplicate HTLC hash
- if this_htlc.1.is_none() { return; } // we don't have any remote signature for this htlc
- if htlc_tx.input.len() != 1 { return; }
- if htlc_tx.input[0].witness.len() != 0 { return; }
-
- let htlc_redeemscript = get_htlc_redeemscript_with_explicit_keys(&this_htlc.0, &local_keys.a_htlc_key, &local_keys.b_htlc_key, &local_keys.revocation_key);
-
- if let Ok(our_htlc_key) = derive_private_key(secp_ctx, &local_keys.per_commitment_point, htlc_base_key) {
- let sighash = hash_to_message!(&bip143::SighashComponents::new(&htlc_tx).sighash_all(&htlc_tx.input[0], &htlc_redeemscript, this_htlc.0.amount_msat / 1000)[..]);
- let our_sig = secp_ctx.sign(&sighash, &our_htlc_key);
-
- htlc_tx.input[0].witness.push(Vec::new()); // First is the multisig dummy
-
- htlc_tx.input[0].witness.push(this_htlc.1.unwrap().serialize_der().to_vec());
- htlc_tx.input[0].witness.push(our_sig.serialize_der().to_vec());
- htlc_tx.input[0].witness[1].push(SigHashType::All as u8);
- htlc_tx.input[0].witness[2].push(SigHashType::All as u8);
-
- if this_htlc.0.offered {
- htlc_tx.input[0].witness.push(Vec::new());
- assert!(htlc_secret.is_none());
- } else {
- htlc_tx.input[0].witness.push(htlc_secret.unwrap().0.to_vec());
- }
-
- htlc_tx.input[0].witness.push(htlc_redeemscript.as_bytes().to_vec());
-
- this_htlc.2 = Some(htlc_tx);
- } else { return; }
+ let htlc_redeemscript = get_htlc_redeemscript_with_explicit_keys(&this_htlc.0, &self.keys.broadcaster_htlc_key, &self.keys.countersignatory_htlc_key, &self.keys.revocation_key);
+
+ let sighash = hash_to_message!(&bip143::SigHashCache::new(&htlc_tx).signature_hash(0, &htlc_redeemscript, this_htlc.0.amount_msat / 1000, SigHashType::All)[..]);
+ ret.push(Some(secp_ctx.sign(&sighash, &holder_htlc_key)));
+ } else {
+ ret.push(None);