@@ -36,7 +36,9 @@ import scala.util.{Failure, Success}
3636 * Created by t-bast on 08/10/2019.
3737 */
3838
39- sealed trait IncomingPaymentPacket
39+ sealed trait IncomingPaymentPacket {
40+ def receivedAt : TimestampMilli
41+ }
4042
4143/** Helpers to handle incoming payment packets. */
4244object IncomingPaymentPacket {
@@ -47,7 +49,7 @@ object IncomingPaymentPacket {
4749 /** We are an intermediate node. */
4850 sealed trait RelayPacket extends IncomingPaymentPacket
4951 /** We must relay the payment to a direct peer. */
50- case class ChannelRelayPacket (add : UpdateAddHtlc , payload : IntermediatePayload .ChannelRelay , nextPacket : OnionRoutingPacket ) extends RelayPacket {
52+ case class ChannelRelayPacket (add : UpdateAddHtlc , payload : IntermediatePayload .ChannelRelay , nextPacket : OnionRoutingPacket , receivedAt : TimestampMilli ) extends RelayPacket {
5153 val amountToForward : MilliSatoshi = payload.amountToForward(add.amountMsat)
5254 val outgoingCltv : CltvExpiry = payload.outgoingCltv(add.cltvExpiry)
5355 val relayFeeMsat : MilliSatoshi = add.amountMsat - amountToForward
@@ -59,9 +61,9 @@ object IncomingPaymentPacket {
5961 def outerPayload : FinalPayload .Standard
6062 def innerPayload : IntermediatePayload .NodeRelay
6163 }
62- case class RelayToTrampolinePacket (add : UpdateAddHtlc , outerPayload : FinalPayload .Standard , innerPayload : IntermediatePayload .NodeRelay .Standard , nextPacket : OnionRoutingPacket ) extends NodeRelayPacket
63- case class RelayToNonTrampolinePacket (add : UpdateAddHtlc , outerPayload : FinalPayload .Standard , innerPayload : IntermediatePayload .NodeRelay .ToNonTrampoline ) extends NodeRelayPacket
64- case class RelayToBlindedPathsPacket (add : UpdateAddHtlc , outerPayload : FinalPayload .Standard , innerPayload : IntermediatePayload .NodeRelay .ToBlindedPaths ) extends NodeRelayPacket
64+ case class RelayToTrampolinePacket (add : UpdateAddHtlc , outerPayload : FinalPayload .Standard , innerPayload : IntermediatePayload .NodeRelay .Standard , nextPacket : OnionRoutingPacket , receivedAt : TimestampMilli ) extends NodeRelayPacket
65+ case class RelayToNonTrampolinePacket (add : UpdateAddHtlc , outerPayload : FinalPayload .Standard , innerPayload : IntermediatePayload .NodeRelay .ToNonTrampoline , receivedAt : TimestampMilli ) extends NodeRelayPacket
66+ case class RelayToBlindedPathsPacket (add : UpdateAddHtlc , outerPayload : FinalPayload .Standard , innerPayload : IntermediatePayload .NodeRelay .ToBlindedPaths , receivedAt : TimestampMilli ) extends NodeRelayPacket
6567 // @formatter:on
6668
6769 case class DecodedOnionPacket (payload : TlvStream [OnionPaymentPayloadTlv ], next_opt : Option [OnionRoutingPacket ])
@@ -135,15 +137,15 @@ object IncomingPaymentPacket {
135137 decryptEncryptedRecipientData(add, privateKey, payload, encrypted.data).flatMap {
136138 case DecodedEncryptedRecipientData (blindedPayload, nextPathKey) =>
137139 validateBlindedChannelRelayPayload(add, payload, blindedPayload, nextPathKey, nextPacket).flatMap {
138- case ChannelRelayPacket (_, payload, nextPacket) if payload.outgoing == Right (ShortChannelId .toSelf) =>
140+ case ChannelRelayPacket (_, payload, nextPacket, _ ) if payload.outgoing == Right (ShortChannelId .toSelf) =>
139141 decrypt(add.copy(onionRoutingPacket = nextPacket, tlvStream = add.tlvStream.copy(records = Set (UpdateAddHtlcTlv .PathKey (nextPathKey)))), privateKey, features)
140142 case relayPacket => Right (relayPacket)
141143 }
142144 }
143145 case None if add.pathKey_opt.isDefined => Left (InvalidOnionBlinding (Sphinx .hash(add.onionRoutingPacket)))
144146 case None =>
145147 // We are not inside a blinded path: channel relay information is directly available.
146- IntermediatePayload .ChannelRelay .Standard .validate(payload).left.map(_.failureMessage).map(payload => ChannelRelayPacket (add, payload, nextPacket))
148+ IntermediatePayload .ChannelRelay .Standard .validate(payload).left.map(_.failureMessage).map(payload => ChannelRelayPacket (add, payload, nextPacket, TimestampMilli .now() ))
147149 }
148150 case DecodedOnionPacket (payload, None ) =>
149151 // We are the final node for the outer onion, so we are either:
@@ -216,7 +218,7 @@ object IncomingPaymentPacket {
216218 case payload if add.amountMsat < payload.paymentRelayData.paymentConstraints.minAmount => Left (InvalidOnionBlinding (Sphinx .hash(add.onionRoutingPacket)))
217219 case payload if add.cltvExpiry > payload.paymentRelayData.paymentConstraints.maxCltvExpiry => Left (InvalidOnionBlinding (Sphinx .hash(add.onionRoutingPacket)))
218220 case payload if ! Features .areCompatible(Features .empty, payload.paymentRelayData.allowedFeatures) => Left (InvalidOnionBlinding (Sphinx .hash(add.onionRoutingPacket)))
219- case payload => Right (ChannelRelayPacket (add, payload, nextPacket))
221+ case payload => Right (ChannelRelayPacket (add, payload, nextPacket, TimestampMilli .now() ))
220222 }
221223 }
222224
@@ -261,7 +263,7 @@ object IncomingPaymentPacket {
261263 IntermediatePayload .NodeRelay .Standard .validate(innerPayload).left.map(_.failureMessage).flatMap {
262264 case _ if add.amountMsat < outerPayload.amount => Left (FinalIncorrectHtlcAmount (add.amountMsat))
263265 case _ if add.cltvExpiry != outerPayload.expiry => Left (FinalIncorrectCltvExpiry (add.cltvExpiry))
264- case innerPayload => Right (RelayToTrampolinePacket (add, outerPayload, innerPayload, next))
266+ case innerPayload => Right (RelayToTrampolinePacket (add, outerPayload, innerPayload, next, TimestampMilli .now() ))
265267 }
266268 }
267269 }
@@ -271,7 +273,7 @@ object IncomingPaymentPacket {
271273 IntermediatePayload .NodeRelay .ToNonTrampoline .validate(innerPayload).left.map(_.failureMessage).flatMap {
272274 case _ if add.amountMsat < outerPayload.amount => Left (FinalIncorrectHtlcAmount (add.amountMsat))
273275 case _ if add.cltvExpiry != outerPayload.expiry => Left (FinalIncorrectCltvExpiry (add.cltvExpiry))
274- case innerPayload => Right (RelayToNonTrampolinePacket (add, outerPayload, innerPayload))
276+ case innerPayload => Right (RelayToNonTrampolinePacket (add, outerPayload, innerPayload, TimestampMilli .now() ))
275277 }
276278 }
277279 }
@@ -281,7 +283,7 @@ object IncomingPaymentPacket {
281283 IntermediatePayload .NodeRelay .ToBlindedPaths .validate(innerPayload).left.map(_.failureMessage).flatMap {
282284 case _ if add.amountMsat < outerPayload.amount => Left (FinalIncorrectHtlcAmount (add.amountMsat))
283285 case _ if add.cltvExpiry != outerPayload.expiry => Left (FinalIncorrectCltvExpiry (add.cltvExpiry))
284- case innerPayload => Right (RelayToBlindedPathsPacket (add, outerPayload, innerPayload))
286+ case innerPayload => Right (RelayToBlindedPathsPacket (add, outerPayload, innerPayload, TimestampMilli .now() ))
285287 }
286288 }
287289 }
0 commit comments