Skip to content

Commit d9ab2fa

Browse files
committed
Add c_bindings version of OfferBuilder
Use the macros introduced in the previous commit to define two builders for each type parameterization of OfferBuilder - OfferWithExplicitMetadataBuilder - OfferWithDerivedMetadataBuilder The difference between these and OfferBuilder is that these have methods that take `self` by mutable reference instead of by value and don't return anything instead returning the modified builder. This is required because bindings don't support move semantics nor impl blocks specific to a certain type parameterization. Because of this, the builder's contents must be cloned when building an Offer. Keeps OfferBuilder defined so that it can be used internally in ChannelManager::create_offer_builder even when compiled for c_bindings.
1 parent a517925 commit d9ab2fa

File tree

4 files changed

+165
-32
lines changed

4 files changed

+165
-32
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ use crate::ln::wire::Encode;
6060
use crate::offers::invoice::{BlindedPayInfo, Bolt12Invoice, DEFAULT_RELATIVE_EXPIRY, DerivedSigningPubkey, InvoiceBuilder};
6161
use crate::offers::invoice_error::InvoiceError;
6262
use crate::offers::merkle::SignError;
63-
use crate::offers::offer::{DerivedMetadata, Offer, OfferBuilder};
63+
use crate::offers::offer::{Offer, OfferBuilder};
6464
use crate::offers::parse::Bolt12SemanticError;
6565
use crate::offers::refund::{Refund, RefundBuilder};
6666
use crate::onion_message::messenger::{Destination, MessageRouter, PendingOnionMessage, new_pending_onion_message};
@@ -76,11 +76,16 @@ use crate::util::logger::{Level, Logger, WithContext};
7676
use crate::util::errors::APIError;
7777
#[cfg(not(c_bindings))]
7878
use {
79+
crate::offers::offer::DerivedMetadata,
7980
crate::routing::router::DefaultRouter,
8081
crate::routing::gossip::NetworkGraph,
8182
crate::routing::scoring::{ProbabilisticScorer, ProbabilisticScoringFeeParameters},
8283
crate::sign::KeysManager,
8384
};
85+
#[cfg(c_bindings)]
86+
use {
87+
crate::offers::offer::OfferWithDerivedMetadataBuilder,
88+
};
8489

8590
use alloc::collections::{btree_map, BTreeMap};
8691

@@ -7520,7 +7525,9 @@ where
75207525
self.finish_close_channel(failure);
75217526
}
75227527
}
7528+
}
75237529

