Skip to content

Commit 2668794

Browse files
committed
Add Custom TLVs for payment::ReceiveTlvs
- Building on the previous commit, this update allows users to include their own custom TLVs within the reply path of a sent onion message. - With this, users can attach custom data to the message, which will be returned in the response, providing more flexibility for custom use cases.
1 parent 5f7054d commit 2668794

File tree

5 files changed

+23
-6
lines changed

5 files changed

+23
-6
lines changed

lightning/src/blinded_path/payment.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,8 @@ pub struct ReceiveTlvs {
260260
pub payment_constraints: PaymentConstraints,
261261
/// Context for the receiver of this payment.
262262
pub payment_context: PaymentContext,
263+
/// Custom Tlvs
264+
pub custom_tlvs: Vec<u8>,
263265
}
264266

265267
/// Data to construct a [`BlindedHop`] for sending a payment over.
@@ -404,7 +406,8 @@ impl Writeable for ReceiveTlvs {
404406
encode_tlv_stream!(w, {
405407
(12, self.payment_constraints, required),
406408
(65536, self.payment_secret, required),
407-
(65537, self.payment_context, required)
409+
(65537, self.payment_context, required),
410+
(65539, self.custom_tlvs, (default_value, Vec::new())),
408411
});
409412
Ok(())
410413
}
@@ -432,6 +435,7 @@ impl Readable for BlindedPaymentTlvs {
432435
(14, features, (option, encoding: (BlindedHopFeatures, WithoutLength))),
433436
(65536, payment_secret, option),
434437
(65537, payment_context, (default_value, PaymentContext::unknown())),
438+
(65539, custom_tlvs, (default_value, Vec::new()))
435439
});
436440
let _padding: Option<utils::Padding> = _padding;
437441

@@ -452,6 +456,7 @@ impl Readable for BlindedPaymentTlvs {
452456
payment_secret: payment_secret.ok_or(DecodeError::InvalidValue)?,
453457
payment_constraints: payment_constraints.0.unwrap(),
454458
payment_context: payment_context.0.unwrap(),
459+
custom_tlvs: custom_tlvs.0.unwrap(),
455460
}))
456461
}
457462
}
@@ -683,6 +688,7 @@ mod tests {
683688
htlc_minimum_msat: 1,
684689
},
685690
payment_context: PaymentContext::unknown(),
691+
custom_tlvs: Vec::new(),
686692
};
687693
let htlc_maximum_msat = 100_000;
688694
let blinded_payinfo = super::compute_payinfo(&intermediate_nodes[..], &recv_tlvs, htlc_maximum_msat, 12).unwrap();
@@ -702,6 +708,7 @@ mod tests {
702708
htlc_minimum_msat: 1,
703709
},
704710
payment_context: PaymentContext::unknown(),
711+
custom_tlvs: Vec::new(),
705712
};
706713
let blinded_payinfo = super::compute_payinfo(&[], &recv_tlvs, 4242, TEST_FINAL_CLTV as u16).unwrap();
707714
assert_eq!(blinded_payinfo.fee_base_msat, 0);
@@ -758,6 +765,7 @@ mod tests {
758765
htlc_minimum_msat: 3,
759766
},
760767
payment_context: PaymentContext::unknown(),
768+
custom_tlvs: Vec::new(),
761769
};
762770
let htlc_maximum_msat = 100_000;
763771
let blinded_payinfo = super::compute_payinfo(&intermediate_nodes[..], &recv_tlvs, htlc_maximum_msat, TEST_FINAL_CLTV as u16).unwrap();
@@ -811,6 +819,7 @@ mod tests {
811819
htlc_minimum_msat: 1,
812820
},
813821
payment_context: PaymentContext::unknown(),
822+
custom_tlvs: Vec::new(),
814823
};
815824
let htlc_minimum_msat = 3798;
816825
assert!(super::compute_payinfo(&intermediate_nodes[..], &recv_tlvs, htlc_minimum_msat - 1, TEST_FINAL_CLTV as u16).is_err());
@@ -868,6 +877,7 @@ mod tests {
868877
htlc_minimum_msat: 1,
869878
},
870879
payment_context: PaymentContext::unknown(),
880+
custom_tlvs: Vec::new()
871881
};
872882

873883
let blinded_payinfo = super::compute_payinfo(&intermediate_nodes[..], &recv_tlvs, 10_000, TEST_FINAL_CLTV as u16).unwrap();

