@@ -37,7 +37,6 @@ use crate::types::features::{
37
37
use crate :: types:: payment:: { PaymentHash , PaymentPreimage } ;
38
38
use crate :: util:: logger:: Logger ;
39
39
use crate :: util:: ser:: { Readable , ReadableArgs , Writeable , Writer } ;
40
-
41
40
use crate :: io;
42
41
use crate :: prelude:: * ;
43
42
use alloc:: collections:: BinaryHeap ;
@@ -2453,7 +2452,7 @@ where L::Target: Logger {
2453
2452
let our_node_id = NodeId :: from_pubkey ( & our_node_pubkey) ;
2454
2453
2455
2454
if payee_node_id_opt. map_or ( false , |payee| payee == our_node_id) {
2456
- return Err ( "Cannot generate a route to ourselves" ) ;
2455
+ return create_self_payment_route ( our_node_pubkey , route_params ) ;
2457
2456
}
2458
2457
if our_node_id == maybe_dummy_payee_node_id {
2459
2458
return Err ( "Invalid origin node id provided, use a different one" ) ;
@@ -3727,6 +3726,25 @@ where L::Target: Logger {
3727
3726
Ok ( route)
3728
3727
}
3729
3728
3729
+ fn create_self_payment_route ( our_node_pubkey : & PublicKey , route_params : & RouteParameters ) -> Result < Route , & ' static str > {
3730
+ let path = Path {
3731
+ hops : vec ! [ RouteHop {
3732
+ pubkey: our_node_pubkey. clone( ) ,
3733
+ short_channel_id: 0 , // Dummy short_channel_id specifying self payment
3734
+ fee_msat: 0 , // Zero fees
3735
+ cltv_expiry_delta: MIN_FINAL_CLTV_EXPIRY_DELTA . into( ) ,
3736
+ node_features: NodeFeatures :: empty( ) ,
3737
+ channel_features: ChannelFeatures :: empty( ) ,
3738
+ maybe_announced_channel: false ,
3739
+ } ] ,
3740
+ blinded_tail : None ,
3741
+ } ;
3742
+ Ok ( Route {
3743
+ paths : vec ! [ path] ,
3744
+ route_params : Some ( route_params. clone ( ) ) ,
3745
+ } )
3746
+ }
3747
+
3730
3748
// When an adversarial intermediary node observes a payment, it may be able to infer its
3731
3749
// destination, if the remaining CLTV expiry delta exactly matches a feasible path in the network
3732
3750
// graph. In order to improve privacy, this method obfuscates the CLTV expiry deltas along the
0 commit comments