16
16
#[ cfg( any( test, feature = "std" ) ) ]
17
17
extern crate core;
18
18
19
+ #[ cfg( not( feature = "std" ) ) ]
20
+ extern crate alloc;
21
+
19
22
#[ macro_use] extern crate lightning;
20
23
extern crate lightning_rapid_gossip_sync;
21
24
@@ -28,7 +31,7 @@ use lightning::ln::msgs::{ChannelMessageHandler, OnionMessageHandler, RoutingMes
28
31
use lightning:: ln:: peer_handler:: { CustomMessageHandler , PeerManager , SocketDescriptor } ;
29
32
use lightning:: routing:: gossip:: { NetworkGraph , P2PGossipSync } ;
30
33
use lightning:: routing:: router:: Router ;
31
- use lightning:: routing:: scoring:: WriteableScore ;
34
+ use lightning:: routing:: scoring:: { Score , WriteableScore } ;
32
35
use lightning:: util:: events:: { Event , EventHandler , EventsProvider } ;
33
36
use lightning:: util:: logger:: Logger ;
34
37
use lightning:: util:: persist:: Persister ;
@@ -49,6 +52,8 @@ use std::time::Instant;
49
52
50
53
#[ cfg( feature = "futures" ) ]
51
54
use futures_util:: { select_biased, future:: FutureExt , task} ;
55
+ #[ cfg( not( feature = "std" ) ) ]
56
+ use alloc:: vec:: Vec ;
52
57
53
58
/// `BackgroundProcessor` takes care of tasks that (1) need to happen periodically to keep
54
59
/// Rust-Lightning running properly, and (2) either can or should be run in the background. Its
@@ -216,6 +221,34 @@ fn handle_network_graph_update<L: Deref>(
216
221
}
217
222
}
218
223
224
+ fn update_scorer < ' a , S : ' static + Deref < Target = SC > + Send + Sync , SC : ' a + WriteableScore < ' a > > (
225
+ scorer : & ' a S , event : & Event
226
+ ) {
227
+ match event {
228
+ Event :: PaymentPathFailed { ref path, short_channel_id : Some ( scid) , .. } => {
229
+ let path = path. iter ( ) . collect :: < Vec < _ > > ( ) ;
230
+ let mut score = scorer. lock ( ) ;
231
+ score. payment_path_failed ( & path, * scid) ;
232
+ } ,
233
+ Event :: PaymentPathSuccessful { path, .. } => {
234
+ let path = path. iter ( ) . collect :: < Vec < _ > > ( ) ;
235
+ let mut score = scorer. lock ( ) ;
236
+ score. payment_path_successful ( & path) ;
237
+ } ,
238
+ Event :: ProbeSuccessful { path, .. } => {
239
+ let path = path. iter ( ) . collect :: < Vec < _ > > ( ) ;
240
+ let mut score = scorer. lock ( ) ;
241
+ score. probe_successful ( & path) ;
242
+ } ,
243
+ Event :: ProbeFailed { path, short_channel_id : Some ( scid) , .. } => {
244
+ let path = path. iter ( ) . collect :: < Vec < _ > > ( ) ;
245
+ let mut score = scorer. lock ( ) ;
246
+ score. probe_failed ( & path, * scid) ;
247
+ } ,
248
+ _ => { } ,
249
+ }
250
+ }
251
+
219
252
macro_rules! define_run_body {
220
253
( $persister: ident, $chain_monitor: ident, $process_chain_monitor_events: expr,
221
254
$channel_manager: ident, $process_channel_manager_events: expr,
@@ -387,7 +420,7 @@ pub async fn process_events_async<
387
420
UMH : ' static + Deref + Send + Sync ,
388
421
PM : ' static + Deref < Target = PeerManager < Descriptor , CMH , RMH , OMH , L , UMH , NS > > + Send + Sync ,
389
422
S : ' static + Deref < Target = SC > + Send + Sync ,
390
- SC : WriteableScore < ' a > ,
423
+ SC : for < ' b > WriteableScore < ' b > ,
391
424
SleepFuture : core:: future:: Future < Output = bool > + core:: marker:: Unpin ,
392
425
Sleeper : Fn ( Duration ) -> SleepFuture
393
426
> (
@@ -417,10 +450,14 @@ where
417
450
let async_event_handler = |event| {
418
451
let network_graph = gossip_sync. network_graph ( ) ;
419
452
let event_handler = & event_handler;
453
+ let scorer = & scorer;
420
454
async move {
421
455
if let Some ( network_graph) = network_graph {
422
456
handle_network_graph_update ( network_graph, & event)
423
457
}
458
+ if let Some ( ref scorer) = scorer {
459
+ update_scorer ( scorer, & event) ;
460
+ }
424
461
event_handler ( event) . await ;
425
462
}
426
463
} ;
@@ -516,7 +553,7 @@ impl BackgroundProcessor {
516
553
UMH : ' static + Deref + Send + Sync ,
517
554
PM : ' static + Deref < Target = PeerManager < Descriptor , CMH , RMH , OMH , L , UMH , NS > > + Send + Sync ,
518
555
S : ' static + Deref < Target = SC > + Send + Sync ,
519
- SC : WriteableScore < ' a > ,
556
+ SC : for < ' b > WriteableScore < ' b > ,
520
557
> (
521
558
persister : PS , event_handler : EH , chain_monitor : M , channel_manager : CM ,
522
559
gossip_sync : GossipSync < PGS , RGS , G , CA , L > , peer_manager : PM , logger : L , scorer : Option < S > ,
@@ -547,6 +584,9 @@ impl BackgroundProcessor {
547
584
if let Some ( network_graph) = network_graph {
548
585
handle_network_graph_update ( network_graph, & event)
549
586
}
587
+ if let Some ( ref scorer) = scorer {
588
+ update_scorer ( scorer, & event) ;
589
+ }
550
590
event_handler. handle_event ( event) ;
551
591
} ;
552
592
define_run_body ! ( persister, chain_monitor, chain_monitor. process_pending_events( & event_handler) ,
@@ -618,15 +658,16 @@ mod tests {
618
658
use lightning:: chain:: keysinterface:: { InMemorySigner , EntropySource , KeysManager } ;
619
659
use lightning:: chain:: transaction:: OutPoint ;
620
660
use lightning:: get_event_msg;
621
- use lightning:: ln:: channelmanager:: { BREAKDOWN_TIMEOUT , ChainParameters , ChannelManager , SimpleArcChannelManager } ;
661
+ use lightning:: ln:: channelmanager:: { BREAKDOWN_TIMEOUT , ChainParameters , ChannelManager , PaymentId , Retry as ChannelManagerRetry , SimpleArcChannelManager } ;
662
+ use lightning:: ln:: functional_test_utils:: * ;
622
663
use lightning:: ln:: features:: ChannelFeatures ;
623
- use lightning:: ln:: msgs:: { ChannelMessageHandler , Init } ;
664
+ use lightning:: ln:: msgs:: { ChannelMessageHandler , Init , RoutingMessageHandler } ;
624
665
use lightning:: ln:: peer_handler:: { PeerManager , MessageHandler , SocketDescriptor , IgnoringMessageHandler } ;
625
- use lightning:: routing:: gossip:: { NetworkGraph , P2PGossipSync } ;
626
- use lightning:: routing:: router:: DefaultRouter ;
666
+ use lightning:: routing:: gossip:: { NetworkGraph , NodeId , P2PGossipSync } ;
667
+ use lightning:: routing:: router:: { DefaultRouter , PaymentParameters , RouteParameters } ;
627
668
use lightning:: routing:: scoring:: { ProbabilisticScoringParameters , ProbabilisticScorer } ;
628
669
use lightning:: util:: config:: UserConfig ;
629
- use lightning:: util:: events:: { Event , MessageSendEventsProvider , MessageSendEvent } ;
670
+ use lightning:: util:: events:: { Event , MessageSendEventsProvider , MessageSendEvent , PaymentPurpose } ;
630
671
use lightning:: util:: ser:: Writeable ;
631
672
use lightning:: util:: test_utils;
632
673
use lightning:: util:: persist:: KVStorePersister ;
@@ -782,8 +823,8 @@ mod tests {
782
823
let chain_monitor = Arc :: new ( chainmonitor:: ChainMonitor :: new ( Some ( chain_source. clone ( ) ) , tx_broadcaster. clone ( ) , logger. clone ( ) , fee_estimator. clone ( ) , persister. clone ( ) ) ) ;
783
824
let best_block = BestBlock :: from_genesis ( network) ;
784
825
let params = ChainParameters { network, best_block } ;
785
- let manager = Arc :: new ( ChannelManager :: new ( fee_estimator. clone ( ) , chain_monitor. clone ( ) , tx_broadcaster. clone ( ) , router. clone ( ) , logger. clone ( ) , keys_manager. clone ( ) , keys_manager. clone ( ) , keys_manager. clone ( ) , UserConfig :: default ( ) , params) ) ;
786
- let p2p_gossip_sync = Arc :: new ( P2PGossipSync :: new ( network_graph. clone ( ) , Some ( chain_source . clone ( ) ) , logger. clone ( ) ) ) ;
826
+ let manager = Arc :: new ( ChannelManager :: new ( fee_estimator. clone ( ) , chain_monitor. clone ( ) , tx_broadcaster. clone ( ) , router. clone ( ) , logger. clone ( ) , keys_manager. clone ( ) , keys_manager. clone ( ) , keys_manager. clone ( ) , test_default_channel_config ( ) , params) ) ;
827
+ let p2p_gossip_sync = Arc :: new ( P2PGossipSync :: new ( network_graph. clone ( ) , None , logger. clone ( ) ) ) ;
787
828
let rapid_gossip_sync = Arc :: new ( RapidGossipSync :: new ( network_graph. clone ( ) ) ) ;
788
829
let msg_handler = MessageHandler { chan_handler : Arc :: new ( test_utils:: TestChannelMessageHandler :: new ( ) ) , route_handler : Arc :: new ( test_utils:: TestRoutingMessageHandler :: new ( ) ) , onion_message_handler : IgnoringMessageHandler { } } ;
789
830
let peer_manager = Arc :: new ( PeerManager :: new ( msg_handler, 0 , & seed, logger. clone ( ) , IgnoringMessageHandler { } , keys_manager. clone ( ) ) ) ;
@@ -803,7 +844,7 @@ mod tests {
803
844
804
845
macro_rules! open_channel {
805
846
( $node_a: expr, $node_b: expr, $channel_value: expr) => { {
806
- begin_open_channel!( $node_a, $node_b, $channel_value) ;
847
+ begin_open_channel!( $node_a, $node_b, $channel_value, None ) ;
807
848
let events = $node_a. node. get_and_clear_pending_events( ) ;
808
849
assert_eq!( events. len( ) , 1 ) ;
809
850
let ( temporary_channel_id, tx) = handle_funding_generation_ready!( events[ 0 ] , $channel_value) ;
@@ -813,8 +854,8 @@ mod tests {
813
854
}
814
855
815
856
macro_rules! begin_open_channel {
816
- ( $node_a: expr, $node_b: expr, $channel_value: expr) => { {
817
- $node_a. node. create_channel( $node_b. node. get_our_node_id( ) , $channel_value, 100 , 42 , None ) . unwrap( ) ;
857
+ ( $node_a: expr, $node_b: expr, $channel_value: expr, $override_cfg : expr ) => { {
858
+ $node_a. node. create_channel( $node_b. node. get_our_node_id( ) , $channel_value, 100 , 42 , $override_cfg ) . unwrap( ) ;
818
859
$node_b. node. handle_open_channel( & $node_a. node. get_our_node_id( ) , & get_event_msg!( $node_a, MessageSendEvent :: SendOpenChannel , $node_b. node. get_our_node_id( ) ) ) ;
819
860
$node_a. node. handle_accept_channel( & $node_b. node. get_our_node_id( ) , & get_event_msg!( $node_b, MessageSendEvent :: SendAcceptChannel , $node_a. node. get_our_node_id( ) ) ) ;
820
861
} }
@@ -1034,7 +1075,7 @@ mod tests {
1034
1075
let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . no_gossip_sync ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
1035
1076
1036
1077
// Open a channel and check that the FundingGenerationReady event was handled.
1037
- begin_open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , channel_value) ;
1078
+ begin_open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , channel_value, Some ( UserConfig :: default ( ) ) ) ;
1038
1079
let ( temporary_channel_id, funding_tx) = receiver
1039
1080
. recv_timeout ( Duration :: from_secs ( EVENT_DEADLINE ) )
1040
1081
. expect ( "FundingGenerationReady not handled within deadline" ) ;
@@ -1171,4 +1212,164 @@ mod tests {
1171
1212
let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . no_gossip_sync ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
1172
1213
assert ! ( bg_processor. stop( ) . is_ok( ) ) ;
1173
1214
}
1215
+
1216
+ #[ test]
1217
+ fn test_payment_path_scoring ( ) {
1218
+ // Ensure that we update the scorer when relevant events are processed. In this case, we ensure
1219
+ // that we update the scorer upon a payment path succeeding (note that the channel must be
1220
+ // public or else we won't score it).
1221
+ let mut nodes = create_nodes ( 2 , "test_payment_path_scoring" . to_string ( ) ) ;
1222
+ let channel_value = 100000 ;
1223
+ let data_dir_0 = nodes[ 0 ] . persister . get_data_dir ( ) ;
1224
+ let persister_0 = Arc :: new ( Persister :: new ( data_dir_0. clone ( ) ) ) ;
1225
+
1226
+ // Set up a background event handler for FundingGenerationReady events.
1227
+ let ( sender, receiver) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
1228
+ let event_handler_0 = move |event : Event | match event {
1229
+ Event :: FundingGenerationReady { .. } => sender. send ( handle_funding_generation_ready ! ( event, channel_value) ) . unwrap ( ) ,
1230
+ Event :: ChannelReady { .. } => { } ,
1231
+ _ => panic ! ( "Unexpected event: {:?}" , event) ,
1232
+ } ;
1233
+
1234
+ let bg_processor_0 = BackgroundProcessor :: start ( persister_0, event_handler_0, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . no_gossip_sync ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
1235
+
1236
+ // Open a channel and check that the FundingGenerationReady event was handled.
1237
+ begin_open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , channel_value, None ) ;
1238
+ let ( temporary_channel_id, funding_tx) = receiver
1239
+ . recv_timeout ( Duration :: from_secs ( EVENT_DEADLINE ) )
1240
+ . expect ( "FundingGenerationReady not handled within deadline" ) ;
1241
+ end_open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , temporary_channel_id, funding_tx) ;
1242
+
1243
+ // Confirm the funding transaction.
1244
+ confirm_transaction ( & mut nodes[ 0 ] , & funding_tx) ;
1245
+ let as_funding = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendChannelReady , nodes[ 1 ] . node. get_our_node_id( ) ) ;
1246
+ confirm_transaction ( & mut nodes[ 1 ] , & funding_tx) ;
1247
+ let bs_funding = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelReady , nodes[ 0 ] . node. get_our_node_id( ) ) ;
1248
+ nodes[ 0 ] . node . handle_channel_ready ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_funding) ;
1249
+ let as_ann_sigs = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendAnnouncementSignatures , nodes[ 1 ] . node. get_our_node_id( ) ) ;
1250
+ nodes[ 1 ] . node . handle_channel_ready ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_funding) ;
1251
+ let bs_ann_sigs = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendAnnouncementSignatures , nodes[ 0 ] . node. get_our_node_id( ) ) ;
1252
+ nodes[ 1 ] . node . handle_announcement_signatures ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_ann_sigs) ;
1253
+ let events = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
1254
+ assert_eq ! ( events. len( ) , 1 ) ;
1255
+ let ( ann, bs_update) = match events[ 0 ] {
1256
+ MessageSendEvent :: BroadcastChannelAnnouncement { ref msg, ref update_msg } => {
1257
+ ( msg, update_msg)
1258
+ } ,
1259
+ _ => panic ! ( "Unexpected event" ) ,
1260
+ } ;
1261
+ let scid = bs_update. contents . short_channel_id ;
1262
+ nodes[ 0 ] . node . handle_announcement_signatures ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_ann_sigs) ;
1263
+ let events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
1264
+ assert_eq ! ( events. len( ) , 1 ) ;
1265
+ let as_update = match events[ 0 ] {
1266
+ MessageSendEvent :: BroadcastChannelAnnouncement { ref msg, ref update_msg } => {
1267
+ assert ! ( * ann == * msg) ;
1268
+ assert_eq ! ( update_msg. contents. short_channel_id, ann. contents. short_channel_id) ;
1269
+ assert_eq ! ( update_msg. contents. short_channel_id, bs_update. contents. short_channel_id) ;
1270
+ update_msg
1271
+ } ,
1272
+ _ => panic ! ( "Unexpected event" ) ,
1273
+ } ;
1274
+
1275
+ for node in nodes. iter ( ) {
1276
+ assert ! ( node. p2p_gossip_sync. handle_channel_announcement( ann) . unwrap( ) ) ;
1277
+ node. p2p_gossip_sync . handle_channel_update ( as_update) . unwrap ( ) ;
1278
+ node. p2p_gossip_sync . handle_channel_update ( bs_update) . unwrap ( ) ;
1279
+
1280
+ node. node . handle_channel_update ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_update) ;
1281
+ node. node . handle_channel_update ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_update) ;
1282
+ }
1283
+
1284
+ assert ! ( bg_processor_0. stop( ) . is_ok( ) ) ;
1285
+
1286
+ let ( sender_0, receiver_0) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
1287
+ let event_handler_0 = move |event : Event | match event {
1288
+ Event :: ChannelReady { .. } => { } ,
1289
+ Event :: PendingHTLCsForwardable { .. } => { } ,
1290
+ Event :: PaymentSent { .. } => { } ,
1291
+ Event :: PaymentPathSuccessful { .. } => sender_0. send ( event) . unwrap ( ) ,
1292
+ _ => panic ! ( "Unexpected event: {:?}" , event) ,
1293
+ } ;
1294
+ let persister_0 = Arc :: new ( Persister :: new ( data_dir_0) ) ;
1295
+ let _bg_processor_0 = BackgroundProcessor :: start ( persister_0, event_handler_0, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . no_gossip_sync ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
1296
+
1297
+ let amt_msat = 40000 ;
1298
+ let payment_params = PaymentParameters :: from_node_id ( nodes[ 1 ] . node . get_our_node_id ( ) )
1299
+ . with_features ( nodes[ 1 ] . node . invoice_features ( ) ) ;
1300
+ let route_params = RouteParameters {
1301
+ payment_params,
1302
+ final_value_msat : amt_msat,
1303
+ final_cltv_expiry_delta : 70 ,
1304
+ } ;
1305
+ let ( payment_hash, payment_secret) = nodes[ 1 ] . node . create_inbound_payment ( Some ( amt_msat) , 60 * 60 , None ) . unwrap ( ) ;
1306
+
1307
+ let ( sender_1, receiver_1) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
1308
+ let event_handler_1 = move |event : Event | match event {
1309
+ Event :: ChannelReady { .. } => { } ,
1310
+ Event :: PendingHTLCsForwardable { .. } => { } ,
1311
+ Event :: PaymentClaimable { .. } => sender_1. send ( event) . unwrap ( ) ,
1312
+ Event :: PaymentClaimed { .. } => { } ,
1313
+ _ => panic ! ( "Unexpected event: {:?}" , event) ,
1314
+ } ;
1315
+ let data_dir_1 = nodes[ 1 ] . persister . get_data_dir ( ) ;
1316
+ let persister_1 = Arc :: new ( Persister :: new ( data_dir_1. clone ( ) ) ) ;
1317
+ let _bg_processor_1 = BackgroundProcessor :: start ( persister_1, event_handler_1, nodes[ 1 ] . chain_monitor . clone ( ) , nodes[ 1 ] . node . clone ( ) , nodes[ 1 ] . no_gossip_sync ( ) , nodes[ 1 ] . peer_manager . clone ( ) , nodes[ 1 ] . logger . clone ( ) , Some ( nodes[ 1 ] . scorer . clone ( ) ) ) ;
1318
+
1319
+ nodes[ 0 ] . node . send_payment_with_retry ( payment_hash, & Some ( payment_secret) , PaymentId ( payment_hash. 0 ) , route_params, ChannelManagerRetry :: Attempts ( 0 ) ) . unwrap ( ) ;
1320
+
1321
+ let mut msg_events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
1322
+
1323
+ assert_eq ! ( msg_events. len( ) , 1 ) ;
1324
+ let payment_event = SendEvent :: from_event ( msg_events. remove ( 0 ) ) ;
1325
+
1326
+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) ;
1327
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & payment_event. commitment_msg ) ;
1328
+ let ( bs_first_raa, bs_first_cs) = get_revoke_commit_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
1329
+
1330
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_first_raa) ;
1331
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_first_cs) ;
1332
+ let as_first_raa = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 1 ] . node. get_our_node_id( ) ) ;
1333
+
1334
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_first_raa) ;
1335
+ nodes[ 1 ] . node . process_pending_htlc_forwards ( ) ;
1336
+
1337
+ let event = receiver_1
1338
+ . recv_timeout ( Duration :: from_secs ( EVENT_DEADLINE ) )
1339
+ . expect ( "Events not handled within deadline" ) ;
1340
+ match event {
1341
+ Event :: PaymentClaimable { purpose : PaymentPurpose :: InvoicePayment { payment_preimage : Some ( payment_preimage) , .. } , .. } => nodes[ 1 ] . node . claim_funds ( payment_preimage) ,
1342
+ Event :: ChannelReady { .. } => { } ,
1343
+ _ => panic ! ( "Unexpected event: {:?}" , event) ,
1344
+ }
1345
+
1346
+ nodes[ 1 ] . node . process_pending_htlc_forwards ( ) ;
1347
+ let update_1 = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
1348
+ assert ! ( update_1. update_fulfill_htlcs. len( ) == 1 ) ;
1349
+ let fulfill_msg = update_1. update_fulfill_htlcs [ 0 ] . clone ( ) ;
1350
+
1351
+ nodes[ 0 ] . node . handle_update_fulfill_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & fulfill_msg) ;
1352
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & update_1. commitment_signed ) ;
1353
+ let ( as_first_raa, as_first_cs) = get_revoke_commit_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
1354
+
1355
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_first_raa) ;
1356
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_first_cs) ;
1357
+ let bs_first_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
1358
+
1359
+ // Ensure that nodes[0] has no capacity data for its channel before the PaymentPathSuccess event
1360
+ // is processed.
1361
+ assert_eq ! ( nodes[ 0 ] . scorer. lock( ) . unwrap( ) . estimated_channel_liquidity_range( scid, & NodeId :: from_pubkey( & nodes[ 0 ] . node. get_our_node_id( ) ) ) , None ) ;
1362
+
1363
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_first_raa) ;
1364
+
1365
+ let event = receiver_0
1366
+ . recv_timeout ( Duration :: from_secs ( EVENT_DEADLINE ) )
1367
+ . expect ( "Events not handled within deadline" ) ;
1368
+ match event {
1369
+ Event :: PaymentPathSuccessful { .. } => {
1370
+ assert_eq ! ( nodes[ 0 ] . scorer. lock( ) . unwrap( ) . estimated_channel_liquidity_range( scid, & NodeId :: from_pubkey( & nodes[ 0 ] . node. get_our_node_id( ) ) ) , Some ( ( 40000 , 10000000 ) ) ) ;
1371
+ } ,
1372
+ _ => panic ! ( "Unexpected event: {:?}" , event) ,
1373
+ }
1374
+ }
1174
1375
}
0 commit comments