Skip to content
Open
14 changes: 14 additions & 0 deletions fuzz/src/full_stack.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ use lightning::ln::peer_handler::{
};
use lightning::ln::script::ShutdownScript;
use lightning::ln::types::ChannelId;
use lightning::offers::currency::CurrencyConversion;
use lightning::offers::invoice::UnsignedBolt12Invoice;
use lightning::offers::offer::CurrencyCode;
use lightning::onion_message::messenger::{Destination, MessageRouter, OnionMessagePath};
use lightning::routing::gossip::{NetworkGraph, P2PGossipSync};
use lightning::routing::router::{
Expand Down Expand Up @@ -184,6 +186,14 @@ impl MessageRouter for FuzzRouter {
}
}

struct FuzzCurrencyConversion;

impl CurrencyConversion for FuzzCurrencyConversion {
fn msats_per_minor_unit(&self, _iso4217_code: CurrencyCode) -> Result<(f64, u8), ()> {
Err(())
}
}

struct TestBroadcaster {
txn_broadcasted: Mutex<Vec<Transaction>>,
}
Expand Down Expand Up @@ -239,6 +249,7 @@ type ChannelMan<'a> = ChannelManager<
Arc<FuzzEstimator>,
&'a FuzzRouter,
&'a FuzzRouter,
&'a FuzzCurrencyConversion,
Arc<dyn Logger + MaybeSend + MaybeSync>,
>;
type PeerMan<'a> = PeerManager<
Expand Down Expand Up @@ -549,6 +560,8 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger + MaybeSend + MaybeSync>
let fee_est = Arc::new(FuzzEstimator { input: input.clone() });
let router = FuzzRouter {};

let conversion = FuzzCurrencyConversion;