7530+
macro_rules! create_offer_builder { ($self: ident, $builder: ty) => {
75247531
/// Creates an [`OfferBuilder`] such that the [`Offer`] it builds is recognized by the
75257532
/// [`ChannelManager`] when handling [`InvoiceRequest`] messages for the offer. The offer will
75267533
/// not have an expiration unless otherwise set on the builder.
@@ -7549,22 +7556,40 @@ where
75497556
/// [`Offer`]: crate::offers::offer::Offer
75507557
/// [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest
75517558
pub fn create_offer_builder(
7552-
&self, description: String
7553-
) -> Result<OfferBuilder<DerivedMetadata, secp256k1::All>, Bolt12SemanticError> {
7554-
let node_id = self.get_our_node_id();
7555-
let expanded_key = &self.inbound_payment_key;
7556-
let entropy = &*self.entropy_source;
7557-
let secp_ctx = &self.secp_ctx;
7558-
7559-
let path = self.create_blinded_path().map_err(|_| Bolt12SemanticError::MissingPaths)?;
7559+
&$self, description: String
7560+
) -> Result<$builder, Bolt12SemanticError> {
7561+
let node_id = $self.get_our_node_id();
7562+
let expanded_key = &$self.inbound_payment_key;
7563+
let entropy = &*$self.entropy_source;
7564+
let secp_ctx = &$self.secp_ctx;
7565+
7566+
let path = $self.create_blinded_path().map_err(|_| Bolt12SemanticError::MissingPaths)?;
75607567
let builder = OfferBuilder::deriving_signing_pubkey(
75617568
description, node_id, expanded_key, entropy, secp_ctx
75627569
)
7563-
.chain_hash(self.chain_hash)
7570+
.chain_hash($self.chain_hash)
75647571
.path(path);
75657572

7566-
Ok(builder)
7573+
Ok(builder.into())
75677574
}
7575+
} }
7576+
7577+
impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, L: Deref> ChannelManager<M, T, ES, NS, SP, F, R, L>
7578+
where
7579+
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
7580+
T::Target: BroadcasterInterface,
7581+
ES::Target: EntropySource,
7582+
NS::Target: NodeSigner,
7583+
SP::Target: SignerProvider,
7584+
F::Target: FeeEstimator,
7585+
R::Target: Router,
7586+
L::Target: Logger,
7587+
{
7588+
#[cfg(not(c_bindings))]
7589+
create_offer_builder!(self, OfferBuilder<DerivedMetadata, secp256k1::All>);
7590+
7591+
#[cfg(c_bindings)]
7592+
create_offer_builder!(self, OfferWithDerivedMetadataBuilder);
75687593

75697594
/// Creates a [`RefundBuilder`] such that the [`Refund`] it builds is recognized by the
75707595
/// [`ChannelManager`] when handling [`Bolt12Invoice`] messages for the refund.

lightning/src/offers/invoice.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1306,7 +1306,15 @@ mod tests {
13061306
use crate::ln::msgs::DecodeError;
13071307
use crate::offers::invoice_request::InvoiceRequestTlvStreamRef;
13081308
use crate::offers::merkle::{SignError, SignatureTlvStreamRef, TaggedHash, self};
1309-
use crate::offers::offer::{Amount, OfferBuilder, OfferTlvStreamRef, Quantity};
1309+
use crate::offers::offer::{Amount, OfferTlvStreamRef, Quantity};
1310+
#[cfg(not(c_bindings))]
1311+
use {
1312+
crate::offers::offer::OfferBuilder,
1313+
};
1314+
#[cfg(c_bindings)]
1315+
use {
1316+
crate::offers::offer::OfferWithExplicitMetadataBuilder as OfferBuilder,
1317+
};
13101318
use crate::offers::parse::{Bolt12ParseError, Bolt12SemanticError};
13111319
use crate::offers::payer::PayerTlvStreamRef;
13121320
use crate::offers::refund::RefundBuilder;
@@ -1644,6 +1652,8 @@ mod tests {
16441652
],
16451653
};
16461654

1655+
#[cfg(c_bindings)]
1656+
use crate::offers::offer::OfferWithDerivedMetadataBuilder as OfferBuilder;
16471657
let offer = OfferBuilder
16481658
::deriving_signing_pubkey(desc, node_id, &expanded_key, &entropy, &secp_ctx)
16491659
.amount_msats(1000)

lightning/src/offers/invoice_request.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -941,7 +941,15 @@ mod tests {
941941
use crate::ln::msgs::{DecodeError, MAX_VALUE_MSAT};
942942
use crate::offers::invoice::{Bolt12Invoice, SIGNATURE_TAG as INVOICE_SIGNATURE_TAG};
943943
use crate::offers::merkle::{SignError, SignatureTlvStreamRef, TaggedHash, self};
944-
use crate::offers::offer::{Amount, OfferBuilder, OfferTlvStreamRef, Quantity};
944+
use crate::offers::offer::{Amount, OfferTlvStreamRef, Quantity};
945+
#[cfg(not(c_bindings))]
946+
use {
947+
crate::offers::offer::OfferBuilder,
948+
};
949+
#[cfg(c_bindings)]
950+
use {
951+
crate::offers::offer::OfferWithExplicitMetadataBuilder as OfferBuilder,
952+
};
945953
use crate::offers::parse::{Bolt12ParseError, Bolt12SemanticError};
946954
use crate::offers::payer::PayerTlvStreamRef;
947955
use crate::offers::test_utils::*;

0 commit comments

Comments
 (0)