@@ -36,7 +36,9 @@ import scala.util.{Failure, Success}
36
36
* Created by t-bast on 08/10/2019.
37
37
*/
38
38
39
- sealed trait IncomingPaymentPacket
39
+ sealed trait IncomingPaymentPacket {
40
+ def receivedAt : TimestampMilli
41
+ }
40
42
41
43
/** Helpers to handle incoming payment packets. */
42
44
object IncomingPaymentPacket {
@@ -47,7 +49,7 @@ object IncomingPaymentPacket {
47
49
/** We are an intermediate node. */
48
50
sealed trait RelayPacket extends IncomingPaymentPacket
49
51
/** 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 {
51
53
val amountToForward : MilliSatoshi = payload.amountToForward(add.amountMsat)
52
54
val outgoingCltv : CltvExpiry = payload.outgoingCltv(add.cltvExpiry)
53
55
val relayFeeMsat : MilliSatoshi = add.amountMsat - amountToForward
@@ -59,9 +61,9 @@ object IncomingPaymentPacket {
59
61
def outerPayload : FinalPayload .Standard
60
62
def innerPayload : IntermediatePayload .NodeRelay
61
63
}
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
65
67
// @formatter:on
66
68
67
69
case class DecodedOnionPacket (payload : TlvStream [OnionPaymentPayloadTlv ], next_opt : Option [OnionRoutingPacket ])
@@ -135,15 +137,15 @@ object IncomingPaymentPacket {
135
137
decryptEncryptedRecipientData(add, privateKey, payload, encrypted.data).flatMap {
136
138
case DecodedEncryptedRecipientData (blindedPayload, nextPathKey) =>
137
139
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) =>
139
141
decrypt(add.copy(onionRoutingPacket = nextPacket, tlvStream = add.tlvStream.copy(records = Set (UpdateAddHtlcTlv .PathKey (nextPathKey)))), privateKey, features)
140
142
case relayPacket => Right (relayPacket)
141
143
}
142
144
}
143
145
case None if add.pathKey_opt.isDefined => Left (InvalidOnionBlinding (Sphinx .hash(add.onionRoutingPacket)))
144
146
case None =>
145
147
// 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() ))
147
149
}
148
150
case DecodedOnionPacket (payload, None ) =>
149
151
// We are the final node for the outer onion, so we are either:
@@ -216,7 +218,7 @@ object IncomingPaymentPacket {
216
218
case payload if add.amountMsat < payload.paymentRelayData.paymentConstraints.minAmount => Left (InvalidOnionBlinding (Sphinx .hash(add.onionRoutingPacket)))
217
219
case payload if add.cltvExpiry > payload.paymentRelayData.paymentConstraints.maxCltvExpiry => Left (InvalidOnionBlinding (Sphinx .hash(add.onionRoutingPacket)))
218
220
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() ))
220
222
}
221
223
}
222
224
@@ -261,7 +263,7 @@ object IncomingPaymentPacket {
261
263
IntermediatePayload .NodeRelay .Standard .validate(innerPayload).left.map(_.failureMessage).flatMap {
262
264
case _ if add.amountMsat < outerPayload.amount => Left (FinalIncorrectHtlcAmount (add.amountMsat))
263
265
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() ))
265
267
}
266
268
}
267
269
}
@@ -271,7 +273,7 @@ object IncomingPaymentPacket {
271
273
IntermediatePayload .NodeRelay .ToNonTrampoline .validate(innerPayload).left.map(_.failureMessage).flatMap {
272
274
case _ if add.amountMsat < outerPayload.amount => Left (FinalIncorrectHtlcAmount (add.amountMsat))
273
275
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() ))
275
277
}
276
278
}
277
279
}
@@ -281,7 +283,7 @@ object IncomingPaymentPacket {
281
283
IntermediatePayload .NodeRelay .ToBlindedPaths .validate(innerPayload).left.map(_.failureMessage).flatMap {
282
284
case _ if add.amountMsat < outerPayload.amount => Left (FinalIncorrectHtlcAmount (add.amountMsat))
283
285
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() ))
285
287
}
286
288
}
287
289
}
0 commit comments