@@ -14,7 +14,9 @@ import (
14
14
15
15
"github.com/elementsproject/peerswap/lightning"
16
16
"github.com/lightningnetwork/lnd/lnrpc"
17
+ "github.com/lightningnetwork/lnd/lnrpc/routerrpc"
17
18
"github.com/lightningnetwork/lnd/lnwire"
19
+ "github.com/lightningnetwork/lnd/routing/route"
18
20
)
19
21
20
22
func getLndConfig () map [string ]string {
@@ -375,7 +377,11 @@ func (n *LndNode) OpenChannel(peer LightningNode, capacity, pushAmt uint64, conn
375
377
return false , fmt .Errorf ("IsChannelActive() %w" , err )
376
378
}
377
379
}
378
- return remoteActive && localActive , nil
380
+ hasRoute , err := n .HasRoute (peer .Id (), scid )
381
+ if err != nil {
382
+ return false , nil
383
+ }
384
+ return remoteActive && localActive && hasRoute , nil
379
385
}, TIMEOUT )
380
386
if err != nil {
381
387
return "" , fmt .Errorf ("error waiting for active channel: %w" , err )
@@ -390,6 +396,39 @@ func (n *LndNode) OpenChannel(peer LightningNode, capacity, pushAmt uint64, conn
390
396
return scid , nil
391
397
}
392
398
399
+ // HasRoute check the route is constructed
400
+ func (n * LndNode ) HasRoute (remote , scid string ) (bool , error ) {
401
+ chsRes , err := n .Rpc .ListChannels (context .Background (), & lnrpc.ListChannelsRequest {})
402
+ if err != nil {
403
+ return false , fmt .Errorf ("ListChannels() %w" , err )
404
+ }
405
+ var channel * lnrpc.Channel
406
+ for _ , ch := range chsRes .GetChannels () {
407
+ channelShortId := lnwire .NewShortChanIDFromInt (ch .ChanId )
408
+ if channelShortId .String () == lightning .Scid (scid ).LndStyle () {
409
+ channel = ch
410
+ }
411
+ }
412
+ if channel .GetChanId () == 0 {
413
+ return false , fmt .Errorf ("could not find a channel with scid: %s" , scid )
414
+ }
415
+ v , err := route .NewVertexFromStr (channel .GetRemotePubkey ())
416
+ if err != nil {
417
+ return false , fmt .Errorf ("NewVertexFromStr() %w" , err )
418
+ }
419
+
420
+ routeres , err := n .RpcV2 .BuildRoute (context .Background (), & routerrpc.BuildRouteRequest {
421
+ AmtMsat : 1 ,
422
+ FinalCltvDelta : 9 ,
423
+ OutgoingChanId : channel .GetChanId (),
424
+ HopPubkeys : [][]byte {v [:]},
425
+ })
426
+ if err != nil {
427
+ return false , fmt .Errorf ("BuildRoute() %w" , err )
428
+ }
429
+ return len (routeres .GetRoute ().Hops ) > 0 , nil
430
+ }
431
+
393
432
func (n * LndNode ) IsBlockHeightSynced () (bool , error ) {
394
433
r , err := n .bitcoin .Rpc .Call ("getblockcount" )
395
434
if err != nil {
0 commit comments