diff --git a/routing/router.go b/routing/router.go index 37443b2d..2081bac8 100644 --- a/routing/router.go +++ b/routing/router.go @@ -1637,26 +1637,31 @@ func (r *ChannelRouter) SendToRoute(hash lntypes.Hash, route *route.Route) ( // Create a payment session for just this route. paySession := r.cfg.MissionControl.NewPaymentSessionForRoute(route) - // Create a (mostly) dummy payment, as the created payment session is - // not going to do path finding. - payment := &LightningPayment{ - PaymentHash: hash, - } + // Calculate amount paid to receiver. + amt := route.TotalAmount - route.TotalFees() // Record this payment hash with the ControlTower, ensuring it is not // already in-flight. info := &channeldb.PaymentCreationInfo{ - PaymentHash: payment.PaymentHash, - Value: payment.Amount, + PaymentHash: hash, + Value: amt, CreationDate: time.Now(), PaymentRequest: nil, } - err := r.cfg.Control.InitPayment(payment.PaymentHash, info) + err := r.cfg.Control.InitPayment(hash, info) if err != nil { return [32]byte{}, err } + // Create a (mostly) dummy payment, as the created payment session is + // not going to do path finding. + // TODO(halseth): sendPayment doesn't relly need LightningPayment, make + // it take just needed fields instead. + payment := &LightningPayment{ + PaymentHash: hash, + } + // Since this is the first time this payment is being made, we pass nil // for the existing attempt. preimage, _, err := r.sendPayment(nil, payment, paySession) diff --git a/routing/router_test.go b/routing/router_test.go index f90dbd8c..54ee4708 100644 --- a/routing/router_test.go +++ b/routing/router_test.go @@ -3175,27 +3175,31 @@ func TestSendToRouteStructuredError(t *testing.T) { } defer cleanUp() + // Set up an init channel for the control tower, such that we can make + // sure the payment is initiated correctly. + init := make(chan initArgs, 1) + ctx.router.cfg.Control.(*mockControlTower).init = init + // Setup a route from source a to destination c. The route will be used // in a call to SendToRoute. SendToRoute also applies channel updates, // but it saves us from including RequestRoute in the test scope too. + const payAmt = lnwire.MilliSatoshi(10000) hop1 := ctx.aliases["b"] hop2 := ctx.aliases["c"] - hops := []*route.Hop{ { - ChannelID: 1, - PubKeyBytes: hop1, + ChannelID: 1, + PubKeyBytes: hop1, + AmtToForward: payAmt, }, { - ChannelID: 2, - PubKeyBytes: hop2, + ChannelID: 2, + PubKeyBytes: hop2, + AmtToForward: payAmt, }, } - rt, err := route.NewRouteFromHops( - lnwire.MilliSatoshi(10000), 100, - ctx.aliases["a"], hops, - ) + rt, err := route.NewRouteFromHops(payAmt, 100, ctx.aliases["a"], hops) if err != nil { t.Fatalf("unable to create route: %v", err) } @@ -3239,4 +3243,14 @@ func TestSendToRouteStructuredError(t *testing.T) { if _, ok := fErr.FailureMessage.(*lnwire.FailFeeInsufficient); !ok { t.Fatalf("expected fee insufficient error") } + + // Check that the correct values were used when initiating the payment. + select { + case initVal := <-init: + if initVal.c.Value != payAmt { + t.Fatalf("expected %v, got %v", payAmt, initVal.c.Value) + } + case <-time.After(100 * time.Millisecond): + t.Fatalf("initPayment not called") + } }