Do not panic if we fail to fund a channel
[ldk-sample] / src / main.rs
index a8b28f57d12b5056df3031f88dbcf0fdae31cabb..b7d74aa0ffb57c0ed427ead353f162b3acd20dbd 100644 (file)
@@ -139,7 +139,15 @@ 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, .. } => {
                        let mut payments = inbound_payments.lock().unwrap();
@@ -426,13 +434,33 @@ async fn start_ldk() {
        }
 
        // Step 11: Optional: Initialize the NetGraphMsgHandler
-       // XXX persist routing data
        let genesis = genesis_block(args.network).header.block_hash();
-       let router = Arc::new(NetGraphMsgHandler::new(
-               genesis,
+       let network_graph_path = format!("{}/network_graph", ldk_data_dir.clone());
+       let network_graph = disk::read_network(Path::new(&network_graph_path), genesis);
+       let router = Arc::new(NetGraphMsgHandler::from_net_graph(
                None::<Arc<dyn chain::Access + Send + Sync>>,
                logger.clone(),
+               network_graph,
        ));
+       let router_persist = Arc::clone(&router);
+       tokio::spawn(async move {
+               let mut interval = tokio::time::interval(Duration::from_secs(600));
+               loop {
+                       interval.tick().await;
+                       if disk::persist_network(
+                               Path::new(&network_graph_path),
+                               &*router_persist.network_graph.read().unwrap(),
+                       )
+                       .is_err()
+                       {
+                               // Persistence errors here are non-fatal as we can just fetch the routing graph
+                               // again later, but they may indicate a disk error which could be fatal elsewhere.
+                               eprintln!(
+                                       "Warning: Failed to persist network graph, check your disk and permissions"
+                               );
+                       }
+               }
+       });
 
        // Step 12: Initialize the PeerManager
        let channel_manager: Arc<ChannelManager> = Arc::new(channel_manager);
@@ -490,7 +518,7 @@ async fn start_ldk() {
                }
        });
 
-       // Step 15: Event Handling
+       // Step 15: Handle LDK Events
        let channel_manager_event_listener = channel_manager.clone();
        let keys_manager_listener = keys_manager.clone();
        // TODO: persist payment info to disk
@@ -512,7 +540,7 @@ async fn start_ldk() {
                        event,
                ))
        };
-       // Step 16: ChannelManager Persisting
+       // Step 16: Persist ChannelManager
        let data_dir = ldk_data_dir.clone();
        let persist_channel_manager_callback =
                move |node: &ChannelManager| FilesystemPersister::persist_manager(data_dir.clone(), &*node);
@@ -549,7 +577,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 {
@@ -557,7 +585,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(),
                                );
                        }
                });