diff --git a/payment.go b/payment.go index 6e057fa..cbef614 100644 --- a/payment.go +++ b/payment.go @@ -109,15 +109,17 @@ func (r *regolancer) pay(ctx context.Context, amount int64, minAmount int64, max if result.Failure.Code == lnrpc.Failure_FEE_INSUFFICIENT || result.Failure.Code == lnrpc.Failure_INCORRECT_CLTV_EXPIRY { failedHop := route.Hops[result.Failure.FailureSourceIndex-1] - route, err = r.rebuildRoute(ctx, route, amount) - updatedHop := route.Hops[result.Failure.FailureSourceIndex-1] + updatedRoute, err := r.rebuildRoute(ctx, route, amount) if err == nil { + updatedHop := updatedRoute.Hops[result.Failure.FailureSourceIndex-1] // compare hops to make sure we do not loop endlessly if !compareHops(failedHop, updatedHop) { log.Printf("received channelupdate after failure, trying again with amt %s and fee %s ppm", - hiWhiteColor(amount), formatFeePPM(amount*1000, route.TotalFeesMsat)) - return r.pay(ctx, amount, minAmount, maxFeeMsat, route, probeSteps) + hiWhiteColor(amount), formatFeePPM(amount*1000, updatedRoute.TotalFeesMsat)) + return r.pay(ctx, amount, minAmount, maxFeeMsat, updatedRoute, probeSteps) } + } else { + log.Printf("error rebuilding the route: %s", err) } } if result.Failure.Code == lnrpc.Failure_TEMPORARY_CHANNEL_FAILURE { diff --git a/routes.go b/routes.go index a2df0b0..9eedb9f 100644 --- a/routes.go +++ b/routes.go @@ -322,6 +322,9 @@ func getTarget(route *lnrpc.Route) uint64 { } func compareHops(hop1 *lnrpc.Hop, hop2 *lnrpc.Hop) bool { + if hop1 == nil || hop2 == nil { + return false + } return hop1.ChanId == hop2.ChanId && hop1.FeeMsat == hop2.FeeMsat && hop1.Expiry == hop2.Expiry