@@ -104,6 +104,9 @@ pub(super) enum PendingHTLCRouting {
104104 /// The SCID from the onion that we should forward to. This could be a real SCID or a fake one
105105 /// generated using `get_fake_scid` from the scid_utils::fake_scid module.
106106 short_channel_id : u64 , // This should be NonZero<u64> eventually when we bump MSRV
107+ /// The fee we're skimming off the top of this HTLC. See
108+ /// [`ChannelConfig::accept_underpaying_htlcs`].
109+ skimmed_fee_msat : Option < u64 > ,
107110 } ,
108111 Receive {
109112 payment_data : msgs:: FinalOnionHopData ,
@@ -2764,6 +2767,7 @@ where
27642767 routing : PendingHTLCRouting :: Forward {
27652768 onion_packet : outgoing_packet,
27662769 short_channel_id,
2770+ skimmed_fee_msat : None ,
27672771 } ,
27682772 payment_hash : msg. payment_hash . clone ( ) ,
27692773 incoming_shared_secret : shared_secret,
@@ -3402,8 +3406,16 @@ where
34023406 } ) ?;
34033407
34043408 let routing = match payment. forward_info . routing {
3405- PendingHTLCRouting :: Forward { onion_packet, .. } => {
3406- PendingHTLCRouting :: Forward { onion_packet, short_channel_id : next_hop_scid }
3409+ PendingHTLCRouting :: Forward { onion_packet, skimmed_fee_msat, .. } => {
3410+ debug_assert ! ( skimmed_fee_msat. is_none( ) ) ;
3411+ PendingHTLCRouting :: Forward {
3412+ onion_packet,
3413+ short_channel_id : next_hop_scid,
3414+ skimmed_fee_msat :
3415+ // The minuend here must match the expected forward amount generated for the
3416+ // HTLCIntercepted event.
3417+ Some ( payment. forward_info . outgoing_amt_msat . saturating_sub ( amt_to_forward_msat) ) ,
3418+ }
34073419 } ,
34083420 _ => unreachable ! ( ) // Only `PendingHTLCRouting::Forward`s are intercepted
34093421 } ;
@@ -7311,6 +7323,7 @@ impl_writeable_tlv_based!(PhantomRouteHints, {
73117323impl_writeable_tlv_based_enum ! ( PendingHTLCRouting ,
73127324 ( 0 , Forward ) => {
73137325 ( 0 , onion_packet, required) ,
7326+ ( 1 , skimmed_fee_msat, option) ,
73147327 ( 2 , short_channel_id, required) ,
73157328 } ,
73167329 ( 1 , Receive ) => {
0 commit comments