@@ -35,7 +35,7 @@ import fr.acinq.eclair.payment._
35
35
import fr .acinq .eclair .payment .receive .MultiPartHandler .ReceivePayment
36
36
import fr .acinq .eclair .payment .relay .Relayer .{GetOutgoingChannels , OutgoingChannels , UsableBalance }
37
37
import fr .acinq .eclair .payment .send .MultiPartPaymentLifecycle .PreimageReceived
38
- import fr .acinq .eclair .payment .send .PaymentInitiator .{SendPaymentRequest , SendPaymentToRouteRequest , SendPaymentToRouteResponse }
38
+ import fr .acinq .eclair .payment .send .PaymentInitiator .{SendPayment , SendPaymentToRoute , SendPaymentToRouteResponse , SendSpontaneousPayment }
39
39
import fr .acinq .eclair .router .Router ._
40
40
import fr .acinq .eclair .router .{NetworkStats , RouteCalculation , Router }
41
41
import fr .acinq .eclair .wire .protocol ._
@@ -107,9 +107,9 @@ trait Eclair {
107
107
108
108
def receivedInfo (paymentHash : ByteVector32 )(implicit timeout : Timeout ): Future [Option [IncomingPayment ]]
109
109
110
- def send (externalId_opt : Option [String ], recipientNodeId : PublicKey , amount : MilliSatoshi , paymentHash : ByteVector32 , invoice_opt : Option [ PaymentRequest ] = None , maxAttempts_opt : Option [Int ] = None , feeThresholdSat_opt : Option [Satoshi ] = None , maxFeePct_opt : Option [Double ] = None )(implicit timeout : Timeout ): Future [UUID ]
110
+ def send (externalId_opt : Option [String ], amount : MilliSatoshi , invoice : PaymentRequest , maxAttempts_opt : Option [Int ] = None , feeThresholdSat_opt : Option [Satoshi ] = None , maxFeePct_opt : Option [Double ] = None )(implicit timeout : Timeout ): Future [UUID ]
111
111
112
- def sendBlocking (externalId_opt : Option [String ], recipientNodeId : PublicKey , amount : MilliSatoshi , paymentHash : ByteVector32 , invoice_opt : Option [ PaymentRequest ] = None , maxAttempts_opt : Option [Int ] = None , feeThresholdSat_opt : Option [Satoshi ] = None , maxFeePct_opt : Option [Double ] = None )(implicit timeout : Timeout ): Future [Either [PreimageReceived , PaymentEvent ]]
112
+ def sendBlocking (externalId_opt : Option [String ], amount : MilliSatoshi , invoice : PaymentRequest , maxAttempts_opt : Option [Int ] = None , feeThresholdSat_opt : Option [Satoshi ] = None , maxFeePct_opt : Option [Double ] = None )(implicit timeout : Timeout ): Future [Either [PreimageReceived , PaymentEvent ]]
113
113
114
114
def sendWithPreimage (externalId_opt : Option [String ], recipientNodeId : PublicKey , amount : MilliSatoshi , paymentPreimage : ByteVector32 = randomBytes32(), maxAttempts_opt : Option [Int ] = None , feeThresholdSat_opt : Option [Satoshi ] = None , maxFeePct_opt : Option [Double ] = None )(implicit timeout : Timeout ): Future [UUID ]
115
115
@@ -272,15 +272,14 @@ class EclairImpl(appKit: Kit) extends Eclair {
272
272
override def findRoute (targetNodeId : PublicKey , amount : MilliSatoshi , assistedRoutes : Seq [Seq [PaymentRequest .ExtraHop ]] = Seq .empty)(implicit timeout : Timeout ): Future [RouteResponse ] =
273
273
findRouteBetween(appKit.nodeParams.nodeId, targetNodeId, amount, assistedRoutes)
274
274
275
-
276
275
override def findRouteBetween (sourceNodeId : PublicKey , targetNodeId : PublicKey , amount : MilliSatoshi , assistedRoutes : Seq [Seq [PaymentRequest .ExtraHop ]] = Seq .empty)(implicit timeout : Timeout ): Future [RouteResponse ] = {
277
276
val maxFee = RouteCalculation .getDefaultRouteParams(appKit.nodeParams.routerConf).getMaxFee(amount)
278
277
(appKit.router ? RouteRequest (sourceNodeId, targetNodeId, amount, maxFee, assistedRoutes)).mapTo[RouteResponse ]
279
278
}
280
279
281
280
override def sendToRoute (amount : MilliSatoshi , recipientAmount_opt : Option [MilliSatoshi ], externalId_opt : Option [String ], parentId_opt : Option [UUID ], invoice : PaymentRequest , finalCltvExpiryDelta : CltvExpiryDelta , route : PredefinedRoute , trampolineSecret_opt : Option [ByteVector32 ], trampolineFees_opt : Option [MilliSatoshi ], trampolineExpiryDelta_opt : Option [CltvExpiryDelta ], trampolineNodes_opt : Seq [PublicKey ])(implicit timeout : Timeout ): Future [SendPaymentToRouteResponse ] = {
282
281
val recipientAmount = recipientAmount_opt.getOrElse(invoice.amount.getOrElse(amount))
283
- val sendPayment = SendPaymentToRouteRequest (amount, recipientAmount, externalId_opt, parentId_opt, invoice, finalCltvExpiryDelta, route , trampolineSecret_opt, trampolineFees_opt.getOrElse(0 msat), trampolineExpiryDelta_opt.getOrElse(CltvExpiryDelta (0 )), trampolineNodes_opt)
282
+ val sendPayment = SendPaymentToRoute (amount, recipientAmount, invoice, finalCltvExpiryDelta, route, externalId_opt, parentId_opt , trampolineSecret_opt, trampolineFees_opt.getOrElse(0 msat), trampolineExpiryDelta_opt.getOrElse(CltvExpiryDelta (0 )), trampolineNodes_opt)
284
283
if (invoice.isExpired) {
285
284
Future .failed(new IllegalArgumentException (" invoice has expired" ))
286
285
} else if (route.isEmpty) {
@@ -296,7 +295,7 @@ class EclairImpl(appKit: Kit) extends Eclair {
296
295
}
297
296
}
298
297
299
- private def createPaymentRequest (externalId_opt : Option [String ], recipientNodeId : PublicKey , amount : MilliSatoshi , paymentHash : ByteVector32 , invoice_opt : Option [ PaymentRequest ] , maxAttempts_opt : Option [Int ], feeThreshold_opt : Option [Satoshi ], maxFeePct_opt : Option [Double ]): Either [IllegalArgumentException , SendPaymentRequest ] = {
298
+ private def createPaymentRequest (externalId_opt : Option [String ], amount : MilliSatoshi , invoice : PaymentRequest , maxAttempts_opt : Option [Int ], feeThreshold_opt : Option [Satoshi ], maxFeePct_opt : Option [Double ]): Either [IllegalArgumentException , SendPayment ] = {
300
299
val maxAttempts = maxAttempts_opt.getOrElse(appKit.nodeParams.maxPaymentAttempts)
301
300
val defaultRouteParams = RouteCalculation .getDefaultRouteParams(appKit.nodeParams.routerConf)
302
301
val routeParams = defaultRouteParams.copy(
@@ -306,26 +305,23 @@ class EclairImpl(appKit: Kit) extends Eclair {
306
305
307
306
externalId_opt match {
308
307
case Some (externalId) if externalId.length > externalIdMaxLength => Left (new IllegalArgumentException (s " externalId is too long: cannot exceed $externalIdMaxLength characters " ))
309
- case _ => invoice_opt match {
310
- case Some (invoice) if invoice.isExpired => Left (new IllegalArgumentException (" invoice has expired" ))
311
- case Some (invoice) => invoice.minFinalCltvExpiryDelta match {
312
- case Some (minFinalCltvExpiryDelta) => Right (SendPaymentRequest (amount, paymentHash, recipientNodeId, maxAttempts, minFinalCltvExpiryDelta, invoice_opt, externalId_opt, assistedRoutes = invoice.routingInfo, routeParams = Some (routeParams)))
313
- case None => Right (SendPaymentRequest (amount, paymentHash, recipientNodeId, maxAttempts, paymentRequest = invoice_opt, externalId = externalId_opt, assistedRoutes = invoice.routingInfo, routeParams = Some (routeParams)))
314
- }
315
- case None => Right (SendPaymentRequest (amount, paymentHash, recipientNodeId, maxAttempts = maxAttempts, externalId = externalId_opt, routeParams = Some (routeParams)))
308
+ case _ if invoice.isExpired => Left (new IllegalArgumentException (" invoice has expired" ))
309
+ case _ => invoice.minFinalCltvExpiryDelta match {
310
+ case Some (minFinalCltvExpiryDelta) => Right (SendPayment (amount, invoice, maxAttempts, minFinalCltvExpiryDelta, externalId_opt, assistedRoutes = invoice.routingInfo, routeParams = Some (routeParams)))
311
+ case None => Right (SendPayment (amount, invoice, maxAttempts, externalId = externalId_opt, assistedRoutes = invoice.routingInfo, routeParams = Some (routeParams)))
316
312
}
317
313
}
318
314
}
319
315
320
- override def send (externalId_opt : Option [String ], recipientNodeId : PublicKey , amount : MilliSatoshi , paymentHash : ByteVector32 , invoice_opt : Option [ PaymentRequest ] , maxAttempts_opt : Option [Int ], feeThreshold_opt : Option [Satoshi ], maxFeePct_opt : Option [Double ])(implicit timeout : Timeout ): Future [UUID ] = {
321
- createPaymentRequest(externalId_opt, recipientNodeId, amount, paymentHash, invoice_opt , maxAttempts_opt, feeThreshold_opt, maxFeePct_opt) match {
316
+ override def send (externalId_opt : Option [String ], amount : MilliSatoshi , invoice : PaymentRequest , maxAttempts_opt : Option [Int ], feeThreshold_opt : Option [Satoshi ], maxFeePct_opt : Option [Double ])(implicit timeout : Timeout ): Future [UUID ] = {
317
+ createPaymentRequest(externalId_opt, amount, invoice , maxAttempts_opt, feeThreshold_opt, maxFeePct_opt) match {
322
318
case Left (ex) => Future .failed(ex)
323
319
case Right (req) => (appKit.paymentInitiator ? req).mapTo[UUID ]
324
320
}
325
321
}
326
322
327
- override def sendBlocking (externalId_opt : Option [String ], recipientNodeId : PublicKey , amount : MilliSatoshi , paymentHash : ByteVector32 , invoice_opt : Option [ PaymentRequest ] , maxAttempts_opt : Option [Int ], feeThreshold_opt : Option [Satoshi ], maxFeePct_opt : Option [Double ])(implicit timeout : Timeout ): Future [Either [PreimageReceived , PaymentEvent ]] = {
328
- createPaymentRequest(externalId_opt, recipientNodeId, amount, paymentHash, invoice_opt , maxAttempts_opt, feeThreshold_opt, maxFeePct_opt) match {
323
+ override def sendBlocking (externalId_opt : Option [String ], amount : MilliSatoshi , invoice : PaymentRequest , maxAttempts_opt : Option [Int ], feeThreshold_opt : Option [Satoshi ], maxFeePct_opt : Option [Double ])(implicit timeout : Timeout ): Future [Either [PreimageReceived , PaymentEvent ]] = {
324
+ createPaymentRequest(externalId_opt, amount, invoice , maxAttempts_opt, feeThreshold_opt, maxFeePct_opt) match {
329
325
case Left (ex) => Future .failed(ex)
330
326
case Right (req) => (appKit.paymentInitiator ? req.copy(blockUntilComplete = true )).map {
331
327
case e : PreimageReceived => Left (e)
@@ -334,6 +330,17 @@ class EclairImpl(appKit: Kit) extends Eclair {
334
330
}
335
331
}
336
332
333
+ override def sendWithPreimage (externalId_opt : Option [String ], recipientNodeId : PublicKey , amount : MilliSatoshi , paymentPreimage : ByteVector32 , maxAttempts_opt : Option [Int ], feeThreshold_opt : Option [Satoshi ], maxFeePct_opt : Option [Double ])(implicit timeout : Timeout ): Future [UUID ] = {
334
+ val maxAttempts = maxAttempts_opt.getOrElse(appKit.nodeParams.maxPaymentAttempts)
335
+ val defaultRouteParams = RouteCalculation .getDefaultRouteParams(appKit.nodeParams.routerConf)
336
+ val routeParams = defaultRouteParams.copy(
337
+ maxFeePct = maxFeePct_opt.getOrElse(defaultRouteParams.maxFeePct),
338
+ maxFeeBase = feeThreshold_opt.map(_.toMilliSatoshi).getOrElse(defaultRouteParams.maxFeeBase)
339
+ )
340
+ val sendPayment = SendSpontaneousPayment (amount, recipientNodeId, paymentPreimage, maxAttempts, externalId_opt, Some (routeParams))
341
+ (appKit.paymentInitiator ? sendPayment).mapTo[UUID ]
342
+ }
343
+
337
344
override def sentInfo (id : Either [UUID , ByteVector32 ])(implicit timeout : Timeout ): Future [Seq [OutgoingPayment ]] = Future {
338
345
id match {
339
346
case Left (uuid) => appKit.nodeParams.db.payments.listOutgoingPayments(uuid)
@@ -421,19 +428,6 @@ class EclairImpl(appKit: Kit) extends Eclair {
421
428
override def usableBalances ()(implicit timeout : Timeout ): Future [Iterable [UsableBalance ]] =
422
429
(appKit.relayer ? GetOutgoingChannels ()).mapTo[OutgoingChannels ].map(_.channels.map(_.toUsableBalance))
423
430
424
- override def sendWithPreimage (externalId_opt : Option [String ], recipientNodeId : PublicKey , amount : MilliSatoshi , paymentPreimage : ByteVector32 , maxAttempts_opt : Option [Int ], feeThreshold_opt : Option [Satoshi ], maxFeePct_opt : Option [Double ])(implicit timeout : Timeout ): Future [UUID ] = {
425
- val maxAttempts = maxAttempts_opt.getOrElse(appKit.nodeParams.maxPaymentAttempts)
426
- val defaultRouteParams = RouteCalculation .getDefaultRouteParams(appKit.nodeParams.routerConf)
427
- val routeParams = defaultRouteParams.copy(
428
- maxFeePct = maxFeePct_opt.getOrElse(defaultRouteParams.maxFeePct),
429
- maxFeeBase = feeThreshold_opt.map(_.toMilliSatoshi).getOrElse(defaultRouteParams.maxFeeBase)
430
- )
431
- val paymentHash : ByteVector32 = Crypto .sha256(paymentPreimage)
432
- val keySendTlvRecords = Seq (GenericTlv (UInt64 (5482373484L ), paymentPreimage))
433
- val sendPayment = SendPaymentRequest (amount, paymentHash, recipientNodeId, maxAttempts, externalId = externalId_opt, routeParams = Some (routeParams), userCustomTlvs = keySendTlvRecords)
434
- (appKit.paymentInitiator ? sendPayment).mapTo[UUID ]
435
- }
436
-
437
431
override def signMessage (message : ByteVector ): SignedMessage = {
438
432
val bytesToSign = SignedMessage .signedBytes(message)
439
433
val (signature, recoveryId) = appKit.nodeParams.nodeKeyManager.signDigest(bytesToSign)
@@ -445,6 +439,6 @@ class EclairImpl(appKit: Kit) extends Eclair {
445
439
val signature = ByteVector64 (recoverableSignature.tail)
446
440
val recoveryId = recoverableSignature.head.toInt - 31
447
441
val pubKeyFromSignature = Crypto .recoverPublicKey(signature, signedBytes, recoveryId)
448
- VerifiedMessage (true , pubKeyFromSignature)
442
+ VerifiedMessage (valid = true , pubKeyFromSignature)
449
443
}
450
444
}
0 commit comments