@@ -125,13 +125,14 @@ class MultiPartHandler(nodeParams: NodeParams, register: ActorRef, db: IncomingP
125125 }
126126 }
127127
128- case ProcessBlindedPacket (add, payload, payment, recipientPathFees ) if doHandle(add.paymentHash) =>
128+ case ProcessBlindedPacket (add, payload, payment, maxRecipientPathFees ) if doHandle(add.paymentHash) =>
129129 Logs .withMdc(log)(Logs .mdc(paymentHash_opt = Some (add.paymentHash))) {
130- validateBlindedPayment(nodeParams, add, payload, payment, recipientPathFees ) match {
130+ validateBlindedPayment(nodeParams, add, payload, payment, maxRecipientPathFees ) match {
131131 case Some (cmdFail) =>
132132 Metrics .PaymentFailed .withTag(Tags .Direction , Tags .Directions .Received ).withTag(Tags .Failure , Tags .FailureType (cmdFail)).increment()
133133 PendingCommandsDb .safeSend(register, nodeParams.db.pendingCommands, add.channelId, cmdFail)
134134 case None =>
135+ val recipientPathFees = payload.amount - add.amountMsat
135136 log.debug(" received payment for amount={} recipientPathFees={} totalAmount={}" , add.amountMsat, recipientPathFees, payload.totalAmount)
136137 addHtlcPart(ctx, add, payload, payment)
137138 if (recipientPathFees > 0 .msat) {
@@ -237,7 +238,7 @@ object MultiPartHandler {
237238
238239 // @formatter:off
239240 private case class ProcessPacket (add : UpdateAddHtlc , payload : FinalPayload .Standard , payment_opt : Option [IncomingStandardPayment ])
240- private case class ProcessBlindedPacket (add : UpdateAddHtlc , payload : FinalPayload .Blinded , payment : IncomingBlindedPayment , recipientPathFees : MilliSatoshi )
241+ private case class ProcessBlindedPacket (add : UpdateAddHtlc , payload : FinalPayload .Blinded , payment : IncomingBlindedPayment , maxRecipientPathFees : MilliSatoshi )
241242 private case class RejectPacket (add : UpdateAddHtlc , failure : FailureMessage )
242243 case class DoFulfill (payment : IncomingPayment , success : MultiPartPaymentFSM .MultiPartPaymentSucceeded )
243244
@@ -358,7 +359,7 @@ object MultiPartHandler {
358359 // @formatter:off
359360 sealed trait Command
360361 case class GetIncomingPayment (replyTo : ActorRef ) extends Command
361- case class ProcessPayment (payment : IncomingBlindedPayment , recipientPathFees : MilliSatoshi ) extends Command
362+ case class ProcessPayment (payment : IncomingBlindedPayment , maxRecipientPathFees : MilliSatoshi ) extends Command
362363 case class RejectPayment (reason : String ) extends Command
363364 // @formatter:on
364365
@@ -378,7 +379,7 @@ object MultiPartHandler {
378379 }
379380 Behaviors .stopped
380381 case payload : FinalPayload .Blinded =>
381- offerManager ! OfferManager .ReceivePayment (context.self, packet.add.paymentHash, payload)
382+ offerManager ! OfferManager .ReceivePayment (context.self, packet.add.paymentHash, payload, packet.add.amountMsat )
382383 waitForPayment(context, nodeParams, replyTo, packet.add, payload)
383384 }
384385 }
@@ -388,8 +389,8 @@ object MultiPartHandler {
388389
389390 private def waitForPayment (context : typed.scaladsl.ActorContext [Command ], nodeParams : NodeParams , replyTo : ActorRef , add : UpdateAddHtlc , payload : FinalPayload .Blinded ): Behavior [Command ] = {
390391 Behaviors .receiveMessagePartial {
391- case ProcessPayment (payment, recipientPathFees ) =>
392- replyTo ! ProcessBlindedPacket (add, payload, payment, recipientPathFees )
392+ case ProcessPayment (payment, maxRecipientPathFees ) =>
393+ replyTo ! ProcessBlindedPacket (add, payload, payment, maxRecipientPathFees )
393394 Behaviors .stopped
394395 case RejectPayment (reason) =>
395396 context.log.info(" rejecting blinded htlc #{} from channel {}: {}" , add.id, add.channelId, reason)
@@ -473,13 +474,13 @@ object MultiPartHandler {
473474 if (commonOk && secretOk) None else Some (cmdFail)
474475 }
475476
476- private def validateBlindedPayment (nodeParams : NodeParams , add : UpdateAddHtlc , payload : FinalPayload .Blinded , record : IncomingBlindedPayment , recipientPathFees : MilliSatoshi )(implicit log : LoggingAdapter ): Option [CMD_FAIL_HTLC ] = {
477+ private def validateBlindedPayment (nodeParams : NodeParams , add : UpdateAddHtlc , payload : FinalPayload .Blinded , record : IncomingBlindedPayment , maxRecipientPathFees : MilliSatoshi )(implicit log : LoggingAdapter ): Option [CMD_FAIL_HTLC ] = {
477478 // We send the same error regardless of the failure to avoid probing attacks.
478479 val cmdFail = CMD_FAIL_HTLC (add.id, FailureReason .LocalFailure (IncorrectOrUnknownPaymentDetails (payload.totalAmount, nodeParams.currentBlockHeight)), commit = true )
479480 val commonOk = validateCommon(nodeParams, add, payload, record)
480481 // The payer isn't aware of the blinded path fees if we decided to hide them. The HTLC amount will thus be smaller
481482 // than the onion amount, but should match when re-adding the blinded path fees.
482- val pathFeesOk = add.amountMsat + recipientPathFees >= payload.amount
483+ val pathFeesOk = payload.amount - add.amountMsat <= maxRecipientPathFees
483484 if (commonOk && pathFeesOk) None else Some (cmdFail)
484485 }
485486
0 commit comments