@@ -98,6 +98,17 @@ sealed class OnionPaymentPayloadTlv : Tlv {
9898 }
9999 }
100100
101+ /* * Id of the next node. */
102+ data class OutgoingNodeId (val nodeId : PublicKey ) : OnionPaymentPayloadTlv() {
103+ override val tag: Long get() = OutgoingNodeId .tag
104+ override fun write (out : Output ) = LightningCodecs .writeBytes(nodeId.value, out )
105+
106+ companion object : TlvValueReader <OutgoingNodeId > {
107+ const val tag: Long = 14
108+ override fun read (input : Input ): OutgoingNodeId = OutgoingNodeId (PublicKey (LightningCodecs .bytes(input, 33 )))
109+ }
110+ }
111+
101112 /* *
102113 * When payment metadata is included in a Bolt 9 invoice, we should send it as-is to the recipient.
103114 * This lets recipients generate invoices without having to store anything on their side until the invoice is paid.
@@ -125,6 +136,20 @@ sealed class OnionPaymentPayloadTlv : Tlv {
125136 }
126137 }
127138
139+ /* * An encrypted trampoline onion packet. */
140+ data class TrampolineOnion (val packet : OnionRoutingPacket ) : OnionPaymentPayloadTlv() {
141+ override val tag: Long get() = TrampolineOnion .tag
142+ override fun write (out : Output ) = OnionRoutingPacketSerializer (packet.payload.size()).write(packet, out )
143+
144+ companion object : TlvValueReader <TrampolineOnion > {
145+ const val tag: Long = 20
146+ override fun read (input : Input ): TrampolineOnion {
147+ val payloadLength = input.availableBytes - 66 // 1 byte version + 33 bytes public key + 32 bytes HMAC
148+ return TrampolineOnion (OnionRoutingPacketSerializer (payloadLength).read(input))
149+ }
150+ }
151+ }
152+
128153 /* *
129154 * Invoice feature bits. Only included for intermediate trampoline nodes when they should convert to a legacy payment
130155 * because the final recipient doesn't support trampoline.
@@ -139,17 +164,6 @@ sealed class OnionPaymentPayloadTlv : Tlv {
139164 }
140165 }
141166
142- /* * Id of the next node. */
143- data class OutgoingNodeId (val nodeId : PublicKey ) : OnionPaymentPayloadTlv() {
144- override val tag: Long get() = OutgoingNodeId .tag
145- override fun write (out : Output ) = LightningCodecs .writeBytes(nodeId.value, out )
146-
147- companion object : TlvValueReader <OutgoingNodeId > {
148- const val tag: Long = 66098
149- override fun read (input : Input ): OutgoingNodeId = OutgoingNodeId (PublicKey (LightningCodecs .bytes(input, 33 )))
150- }
151- }
152-
153167 /* *
154168 * Invoice routing hints. Only included for intermediate trampoline nodes when they should convert to a legacy payment
155169 * because the final recipient doesn't support trampoline.
@@ -191,20 +205,6 @@ sealed class OnionPaymentPayloadTlv : Tlv {
191205 }
192206 }
193207
194- /* * An encrypted trampoline onion packet. */
195- data class TrampolineOnion (val packet : OnionRoutingPacket ) : OnionPaymentPayloadTlv() {
196- override val tag: Long get() = TrampolineOnion .tag
197- override fun write (out : Output ) = OnionRoutingPacketSerializer (packet.payload.size()).write(packet, out )
198-
199- companion object : TlvValueReader <TrampolineOnion > {
200- const val tag: Long = 66100
201- override fun read (input : Input ): TrampolineOnion {
202- val payloadLength = input.availableBytes - 66 // 1 byte version + 33 bytes public key + 32 bytes HMAC
203- return TrampolineOnion (OnionRoutingPacketSerializer (payloadLength).read(input))
204- }
205- }
206- }
207-
208208 /* * Blinded paths to relay the payment to */
209209 data class OutgoingBlindedPaths (val paths : List <Bolt12Invoice .Companion .PaymentBlindedContactInfo >) : OnionPaymentPayloadTlv() {
210210 override val tag: Long get() = OutgoingBlindedPaths .tag
@@ -249,15 +249,15 @@ object PaymentOnion {
249249 OnionPaymentPayloadTlv .AmountToForward .tag to OnionPaymentPayloadTlv .AmountToForward .Companion as TlvValueReader <OnionPaymentPayloadTlv >,
250250 OnionPaymentPayloadTlv .OutgoingCltv .tag to OnionPaymentPayloadTlv .OutgoingCltv .Companion as TlvValueReader <OnionPaymentPayloadTlv >,
251251 OnionPaymentPayloadTlv .OutgoingChannelId .tag to OnionPaymentPayloadTlv .OutgoingChannelId .Companion as TlvValueReader <OnionPaymentPayloadTlv >,
252+ OnionPaymentPayloadTlv .OutgoingNodeId .tag to OnionPaymentPayloadTlv .OutgoingNodeId .Companion as TlvValueReader <OnionPaymentPayloadTlv >,
252253 OnionPaymentPayloadTlv .PaymentData .tag to OnionPaymentPayloadTlv .PaymentData .Companion as TlvValueReader <OnionPaymentPayloadTlv >,
253254 OnionPaymentPayloadTlv .EncryptedRecipientData .tag to OnionPaymentPayloadTlv .EncryptedRecipientData .Companion as TlvValueReader <OnionPaymentPayloadTlv >,
254255 OnionPaymentPayloadTlv .BlindingPoint .tag to OnionPaymentPayloadTlv .BlindingPoint .Companion as TlvValueReader <OnionPaymentPayloadTlv >,
255256 OnionPaymentPayloadTlv .PaymentMetadata .tag to OnionPaymentPayloadTlv .PaymentMetadata .Companion as TlvValueReader <OnionPaymentPayloadTlv >,
256257 OnionPaymentPayloadTlv .TotalAmount .tag to OnionPaymentPayloadTlv .TotalAmount .Companion as TlvValueReader <OnionPaymentPayloadTlv >,
258+ OnionPaymentPayloadTlv .TrampolineOnion .tag to OnionPaymentPayloadTlv .TrampolineOnion .Companion as TlvValueReader <OnionPaymentPayloadTlv >,
257259 OnionPaymentPayloadTlv .InvoiceFeatures .tag to OnionPaymentPayloadTlv .InvoiceFeatures .Companion as TlvValueReader <OnionPaymentPayloadTlv >,
258- OnionPaymentPayloadTlv .OutgoingNodeId .tag to OnionPaymentPayloadTlv .OutgoingNodeId .Companion as TlvValueReader <OnionPaymentPayloadTlv >,
259260 OnionPaymentPayloadTlv .InvoiceRoutingInfo .tag to OnionPaymentPayloadTlv .InvoiceRoutingInfo .Companion as TlvValueReader <OnionPaymentPayloadTlv >,
260- OnionPaymentPayloadTlv .TrampolineOnion .tag to OnionPaymentPayloadTlv .TrampolineOnion .Companion as TlvValueReader <OnionPaymentPayloadTlv >,
261261 OnionPaymentPayloadTlv .OutgoingBlindedPaths .tag to OnionPaymentPayloadTlv .OutgoingBlindedPaths .Companion as TlvValueReader <OnionPaymentPayloadTlv >,
262262 )
263263 )
@@ -457,20 +457,15 @@ object PaymentOnion {
457457 }
458458 }
459459
460+ /* *
461+ * Create a trampoline payload to tell our trampoline node to relay to a Bolt 11 recipient that doesn't support trampoline.
462+ * This reveals to our trampoline node who the recipient is and details from the invoice.
463+ * This must be deprecated once recipients support either trampoline or blinded paths.
464+ */
460465 data class RelayToNonTrampolinePayload (val records : TlvStream <OnionPaymentPayloadTlv >) : PerHopPayload() {
461466 val amountToForward = records.get<OnionPaymentPayloadTlv .AmountToForward >()!! .amount
462467 val outgoingCltv = records.get<OnionPaymentPayloadTlv .OutgoingCltv >()!! .cltv
463468 val outgoingNodeId = records.get<OnionPaymentPayloadTlv .OutgoingNodeId >()!! .nodeId
464- val totalAmount = run {
465- val paymentData = records.get<OnionPaymentPayloadTlv .PaymentData >()
466- when {
467- paymentData == null -> amountToForward
468- paymentData.totalAmount == MilliSatoshi (0 ) -> amountToForward
469- else -> paymentData.totalAmount
470- }
471- }
472-
473- // NB: the following fields are only included in the trampoline-to-legacy case.
474469 val paymentSecret = records.get<OnionPaymentPayloadTlv .PaymentData >()!! .secret
475470 val paymentMetadata = records.get<OnionPaymentPayloadTlv .PaymentMetadata >()?.data
476471 val invoiceFeatures = records.get<OnionPaymentPayloadTlv .InvoiceFeatures >()!! .features
0 commit comments