Skip to content

Commit f157b15

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 923886d commit f157b15

File tree

3 files changed

+43
-12
lines changed

3 files changed

+43
-12
lines changed

lightning/src/offers/invoice.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1546,7 +1546,7 @@ type FullInvoiceTlvStreamRef<'a> = (
15461546
InvoiceTlvStreamRef<'a>,
15471547
SignatureTlvStreamRef<'a>,
15481548
ExperimentalOfferTlvStreamRef,
1549-
ExperimentalInvoiceRequestTlvStreamRef,
1549+
ExperimentalInvoiceRequestTlvStreamRef<'a>,
15501550
ExperimentalInvoiceTlvStreamRef,
15511551
);
15521552

@@ -1590,7 +1590,7 @@ type PartialInvoiceTlvStreamRef<'a> = (
15901590
InvoiceRequestTlvStreamRef<'a>,
15911591
InvoiceTlvStreamRef<'a>,
15921592
ExperimentalOfferTlvStreamRef,
1593-
ExperimentalInvoiceRequestTlvStreamRef,
1593+
ExperimentalInvoiceRequestTlvStreamRef<'a>,
15941594
ExperimentalInvoiceTlvStreamRef,
15951595
);
15961596

@@ -2014,7 +2014,11 @@ mod tests {
20142014
},
20152015
SignatureTlvStreamRef { signature: Some(&invoice.signature()) },
20162016
ExperimentalOfferTlvStreamRef { experimental_foo: None },
2017-
ExperimentalInvoiceRequestTlvStreamRef { experimental_bar: None },
2017+
ExperimentalInvoiceRequestTlvStreamRef {
2018+
experimental_bar: None,
2019+
invreq_contact_secret: None,
2020+
invreq_payer_offer: None,
2021+
},
20182022
ExperimentalInvoiceTlvStreamRef { experimental_baz: None },
20192023
),
20202024
);
@@ -2117,7 +2121,11 @@ mod tests {
21172121
},
21182122
SignatureTlvStreamRef { signature: Some(&invoice.signature()) },
21192123
ExperimentalOfferTlvStreamRef { experimental_foo: None },
2120-
ExperimentalInvoiceRequestTlvStreamRef { experimental_bar: None },
2124+
ExperimentalInvoiceRequestTlvStreamRef {
2125+
experimental_bar: None,
2126+
invreq_contact_secret: None,
2127+
invreq_payer_offer: None,
2128+
},
21212129
ExperimentalInvoiceTlvStreamRef { experimental_baz: None },
21222130
),
21232131
);

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
@@ -816,6 +816,8 @@ impl RefundContents {
816816
};
817817

818818
let experimental_invoice_request = ExperimentalInvoiceRequestTlvStreamRef {
819+
invreq_contact_secret: None,
820+
invreq_payer_offer: None,
819821
#[cfg(test)]
820822
experimental_bar: self.experimental_bar,
821823
};
@@ -861,7 +863,7 @@ type RefundTlvStreamRef<'a> = (
861863
OfferTlvStreamRef<'a>,
862864
InvoiceRequestTlvStreamRef<'a>,
863865
ExperimentalOfferTlvStreamRef,
864-
ExperimentalInvoiceRequestTlvStreamRef,
866+
ExperimentalInvoiceRequestTlvStreamRef<'a>,
865867
);
866868

867869
impl CursorReadable for RefundTlvStream {
@@ -934,6 +936,8 @@ impl TryFrom<RefundTlvStream> for RefundContents {
934936
experimental_foo,
935937
},
936938
ExperimentalInvoiceRequestTlvStream {
939+
invreq_contact_secret: _,
940+
invreq_payer_offer: _,
937941
#[cfg(test)]
938942
experimental_bar,
939943
},
@@ -1120,7 +1124,11 @@ mod tests {
11201124
offer_from_hrn: None,
11211125
},
11221126
ExperimentalOfferTlvStreamRef { experimental_foo: None },
1123-
ExperimentalInvoiceRequestTlvStreamRef { experimental_bar: None },
1127+
ExperimentalInvoiceRequestTlvStreamRef {
1128+
invreq_contact_secret: None,
1129+
invreq_payer_offer: None,
1130+
experimental_bar: None,
1131+
},
11241132
),
11251133
);
11261134

0 commit comments

Comments
 (0)