@@ -418,6 +418,22 @@ pub enum Event {
418418 /// Custom TLV records attached to the payment
419419 custom_records : Vec < CustomTlvRecord > ,
420420 } ,
421+ /// A sent payment probe was successful.
422+ ProbeSuccessful {
423+ /// A local identifier used to track the probe.
424+ payment_id : PaymentId ,
425+ /// The hash of the probe payment.
426+ payment_hash : PaymentHash ,
427+ } ,
428+ /// A sent payment probe has failed.
429+ ProbeFailed {
430+ /// A local identifier used to track the probe.
431+ payment_id : PaymentId ,
432+ /// The hash of the probe payment.
433+ payment_hash : PaymentHash ,
434+ /// The channel responsible for the failed probe, if known.
435+ short_channel_id : Option < u64 > ,
436+ } ,
421437 /// A channel has been created and is pending confirmation on-chain.
422438 ChannelPending {
423439 /// The `channel_id` of the channel.
@@ -944,6 +960,15 @@ impl_writeable_tlv_based_enum!(Event,
944960 ( 6 , new_total_onchain_balance_sats, required) ,
945961 ( 8 , old_total_lightning_balance_sats, required) ,
946962 ( 10 , new_total_lightning_balance_sats, required) ,
963+ } ,
964+ ( 18 , ProbeSuccessful ) => {
965+ ( 0 , payment_hash, required) ,
966+ ( 2 , payment_id, required) ,
967+ } ,
968+ ( 19 , ProbeFailed ) => {
969+ ( 0 , payment_hash, required) ,
970+ ( 1 , short_channel_id, option) ,
971+ ( 3 , payment_id, required) ,
947972 }
948973) ;
949974
@@ -1779,8 +1804,26 @@ where
17791804
17801805 LdkEvent :: PaymentPathSuccessful { .. } => { } ,
17811806 LdkEvent :: PaymentPathFailed { .. } => { } ,
1782- LdkEvent :: ProbeSuccessful { .. } => { } ,
1783- LdkEvent :: ProbeFailed { .. } => { } ,
1807+ LdkEvent :: ProbeSuccessful { payment_id, payment_hash, .. } => {
1808+ let event = Event :: ProbeSuccessful { payment_id, payment_hash } ;
1809+ match self . event_queue . add_event ( event) . await {
1810+ Ok ( _) => { } ,
1811+ Err ( e) => {
1812+ log_error ! ( self . logger, "Failed to push probe event: {}" , e) ;
1813+ return Err ( ReplayEvent ( ) ) ;
1814+ } ,
1815+ }
1816+ } ,
1817+ LdkEvent :: ProbeFailed { payment_id, payment_hash, short_channel_id, .. } => {
1818+ let event = Event :: ProbeFailed { payment_id, payment_hash, short_channel_id } ;
1819+ match self . event_queue . add_event ( event) . await {
1820+ Ok ( _) => { } ,
1821+ Err ( e) => {
1822+ log_error ! ( self . logger, "Failed to push probe event: {}" , e) ;
1823+ return Err ( ReplayEvent ( ) ) ;
1824+ } ,
1825+ }
1826+ } ,
17841827 LdkEvent :: HTLCHandlingFailed { failure_type, .. } => {
17851828 if let Some ( liquidity_source) = self . liquidity_source . as_ref ( ) {
17861829 liquidity_source. handle_htlc_handling_failed ( failure_type) . await ;
@@ -2573,4 +2616,40 @@ mod tests {
25732616 }
25742617 assert_eq ! ( event_queue. next_event( ) , None ) ;
25752618 }
2619+
2620+ #[ tokio:: test]
2621+ async fn probe_events_persistence_roundtrip ( ) {
2622+ let store: Arc < DynStore > = Arc :: new ( InMemoryStore :: new ( ) ) ;
2623+ let logger = Arc :: new ( TestLogger :: new ( ) ) ;
2624+ let event_queue = Arc :: new ( EventQueue :: new ( Arc :: clone ( & store) , Arc :: clone ( & logger) ) ) ;
2625+
2626+ assert_eq ! ( event_queue. next_event( ) , None ) ;
2627+
2628+ let payment_hash = PaymentHash ( [ 7u8 ; 32 ] ) ;
2629+ let payment_id = PaymentId ( payment_hash. 0 ) ;
2630+ let expected_event =
2631+ Event :: ProbeFailed { payment_id, payment_hash, short_channel_id : Some ( 42 ) } ;
2632+
2633+ event_queue. add_event ( expected_event. clone ( ) ) . await . unwrap ( ) ;
2634+
2635+ // Check we get the expected event and that it is returned until handled.
2636+ assert_eq ! ( event_queue. next_event_async( ) . await , expected_event) ;
2637+ assert_eq ! ( event_queue. next_event( ) , Some ( expected_event. clone( ) ) ) ;
2638+
2639+ // Check we can read back what we persisted.
2640+ let persisted_bytes = KVStore :: read (
2641+ & * store,
2642+ EVENT_QUEUE_PERSISTENCE_PRIMARY_NAMESPACE ,
2643+ EVENT_QUEUE_PERSISTENCE_SECONDARY_NAMESPACE ,
2644+ EVENT_QUEUE_PERSISTENCE_KEY ,
2645+ )
2646+ . await
2647+ . unwrap ( ) ;
2648+ let deser_event_queue =
2649+ EventQueue :: read ( & mut & persisted_bytes[ ..] , ( Arc :: clone ( & store) , logger) ) . unwrap ( ) ;
2650+ assert_eq ! ( deser_event_queue. next_event_async( ) . await , expected_event) ;
2651+
2652+ event_queue. event_handled ( ) . await . unwrap ( ) ;
2653+ assert_eq ! ( event_queue. next_event( ) , None ) ;
2654+ }
25762655}
0 commit comments