diff --git a/processor/src/networks/mod.rs b/processor/src/networks/mod.rs index 1b2a85e0..7d1f8b98 100644 --- a/processor/src/networks/mod.rs +++ b/processor/src/networks/mod.rs @@ -358,7 +358,7 @@ pub trait Network: 'static + Send + Sync + Clone + PartialEq + Eq + Debug { }); }; - // Amortize a fee over the plan's payments + // Amortize the fee over the plan's payments let (post_fee_branches, mut operating_costs) = (|| { // If we're creating a change output, letting us recoup coins, amortize the operating costs // as well @@ -417,9 +417,21 @@ pub trait Network: 'static + Send + Sync + Clone + PartialEq + Eq + Debug { } // Drop payments now worth 0 - plan.payments = plan.payments.drain(..).filter(|payment| payment.amount != 0).collect(); + let plan_id = plan.id(); + plan.payments = plan + .payments + .drain(..) + .filter(|payment| { + if payment.amount != 0 { + true + } else { + log::debug!("dropping dust payment from plan {}", hex::encode(&plan_id)); + false + } + }) + .collect(); - // Sanity check the fee wa successfully amortized + // Sanity check the fee was successfully amortized let new_outputs = plan.payments.iter().map(|payment| payment.amount).sum::(); assert!((new_outputs + total_fee) <= original_outputs); diff --git a/processor/src/plan.rs b/processor/src/plan.rs index f85372e1..c009c852 100644 --- a/processor/src/plan.rs +++ b/processor/src/plan.rs @@ -113,10 +113,16 @@ impl Plan { transcript.append_message(b"input", input.id()); } + // Don't transcript the payments as these will change between the intended Plan and the actual + // Plan, once various fee logics have executed + // TODO: Distinguish IntendedPlan and ActualPlan, or make actual payments a distinct field, + // letting us transcript this + /* transcript.domain_separate(b"payments"); for payment in &self.payments { payment.transcript(&mut transcript); } + */ if let Some(change) = &self.change { transcript.append_message(b"change", change.to_string());