Skip to content

Introduce Synchronous Currency Conversion Support in Offers #3833

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
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
15 changes: 15 additions & 0 deletions fuzz/src/chanmon_consistency.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ use lightning::ln::msgs::{
use lightning::ln::script::ShutdownScript;
use lightning::ln::types::ChannelId;
use lightning::offers::invoice::UnsignedBolt12Invoice;
use lightning::offers::invoice_request::CurrencyConversion;
use lightning::offers::offer::CurrencyCode;
use lightning::offers::parse::Bolt12SemanticError;
use lightning::onion_message::messenger::{Destination, MessageRouter, OnionMessagePath};
use lightning::routing::router::{
InFlightHtlcs, Path, PaymentParameters, Route, RouteHop, RouteParameters, Router,
Expand Down Expand Up @@ -150,6 +153,14 @@ impl MessageRouter for FuzzRouter {
}
}

struct FuzzCurrencyConversion {}

impl CurrencyConversion for FuzzCurrencyConversion {
fn fiat_to_msats(&self, _iso4217_code: CurrencyCode) -> Result<u64, Bolt12SemanticError> {
unreachable!()
}
}

pub struct TestBroadcaster {}
impl BroadcasterInterface for TestBroadcaster {
fn broadcast_transactions(&self, _txs: &[&Transaction]) {}
Expand Down Expand Up @@ -464,6 +475,7 @@ type ChanMan<'a> = ChannelManager<
Arc<FuzzEstimator>,
&'a FuzzRouter,
&'a FuzzRouter,
&'a FuzzCurrencyConversion,
Arc<dyn Logger>,
>;

Expand Down Expand Up @@ -637,6 +649,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
let out = SearchingOutput::new(underlying_out);
let broadcast = Arc::new(TestBroadcaster {});
let router = FuzzRouter {};
let currency_conversion = FuzzCurrencyConversion {};

macro_rules! make_node {
($node_id: expr, $fee_estimator: expr) => {{
Expand Down Expand Up @@ -679,6 +692,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
broadcast.clone(),
&router,
&router,
&currency_conversion,
Arc::clone(&logger),
keys_manager.clone(),
keys_manager.clone(),
Expand Down Expand Up @@ -770,6 +784,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
tx_broadcaster: broadcast.clone(),
router: &router,
message_router: &router,
currency_conversion: &currency_conversion,
logger,
default_config: config,
channel_monitors: monitor_refs,
Expand Down
14 changes: 14 additions & 0 deletions fuzz/src/full_stack.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ use lightning::ln::peer_handler::{
use lightning::ln::script::ShutdownScript;
use lightning::ln::types::ChannelId;
use lightning::offers::invoice::UnsignedBolt12Invoice;
use lightning::offers::invoice_request::CurrencyConversion;
use lightning::offers::offer::CurrencyCode;
use lightning::offers::parse::Bolt12SemanticError;
use lightning::onion_message::messenger::{Destination, MessageRouter, OnionMessagePath};
use lightning::routing::gossip::{NetworkGraph, P2PGossipSync};
use lightning::routing::router::{
Expand Down Expand Up @@ -181,6 +184,14 @@ impl MessageRouter for FuzzRouter {
}
}

struct FuzzCurrencyConversion {}

impl CurrencyConversion for FuzzCurrencyConversion {
fn fiat_to_msats(&self, _iso4217_code: CurrencyCode) -> Result<u64, Bolt12SemanticError> {
unreachable!()
}
}

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

macro_rules! get_slice {
($len: expr) => {
Expand Down Expand Up @@ -606,6 +619,7 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
broadcast.clone(),
&router,
&router,
&currency_conversion,
Arc::clone(&logger),
keys_manager.clone(),
keys_manager.clone(),
Expand Down
27 changes: 24 additions & 3 deletions fuzz/src/invoice_request_deser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,19 @@
use crate::utils::test_logger;
use bitcoin::secp256k1::{self, Keypair, Parity, PublicKey, Secp256k1, SecretKey};
use core::convert::TryFrom;
use core::ops::Deref;
use lightning::blinded_path::payment::{
BlindedPaymentPath, Bolt12OfferContext, ForwardTlvs, PaymentConstraints, PaymentContext,
PaymentForwardNode, PaymentRelay, UnauthenticatedReceiveTlvs,
};
use lightning::ln::channelmanager::MIN_FINAL_CLTV_EXPIRY_DELTA;
use lightning::ln::inbound_payment::ExpandedKey;
use lightning::offers::invoice::UnsignedBolt12Invoice;
use lightning::offers::invoice_request::{InvoiceRequest, InvoiceRequestFields};
use lightning::offers::invoice_request::{
CurrencyConversion, InvoiceRequest, InvoiceRequestFields,
};
use lightning::offers::nonce::Nonce;
use lightning::offers::offer::OfferId;
use lightning::offers::offer::{CurrencyCode, OfferId};
use lightning::offers::parse::Bolt12SemanticError;
use lightning::sign::EntropySource;
use lightning::types::features::BlindedHopFeatures;
Expand Down Expand Up @@ -79,6 +82,22 @@ fn privkey(byte: u8) -> SecretKey {
SecretKey::from_slice(&[byte; 32]).unwrap()
}

struct FuzzCurrencyConversion;

impl Deref for FuzzCurrencyConversion {
type Target = Self;

fn deref(&self) -> &Self::Target {
self
}
}

impl CurrencyConversion for FuzzCurrencyConversion {
fn fiat_to_msats(&self, _iso4217_code: CurrencyCode) -> Result<u64, Bolt12SemanticError> {
unreachable!()
}
}

fn build_response<T: secp256k1::Signing + secp256k1::Verification>(
invoice_request: &InvoiceRequest, secp_ctx: &Secp256k1<T>,
) -> Result<UnsignedBolt12Invoice, Bolt12SemanticError> {
Expand Down Expand Up @@ -145,7 +164,9 @@ 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(&FuzzCurrencyConversion {}, vec![payment_path], payment_hash)?
.build()
}

pub fn invoice_request_deser_test<Out: test_logger::Output>(data: &[u8], out: Out) {
Expand Down
3 changes: 3 additions & 0 deletions fuzz/src/lsps_message.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use lightning::chain::{chainmonitor, BestBlock};
use lightning::ln::channelmanager::{ChainParameters, ChannelManager};
use lightning::ln::peer_handler::CustomMessageHandler;
use lightning::ln::wire::CustomMessageReader;
use lightning::offers::invoice_request::DefaultCurrencyConversion;
use lightning::onion_message::messenger::DefaultMessageRouter;
use lightning::routing::gossip::NetworkGraph;
use lightning::routing::router::DefaultRouter;
Expand Down Expand Up @@ -49,6 +50,7 @@ pub fn do_test(data: &[u8]) {
));
let msg_router =
Arc::new(DefaultMessageRouter::new(Arc::clone(&network_graph), Arc::clone(&keys_manager)));
let currency_conversion = Arc::new(DefaultCurrencyConversion {});
let chain_source = Arc::new(TestChainSource::new(Network::Bitcoin));
let kv_store = Arc::new(TestStore::new(false));
let chain_monitor = Arc::new(chainmonitor::ChainMonitor::new(
Expand All @@ -68,6 +70,7 @@ pub fn do_test(data: &[u8]) {
Arc::clone(&tx_broadcaster),
Arc::clone(&router),
Arc::clone(&msg_router),
Arc::clone(&currency_conversion),
Arc::clone(&logger),
Arc::clone(&keys_manager),
Arc::clone(&keys_manager),
Expand Down
4 changes: 4 additions & 0 deletions lightning-background-processor/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1672,6 +1672,7 @@ mod tests {
IgnoringMessageHandler, MessageHandler, PeerManager, SocketDescriptor,
};
use lightning::ln::types::ChannelId;
use lightning::offers::invoice_request::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 @@ -1745,6 +1746,7 @@ mod tests {
Arc<KeysManager>,
>,
>,
Arc<DefaultCurrencyConversion>,
Arc<test_utils::TestLogger>,
>;

Expand Down Expand Up @@ -2167,6 +2169,7 @@ mod tests {
Arc::clone(&network_graph),
Arc::clone(&keys_manager),
));
let currency_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 @@ -2189,6 +2192,7 @@ mod tests {
Arc::clone(&tx_broadcaster),
Arc::clone(&router),
Arc::clone(&msg_router),
currency_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 @@ -50,6 +50,7 @@ where
/// use lightning::chain::chaininterface::BroadcasterInterface;
/// use lightning::chain::chaininterface::FeeEstimator;
/// use lightning::ln::channelmanager::{ChannelManager, ChannelManagerReadArgs};
/// use lightning::offers::invoice_request::CurrencyConversion;
/// use lightning::onion_message::messenger::MessageRouter;
/// use lightning::routing::router::Router;
/// use lightning::sign;
Expand All @@ -71,6 +72,7 @@ where
/// F: FeeEstimator,
/// R: Router,
/// MR: MessageRouter,
/// CC: CurrencyConversion,
/// L: Logger,
/// C: chain::Filter,
/// P: chainmonitor::Persist<SP::EcdsaSigner>,
Expand All @@ -85,6 +87,7 @@ where
/// fee_estimator: &F,
/// router: &R,
/// message_router: &MR,
/// currency_conversion: &CC,
/// logger: &L,
/// persister: &P,
/// ) {
Expand All @@ -105,11 +108,12 @@ where
/// tx_broadcaster,
/// router,
/// message_router,
/// currency_conversion,
/// logger,
/// config,
/// vec![&mut monitor],
/// );
/// <(BlockHash, ChannelManager<&ChainMonitor<SP::EcdsaSigner, &C, &T, &F, &L, &P, &ES>, &T, &ES, &NS, &SP, &F, &R, &MR, &L>)>::read(
/// <(BlockHash, 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
Loading
Loading