Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 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;
Comment on lines +54 to +56
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== CurrencyConversion trait signature =="
rg -n "trait CurrencyConversion|fn conversion_range" lightning/src/offers/currency.rs -A4 -B2

echo
echo "== Imports in fuzz/src/full_stack.rs (currency-related) =="
sed -n '50,60p' fuzz/src/full_stack.rs

echo
echo "== FuzzCurrencyConversion impl snippet =="
sed -n '189,196p' fuzz/src/full_stack.rs

echo
echo "== Check for ExchangeRange import in fuzz/src/full_stack.rs =="
rg -n "use lightning::offers::currency::.*ExchangeRange" fuzz/src/full_stack.rs || true

Repository: shaavan/rust-lightning

Length of output: 1671


Add missing ExchangeRange import to resolve type resolution failure at line 192.

The conversion_range method implementation returns Result<ExchangeRange, ()> but ExchangeRange is not in scope. This is a compile blocker.

Proposed fix
-use lightning::offers::currency::CurrencyConversion;
+use lightning::offers::currency::{CurrencyConversion, ExchangeRange};
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
use lightning::offers::currency::CurrencyConversion;
use lightning::offers::invoice::UnsignedBolt12Invoice;
use lightning::offers::offer::CurrencyCode;
use lightning::offers::currency::{CurrencyConversion, ExchangeRange};
use lightning::offers::invoice::UnsignedBolt12Invoice;
use lightning::offers::offer::CurrencyCode;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@fuzz/src/full_stack.rs` around lines 54 - 56, The file is missing an import
for ExchangeRange which causes the return type Result<ExchangeRange, ()> in the
conversion_range function to be unresolved; add the appropriate use statement
(bring ExchangeRange into scope) so the conversion_range function compiles —
locate the conversion_range method in full_stack.rs and add a use for
ExchangeRange (from the same module as CurrencyConversion/CurrencyCode or the
offers::currency module) so the type name resolves.

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 conversion_range(&self, _currency: CurrencyCode) -> Result<ExchangeRange, ()> {
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 @@ -548,6 +559,7 @@ 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) => {
Expand Down Expand Up @@ -613,6 +625,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
3 changes: 2 additions & 1 deletion fuzz/src/invoice_request_deser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ use lightning::blinded_path::payment::{
};
use lightning::ln::channelmanager::MIN_FINAL_CLTV_EXPIRY_DELTA;
use lightning::ln::inbound_payment::ExpandedKey;
use lightning::offers::currency::NullCurrencyConversion;
use lightning::offers::invoice::UnsignedBolt12Invoice;
use lightning::offers::invoice_request::{InvoiceRequest, InvoiceRequestFields};
use lightning::offers::offer::OfferId;
Expand Down Expand Up @@ -144,7 +145,7 @@ 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()
invoice_request.respond_with(&NullCurrencyConversion, vec![payment_path], payment_hash)?.build()
}

pub fn invoice_request_deser_test<Out: test_logger::Output>(data: &[u8], out: Out) {
Expand Down
3 changes: 2 additions & 1 deletion fuzz/src/refund_deser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ use lightning::blinded_path::payment::{
PaymentForwardNode, PaymentRelay, ReceiveTlvs,
};
use lightning::ln::channelmanager::MIN_FINAL_CLTV_EXPIRY_DELTA;
use lightning::offers::currency::NullCurrencyConversion;
use lightning::offers::invoice::UnsignedBolt12Invoice;
use lightning::offers::parse::Bolt12SemanticError;
use lightning::offers::refund::Refund;
Expand Down Expand Up @@ -109,7 +110,7 @@ fn build_response<T: secp256k1::Signing + secp256k1::Verification>(
.unwrap();

let payment_hash = PaymentHash([42; 32]);
refund.respond_with(vec![payment_path], payment_hash, signing_pubkey)?.build()
refund.respond_with(&NullCurrencyConversion, vec![payment_path], payment_hash, signing_pubkey)?.build()
}

pub fn refund_deser_test<Out: test_logger::Output>(data: &[u8], out: Out) {
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::NullCurrencyConversion;

#[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::NullCurrencyConversion;
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<NullCurrencyConversion>,
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(NullCurrencyConversion);
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
19 changes: 16 additions & 3 deletions lightning/src/ln/async_payments_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ use crate::offers::async_receive_offer_cache::{
TEST_INVOICE_REFRESH_THRESHOLD, TEST_MAX_CACHED_OFFERS_TARGET, TEST_MAX_UPDATE_ATTEMPTS,
TEST_MIN_OFFER_PATHS_RELATIVE_EXPIRY_SECS, TEST_OFFER_REFRESH_THRESHOLD,
};
use crate::offers::currency::NullCurrencyConversion;
use crate::offers::flow::{
TEST_DEFAULT_ASYNC_RECEIVE_OFFER_EXPIRY, TEST_OFFERS_MESSAGE_REQUEST_LIMIT,
TEST_TEMP_REPLY_PATH_RELATIVE_EXPIRY,
Expand Down Expand Up @@ -322,7 +323,11 @@ fn create_static_invoice<T: secp256k1::Signing + secp256k1::Verification>(
let (offer_builder, offer_nonce) = recipient
.node
.flow
.create_async_receive_offer_builder(entropy_source, blinded_paths_to_always_online_node)
.create_async_receive_offer_builder(
entropy_source,
&NullCurrencyConversion,
blinded_paths_to_always_online_node,
)
.unwrap();
let offer = offer_builder.build().unwrap();
let static_invoice =
Expand Down Expand Up @@ -693,7 +698,11 @@ fn static_invoice_unknown_required_features() {
let (offer_builder, nonce) = nodes[2]
.node
.flow
.create_async_receive_offer_builder(entropy_source, blinded_paths_to_always_online_node)
.create_async_receive_offer_builder(
entropy_source,
&NullCurrencyConversion,
blinded_paths_to_always_online_node,
)
.unwrap();
let offer = offer_builder.build().unwrap();
let static_invoice_unknown_req_features =
Expand Down Expand Up @@ -1677,7 +1686,11 @@ fn invalid_async_receive_with_retry<F1, F2>(
let (offer_builder, offer_nonce) = nodes[2]
.node
.flow
.create_async_receive_offer_builder(entropy_source, blinded_paths_to_always_online_node)
.create_async_receive_offer_builder(
entropy_source,
&NullCurrencyConversion,
blinded_paths_to_always_online_node,
)
.unwrap();
let offer = offer_builder.build().unwrap();
let amt_msat = 5000;
Expand Down
Loading
Loading