@@ -15,11 +15,23 @@ use crate::types::DynStore;
1515use bitcoin:: hashes:: sha256:: Hash as Sha256 ;
1616use bitcoin:: hashes:: Hash ;
1717
18- use lightning:: { offers:: static_invoice:: StaticInvoice , util:: ser:: Writeable } ;
18+ use lightning:: blinded_path:: message:: BlindedMessagePath ;
19+ use lightning:: impl_writeable_tlv_based;
20+ use lightning:: { offers:: static_invoice:: StaticInvoice , util:: ser:: Readable , util:: ser:: Writeable } ;
1921
2022use std:: sync:: { Arc , Mutex } ;
2123use std:: time:: Duration ;
2224
25+ struct PersistedStaticInvoice {
26+ invoice : StaticInvoice ,
27+ request_path : BlindedMessagePath ,
28+ }
29+
30+ impl_writeable_tlv_based ! ( PersistedStaticInvoice , {
31+ ( 0 , invoice, required) ,
32+ ( 2 , request_path, required)
33+ } ) ;
34+
2335pub ( crate ) struct StaticInvoiceStore {
2436 kv_store : Arc < DynStore > ,
2537 request_rate_limiter : Mutex < RateLimiter > ,
@@ -60,20 +72,24 @@ impl StaticInvoiceStore {
6072
6173 pub ( crate ) async fn handle_static_invoice_requested (
6274 & self , recipient_id : & [ u8 ] , invoice_slot : u16 ,
63- ) -> Result < Option < StaticInvoice > , lightning:: io:: Error > {
75+ ) -> Result < Option < ( StaticInvoice , BlindedMessagePath ) > , lightning:: io:: Error > {
6476 Self :: check_rate_limit ( & self . request_rate_limiter , & recipient_id) ?;
6577
6678 let ( secondary_namespace, key) = Self :: get_storage_location ( invoice_slot, recipient_id) ;
6779
6880 self . kv_store
6981 . read ( STATIC_INVOICE_STORE_PRIMARY_NAMESPACE , & secondary_namespace, & key)
7082 . and_then ( |data| {
71- data. try_into ( ) . map ( Some ) . map_err ( |e| {
72- lightning:: io:: Error :: new (
73- lightning:: io:: ErrorKind :: InvalidData ,
74- format ! ( "Failed to parse static invoice: {:?}" , e) ,
75- )
76- } )
83+ PersistedStaticInvoice :: read ( & mut & * data)
84+ . map ( |persisted_invoice| {
85+ Some ( ( persisted_invoice. invoice , persisted_invoice. request_path ) )
86+ } )
87+ . map_err ( |e| {
88+ lightning:: io:: Error :: new (
89+ lightning:: io:: ErrorKind :: InvalidData ,
90+ format ! ( "Failed to parse static invoice: {:?}" , e) ,
91+ )
92+ } )
7793 } )
7894 . or_else (
7995 |e| {
@@ -87,14 +103,18 @@ impl StaticInvoiceStore {
87103 }
88104
89105 pub ( crate ) async fn handle_persist_static_invoice (
90- & self , invoice : StaticInvoice , invoice_slot : u16 , recipient_id : Vec < u8 > ,
106+ & self , invoice : StaticInvoice , invoice_request_path : BlindedMessagePath , invoice_slot : u16 ,
107+ recipient_id : Vec < u8 > ,
91108 ) -> Result < ( ) , lightning:: io:: Error > {
92109 Self :: check_rate_limit ( & self . persist_rate_limiter , & recipient_id) ?;
93110
94111 let ( secondary_namespace, key) = Self :: get_storage_location ( invoice_slot, & recipient_id) ;
95112
113+ let persisted_invoice =
114+ PersistedStaticInvoice { invoice, request_path : invoice_request_path } ;
115+
96116 let mut buf = Vec :: new ( ) ;
97- invoice . write ( & mut buf) ?;
117+ persisted_invoice . write ( & mut buf) ?;
98118
99119 // Static invoices will be persisted at "static_invoices/<sha256(recipient_id)>/<invoice_slot>".
100120 //
@@ -144,15 +164,21 @@ mod tests {
144164
145165 let static_invoice = invoice ( ) ;
146166 let recipient_id = vec ! [ 1 , 1 , 1 ] ;
167+ let invoice_request_path = blinded_path ( ) ;
147168 assert ! ( static_invoice_store
148- . handle_persist_static_invoice( static_invoice. clone( ) , 0 , recipient_id. clone( ) )
169+ . handle_persist_static_invoice(
170+ static_invoice. clone( ) ,
171+ invoice_request_path. clone( ) ,
172+ 0 ,
173+ recipient_id. clone( )
174+ )
149175 . await
150176 . is_ok( ) ) ;
151177
152178 let requested_invoice =
153179 static_invoice_store. handle_static_invoice_requested ( & recipient_id, 0 ) . await . unwrap ( ) ;
154180
155- assert_eq ! ( requested_invoice. unwrap( ) , static_invoice) ;
181+ assert_eq ! ( requested_invoice. unwrap( ) , ( static_invoice, invoice_request_path ) ) ;
156182
157183 assert ! ( static_invoice_store
158184 . handle_static_invoice_requested( & recipient_id, 1 )
0 commit comments