@@ -1381,11 +1381,21 @@ impl ChannelManager {
1381
1381
match source {
1382
1382
HTLCSource :: OutboundRoute { .. } => {
1383
1383
mem:: drop ( channel_state) ;
1384
-
1385
- let mut pending_events = self . pending_events . lock ( ) . unwrap ( ) ;
1386
- pending_events. push ( events:: Event :: PaymentFailed {
1387
- payment_hash : payment_hash. clone ( )
1388
- } ) ;
1384
+ if let & HTLCFailReason :: ErrorPacket { ref err } = & onion_error {
1385
+ let ( channel_update, payment_retryable) = self . process_onion_failure ( & source, err. data . clone ( ) ) ;
1386
+ let mut pending_events = self . pending_events . lock ( ) . unwrap ( ) ;
1387
+ if let Some ( channel_update) = channel_update {
1388
+ pending_events. push ( events:: Event :: PaymentFailureNetworkUpdate {
1389
+ update : channel_update,
1390
+ } ) ;
1391
+ }
1392
+ pending_events. push ( events:: Event :: PaymentFailed {
1393
+ payment_hash : payment_hash. clone ( ) ,
1394
+ rejected_by_dest : !payment_retryable,
1395
+ } ) ;
1396
+ } else {
1397
+ panic ! ( "should have onion error packet here" ) ;
1398
+ }
1389
1399
} ,
1390
1400
HTLCSource :: PreviousHopData ( HTLCPreviousHopData { short_channel_id, htlc_id, incoming_packet_shared_secret } ) => {
1391
1401
let err_packet = match onion_error {
@@ -1996,9 +2006,9 @@ impl ChannelManager {
1996
2006
} else { ( ( None , true ) ) }
1997
2007
}
1998
2008
1999
- fn internal_update_fail_htlc ( & self , their_node_id : & PublicKey , msg : & msgs:: UpdateFailHTLC ) -> Result < Option < msgs :: HTLCFailChannelUpdate > , MsgHandleErrInternal > {
2009
+ fn internal_update_fail_htlc ( & self , their_node_id : & PublicKey , msg : & msgs:: UpdateFailHTLC ) -> Result < ( ) , MsgHandleErrInternal > {
2000
2010
let mut channel_state = self . channel_state . lock ( ) . unwrap ( ) ;
2001
- let htlc_source = match channel_state. by_id . get_mut ( & msg. channel_id ) {
2011
+ match channel_state. by_id . get_mut ( & msg. channel_id ) {
2002
2012
Some ( chan) => {
2003
2013
if chan. get_their_node_id ( ) != * their_node_id {
2004
2014
//TODO: here and below MsgHandleErrInternal, #153 case
@@ -2009,17 +2019,7 @@ impl ChannelManager {
2009
2019
} ,
2010
2020
None => return Err ( MsgHandleErrInternal :: send_err_msg_no_close ( "Failed to find corresponding channel" , msg. channel_id ) )
2011
2021
} ?;
2012
-
2013
- // we are the origin node and update route information
2014
- // also determine if the payment is retryable
2015
- if let & HTLCSource :: OutboundRoute { .. } = htlc_source {
2016
- let ( channel_update, _payment_retry) = self . process_onion_failure ( htlc_source, msg. reason . data . clone ( ) ) ;
2017
- Ok ( channel_update)
2018
- // TODO: include pyament_retry info in PaymentFailed event that will be
2019
- // fired when receiving revoke_and_ack
2020
- } else {
2021
- Ok ( None )
2022
- }
2022
+ Ok ( ( ) )
2023
2023
}
2024
2024
2025
2025
fn internal_update_fail_malformed_htlc ( & self , their_node_id : & PublicKey , msg : & msgs:: UpdateFailMalformedHTLC ) -> Result < ( ) , MsgHandleErrInternal > {
@@ -2424,7 +2424,7 @@ impl ChannelMessageHandler for ChannelManager {
2424
2424
handle_error ! ( self , self . internal_update_fulfill_htlc( their_node_id, msg) , their_node_id)
2425
2425
}
2426
2426
2427
- fn handle_update_fail_htlc ( & self , their_node_id : & PublicKey , msg : & msgs:: UpdateFailHTLC ) -> Result < Option < msgs :: HTLCFailChannelUpdate > , HandleError > {
2427
+ fn handle_update_fail_htlc ( & self , their_node_id : & PublicKey , msg : & msgs:: UpdateFailHTLC ) -> Result < ( ) , HandleError > {
2428
2428
handle_error ! ( self , self . internal_update_fail_htlc( their_node_id, msg) , their_node_id)
2429
2429
}
2430
2430
@@ -3296,8 +3296,9 @@ mod tests {
3296
3296
let events = origin_node. node . get_and_clear_pending_events ( ) ;
3297
3297
assert_eq ! ( events. len( ) , 1 ) ;
3298
3298
match events[ 0 ] {
3299
- Event :: PaymentFailed { payment_hash } => {
3299
+ Event :: PaymentFailed { payment_hash, rejected_by_dest } => {
3300
3300
assert_eq ! ( payment_hash, our_payment_hash) ;
3301
+ assert ! ( rejected_by_dest) ;
3301
3302
} ,
3302
3303
_ => panic ! ( "Unexpected event" ) ,
3303
3304
}
@@ -5064,8 +5065,9 @@ mod tests {
5064
5065
_ => panic ! ( "Unexpected event" ) ,
5065
5066
}
5066
5067
match events[ 1 ] {
5067
- Event :: PaymentFailed { payment_hash } => {
5068
+ Event :: PaymentFailed { payment_hash, rejected_by_dest } => {
5068
5069
assert_eq ! ( payment_hash, payment_hash_5) ;
5070
+ assert ! ( rejected_by_dest) ;
5069
5071
} ,
5070
5072
_ => panic ! ( "Unexpected event" ) ,
5071
5073
}
0 commit comments