@@ -37,7 +37,6 @@ use crate::types::features::{
3737use crate :: types:: payment:: { PaymentHash , PaymentPreimage } ;
3838use crate :: util:: logger:: Logger ;
3939use crate :: util:: ser:: { Readable , ReadableArgs , Writeable , Writer } ;
40-
4140use crate :: io;
4241use crate :: prelude:: * ;
4342use alloc:: collections:: BinaryHeap ;
@@ -2453,7 +2452,7 @@ where L::Target: Logger {
24532452 let our_node_id = NodeId :: from_pubkey ( & our_node_pubkey) ;
24542453
24552454 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 ) ;
24572456 }
24582457 if our_node_id == maybe_dummy_payee_node_id {
24592458 return Err ( "Invalid origin node id provided, use a different one" ) ;
@@ -3727,6 +3726,25 @@ where L::Target: Logger {
37273726 Ok ( route)
37283727}
37293728
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+
37303748// When an adversarial intermediary node observes a payment, it may be able to infer its
37313749// destination, if the remaining CLTV expiry delta exactly matches a feasible path in the network
37323750// graph. In order to improve privacy, this method obfuscates the CLTV expiry deltas along the
0 commit comments