@@ -167,12 +167,16 @@ enum OnionPayload {
167
167
Spontaneous ( PaymentPreimage ) ,
168
168
}
169
169
170
+ /// HTLCs that are to us and can be failed/claimed by the user
170
171
struct ClaimableHTLC {
171
172
prev_hop : HTLCPreviousHopData ,
172
173
cltv_expiry : u32 ,
174
+ /// The amount (in msats) of this MPP part
173
175
value : u64 ,
174
176
onion_payload : OnionPayload ,
175
177
timer_ticks : u8 ,
178
+ /// The sum total of all MPP parts
179
+ total_msat : u64 ,
176
180
}
177
181
178
182
/// A payment identifier used to uniquely identify a payment to LDK.
@@ -3091,11 +3095,11 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
3091
3095
HTLCForwardInfo :: AddHTLC { prev_short_channel_id, prev_htlc_id, forward_info : PendingHTLCInfo {
3092
3096
routing, incoming_shared_secret, payment_hash, amt_to_forward, .. } ,
3093
3097
prev_funding_outpoint } => {
3094
- let ( cltv_expiry, onion_payload, phantom_shared_secret) = match routing {
3098
+ let ( cltv_expiry, total_msat , onion_payload, phantom_shared_secret) = match routing {
3095
3099
PendingHTLCRouting :: Receive { payment_data, incoming_cltv_expiry, phantom_shared_secret } =>
3096
- ( incoming_cltv_expiry, OnionPayload :: Invoice ( payment_data) , phantom_shared_secret) ,
3100
+ ( incoming_cltv_expiry, payment_data . total_msat , OnionPayload :: Invoice ( payment_data) , phantom_shared_secret) ,
3097
3101
PendingHTLCRouting :: ReceiveKeysend { payment_preimage, incoming_cltv_expiry } =>
3098
- ( incoming_cltv_expiry, OnionPayload :: Spontaneous ( payment_preimage) , None ) ,
3102
+ ( incoming_cltv_expiry, amt_to_forward , OnionPayload :: Spontaneous ( payment_preimage) , None ) ,
3099
3103
_ => {
3100
3104
panic ! ( "short_channel_id == 0 should imply any pending_forward entries are of type Receive" ) ;
3101
3105
}
@@ -3110,6 +3114,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
3110
3114
} ,
3111
3115
value : amt_to_forward,
3112
3116
timer_ticks : 0 ,
3117
+ total_msat,
3113
3118
cltv_expiry,
3114
3119
onion_payload,
3115
3120
} ;
@@ -3148,18 +3153,18 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
3148
3153
for htlc in htlcs. iter( ) {
3149
3154
total_value += htlc. value;
3150
3155
match & htlc. onion_payload {
3151
- OnionPayload :: Invoice ( htlc_payment_data ) => {
3152
- if htlc_payment_data . total_msat != $payment_data_total_msat {
3156
+ OnionPayload :: Invoice { .. } => {
3157
+ if htlc . total_msat != $payment_data_total_msat {
3153
3158
log_trace!( self . logger, "Failing HTLCs with payment_hash {} as the HTLCs had inconsistent total values (eg {} and {})" ,
3154
- log_bytes!( payment_hash. 0 ) , $payment_data_total_msat, htlc_payment_data . total_msat) ;
3159
+ log_bytes!( payment_hash. 0 ) , $payment_data_total_msat, htlc . total_msat) ;
3155
3160
total_value = msgs:: MAX_VALUE_MSAT ;
3156
3161
}
3157
3162
if total_value >= msgs:: MAX_VALUE_MSAT { break ; }
3158
3163
} ,
3159
3164
_ => unreachable!( ) ,
3160
3165
}
3161
3166
}
3162
- if total_value >= msgs:: MAX_VALUE_MSAT || total_value > $payment_data_total_msat {
3167
+ if total_value >= msgs:: MAX_VALUE_MSAT || total_value > claimable_htlc . total_msat {
3163
3168
log_trace!( self . logger, "Failing HTLCs with payment_hash {} as the total value {} ran over expected value {} (or HTLCs were inconsistent)" ,
3164
3169
log_bytes!( payment_hash. 0 ) , total_value, $payment_data_total_msat) ;
3165
3170
fail_htlc!( claimable_htlc) ;
@@ -3202,9 +3207,8 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
3202
3207
continue
3203
3208
}
3204
3209
} ;
3205
- let payment_data_total_msat = payment_data. total_msat ;
3206
3210
let payment_secret = payment_data. payment_secret . clone ( ) ;
3207
- check_total_value ! ( payment_data_total_msat , payment_secret, payment_preimage) ;
3211
+ check_total_value ! ( payment_data . total_msat , payment_secret, payment_preimage) ;
3208
3212
} ,
3209
3213
OnionPayload :: Spontaneous ( preimage) => {
3210
3214
match channel_state. claimable_htlcs . entry ( payment_hash) {
@@ -6069,13 +6073,14 @@ impl Writeable for ClaimableHTLC {
6069
6073
OnionPayload :: Invoice ( _) => None ,
6070
6074
OnionPayload :: Spontaneous ( preimage) => Some ( preimage. clone ( ) ) ,
6071
6075
} ;
6072
- write_tlv_fields !
6073
- ( writer,
6074
- {
6075
- ( 0 , self . prev_hop, required) , ( 2 , self . value, required) ,
6076
- ( 4 , payment_data, option) , ( 6 , self . cltv_expiry, required) ,
6077
- ( 8 , keysend_preimage, option) ,
6078
- } ) ;
6076
+ write_tlv_fields ! ( writer, {
6077
+ ( 0 , self . prev_hop, required) ,
6078
+ ( 1 , self . total_msat, required) ,
6079
+ ( 2 , self . value, required) ,
6080
+ ( 4 , payment_data, option) ,
6081
+ ( 6 , self . cltv_expiry, required) ,
6082
+ ( 8 , keysend_preimage, option) ,
6083
+ } ) ;
6079
6084
Ok ( ( ) )
6080
6085
}
6081
6086
}
@@ -6086,32 +6091,41 @@ impl Readable for ClaimableHTLC {
6086
6091
let mut value = 0 ;
6087
6092
let mut payment_data: Option < msgs:: FinalOnionHopData > = None ;
6088
6093
let mut cltv_expiry = 0 ;
6094
+ let mut total_msat = None ;
6089
6095
let mut keysend_preimage: Option < PaymentPreimage > = None ;
6090
- read_tlv_fields !
6091
- ( reader,
6092
- {
6093
- ( 0 , prev_hop, required) , ( 2 , value, required) ,
6094
- ( 4 , payment_data, option) , ( 6 , cltv_expiry, required) ,
6095
- ( 8 , keysend_preimage, option)
6096
- } ) ;
6096
+ read_tlv_fields ! ( reader, {
6097
+ ( 0 , prev_hop, required) ,
6098
+ ( 1 , total_msat, option) ,
6099
+ ( 2 , value, required) ,
6100
+ ( 4 , payment_data, option) ,
6101
+ ( 6 , cltv_expiry, required) ,
6102
+ ( 8 , keysend_preimage, option)
6103
+ } ) ;
6097
6104
let onion_payload = match keysend_preimage {
6098
6105
Some ( p) => {
6099
6106
if payment_data. is_some ( ) {
6100
6107
return Err ( DecodeError :: InvalidValue )
6101
6108
}
6109
+ if total_msat. is_none ( ) {
6110
+ total_msat = Some ( value) ;
6111
+ }
6102
6112
OnionPayload :: Spontaneous ( p)
6103
6113
} ,
6104
6114
None => {
6105
6115
if payment_data. is_none ( ) {
6106
6116
return Err ( DecodeError :: InvalidValue )
6107
6117
}
6118
+ if total_msat. is_none ( ) {
6119
+ total_msat = Some ( payment_data. as_ref ( ) . unwrap ( ) . total_msat ) ;
6120
+ }
6108
6121
OnionPayload :: Invoice ( payment_data. unwrap ( ) )
6109
6122
} ,
6110
6123
} ;
6111
6124
Ok ( Self {
6112
6125
prev_hop : prev_hop. 0 . unwrap ( ) ,
6113
6126
timer_ticks : 0 ,
6114
6127
value,
6128
+ total_msat : total_msat. unwrap ( ) ,
6115
6129
onion_payload,
6116
6130
cltv_expiry,
6117
6131
} )
0 commit comments