@@ -518,6 +518,11 @@ pub struct ProbabilisticScorerUsingTime<G: Deref<Target = NetworkGraph>, T: Time
518
518
/// Parameters for configuring [`ProbabilisticScorer`].
519
519
#[ derive( Clone , Copy ) ]
520
520
pub struct ProbabilisticScoringParameters {
521
+ /// A fixed penalty in msats to apply to each channel.
522
+ ///
523
+ /// Default value: 500 msat
524
+ pub base_penalty_msat : u64 ,
525
+
521
526
/// The function calculating the cost of routing an amount through a channel.
522
527
///
523
528
/// The cost is multiplied by [`liquidity_penalty_multiplier_msat`] to determine the channel
@@ -627,6 +632,7 @@ impl Default for ProbabilisticScoringParameters {
627
632
cost_function : ProbabilisticScoringCostFunction :: NegativeLogSuccessProbability ,
628
633
liquidity_penalty_multiplier_msat : 10_000 ,
629
634
liquidity_offset_half_life : Duration :: from_secs ( 3600 ) ,
635
+ base_penalty_msat : 500 ,
630
636
}
631
637
}
632
638
}
@@ -789,6 +795,7 @@ impl<G: Deref<Target = NetworkGraph>, T: Time> Score for ProbabilisticScorerUsin
789
795
. unwrap_or ( & ChannelLiquidity :: new ( ) )
790
796
. as_directed ( source, target, capacity_msat, self . params . liquidity_offset_half_life )
791
797
. penalty_msat ( amount_msat, & self . params )
798
+ . saturating_add ( self . params . base_penalty_msat )
792
799
}
793
800
794
801
fn payment_path_failed ( & mut self , path : & [ & RouteHop ] , short_channel_id : u64 ) {
@@ -1769,7 +1776,7 @@ mod tests {
1769
1776
fn increased_penalty_nearing_liquidity_upper_bound ( ) {
1770
1777
let network_graph = network_graph ( ) ;
1771
1778
let params = ProbabilisticScoringParameters {
1772
- liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1779
+ base_penalty_msat : 0 , liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1773
1780
} ;
1774
1781
let scorer = ProbabilisticScorer :: new ( params, & network_graph) ;
1775
1782
let source = source_node_id ( ) ;
@@ -1793,6 +1800,7 @@ mod tests {
1793
1800
fn increased_penalty_linearly_nearing_liquidity_upper_bound ( ) {
1794
1801
let network_graph = network_graph ( ) ;
1795
1802
let params = ProbabilisticScoringParameters {
1803
+ base_penalty_msat : 0 ,
1796
1804
cost_function : ProbabilisticScoringCostFunction :: TwiceFailureProbability ,
1797
1805
liquidity_penalty_multiplier_msat : 1_000 ,
1798
1806
..Default :: default ( )
@@ -1820,7 +1828,7 @@ mod tests {
1820
1828
let last_updated = SinceEpoch :: now ( ) ;
1821
1829
let network_graph = network_graph ( ) ;
1822
1830
let params = ProbabilisticScoringParameters {
1823
- liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1831
+ base_penalty_msat : 0 , liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1824
1832
} ;
1825
1833
let scorer = ProbabilisticScorer :: new ( params, & network_graph)
1826
1834
. with_channel ( 42 ,
@@ -1840,7 +1848,7 @@ mod tests {
1840
1848
fn does_not_further_penalize_own_channel ( ) {
1841
1849
let network_graph = network_graph ( ) ;
1842
1850
let params = ProbabilisticScoringParameters {
1843
- liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1851
+ base_penalty_msat : 0 , liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1844
1852
} ;
1845
1853
let mut scorer = ProbabilisticScorer :: new ( params, & network_graph) ;
1846
1854
let sender = sender_node_id ( ) ;
@@ -1861,7 +1869,7 @@ mod tests {
1861
1869
fn sets_liquidity_lower_bound_on_downstream_failure ( ) {
1862
1870
let network_graph = network_graph ( ) ;
1863
1871
let params = ProbabilisticScoringParameters {
1864
- liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1872
+ base_penalty_msat : 0 , liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1865
1873
} ;
1866
1874
let mut scorer = ProbabilisticScorer :: new ( params, & network_graph) ;
1867
1875
let source = source_node_id ( ) ;
@@ -1883,7 +1891,7 @@ mod tests {
1883
1891
fn sets_liquidity_upper_bound_on_failure ( ) {
1884
1892
let network_graph = network_graph ( ) ;
1885
1893
let params = ProbabilisticScoringParameters {
1886
- liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1894
+ base_penalty_msat : 0 , liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1887
1895
} ;
1888
1896
let mut scorer = ProbabilisticScorer :: new ( params, & network_graph) ;
1889
1897
let source = source_node_id ( ) ;
@@ -1905,7 +1913,7 @@ mod tests {
1905
1913
fn reduces_liquidity_upper_bound_along_path_on_success ( ) {
1906
1914
let network_graph = network_graph ( ) ;
1907
1915
let params = ProbabilisticScoringParameters {
1908
- liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1916
+ base_penalty_msat : 0 , liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1909
1917
} ;
1910
1918
let mut scorer = ProbabilisticScorer :: new ( params, & network_graph) ;
1911
1919
let sender = sender_node_id ( ) ;
@@ -1929,6 +1937,7 @@ mod tests {
1929
1937
fn decays_liquidity_bounds_over_time ( ) {
1930
1938
let network_graph = network_graph ( ) ;
1931
1939
let params = ProbabilisticScoringParameters {
1940
+ base_penalty_msat : 0 ,
1932
1941
liquidity_penalty_multiplier_msat : 1_000 ,
1933
1942
liquidity_offset_half_life : Duration :: from_secs ( 10 ) ,
1934
1943
..Default :: default ( )
@@ -1981,6 +1990,7 @@ mod tests {
1981
1990
fn decays_liquidity_bounds_without_shift_overflow ( ) {
1982
1991
let network_graph = network_graph ( ) ;
1983
1992
let params = ProbabilisticScoringParameters {
1993
+ base_penalty_msat : 0 ,
1984
1994
liquidity_penalty_multiplier_msat : 1_000 ,
1985
1995
liquidity_offset_half_life : Duration :: from_secs ( 10 ) ,
1986
1996
..Default :: default ( )
@@ -2006,6 +2016,7 @@ mod tests {
2006
2016
fn restricts_liquidity_bounds_after_decay ( ) {
2007
2017
let network_graph = network_graph ( ) ;
2008
2018
let params = ProbabilisticScoringParameters {
2019
+ base_penalty_msat : 0 ,
2009
2020
liquidity_penalty_multiplier_msat : 1_000 ,
2010
2021
liquidity_offset_half_life : Duration :: from_secs ( 10 ) ,
2011
2022
..Default :: default ( )
@@ -2044,6 +2055,7 @@ mod tests {
2044
2055
fn restores_persisted_liquidity_bounds ( ) {
2045
2056
let network_graph = network_graph ( ) ;
2046
2057
let params = ProbabilisticScoringParameters {
2058
+ base_penalty_msat : 0 ,
2047
2059
liquidity_penalty_multiplier_msat : 1_000 ,
2048
2060
liquidity_offset_half_life : Duration :: from_secs ( 10 ) ,
2049
2061
..Default :: default ( )
@@ -2074,6 +2086,7 @@ mod tests {
2074
2086
fn decays_persisted_liquidity_bounds ( ) {
2075
2087
let network_graph = network_graph ( ) ;
2076
2088
let params = ProbabilisticScoringParameters {
2089
+ base_penalty_msat : 0 ,
2077
2090
liquidity_penalty_multiplier_msat : 1_000 ,
2078
2091
liquidity_offset_half_life : Duration :: from_secs ( 10 ) ,
2079
2092
..Default :: default ( )
@@ -2101,4 +2114,23 @@ mod tests {
2101
2114
SinceEpoch :: advance ( Duration :: from_secs ( 10 ) ) ;
2102
2115
assert_eq ! ( deserialized_scorer. channel_penalty_msat( 42 , 500 , 1_000 , & source, & target) , 371 ) ;
2103
2116
}
2117
+
2118
+ #[ test]
2119
+ fn adds_base_penalty_to_liquidity_penalty ( ) {
2120
+ let network_graph = network_graph ( ) ;
2121
+ let source = source_node_id ( ) ;
2122
+ let target = target_node_id ( ) ;
2123
+
2124
+ let params = ProbabilisticScoringParameters {
2125
+ base_penalty_msat : 0 , ..Default :: default ( )
2126
+ } ;
2127
+ let scorer = ProbabilisticScorer :: new ( params, & network_graph) ;
2128
+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 128 , 1_024 , & source, & target) , 585 ) ;
2129
+
2130
+ let params = ProbabilisticScoringParameters {
2131
+ base_penalty_msat : 500 , ..Default :: default ( )
2132
+ } ;
2133
+ let scorer = ProbabilisticScorer :: new ( params, & network_graph) ;
2134
+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 128 , 1_024 , & source, & target) , 1085 ) ;
2135
+ }
2104
2136
}
0 commit comments