+ }
+ }
+
+ macro_rules! scan_commitment {
+ ($htlc_outputs: expr, $htlc_sources: expr, $source: expr, $local_tx: expr) => {
+ for &(ref payment_hash, ref source, ref vout) in $htlc_sources.iter() {
+ if &Some(input.previous_output.vout) == vout {
+ log_claim!($source, $local_tx, true, payment_hash, true);
+ // We have a resolution of an HTLC either from one of our latest
+ // local commitment transactions or an unrevoked remote commitment
+ // transaction. This implies we either learned a preimage, the HTLC
+ // has timed out, or we screwed up. In any case, we should now
+ // resolve the source HTLC with the original sender.
+ payment_data = Some((source.clone(), *payment_hash));
+ }
+ }
+ if payment_data.is_none() {
+ for htlc_output in $htlc_outputs {
+ if input.previous_output.vout == htlc_output.transaction_output_index {
+ log_claim!($source, $local_tx, $local_tx == htlc_output.offered, htlc_output.payment_hash, false);
+ continue 'outer_loop;
+ }
+ }
+ }
+ }
+ }
+
+ if let Some(ref current_local_signed_commitment_tx) = self.current_local_signed_commitment_tx {
+ if input.previous_output.txid == current_local_signed_commitment_tx.txid {
+ scan_commitment!(current_local_signed_commitment_tx.htlc_outputs.iter().map(|&(ref a, _, _)| a),
+ current_local_signed_commitment_tx.htlc_sources,
+ "our latest local commitment tx", true);
+ }
+ }
+ if let Some(ref prev_local_signed_commitment_tx) = self.prev_local_signed_commitment_tx {
+ if input.previous_output.txid == prev_local_signed_commitment_tx.txid {
+ scan_commitment!(prev_local_signed_commitment_tx.htlc_outputs.iter().map(|&(ref a, _, _)| a),
+ prev_local_signed_commitment_tx.htlc_sources,
+ "our previous local commitment tx", true);
+ }
+ }
+ if let Some(&(ref htlc_outputs, ref htlc_sources)) = self.remote_claimable_outpoints.get(&input.previous_output.txid) {
+ scan_commitment!(htlc_outputs, htlc_sources, "remote commitment tx", false);
+ }
+
+ // Check that scan_commitment, above, decided there is some source worth relaying an
+ // HTLC resolution backwards to and figure out whether we learned a preimage from it.
+ if let Some((source, payment_hash)) = payment_data {
+ let mut payment_preimage = PaymentPreimage([0; 32]);
+ if accepted_preimage_claim {
+ payment_preimage.0.copy_from_slice(&input.witness[3]);
+ htlc_updated.push((source, Some(payment_preimage), payment_hash));
+ } else if offered_preimage_claim {
+ payment_preimage.0.copy_from_slice(&input.witness[1]);
+ htlc_updated.push((source, Some(payment_preimage), payment_hash));
+ } else {
+ htlc_updated.push((source, None, payment_hash));