diff --git a/go.mod b/go.mod index 6aad69a..ea5a915 100644 --- a/go.mod +++ b/go.mod @@ -1,7 +1,7 @@ module github.com/lightninglabs/loop require ( - github.com/btcsuite/btcd v0.20.1-beta + github.com/btcsuite/btcd v0.20.1-beta.0.20200515232429-9f0179fd2c46 github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f github.com/btcsuite/btcutil v1.0.2 github.com/coreos/bbolt v1.3.3 @@ -11,7 +11,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.12.2 github.com/jessevdk/go-flags v1.4.0 github.com/lightninglabs/protobuf-hex-display v1.3.3-0.20191212020323-b444784ce75d - github.com/lightningnetwork/lnd v0.10.0-beta.rc5 + github.com/lightningnetwork/lnd v0.10.1-beta.rc1 github.com/lightningnetwork/lnd/queue v1.0.3 github.com/urfave/cli v1.20.0 golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 diff --git a/go.sum b/go.sum index f437f92..b648ec4 100644 --- a/go.sum +++ b/go.sum @@ -24,6 +24,9 @@ github.com/btcsuite/btcd v0.0.0-20190629003639-c26ffa870fd8/go.mod h1:3J08xEfcug github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.20.1-beta.0.20200513120220-b470eee47728/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.20.1-beta.0.20200515232429-9f0179fd2c46 h1:QyTpiR5nQe94vza2qkvf7Ns8XX2Rjh/vdIhO3RzGj4o= +github.com/btcsuite/btcd v0.20.1-beta.0.20200515232429-9f0179fd2c46/go.mod h1:Yktc19YNjh/Iz2//CX0vfRTS4IJKM/RKO5YZ9Fn+Pgo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng= @@ -34,6 +37,8 @@ github.com/btcsuite/btcutil/psbt v1.0.2 h1:gCVY3KxdoEVU7Q6TjusPO+GANIwVgr9yTLqM+ github.com/btcsuite/btcutil/psbt v1.0.2/go.mod h1:LVveMu4VaNSkIRTZu2+ut0HDBRuYjqGocxDMNS1KuGQ= github.com/btcsuite/btcwallet v0.11.1-0.20200403222202-ada7ca077ebb h1:kkq2SSCy+OrC7GVZLIqutoHVR2yW4SJQdX70jtmuLDI= github.com/btcsuite/btcwallet v0.11.1-0.20200403222202-ada7ca077ebb/go.mod h1:9fJNm1aXi4q9P5Nk23mmqppCy1Le3f2/JMWj9UXKkCc= +github.com/btcsuite/btcwallet v0.11.1-0.20200515224913-e0e62245ecbe h1:0m9uXDcnUc3Fv72635O/MfLbhbW+0hfSVgRiWezpkHU= +github.com/btcsuite/btcwallet v0.11.1-0.20200515224913-e0e62245ecbe/go.mod h1:9+AH3V5mcTtNXTKe+fe63fDLKGOwQbZqmvOVUef+JFE= github.com/btcsuite/btcwallet/wallet/txauthor v1.0.0 h1:KGHMW5sd7yDdDMkCZ/JpP0KltolFsQcB973brBnfj4c= github.com/btcsuite/btcwallet/wallet/txauthor v1.0.0/go.mod h1:VufDts7bd/zs3GV13f/lXc/0lXrPnvxD/NvmpG/FEKU= github.com/btcsuite/btcwallet/wallet/txrules v1.0.0 h1:2VsfS0sBedcM5KmDzRMT3+b6xobqWveZGvjb+jFez5w= @@ -46,6 +51,8 @@ github.com/btcsuite/btcwallet/walletdb v1.3.1 h1:lW1Ac3F1jJY4K11P+YQtRNcP5jFk27A github.com/btcsuite/btcwallet/walletdb v1.3.1/go.mod h1:9cwc1Yyg4uvd4ZdfdoMnALji+V9gfWSMfxEdLdR5Vwc= github.com/btcsuite/btcwallet/wtxmgr v1.0.0 h1:aIHgViEmZmZfe0tQQqF1xyd2qBqFWxX5vZXkkbjtbeA= github.com/btcsuite/btcwallet/wtxmgr v1.0.0/go.mod h1:vc4gBprll6BP0UJ+AIGDaySoc7MdAmZf8kelfNb8CFY= +github.com/btcsuite/btcwallet/wtxmgr v1.1.1-0.20200515224913-e0e62245ecbe h1:yQbJVYfsKbdqDQNLxd4hhiLSiMkIygefW5mSHMsdKpc= +github.com/btcsuite/btcwallet/wtxmgr v1.1.1-0.20200515224913-e0e62245ecbe/go.mod h1:OwC0W0HhUszbWdvJvH6xvgabKSJ0lXl11YbmmqF9YXQ= github.com/btcsuite/fastsha256 v0.0.0-20160815193821-637e65642941 h1:kij1x2aL7VE6gtx8KMIt8PGPgI5GV9LgtHFG5KaEMPY= github.com/btcsuite/fastsha256 v0.0.0-20160815193821-637e65642941/go.mod h1:QcFA8DZHtuIAdYKCq/BzELOaznRsCvwf4zTPmaYwaig= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= @@ -157,6 +164,8 @@ github.com/lightningnetwork/lightning-onion v1.0.1 h1:qChGgS5+aPxFeR6JiUsGvanei1 github.com/lightningnetwork/lightning-onion v1.0.1/go.mod h1:rigfi6Af/KqsF7Za0hOgcyq2PNH4AN70AaMRxcJkff4= github.com/lightningnetwork/lnd v0.10.0-beta.rc5 h1:HcX35Djwk+xoNQe/LA7HnQ11jzbq68TAcpBluhNIKqc= github.com/lightningnetwork/lnd v0.10.0-beta.rc5/go.mod h1:mEnmP+sSgiKUFBozT3I5xEOgRAREMEWd/3lcWDrB+5E= +github.com/lightningnetwork/lnd v0.10.1-beta.rc1 h1:4uBkLHrxeIf6ad5AHlFhGcOhtbvmYwK4iTcDMixmLpw= +github.com/lightningnetwork/lnd v0.10.1-beta.rc1/go.mod h1:mRd+8n/QOlAiolWVnt1RaTzxVvOyplT3J5uYwUb/EDw= github.com/lightningnetwork/lnd/cert v1.0.2/go.mod h1:fmtemlSMf5t4hsQmcprSoOykypAPp+9c+0d0iqTScMo= github.com/lightningnetwork/lnd/queue v1.0.1 h1:jzJKcTy3Nj5lQrooJ3aaw9Lau3I0IwvQR5sqtjdv2R0= github.com/lightningnetwork/lnd/queue v1.0.1/go.mod h1:vaQwexir73flPW43Mrm7JOgJHmcEFBWWSl9HlyASoms= @@ -222,6 +231,8 @@ golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d h1:2+ZP7EfsZV7Vvmx3TIqSlSzATMkTAKqM14YGFPoSKjI= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= diff --git a/lndclient/lnd_services.go b/lndclient/lnd_services.go index bae1cf5..ddb6abd 100644 --- a/lndclient/lnd_services.go +++ b/lndclient/lnd_services.go @@ -31,7 +31,7 @@ var ( minimalCompatibleVersion = &verrpc.Version{ AppMajor: 0, AppMinor: 10, - AppPatch: 0, + AppPatch: 1, BuildTags: []string{ "signrpc", "walletrpc", "chainrpc", "invoicesrpc", }, diff --git a/lndclient/router_client.go b/lndclient/router_client.go index f72c3d1..8fb62e6 100644 --- a/lndclient/router_client.go +++ b/lndclient/router_client.go @@ -64,10 +64,14 @@ type SendPaymentRequest struct { // are only processed when the Invoice field is empty. Invoice string - MaxFee btcutil.Amount - MaxCltv *int32 - OutgoingChannel *uint64 - Timeout time.Duration + MaxFee btcutil.Amount + MaxCltv *int32 + + // OutgoingChanIds is a restriction on the set of possible outgoing + // channels. If nil or empty, there is no restriction. + OutgoingChanIds []uint64 + + Timeout time.Duration // Target is the node in which the payment should be routed towards. Target route.Vertex @@ -126,17 +130,16 @@ func (r *routerClient) SendPayment(ctx context.Context, rpcCtx := r.routerKitMac.WithMacaroonAuth(ctx) rpcReq := &routerrpc.SendPaymentRequest{ - FeeLimitSat: int64(request.MaxFee), - PaymentRequest: request.Invoice, - TimeoutSeconds: int32(request.Timeout.Seconds()), - MaxParts: request.MaxParts, + FeeLimitSat: int64(request.MaxFee), + PaymentRequest: request.Invoice, + TimeoutSeconds: int32(request.Timeout.Seconds()), + MaxParts: request.MaxParts, + OutgoingChanIds: request.OutgoingChanIds, } if request.MaxCltv != nil { rpcReq.CltvLimit = *request.MaxCltv } - if request.OutgoingChannel != nil { - rpcReq.OutgoingChanId = *request.OutgoingChannel - } + if request.LastHopPubkey != nil { rpcReq.LastHopPubkey = request.LastHopPubkey[:] } diff --git a/loopd/start.go b/loopd/start.go index 9b49b54..030f608 100644 --- a/loopd/start.go +++ b/loopd/start.go @@ -24,7 +24,7 @@ var ( LoopMinRequiredLndVersion = &verrpc.Version{ AppMajor: 0, AppMinor: 10, - AppPatch: 0, + AppPatch: 1, BuildTags: []string{ "signrpc", "walletrpc", "chainrpc", "invoicesrpc", }, diff --git a/loopout.go b/loopout.go index 7204dc9..f81f3d5 100644 --- a/loopout.go +++ b/loopout.go @@ -429,9 +429,16 @@ func (s *loopOutSwap) persistState(ctx context.Context) error { func (s *loopOutSwap) payInvoices(ctx context.Context) { // Pay the swap invoice. s.log.Infof("Sending swap payment %v", s.SwapInvoice) + + var outgoingChanIds []uint64 + if s.LoopOutContract.UnchargeChannel != nil { + outgoingChanIds = append( + outgoingChanIds, *s.LoopOutContract.UnchargeChannel, + ) + } + s.swapPaymentChan = s.payInvoice( - ctx, s.SwapInvoice, s.MaxSwapRoutingFee, - s.LoopOutContract.UnchargeChannel, + ctx, s.SwapInvoice, s.MaxSwapRoutingFee, outgoingChanIds, ) // Pay the prepay invoice. @@ -445,7 +452,7 @@ func (s *loopOutSwap) payInvoices(ctx context.Context) { // payInvoice pays a single invoice. func (s *loopOutSwap) payInvoice(ctx context.Context, invoice string, maxFee btcutil.Amount, - outgoingChannel *uint64) chan lndclient.PaymentResult { + outgoingChanIds []uint64) chan lndclient.PaymentResult { resultChan := make(chan lndclient.PaymentResult) @@ -453,7 +460,7 @@ func (s *loopOutSwap) payInvoice(ctx context.Context, invoice string, var result lndclient.PaymentResult status, err := s.payInvoiceAsync( - ctx, invoice, maxFee, outgoingChannel, + ctx, invoice, maxFee, outgoingChanIds, ) if err != nil { result.Err = err @@ -474,7 +481,7 @@ func (s *loopOutSwap) payInvoice(ctx context.Context, invoice string, // payInvoiceAsync is the asynchronously executed part of paying an invoice. func (s *loopOutSwap) payInvoiceAsync(ctx context.Context, - invoice string, maxFee btcutil.Amount, outgoingChannel *uint64) ( + invoice string, maxFee btcutil.Amount, outgoingChanIds []uint64) ( *lndclient.PaymentStatus, error) { // Extract hash from payment request. Unfortunately the request @@ -488,7 +495,7 @@ func (s *loopOutSwap) payInvoiceAsync(ctx context.Context, req := lndclient.SendPaymentRequest{ MaxFee: maxFee, Invoice: invoice, - OutgoingChannel: outgoingChannel, + OutgoingChanIds: outgoingChanIds, Timeout: paymentTimeout, MaxParts: s.executeConfig.loopOutMaxParts, }