Skip to content

Commit 8861e84

Browse files
Add experimental TLV fields for invoice requests: invreq_contact_secret, invreq_payer_offer
Signed-off-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
1 parent 3139fae commit 8861e84

4 files changed

Lines changed: 45 additions & 12 deletions

File tree

lightning/src/ln/offers_tests.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2647,6 +2647,8 @@ fn creates_and_pays_for_phantom_offer() {
26472647
quantity: None,
26482648
payer_note_truncated: None,
26492649
human_readable_name: None,
2650+
contact_secret: None,
2651+
payer_offer: None,
26502652
},
26512653
});
26522654

lightning/src/offers/invoice.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1573,7 +1573,7 @@ type FullInvoiceTlvStreamRef<'a> = (
15731573
InvoiceTlvStreamRef<'a>,
15741574
SignatureTlvStreamRef<'a>,
15751575
ExperimentalOfferTlvStreamRef,
1576-
ExperimentalInvoiceRequestTlvStreamRef,
1576+
ExperimentalInvoiceRequestTlvStreamRef<'a>,
15771577
ExperimentalInvoiceTlvStreamRef,
15781578
);
15791579

@@ -1617,7 +1617,7 @@ type PartialInvoiceTlvStreamRef<'a> = (
16171617
InvoiceRequestTlvStreamRef<'a>,
16181618
InvoiceTlvStreamRef<'a>,
16191619
ExperimentalOfferTlvStreamRef,
1620-
ExperimentalInvoiceRequestTlvStreamRef,
1620+
ExperimentalInvoiceRequestTlvStreamRef<'a>,
16211621
ExperimentalInvoiceTlvStreamRef,
16221622
);
16231623

@@ -2041,7 +2041,11 @@ mod tests {
20412041
},
20422042
SignatureTlvStreamRef { signature: Some(&invoice.signature()) },
20432043
ExperimentalOfferTlvStreamRef { experimental_foo: None },
2044-
ExperimentalInvoiceRequestTlvStreamRef { experimental_bar: None },
2044+
ExperimentalInvoiceRequestTlvStreamRef {
2045+
experimental_bar: None,
2046+
invreq_contact_secret: None,
2047+
invreq_payer_offer: None,
2048+
},
20452049
ExperimentalInvoiceTlvStreamRef { experimental_baz: None },
20462050
),
20472051
);
@@ -2144,7 +2148,11 @@ mod tests {
21442148
},
21452149
SignatureTlvStreamRef { signature: Some(&invoice.signature()) },
21462150
ExperimentalOfferTlvStreamRef { experimental_foo: None },
2147-
ExperimentalInvoiceRequestTlvStreamRef { experimental_bar: None },
2151+
ExperimentalInvoiceRequestTlvStreamRef {
2152+
experimental_bar: None,
2153+
invreq_contact_secret: None,
2154+
invreq_payer_offer: None,
2155+
},
21482156
ExperimentalInvoiceTlvStreamRef { experimental_baz: None },
21492157
),
21502158
);

lightning/src/offers/invoice_request.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,10 @@ impl UnsignedInvoiceRequest {
500500

501501
invoice_request_tlv_stream.write(&mut bytes).unwrap();
502502

503-
const EXPERIMENTAL_TLV_ALLOCATION_SIZE: usize = 0;
503+
// Allocate sufficient capacity for experimental TLV fields to avoid reallocations.
504+
// The new fields (invreq_contact_secret: ~48 bytes, invreq_payer_offer: ~116 bytes)
505+
// total ~164 bytes, with 600 providing headroom for future experimental fields.
506+
const EXPERIMENTAL_TLV_ALLOCATION_SIZE: usize = 600;
504507
let mut experimental_bytes = Vec::with_capacity(EXPERIMENTAL_TLV_ALLOCATION_SIZE);
505508

506509
let experimental_tlv_stream =
@@ -1225,6 +1228,8 @@ impl InvoiceRequestContentsWithoutPayerSigningPubkey {
12251228
};
12261229

12271230
let experimental_invoice_request = ExperimentalInvoiceRequestTlvStreamRef {
1231+
invreq_contact_secret: None,
1232+
invreq_payer_offer: None,
12281233
#[cfg(test)]
12291234
experimental_bar: self.experimental_bar,
12301235
};
@@ -1291,18 +1296,22 @@ pub(super) const EXPERIMENTAL_INVOICE_REQUEST_TYPES: core::ops::Range<u64> =
12911296
#[cfg(not(test))]
12921297
tlv_stream!(
12931298
ExperimentalInvoiceRequestTlvStream,
1294-
ExperimentalInvoiceRequestTlvStreamRef,
1299+
ExperimentalInvoiceRequestTlvStreamRef<'a>,
12951300
EXPERIMENTAL_INVOICE_REQUEST_TYPES,
12961301
{
1302+
(2_000_001_729, invreq_contact_secret: [u8; 32]),
1303+
(2_000_001_731, invreq_payer_offer: (Vec<u8>, WithoutLength)),
12971304
// When adding experimental TLVs, update EXPERIMENTAL_TLV_ALLOCATION_SIZE accordingly in
12981305
// UnsignedInvoiceRequest::new to avoid unnecessary allocations.
12991306
}
13001307
);
13011308

13021309
#[cfg(test)]
13031310
tlv_stream!(
1304-
ExperimentalInvoiceRequestTlvStream, ExperimentalInvoiceRequestTlvStreamRef,
1311+
ExperimentalInvoiceRequestTlvStream, ExperimentalInvoiceRequestTlvStreamRef<'a>,
13051312
EXPERIMENTAL_INVOICE_REQUEST_TYPES, {
1313+
(2_000_001_729, invreq_contact_secret: [u8; 32]),
1314+
(2_000_001_731, invreq_payer_offer: (Vec<u8>, WithoutLength)),
13061315
(2_999_999_999, experimental_bar: (u64, HighZeroBytesDroppedBigSize)),
13071316
}
13081317
);
@@ -1322,7 +1331,7 @@ type FullInvoiceRequestTlvStreamRef<'a> = (
13221331
InvoiceRequestTlvStreamRef<'a>,
13231332
SignatureTlvStreamRef<'a>,
13241333
ExperimentalOfferTlvStreamRef,
1325-
ExperimentalInvoiceRequestTlvStreamRef,
1334+
ExperimentalInvoiceRequestTlvStreamRef<'a>,
13261335
);
13271336

