@@ -118,6 +118,34 @@ pub struct OfferBuilder<'a, M: MetadataStrategy, T: secp256k1::Signing> {
118
118
secp_ctx : Option < & ' a Secp256k1 < T > > ,
119
119
}
120
120
121
+ /// Builds an [`Offer`] for the "offer to be paid" flow.
122
+ ///
123
+ /// See [module-level documentation] for usage.
124
+ ///
125
+ /// This is not exported to bindings users as builder patterns don't map outside of move semantics.
126
+ ///
127
+ /// [module-level documentation]: self
128
+ #[ cfg( c_bindings) ]
129
+ pub struct OfferWithExplicitMetadataBuilder < ' a > {
130
+ offer : OfferContents ,
131
+ metadata_strategy : core:: marker:: PhantomData < ExplicitMetadata > ,
132
+ secp_ctx : Option < & ' a Secp256k1 < secp256k1:: All > > ,
133
+ }
134
+
135
+ /// Builds an [`Offer`] for the "offer to be paid" flow.
136
+ ///
137
+ /// See [module-level documentation] for usage.
138
+ ///
139
+ /// This is not exported to bindings users as builder patterns don't map outside of move semantics.
140
+ ///
141
+ /// [module-level documentation]: self
142
+ #[ cfg( c_bindings) ]
143
+ pub struct OfferWithDerivedMetadataBuilder < ' a > {
144
+ offer : OfferContents ,
145
+ metadata_strategy : core:: marker:: PhantomData < DerivedMetadata > ,
146
+ secp_ctx : Option < & ' a Secp256k1 < secp256k1:: All > > ,
147
+ }
148
+
121
149
/// Indicates how [`Offer::metadata`] may be set.
122
150
///
123
151
/// This is not exported to bindings users as builder patterns don't map outside of move semantics.
@@ -174,7 +202,7 @@ macro_rules! offer_explicit_metadata_builder_methods { (
174
202
}
175
203
} }
176
204
177
- macro_rules! offer_derived_metadata_builder_methods { ( ) => {
205
+ macro_rules! offer_derived_metadata_builder_methods { ( $secp_context : ty ) => {
178
206
/// Similar to [`OfferBuilder::new`] except, if [`OfferBuilder::path`] is called, the signing
179
207
/// pubkey is derived from the given [`ExpandedKey`] and [`EntropySource`]. This provides
180
208
/// recipient privacy by using a different signing pubkey for each offer. Otherwise, the
@@ -188,7 +216,7 @@ macro_rules! offer_derived_metadata_builder_methods { () => {
188
216
/// [`ExpandedKey`]: crate::ln::inbound_payment::ExpandedKey
189
217
pub fn deriving_signing_pubkey<ES : Deref >(
190
218
description: String , node_id: PublicKey , expanded_key: & ExpandedKey , entropy_source: ES ,
191
- secp_ctx: & ' a Secp256k1 <T >
219
+ secp_ctx: & ' a Secp256k1 <$secp_context >
192
220
) -> Self where ES :: Target : EntropySource {
193
221
let nonce = Nonce :: from_entropy_source( entropy_source) ;
194
222
let derivation_material = MetadataMaterial :: new( nonce, expanded_key, IV_BYTES , None ) ;
@@ -333,7 +361,13 @@ macro_rules! offer_builder_methods { (
333
361
let mut bytes = Vec :: new( ) ;
334
362
$self. offer. write( & mut bytes) . unwrap( ) ;
335
363
336
- Offer { bytes, contents: $self. offer }
364
+ Offer {
365
+ bytes,
366
+ #[ cfg( not( c_bindings) ) ]
367
+ contents: $self. offer,
368
+ #[ cfg( c_bindings) ]
369
+ contents: $self. offer. clone( )
370
+ }
337
371
}
338
372
} }
339
373
@@ -368,7 +402,43 @@ impl<'a> OfferBuilder<'a, ExplicitMetadata, secp256k1::SignOnly> {
368
402
}
369
403
370
404
impl < ' a , T : secp256k1:: Signing > OfferBuilder < ' a , DerivedMetadata , T > {
371
- offer_derived_metadata_builder_methods ! ( ) ;
405
+ offer_derived_metadata_builder_methods ! ( T ) ;
406
+ }
407
+
408
+ #[ cfg( all( c_bindings, not( test) ) ) ]
409
+ impl < ' a > OfferWithExplicitMetadataBuilder < ' a > {
410
+ offer_explicit_metadata_builder_methods ! ( self , & mut Self , ( ) , ( ) ) ;
411
+ offer_builder_methods ! ( self , & mut Self , ( ) , ( ) ) ;
412
+ }
413
+
414
+ #[ cfg( all( c_bindings, test) ) ]
415
+ impl < ' a > OfferWithExplicitMetadataBuilder < ' a > {
416
+ offer_explicit_metadata_builder_methods ! ( self , & mut Self , & mut Self , self ) ;
417
+ offer_builder_methods ! ( self , & mut Self , & mut Self , self ) ;
418
+ offer_builder_test_methods ! ( self , & mut Self , & mut Self , self ) ;
419
+ }
420
+
421
+ #[ cfg( all( c_bindings, not( test) ) ) ]
422
+ impl < ' a > OfferWithDerivedMetadataBuilder < ' a > {
423
+ offer_derived_metadata_builder_methods ! ( secp256k1:: All ) ;
424
+ offer_builder_methods ! ( self , & mut Self , ( ) , ( ) ) ;
425
+ }
426
+
427
+ #[ cfg( all( c_bindings, test) ) ]
428
+ impl < ' a > OfferWithDerivedMetadataBuilder < ' a > {
429
+ offer_derived_metadata_builder_methods ! ( secp256k1:: All ) ;
430
+ offer_builder_methods ! ( self , & mut Self , & mut Self , self ) ;
431
+ offer_builder_test_methods ! ( self , & mut Self , & mut Self , self ) ;
432
+ }
433
+
434
+ #[ cfg( c_bindings) ]
435
+ impl < ' a > From < OfferBuilder < ' a , DerivedMetadata , secp256k1:: All > >
436
+ for OfferWithDerivedMetadataBuilder < ' a > {
437
+ fn from ( builder : OfferBuilder < ' a , DerivedMetadata , secp256k1:: All > ) -> Self {
438
+ let OfferBuilder { offer, metadata_strategy, secp_ctx } = builder;
439
+
440
+ Self { offer, metadata_strategy, secp_ctx }
441
+ }
372
442
}
373
443
374
444
/// An `Offer` is a potentially long-lived proposal for payment of a good or service.
@@ -936,7 +1006,15 @@ impl core::fmt::Display for Offer {
936
1006
937
1007
#[ cfg( test) ]
938
1008
mod tests {
939
- use super :: { Amount , Offer , OfferBuilder , OfferTlvStreamRef , Quantity } ;
1009
+ use super :: { Amount , Offer , OfferTlvStreamRef , Quantity } ;
1010
+ #[ cfg( not( c_bindings) ) ]
1011
+ use {
1012
+ super :: OfferBuilder ,
1013
+ } ;
1014
+ #[ cfg( c_bindings) ]
1015
+ use {
1016
+ super :: OfferWithExplicitMetadataBuilder as OfferBuilder ,
1017
+ } ;
940
1018
941
1019
use bitcoin:: blockdata:: constants:: ChainHash ;
942
1020
use bitcoin:: network:: constants:: Network ;
@@ -1065,6 +1143,8 @@ mod tests {
1065
1143
let entropy = FixedEntropy { } ;
1066
1144
let secp_ctx = Secp256k1 :: new ( ) ;
1067
1145
1146
+ #[ cfg( c_bindings) ]
1147
+ use super :: OfferWithDerivedMetadataBuilder as OfferBuilder ;
1068
1148
let offer = OfferBuilder
1069
1149
:: deriving_signing_pubkey ( desc, node_id, & expanded_key, & entropy, & secp_ctx)
1070
1150
. amount_msats ( 1000 )
@@ -1121,6 +1201,8 @@ mod tests {
1121
1201
] ,
1122
1202
} ;
1123
1203
1204
+ #[ cfg( c_bindings) ]
1205
+ use super :: OfferWithDerivedMetadataBuilder as OfferBuilder ;
1124
1206
let offer = OfferBuilder
1125
1207
:: deriving_signing_pubkey ( desc, node_id, & expanded_key, & entropy, & secp_ctx)
1126
1208
. amount_msats ( 1000 )
@@ -1175,8 +1257,13 @@ mod tests {
1175
1257
assert_eq ! ( tlv_stream. amount, Some ( 1000 ) ) ;
1176
1258
assert_eq ! ( tlv_stream. currency, None ) ;
1177
1259
1260
+ #[ cfg( not( c_bindings) ) ]
1178
1261
let builder = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
1179
1262
. amount ( currency_amount. clone ( ) ) ;
1263
+ #[ cfg( c_bindings) ]
1264
+ let mut builder = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) ;
1265
+ #[ cfg( c_bindings) ]
1266
+ builder. amount ( currency_amount. clone ( ) ) ;
1180
1267
let tlv_stream = builder. offer . as_tlv_stream ( ) ;
1181
1268
assert_eq ! ( builder. offer. amount, Some ( currency_amount. clone( ) ) ) ;
1182
1269
assert_eq ! ( tlv_stream. amount, Some ( 10 ) ) ;
0 commit comments