- let static_payment_pk = if local {
- self.their_pubkeys.as_ref().unwrap().payment_point
- } else {
- self.local_keys.pubkeys().payment_point
- }.serialize();
- txouts.push((TxOut {
- script_pubkey: Builder::new().push_opcode(opcodes::all::OP_PUSHBYTES_0)
- .push_slice(&WPubkeyHash::hash(&static_payment_pk)[..])
- .into_script(),
- value: value_to_b as u64
- }, None));
- }
-
- transaction_utils::sort_outputs(&mut txouts, |a, b| {
- if let &Some(ref a_htlc) = a {
- if let &Some(ref b_htlc) = b {
- a_htlc.0.cltv_expiry.cmp(&b_htlc.0.cltv_expiry)
- // Note that due to hash collisions, we have to have a fallback comparison
- // here for fuzztarget mode (otherwise at least chanmon_fail_consistency
- // may fail)!
- .then(a_htlc.0.payment_hash.0.cmp(&b_htlc.0.payment_hash.0))
- // For non-HTLC outputs, if they're copying our SPK we don't really care if we
- // close the channel due to mismatches - they're doing something dumb:
- } else { cmp::Ordering::Equal }
- } else { cmp::Ordering::Equal }
- });
-
- let mut outputs: Vec<TxOut> = Vec::with_capacity(txouts.len());
- let mut htlcs_included: Vec<(HTLCOutputInCommitment, Option<&HTLCSource>)> = Vec::with_capacity(txouts.len() + included_dust_htlcs.len());
- for (idx, mut out) in txouts.drain(..).enumerate() {
- outputs.push(out.0);
- if let Some((mut htlc, source_option)) = out.1.take() {
- htlc.transaction_output_index = Some(idx as u32);
- htlcs_included.push((htlc, source_option));
- }