13281337
impl CursorReadable for FullInvoiceRequestTlvStream {
@@ -1358,7 +1367,7 @@ type PartialInvoiceRequestTlvStreamRef<'a> = (
13581367
OfferTlvStreamRef<'a>,
13591368
InvoiceRequestTlvStreamRef<'a>,
13601369
ExperimentalOfferTlvStreamRef,
1361-
ExperimentalInvoiceRequestTlvStreamRef,
1370+
ExperimentalInvoiceRequestTlvStreamRef<'a>,
13621371
);
13631372

13641373
impl TryFrom<Vec<u8>> for UnsignedInvoiceRequest {
@@ -1437,6 +1446,8 @@ impl TryFrom<PartialInvoiceRequestTlvStream> for InvoiceRequestContents {
14371446
},
14381447
experimental_offer_tlv_stream,
14391448
ExperimentalInvoiceRequestTlvStream {
1449+
invreq_contact_secret: _,
1450+
invreq_payer_offer: _,
14401451
#[cfg(test)]
14411452
experimental_bar,
14421453
},
@@ -1660,7 +1671,11 @@ mod tests {
16601671
},
16611672
SignatureTlvStreamRef { signature: Some(&invoice_request.signature()) },
16621673
ExperimentalOfferTlvStreamRef { experimental_foo: None },
1663-
ExperimentalInvoiceRequestTlvStreamRef { experimental_bar: None },
1674+
ExperimentalInvoiceRequestTlvStreamRef {
1675+
invreq_contact_secret: None,
1676+
invreq_payer_offer: None,
1677+
experimental_bar: None,
1678+
},
16641679
),
16651680
);
16661681

lightning/src/offers/refund.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -809,6 +809,8 @@ impl RefundContents {
809809
};
810810

811811
let experimental_invoice_request = ExperimentalInvoiceRequestTlvStreamRef {
812+
invreq_contact_secret: None,
813+
invreq_payer_offer: None,
812814
#[cfg(test)]
813815
experimental_bar: self.experimental_bar,
814816
};
@@ -854,7 +856,7 @@ type RefundTlvStreamRef<'a> = (
854856
OfferTlvStreamRef<'a>,
855857
InvoiceRequestTlvStreamRef<'a>,
856858
ExperimentalOfferTlvStreamRef,
857-
ExperimentalInvoiceRequestTlvStreamRef,
859+
ExperimentalInvoiceRequestTlvStreamRef<'a>,
858860
);
859861

860862
impl CursorReadable for RefundTlvStream {
@@ -927,6 +929,8 @@ impl TryFrom<RefundTlvStream> for RefundContents {
927929
experimental_foo,
928930
},
929931
ExperimentalInvoiceRequestTlvStream {
932+
invreq_contact_secret: _,
933+
invreq_payer_offer: _,
930934
#[cfg(test)]
931935
experimental_bar,
932936
},
@@ -1113,7 +1117,11 @@ mod tests {
11131117
offer_from_hrn: None,
11141118
},
11151119
ExperimentalOfferTlvStreamRef { experimental_foo: None },
1116-
ExperimentalInvoiceRequestTlvStreamRef { experimental_bar: None },
1120+
ExperimentalInvoiceRequestTlvStreamRef {
1121+
invreq_contact_secret: None,
1122+
invreq_payer_offer: None,
1123+
experimental_bar: None,
1124+
},
11171125
),
11181126
);
11191127

0 commit comments

Comments
 (0)