lightning/src/ln/blinded_payment_tests.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ fn blinded_payment_path(
7474
intro_node_min_htlc_opt.unwrap_or_else(|| channel_upds.last().unwrap().htlc_minimum_msat),
7575
},
7676
payment_context: PaymentContext::unknown(),
77+
custom_tlvs: Vec::new(),
7778
};
7879
let mut secp_ctx = Secp256k1::new();
7980
BlindedPaymentPath::new(
@@ -120,6 +121,7 @@ fn do_one_hop_blinded_path(success: bool) {
120121
htlc_minimum_msat: chan_upd.htlc_minimum_msat,
121122
},
122123
payment_context: PaymentContext::unknown(),
124+
custom_tlvs: Vec::new(),
123125
};
124126
let mut secp_ctx = Secp256k1::new();
125127
let blinded_path = BlindedPaymentPath::new(
@@ -164,6 +166,7 @@ fn mpp_to_one_hop_blinded_path() {
164166
htlc_minimum_msat: chan_upd_1_3.htlc_minimum_msat,
165167
},
166168
payment_context: PaymentContext::unknown(),
169+
custom_tlvs: Vec::new(),
167170
};
168171
let blinded_path = BlindedPaymentPath::new(
169172
&[], nodes[3].node.get_our_node_id(), payee_tlvs, u64::MAX, TEST_FINAL_CLTV as u16,
@@ -1310,6 +1313,7 @@ fn custom_tlvs_to_blinded_path() {
13101313
htlc_minimum_msat: chan_upd.htlc_minimum_msat,
13111314
},
13121315
payment_context: PaymentContext::unknown(),
1316+
custom_tlvs: Vec::new(),
13131317
};
13141318
let mut secp_ctx = Secp256k1::new();
13151319
let blinded_path = BlindedPaymentPath::new(

lightning/src/ln/channelmanager.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9445,7 +9445,7 @@ where
94459445
Ok((payment_hash, payment_secret)) => {
94469446
let payment_context = PaymentContext::Bolt12Refund(Bolt12RefundContext {});
94479447
let payment_paths = self.create_blinded_payment_paths(
9448-
amount_msats, payment_secret, payment_context
9448+
amount_msats, payment_secret, payment_context, None
94499449
)
94509450
.map_err(|_| Bolt12SemanticError::MissingPaths)?;
94519451

@@ -9685,7 +9685,7 @@ where
96859685
/// Creates multi-hop blinded payment paths for the given `amount_msats` by delegating to
96869686
/// [`Router::create_blinded_payment_paths`].
96879687
fn create_blinded_payment_paths(
9688-
&self, amount_msats: u64, payment_secret: PaymentSecret, payment_context: PaymentContext
9688+
&self, amount_msats: u64, payment_secret: PaymentSecret, payment_context: PaymentContext, custom_tlvs: Option<Vec<u8>>
96899689
) -> Result<Vec<BlindedPaymentPath>, ()> {
96909690
let secp_ctx = &self.secp_ctx;
96919691

@@ -9700,6 +9700,7 @@ where
97009700
htlc_minimum_msat: 1,
97019701
},
97029702
payment_context,
9703+
custom_tlvs: custom_tlvs.unwrap_or_default()
97039704
};
97049705
self.router.create_blinded_payment_paths(
97059706
payee_node_id, first_hops, payee_tlvs, amount_msats, secp_ctx
@@ -11190,7 +11191,7 @@ where
1119011191
invoice_request: invoice_request.fields(),
1119111192
});
1119211193
let payment_paths = match self.create_blinded_payment_paths(
11193-
amount_msats, payment_secret, payment_context
11194+
amount_msats, payment_secret, payment_context, custom_tlvs.clone()
1119411195
) {
1119511196
Ok(payment_paths) => payment_paths,
1119611197
Err(()) => {

lightning/src/ln/max_payment_path_len_tests.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ fn one_hop_blinded_path_with_custom_tlv() {
167167
htlc_minimum_msat: chan_upd_1_2.htlc_minimum_msat,
168168
},
169169
payment_context: PaymentContext::unknown(),
170+
custom_tlvs: Vec::new(),
170171
};
171172
let mut secp_ctx = Secp256k1::new();
172173
let blinded_path = BlindedPaymentPath::new(

lightning/src/ln/msgs.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2909,8 +2909,9 @@ impl<NS: Deref> ReadableArgs<(Option<PublicKey>, NS)> for InboundOnionPayload wh
29092909
next_blinding_override,
29102910
})
29112911
},
2912+
// Note: The custom tlvs in the receive tlvs is not used here.
29122913
ChaChaPolyReadAdapter { readable: BlindedPaymentTlvs::Receive(ReceiveTlvs {
2913-
payment_secret, payment_constraints, payment_context
2914+
payment_secret, payment_constraints, payment_context, custom_tlvs: user_custom_tlvs
29142915
})} => {
29152916
if total_msat.unwrap_or(0) > MAX_VALUE_MSAT { return Err(DecodeError::InvalidValue) }
29162917
Ok(Self::BlindedReceive {
@@ -2923,7 +2924,7 @@ impl<NS: Deref> ReadableArgs<(Option<PublicKey>, NS)> for InboundOnionPayload wh
29232924
intro_node_blinding_point,
29242925
keysend_preimage,
29252926
sender_custom_tlvs,
2926-
user_custom_tlvs: Vec::new(),
2927+
user_custom_tlvs,
29272928
})
29282929
},
29292930
}

0 commit comments

Comments
 (0)