@@ -70,6 +70,12 @@ pub struct Route {
70
70
/// given path is variable, keeping the length of any path to less than 20 should currently
71
71
/// ensure it is viable.
72
72
pub paths : Vec < Vec < RouteHop > > ,
73
+ /// The `payee` parameter passed to [`get_route`].
74
+ /// This is used by `ChannelManager` to track information which may be required for retries,
75
+ /// provided back to you via [`Event::PaymentPathFailed`].
76
+ ///
77
+ /// [`Event::PaymentPathFailed`]: crate::util::events::Event::PaymentPathFailed
78
+ pub payee : Option < Payee > ,
73
79
}
74
80
75
81
impl Route {
@@ -106,7 +112,9 @@ impl Writeable for Route {
106
112
hop. write ( writer) ?;
107
113
}
108
114
}
109
- write_tlv_fields ! ( writer, { } ) ;
115
+ write_tlv_fields ! ( writer, {
116
+ ( 1 , self . payee, option) ,
117
+ } ) ;
110
118
Ok ( ( ) )
111
119
}
112
120
}
@@ -124,8 +132,11 @@ impl Readable for Route {
124
132
}
125
133
paths. push ( hops) ;
126
134
}
127
- read_tlv_fields ! ( reader, { } ) ;
128
- Ok ( Route { paths } )
135
+ let mut payee = None ;
136
+ read_tlv_fields ! ( reader, {
137
+ ( 1 , payee, option) ,
138
+ } ) ;
139
+ Ok ( Route { paths, payee } )
129
140
}
130
141
}
131
142
@@ -153,7 +164,7 @@ impl_writeable_tlv_based!(PaymentPathRetry, {
153
164
} ) ;
154
165
155
166
/// The recipient of a payment.
156
- #[ derive( Clone , Debug ) ]
167
+ #[ derive( Clone , Debug , Hash , PartialEq , Eq ) ]
157
168
pub struct Payee {
158
169
/// The node id of the payee.
159
170
pub pubkey : PublicKey ,
@@ -1442,7 +1453,10 @@ where L::Target: Logger {
1442
1453
}
1443
1454
}
1444
1455
1445
- let route = Route { paths : selected_paths. into_iter ( ) . map ( |path| path. into_iter ( ) . collect ( ) ) . collect :: < Result < Vec < _ > , _ > > ( ) ? } ;
1456
+ let route = Route {
1457
+ paths : selected_paths. into_iter ( ) . map ( |path| path. into_iter ( ) . collect ( ) ) . collect :: < Result < Vec < _ > , _ > > ( ) ?,
1458
+ payee : Some ( payee. clone ( ) ) ,
1459
+ } ;
1446
1460
log_info ! ( logger, "Got route to {}: {}" , payee. pubkey, log_route!( route) ) ;
1447
1461
Ok ( route)
1448
1462
}
@@ -4600,6 +4614,7 @@ mod tests {
4600
4614
short_channel_id: 0 , fee_msat: 225 , cltv_expiry_delta: 0
4601
4615
} ,
4602
4616
] ] ,
4617
+ payee : None ,
4603
4618
} ;
4604
4619
4605
4620
assert_eq ! ( route. get_total_fees( ) , 250 ) ;
@@ -4632,6 +4647,7 @@ mod tests {
4632
4647
short_channel_id: 0 , fee_msat: 150 , cltv_expiry_delta: 0
4633
4648
} ,
4634
4649
] ] ,
4650
+ payee : None ,
4635
4651
} ;
4636
4652
4637
4653
assert_eq ! ( route. get_total_fees( ) , 200 ) ;
@@ -4643,7 +4659,7 @@ mod tests {
4643
4659
// In an earlier version of `Route::get_total_fees` and `Route::get_total_amount`, they
4644
4660
// would both panic if the route was completely empty. We test to ensure they return 0
4645
4661
// here, even though its somewhat nonsensical as a route.
4646
- let route = Route { paths : Vec :: new ( ) } ;
4662
+ let route = Route { paths : Vec :: new ( ) , payee : None } ;
4647
4663
4648
4664
assert_eq ! ( route. get_total_fees( ) , 0 ) ;
4649
4665
assert_eq ! ( route. get_total_amount( ) , 0 ) ;
0 commit comments