macro_rules! get_slice {
($len: expr) => {
match input.get_slice($len as usize) {
Expand Down Expand Up @@ -613,6 +626,7 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger + MaybeSend + MaybeSync>
broadcast.clone(),
&router,
&router,
&conversion,
Arc::clone(&logger),
keys_manager.clone(),
keys_manager.clone(),
Expand Down
16 changes: 14 additions & 2 deletions fuzz/src/invoice_request_deser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@ use lightning::blinded_path::payment::{
};
use lightning::ln::channelmanager::MIN_FINAL_CLTV_EXPIRY_DELTA;
use lightning::ln::inbound_payment::ExpandedKey;
use lightning::offers::currency::CurrencyConversion;
use lightning::offers::invoice::UnsignedBolt12Invoice;
use lightning::offers::invoice_request::{InvoiceRequest, InvoiceRequestFields};
use lightning::offers::offer::OfferId;
use lightning::offers::offer::{CurrencyCode, OfferId};
use lightning::offers::parse::Bolt12SemanticError;
use lightning::sign::{EntropySource, ReceiveAuthKey};
use lightning::types::features::BlindedHopFeatures;
Expand Down Expand Up @@ -61,6 +62,14 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
}
}

struct FuzzCurrencyConversion;

impl CurrencyConversion for FuzzCurrencyConversion {
fn msats_per_minor_unit(&self, _iso4217_code: CurrencyCode) -> Result<(f64, u8), ()> {
Err(())
}
}

struct Randomness;

impl EntropySource for Randomness {
Expand Down Expand Up @@ -144,7 +153,10 @@ fn build_response<T: secp256k1::Signing + secp256k1::Verification>(
.unwrap();

let payment_hash = PaymentHash([42; 32]);
invoice_request.respond_with(vec![payment_path], payment_hash)?.build()
let conversion = FuzzCurrencyConversion;
invoice_request
.respond_with(&conversion, vec![payment_path], payment_hash)?
.build()
}

pub fn invoice_request_deser_test<Out: test_logger::Output>(data: &[u8], out: Out) {
Expand Down
9 changes: 5 additions & 4 deletions fuzz/src/offer_deser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@ use bitcoin::secp256k1::Secp256k1;
use core::convert::TryFrom;
use lightning::ln::channelmanager::PaymentId;
use lightning::ln::inbound_payment::ExpandedKey;
use lightning::offers::currency::DefaultCurrencyConversion;
use lightning::offers::invoice_request::InvoiceRequest;
use lightning::offers::nonce::Nonce;
use lightning::offers::offer::{Amount, Offer, Quantity};
use lightning::offers::offer::{Offer, Quantity};
use lightning::offers::parse::Bolt12SemanticError;
use lightning::sign::EntropySource;
use lightning::util::ser::Writeable;
Expand Down Expand Up @@ -48,13 +49,13 @@ fn build_request(offer: &Offer) -> Result<InvoiceRequest, Bolt12SemanticError> {
let nonce = Nonce::from_entropy_source(&entropy);
let secp_ctx = Secp256k1::new();
let payment_id = PaymentId([1; 32]);
let conversion = DefaultCurrencyConversion;

let mut builder = offer.request_invoice(&expanded_key, nonce, &secp_ctx, payment_id)?;
let mut builder = offer.request_invoice(&expanded_key, nonce, &secp_ctx, payment_id, &conversion)?;

builder = match offer.amount() {
None => builder.amount_msats(1000).unwrap(),
Some(Amount::Bitcoin { amount_msats }) => builder.amount_msats(amount_msats + 1)?,
Some(Amount::Currency { .. }) => return Err(Bolt12SemanticError::UnsupportedCurrency),
Some(amount) => builder.amount_msats(amount.into_msats(&conversion)?)?,
};

builder = match offer.supported_quantity() {
Expand Down
8 changes: 8 additions & 0 deletions lightning-background-processor/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,9 @@ type DynMessageRouter = lightning::onion_message::messenger::DefaultMessageRoute
&'static (dyn EntropySource + Send + Sync),
>;

#[cfg(not(c_bindings))]
type DynCurrencyConversion = lightning::offers::currency::DefaultCurrencyConversion;

#[cfg(not(c_bindings))]
type DynSignerProvider = dyn lightning::sign::SignerProvider<EcdsaSigner = lightning::sign::InMemorySigner>
+ Send
Expand All @@ -393,6 +396,7 @@ type DynChannelManager = lightning::ln::channelmanager::ChannelManager<
&'static (dyn FeeEstimator + Send + Sync),
&'static DynRouter,
&'static DynMessageRouter,
&'static DynCurrencyConversion,
&'static (dyn Logger + Send + Sync),
>;

Expand Down Expand Up @@ -1949,6 +1953,7 @@ mod tests {
IgnoringMessageHandler, MessageHandler, PeerManager, SocketDescriptor,
};
use lightning::ln::types::ChannelId;
use lightning::offers::currency::DefaultCurrencyConversion;
use lightning::onion_message::messenger::{DefaultMessageRouter, OnionMessenger};
use lightning::routing::gossip::{NetworkGraph, P2PGossipSync};
use lightning::routing::router::{CandidateRouteHop, DefaultRouter, Path, RouteHop};
Expand Down Expand Up @@ -2044,6 +2049,7 @@ mod tests {
Arc<KeysManager>,
>,
>,
Arc<DefaultCurrencyConversion>,
Arc<test_utils::TestLogger>,
>;

Expand Down Expand Up @@ -2468,6 +2474,7 @@ mod tests {
Arc::clone(&network_graph),
Arc::clone(&keys_manager),
));
let conversion = Arc::new(DefaultCurrencyConversion);
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Bitcoin));
let kv_store =
Arc::new(Persister::new(format!("{}_persister_{}", &persist_dir, i).into()));
Expand All @@ -2494,6 +2501,7 @@ mod tests {
Arc::clone(&tx_broadcaster),
Arc::clone(&router),
Arc::clone(&msg_router),
Arc::clone(&conversion),
Arc::clone(&logger),
Arc::clone(&keys_manager),
Arc::clone(&keys_manager),
Expand Down
6 changes: 5 additions & 1 deletion lightning-block-sync/src/init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ where
/// use lightning::chain::chaininterface::BroadcasterInterface;
/// use lightning::chain::chaininterface::FeeEstimator;
/// use lightning::ln::channelmanager::{ChannelManager, ChannelManagerReadArgs};
/// use lightning::offers::currency::CurrencyConversion;
/// use lightning::onion_message::messenger::MessageRouter;
/// use lightning::routing::router::Router;
/// use lightning::sign;
Expand All @@ -74,6 +75,7 @@ where
/// F: FeeEstimator,
/// R: Router,
/// MR: MessageRouter,
/// CC: CurrencyConversion,
/// L: Logger,
/// C: chain::Filter,
/// P: chainmonitor::Persist<SP::EcdsaSigner>,
Expand All @@ -88,6 +90,7 @@ where
/// fee_estimator: &F,
/// router: &R,
/// message_router: &MR,
/// currency_conversion: &CC,
/// logger: &L,
/// persister: &P,
/// ) {
Expand All @@ -108,11 +111,12 @@ where
/// tx_broadcaster,
/// router,
/// message_router,
/// currency_conversion,
/// logger,
/// config,
/// vec![&mut monitor],
/// );
/// <(BestBlock, ChannelManager<&ChainMonitor<SP::EcdsaSigner, &C, &T, &F, &L, &P, &ES>, &T, &ES, &NS, &SP, &F, &R, &MR, &L>)>::read(
/// <(BestBlock, ChannelManager<&ChainMonitor<SP::EcdsaSigner, &C, &T, &F, &L, &P, &ES>, &T, &ES, &NS, &SP, &F, &R, &MR, &CC, &L>)>::read(
/// &mut Cursor::new(&serialized_manager), read_args).unwrap()
/// };
///
Expand Down
8 changes: 5 additions & 3 deletions lightning/src/ln/async_payments_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,7 @@ fn create_static_invoice_builder<'a>(
relative_expiry_secs,
recipient.node.list_usable_channels(),
recipient.node.test_get_peers_for_blinded_path(),
recipient.node.currency_conversion,
)
.unwrap()
}
Expand All @@ -324,7 +325,7 @@ fn create_static_invoice<T: secp256k1::Signing + secp256k1::Verification>(
.flow
.create_async_receive_offer_builder(entropy_source, blinded_paths_to_always_online_node)
.unwrap();
let offer = offer_builder.build().unwrap();
let offer = offer_builder.build();
let static_invoice =
create_static_invoice_builder(recipient, &offer, offer_nonce, relative_expiry)
.build_and_sign(&secp_ctx)
Expand Down Expand Up @@ -695,7 +696,7 @@ fn static_invoice_unknown_required_features() {
.flow
.create_async_receive_offer_builder(entropy_source, blinded_paths_to_always_online_node)
.unwrap();
let offer = offer_builder.build().unwrap();
let offer = offer_builder.build();
let static_invoice_unknown_req_features =
create_static_invoice_builder(&nodes[2], &offer, nonce, None)
.features_unchecked(Bolt12InvoiceFeatures::unknown())
Expand Down Expand Up @@ -1478,6 +1479,7 @@ fn amount_doesnt_match_invreq() {
Nonce::from_entropy_source(nodes[0].keys_manager),
&secp_ctx,
payment_id,
nodes[0].node.currency_conversion,
)
.unwrap()
.amount_msats(amt_msat + 1)
Expand Down Expand Up @@ -1679,7 +1681,7 @@ fn invalid_async_receive_with_retry<F1, F2>(
.flow
.create_async_receive_offer_builder(entropy_source, blinded_paths_to_always_online_node)
.unwrap();
let offer = offer_builder.build().unwrap();
let offer = offer_builder.build();
let amt_msat = 5000;
let payment_id = PaymentId([1; 32]);

Expand Down
Loading
Loading