@@ -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.
@@ -3096,11 +3100,11 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
3096
3100
HTLCForwardInfo :: AddHTLC { prev_short_channel_id, prev_htlc_id, forward_info : PendingHTLCInfo {
3097
3101
routing, incoming_shared_secret, payment_hash, amt_to_forward, .. } ,
3098
3102
prev_funding_outpoint } => {
3099
- let ( cltv_expiry, onion_payload, phantom_shared_secret) = match routing {
3103
+ let ( cltv_expiry, total_msat , onion_payload, phantom_shared_secret) = match routing {
3100
3104
PendingHTLCRouting :: Receive { payment_data, incoming_cltv_expiry, phantom_shared_secret } =>
3101
- ( incoming_cltv_expiry, OnionPayload :: Invoice ( payment_data) , phantom_shared_secret) ,
3105
+ ( incoming_cltv_expiry, payment_data . total_msat , OnionPayload :: Invoice ( payment_data) , phantom_shared_secret) ,
3102
3106
PendingHTLCRouting :: ReceiveKeysend { payment_preimage, incoming_cltv_expiry } =>
3103
- ( incoming_cltv_expiry, OnionPayload :: Spontaneous ( payment_preimage) , None ) ,
3107
+ ( incoming_cltv_expiry, amt_to_forward , OnionPayload :: Spontaneous ( payment_preimage) , None ) ,
3104
3108
_ => {
3105
3109
panic ! ( "short_channel_id == 0 should imply any pending_forward entries are of type Receive" ) ;
3106
3110
}
@@ -3115,6 +3119,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
3115
3119
} ,
3116
3120
value : amt_to_forward,
3117
3121
timer_ticks : 0 ,
3122
+ total_msat,
3118
3123
cltv_expiry,
3119
3124
onion_payload,
3120
3125
} ;
@@ -3153,10 +3158,10 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
3153
3158
for htlc in htlcs. iter( ) {
3154
3159
total_value += htlc. value;
3155
3160
match & htlc. onion_payload {
3156
- OnionPayload :: Invoice ( htlc_payment_data ) => {
3157
- if htlc_payment_data . total_msat != $payment_data_total_msat {
3161
+ OnionPayload :: Invoice { .. } => {
3162
+ if htlc . total_msat != $payment_data_total_msat {
3158
3163
log_trace!( self . logger, "Failing HTLCs with payment_hash {} as the HTLCs had inconsistent total values (eg {} and {})" ,
3159
- log_bytes!( payment_hash. 0 ) , $payment_data_total_msat, htlc_payment_data . total_msat) ;
3164
+ log_bytes!( payment_hash. 0 ) , $payment_data_total_msat, htlc . total_msat) ;
3160
3165
total_value = msgs:: MAX_VALUE_MSAT ;
3161
3166
}
3162
3167
if total_value >= msgs:: MAX_VALUE_MSAT { break ; }
@@ -3207,9 +3212,8 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
3207
3212
continue
3208
3213
}
3209
3214
} ;
3210
- let payment_data_total_msat = payment_data. total_msat ;
3211
3215
let payment_secret = payment_data. payment_secret . clone ( ) ;
3212
- check_total_value ! ( payment_data_total_msat , payment_secret, payment_preimage) ;
3216
+ check_total_value ! ( payment_data . total_msat , payment_secret, payment_preimage) ;
3213
3217
} ,
3214
3218
OnionPayload :: Spontaneous ( preimage) => {
3215
3219
match channel_state. claimable_htlcs . entry ( payment_hash) {
@@ -6076,13 +6080,14 @@ impl Writeable for ClaimableHTLC {
6076
6080
OnionPayload :: Invoice ( _) => None ,
6077
6081
OnionPayload :: Spontaneous ( preimage) => Some ( preimage. clone ( ) ) ,
6078
6082
} ;
6079
- write_tlv_fields !
6080
- ( writer,
6081
- {
6082
- ( 0 , self . prev_hop, required) , ( 2 , self . value, required) ,
6083
- ( 4 , payment_data, option) , ( 6 , self . cltv_expiry, required) ,
6084
- ( 8 , keysend_preimage, option) ,
6085
- } ) ;
6083
+ write_tlv_fields ! ( writer, {
6084
+ ( 0 , self . prev_hop, required) ,
6085
+ ( 1 , self . total_msat, required) ,
6086
+ ( 2 , self . value, required) ,
6087
+ ( 4 , payment_data, option) ,
6088
+ ( 6 , self . cltv_expiry, required) ,
6089
+ ( 8 , keysend_preimage, option) ,
6090
+ } ) ;
6086
6091
Ok ( ( ) )
6087
6092
}
6088
6093
}
@@ -6093,32 +6098,41 @@ impl Readable for ClaimableHTLC {
6093
6098
let mut value = 0 ;
6094
6099
let mut payment_data: Option < msgs:: FinalOnionHopData > = None ;
6095
6100
let mut cltv_expiry = 0 ;
6101
+ let mut total_msat = None ;
6096
6102
let mut keysend_preimage: Option < PaymentPreimage > = None ;
6097
- read_tlv_fields !
6098
- ( reader,
6099
- {
6100
- ( 0 , prev_hop, required) , ( 2 , value, required) ,
6101
- ( 4 , payment_data, option) , ( 6 , cltv_expiry, required) ,
6102
- ( 8 , keysend_preimage, option)
6103
- } ) ;
6103
+ read_tlv_fields ! ( reader, {
6104
+ ( 0 , prev_hop, required) ,
6105
+ ( 1 , total_msat, option) ,
6106
+ ( 2 , value, required) ,
6107
+ ( 4 , payment_data, option) ,
6108
+ ( 6 , cltv_expiry, required) ,
6109
+ ( 8 , keysend_preimage, option)
6110
+ } ) ;
6104
6111
let onion_payload = match keysend_preimage {
6105
6112
Some ( p) => {
6106
6113
if payment_data. is_some ( ) {
6107
6114
return Err ( DecodeError :: InvalidValue )
6108
6115
}
6116
+ if total_msat. is_none ( ) {
6117
+ total_msat = Some ( value) ;
6118
+ }
6109
6119
OnionPayload :: Spontaneous ( p)
6110
6120
} ,
6111
6121
None => {
6112
6122
if payment_data. is_none ( ) {
6113
6123
return Err ( DecodeError :: InvalidValue )
6114
6124
}
6125
+ if total_msat. is_none ( ) {
6126
+ total_msat = Some ( payment_data. as_ref ( ) . unwrap ( ) . total_msat ) ;
6127
+ }
6115
6128
OnionPayload :: Invoice ( payment_data. unwrap ( ) )
6116
6129
} ,
6117
6130
} ;
6118
6131
Ok ( Self {
6119
6132
prev_hop : prev_hop. 0 . unwrap ( ) ,
6120
6133
timer_ticks : 0 ,
6121
6134
value,
6135
+ total_msat : total_msat. unwrap ( ) ,
6122
6136
onion_payload,
6123
6137
cltv_expiry,
6124
6138
} )
0 commit comments