Keysend support
[ldk-sample] / src / main.rs
index cba93f6a7f28e9c3d22a68aad98c210edce1874a..bfb586adfbe630c3df9ff7fc31b51c67d493ff9c 100644 (file)
@@ -19,17 +19,16 @@ use lightning::chain;
 use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
 use lightning::chain::chainmonitor;
 use lightning::chain::keysinterface::{InMemorySigner, KeysInterface, KeysManager};
-use lightning::chain::Filter;
-use lightning::chain::Watch;
+use lightning::chain::{BestBlock, Filter, Watch};
 use lightning::ln::channelmanager;
 use lightning::ln::channelmanager::{
-       BestBlock, ChainParameters, ChannelManagerReadArgs, SimpleArcChannelManager,
+       ChainParameters, ChannelManagerReadArgs, SimpleArcChannelManager,
 };
 use lightning::ln::peer_handler::{MessageHandler, SimpleArcPeerManager};
 use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
 use lightning::routing::network_graph::NetGraphMsgHandler;
 use lightning::util::config::UserConfig;
-use lightning::util::events::Event;
+use lightning::util::events::{Event, PaymentPurpose};
 use lightning::util::ser::ReadableArgs;
 use lightning_background_processor::BackgroundProcessor;
 use lightning_block_sync::init;
@@ -139,10 +138,24 @@ async fn handle_ldk_events(
                        let final_tx: Transaction =
                                encode::deserialize(&hex_utils::to_vec(&signed_tx.hex).unwrap()).unwrap();
                        // Give the funding transaction back to LDK for opening the channel.
-                       channel_manager.funding_transaction_generated(&temporary_channel_id, final_tx).unwrap();
+                       if channel_manager
+                               .funding_transaction_generated(&temporary_channel_id, final_tx)
+                               .is_err()
+                       {
+                               println!(
+                                       "\nERROR: Channel went away before we could fund it. The peer disconnected or refused the channel.");
+                               print!("> ");
+                               io::stdout().flush().unwrap();
+                       }
                }
-               Event::PaymentReceived { payment_hash, payment_preimage, payment_secret, amt, .. } => {
+               Event::PaymentReceived { payment_hash, purpose, amt, .. } => {
                        let mut payments = inbound_payments.lock().unwrap();
+                       let (payment_preimage, payment_secret) = match purpose {
+                               PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
+                                       (payment_preimage, Some(payment_secret))
+                               }
+                               PaymentPurpose::SpontaneousPayment(preimage) => (Some(preimage), None),
+                       };
                        let status = match channel_manager.claim_funds(payment_preimage.unwrap()) {
                                true => {
                                        println!(
@@ -160,13 +173,13 @@ async fn handle_ldk_events(
                                Entry::Occupied(mut e) => {
                                        let payment = e.get_mut();
                                        payment.status = status;
-                                       payment.preimage = Some(payment_preimage.unwrap());
-                                       payment.secret = Some(payment_secret);
+                                       payment.preimage = payment_preimage;
+                                       payment.secret = payment_secret;
                                }
                                Entry::Vacant(e) => {
                                        e.insert(PaymentInfo {
-                                               preimage: Some(payment_preimage.unwrap()),
-                                               secret: Some(payment_secret),
+                                               preimage: payment_preimage,
+                                               secret: payment_secret,
                                                status,
                                                amt_msat: MillisatAmount(Some(amt)),
                                        });
@@ -340,7 +353,8 @@ async fn start_ldk() {
        let mut channelmonitors = persister.read_channelmonitors(keys_manager.clone()).unwrap();
 
        // Step 8: Initialize the ChannelManager
-       let user_config = UserConfig::default();
+       let mut user_config = UserConfig::default();
+       user_config.peer_channel_config_limits.force_announced_channel_preference = false;
        let mut restarting_node = true;
        let (channel_manager_blockhash, mut channel_manager) = {
                if let Ok(mut f) = fs::File::open(format!("{}/manager", ldk_data_dir.clone())) {
@@ -552,7 +566,7 @@ async fn start_ldk() {
                Ok(mut info) => {
                        for (pubkey, peer_addr) in info.drain() {
                                for chan_info in channel_manager.list_channels() {
-                                       if pubkey == chan_info.remote_network_id {
+                                       if pubkey == chan_info.counterparty.node_id {
                                                let _ =
                                                        cli::connect_peer_if_necessary(pubkey, peer_addr, peer_manager.clone())
                                                                .await;
@@ -569,7 +583,7 @@ async fn start_ldk() {
        // to avoid churn in the global network graph.
        let chan_manager = Arc::clone(&channel_manager);
        let network = args.network;
-       if args.ldk_announced_listen_addr.is_some() {
+       if !args.ldk_announced_listen_addr.is_empty() {
                tokio::spawn(async move {
                        let mut interval = tokio::time::interval(Duration::from_secs(60));
                        loop {
@@ -577,7 +591,7 @@ async fn start_ldk() {
                                chan_manager.broadcast_node_announcement(
                                        [0; 3],
                                        args.ldk_announced_node_name,
-                                       vec![args.ldk_announced_listen_addr.as_ref().unwrap().clone()],
+                                       args.ldk_announced_listen_addr.clone(),
                                );
                        }
                });