@@ -1306,7 +1306,7 @@ mod tests {
1306
1306
network_graph. update_channel ( & signed_update, & secp_ctx) . unwrap ( ) ;
1307
1307
}
1308
1308
1309
- fn payment_path ( amount_msat : u64 ) -> Vec < RouteHop > {
1309
+ fn payment_path_for_amount ( amount_msat : u64 ) -> Vec < RouteHop > {
1310
1310
vec ! [
1311
1311
RouteHop {
1312
1312
pubkey: source_pubkey( ) ,
@@ -1379,6 +1379,116 @@ mod tests {
1379
1379
assert_eq ! ( liquidity. as_directed( & recipient, & target, 1_000 ) . max_liquidity_msat( ) , 1000 ) ;
1380
1380
}
1381
1381
1382
+ #[ test]
1383
+ fn resets_liquidity_upper_bound_when_crossed_by_lower_bound ( ) {
1384
+ let network_graph = network_graph ( ) ;
1385
+ let params = ProbabilisticScoringParameters :: default ( ) ;
1386
+ let mut scorer = ProbabilisticScorer :: new ( params, sender_pubkey ( ) , & network_graph)
1387
+ . with_channel ( 42 ,
1388
+ ChannelLiquidity {
1389
+ min_liquidity_offset_msat : 200 , max_liquidity_offset_msat : 400
1390
+ } ) ;
1391
+ let source = source_node_id ( ) ;
1392
+ let target = target_node_id ( ) ;
1393
+ assert ! ( source > target) ;
1394
+
1395
+ // Check initial bounds.
1396
+ let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
1397
+ . as_directed ( & source, & target, 1_000 ) ;
1398
+ assert_eq ! ( liquidity. min_liquidity_msat( ) , 400 ) ;
1399
+ assert_eq ! ( liquidity. max_liquidity_msat( ) , 800 ) ;
1400
+
1401
+ let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
1402
+ . as_directed ( & target, & source, 1_000 ) ;
1403
+ assert_eq ! ( liquidity. min_liquidity_msat( ) , 200 ) ;
1404
+ assert_eq ! ( liquidity. max_liquidity_msat( ) , 600 ) ;
1405
+
1406
+ // Reset from source to target.
1407
+ scorer. channel_liquidities . get_mut ( & 42 ) . unwrap ( )
1408
+ . as_directed_mut ( & source, & target, 1_000 )
1409
+ . set_min_liquidity_msat ( 900 ) ;
1410
+
1411
+ let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
1412
+ . as_directed ( & source, & target, 1_000 ) ;
1413
+ assert_eq ! ( liquidity. min_liquidity_msat( ) , 900 ) ;
1414
+ assert_eq ! ( liquidity. max_liquidity_msat( ) , 1_000 ) ;
1415
+
1416
+ let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
1417
+ . as_directed ( & target, & source, 1_000 ) ;
1418
+ assert_eq ! ( liquidity. min_liquidity_msat( ) , 0 ) ;
1419
+ assert_eq ! ( liquidity. max_liquidity_msat( ) , 100 ) ;
1420
+
1421
+ // Reset from target to source.
1422
+ scorer. channel_liquidities . get_mut ( & 42 ) . unwrap ( )
1423
+ . as_directed_mut ( & target, & source, 1_000 )
1424
+ . set_min_liquidity_msat ( 400 ) ;
1425
+
1426
+ let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
1427
+ . as_directed ( & source, & target, 1_000 ) ;
1428
+ assert_eq ! ( liquidity. min_liquidity_msat( ) , 0 ) ;
1429
+ assert_eq ! ( liquidity. max_liquidity_msat( ) , 600 ) ;
1430
+
1431
+ let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
1432
+ . as_directed ( & target, & source, 1_000 ) ;
1433
+ assert_eq ! ( liquidity. min_liquidity_msat( ) , 400 ) ;
1434
+ assert_eq ! ( liquidity. max_liquidity_msat( ) , 1_000 ) ;
1435
+ }
1436
+
1437
+ #[ test]
1438
+ fn resets_liquidity_lower_bound_when_crossed_by_upper_bound ( ) {
1439
+ let network_graph = network_graph ( ) ;
1440
+ let params = ProbabilisticScoringParameters :: default ( ) ;
1441
+ let mut scorer = ProbabilisticScorer :: new ( params, sender_pubkey ( ) , & network_graph)
1442
+ . with_channel ( 42 ,
1443
+ ChannelLiquidity {
1444
+ min_liquidity_offset_msat : 200 , max_liquidity_offset_msat : 400
1445
+ } ) ;
1446
+ let source = source_node_id ( ) ;
1447
+ let target = target_node_id ( ) ;
1448
+ assert ! ( source > target) ;
1449
+
1450
+ // Check initial bounds.
1451
+ let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
1452
+ . as_directed ( & source, & target, 1_000 ) ;
1453
+ assert_eq ! ( liquidity. min_liquidity_msat( ) , 400 ) ;
1454
+ assert_eq ! ( liquidity. max_liquidity_msat( ) , 800 ) ;
1455
+
1456
+ let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
1457
+ . as_directed ( & target, & source, 1_000 ) ;
1458
+ assert_eq ! ( liquidity. min_liquidity_msat( ) , 200 ) ;
1459
+ assert_eq ! ( liquidity. max_liquidity_msat( ) , 600 ) ;
1460
+
1461
+ // Reset from source to target.
1462
+ scorer. channel_liquidities . get_mut ( & 42 ) . unwrap ( )
1463
+ . as_directed_mut ( & source, & target, 1_000 )
1464
+ . set_max_liquidity_msat ( 300 ) ;
1465
+
1466
+ let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
1467
+ . as_directed ( & source, & target, 1_000 ) ;
1468
+ assert_eq ! ( liquidity. min_liquidity_msat( ) , 0 ) ;
1469
+ assert_eq ! ( liquidity. max_liquidity_msat( ) , 300 ) ;
1470
+
1471
+ let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
1472
+ . as_directed ( & target, & source, 1_000 ) ;
1473
+ assert_eq ! ( liquidity. min_liquidity_msat( ) , 700 ) ;
1474
+ assert_eq ! ( liquidity. max_liquidity_msat( ) , 1_000 ) ;
1475
+
1476
+ // Reset from target to source.
1477
+ scorer. channel_liquidities . get_mut ( & 42 ) . unwrap ( )
1478
+ . as_directed_mut ( & target, & source, 1_000 )
1479
+ . set_max_liquidity_msat ( 600 ) ;
1480
+
1481
+ let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
1482
+ . as_directed ( & source, & target, 1_000 ) ;
1483
+ assert_eq ! ( liquidity. min_liquidity_msat( ) , 400 ) ;
1484
+ assert_eq ! ( liquidity. max_liquidity_msat( ) , 1_000 ) ;
1485
+
1486
+ let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
1487
+ . as_directed ( & target, & source, 1_000 ) ;
1488
+ assert_eq ! ( liquidity. min_liquidity_msat( ) , 0 ) ;
1489
+ assert_eq ! ( liquidity. max_liquidity_msat( ) , 600 ) ;
1490
+ }
1491
+
1382
1492
#[ test]
1383
1493
fn increased_penalty_nearing_liquidity_upper_bound ( ) {
1384
1494
let network_graph = network_graph ( ) ;
@@ -1418,30 +1528,83 @@ mod tests {
1418
1528
}
1419
1529
1420
1530
#[ test]
1421
- fn reduces_liquidity_upper_bound_on_success ( ) {
1531
+ fn does_not_penalize_own_channel ( ) {
1422
1532
let network_graph = network_graph ( ) ;
1423
1533
let params = ProbabilisticScoringParameters :: default ( ) ;
1424
- let mut scorer = ProbabilisticScorer :: new ( params, sender_pubkey ( ) , & network_graph)
1425
- . with_channel ( 42 ,
1426
- ChannelLiquidity { min_liquidity_offset_msat : 700 , max_liquidity_offset_msat : 0 } )
1427
- . with_channel ( 43 ,
1428
- ChannelLiquidity { min_liquidity_offset_msat : 0 , max_liquidity_offset_msat : 400 } ) ;
1534
+ let mut scorer = ProbabilisticScorer :: new ( params, sender_pubkey ( ) , & network_graph) ;
1535
+ let sender = sender_node_id ( ) ;
1536
+ let source = source_node_id ( ) ;
1537
+ let failed_path = payment_path_for_amount ( 500 ) ;
1538
+ let successful_path = payment_path_for_amount ( 200 ) ;
1539
+
1540
+ assert_eq ! ( scorer. channel_penalty_msat( 41 , 500 , 1_000 , & sender, & source) , 0 ) ;
1541
+
1542
+ scorer. payment_path_failed ( & failed_path. iter ( ) . collect :: < Vec < _ > > ( ) , 41 ) ;
1543
+ assert_eq ! ( scorer. channel_penalty_msat( 41 , 500 , 1_000 , & sender, & source) , 0 ) ;
1544
+
1545
+ scorer. payment_path_successful ( & successful_path. iter ( ) . collect :: < Vec < _ > > ( ) ) ;
1546
+ assert_eq ! ( scorer. channel_penalty_msat( 41 , 500 , 1_000 , & sender, & source) , 0 ) ;
1547
+ }
1548
+
1549
+ #[ test]
1550
+ fn sets_liquidity_lower_bound_on_downstream_failure ( ) {
1551
+ let network_graph = network_graph ( ) ;
1552
+ let params = ProbabilisticScoringParameters :: default ( ) ;
1553
+ let mut scorer = ProbabilisticScorer :: new ( params, sender_pubkey ( ) , & network_graph) ;
1554
+ let source = source_node_id ( ) ;
1555
+ let target = target_node_id ( ) ;
1556
+ let path = payment_path_for_amount ( 500 ) ;
1557
+
1558
+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 250 , 1_000 , & source, & target) , 124 ) ;
1559
+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 500 , 1_000 , & source, & target) , 300 ) ;
1560
+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 750 , 1_000 , & source, & target) , 600 ) ;
1561
+
1562
+ scorer. payment_path_failed ( & path. iter ( ) . collect :: < Vec < _ > > ( ) , 43 ) ;
1563
+
1564
+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 250 , 1_000 , & source, & target) , 0 ) ;
1565
+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 500 , 1_000 , & source, & target) , 0 ) ;
1566
+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 750 , 1_000 , & source, & target) , 300 ) ;
1567
+ }
1568
+
1569
+ #[ test]
1570
+ fn sets_liquidity_upper_bound_on_failure ( ) {
1571
+ let network_graph = network_graph ( ) ;
1572
+ let params = ProbabilisticScoringParameters :: default ( ) ;
1573
+ let mut scorer = ProbabilisticScorer :: new ( params, sender_pubkey ( ) , & network_graph) ;
1574
+ let source = source_node_id ( ) ;
1575
+ let target = target_node_id ( ) ;
1576
+ let path = payment_path_for_amount ( 500 ) ;
1577
+
1578
+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 250 , 1_000 , & source, & target) , 124 ) ;
1579
+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 500 , 1_000 , & source, & target) , 300 ) ;
1580
+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 750 , 1_000 , & source, & target) , 600 ) ;
1581
+
1582
+ scorer. payment_path_failed ( & path. iter ( ) . collect :: < Vec < _ > > ( ) , 42 ) ;
1583
+
1584
+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 250 , 1_000 , & source, & target) , 300 ) ;
1585
+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 500 , 1_000 , & source, & target) , 2699 ) ;
1586
+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 750 , 1_000 , & source, & target) , u64 :: max_value( ) ) ;
1587
+ }
1588
+
1589
+ #[ test]
1590
+ fn reduces_liquidity_upper_bound_along_path_on_success ( ) {
1591
+ let network_graph = network_graph ( ) ;
1592
+ let params = ProbabilisticScoringParameters :: default ( ) ;
1593
+ let mut scorer = ProbabilisticScorer :: new ( params, sender_pubkey ( ) , & network_graph) ;
1429
1594
let sender = sender_node_id ( ) ;
1430
1595
let source = source_node_id ( ) ;
1431
1596
let target = target_node_id ( ) ;
1432
1597
let recipient = recipient_node_id ( ) ;
1433
- let path = payment_path ( 200 ) ;
1598
+ let path = payment_path_for_amount ( 500 ) ;
1434
1599
1435
- assert_eq ! ( scorer. channel_penalty_msat( 41 , 200 , 1_000 , & sender, & source) , 0 ) ;
1436
- assert_eq ! ( scorer. channel_penalty_msat( 42 , 200 , 1_000 , & source, & target) , 474 ) ;
1437
- assert_eq ! ( scorer. channel_penalty_msat( 43 , 200 , 1_000 , & target, & recipient) , 175 ) ;
1600
+ assert_eq ! ( scorer. channel_penalty_msat( 41 , 250 , 1_000 , & sender, & source) , 0 ) ;
1601
+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 250 , 1_000 , & source, & target) , 124 ) ;
1602
+ assert_eq ! ( scorer. channel_penalty_msat( 43 , 250 , 1_000 , & target, & recipient) , 124 ) ;
1438
1603
1439
1604
scorer. payment_path_successful ( & path. iter ( ) . collect :: < Vec < _ > > ( ) ) ;
1440
1605
1441
- assert_eq ! ( scorer. channel_penalty_msat( 41 , 200 , 1_000 , & sender, & source) , 0 ) ;
1442
- assert_eq ! ( scorer. channel_penalty_msat( 42 , 200 , 1_000 , & source, & target) , u64 :: max_value ( ) ) ;
1443
- assert_eq ! ( scorer. channel_penalty_msat( 43 , 200 , 1_000 , & target, & recipient) , 299 ) ;
1606
+ assert_eq ! ( scorer. channel_penalty_msat( 41 , 250 , 1_000 , & sender, & source) , 0 ) ;
1607
+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 250 , 1_000 , & source, & target) , 300 ) ;
1608
+ assert_eq ! ( scorer. channel_penalty_msat( 43 , 250 , 1_000 , & target, & recipient) , 300 ) ;
1444
1609
}
1445
-
1446
- // TODO: Add more test coverage
1447
1610
}
0 commit comments