Merge pull request #131 from TheBlueMatt/2018-08-bolt-1-compliance
[rust-lightning] / src / ln / channelmanager.rs
index c29635b89707c2c7951b771c8458dc13c770543a..3a98cd5a17647fb5a4a036abf5814411018bed22 100644 (file)
@@ -829,8 +829,8 @@ impl ChannelManager {
                                        if !chan.is_live() {
                                                Some(("Forwarding channel is not in a ready state.", 0x1000 | 7, self.get_channel_update(chan).unwrap()))
                                        } else {
-                                               let fee = chan.get_our_fee_base_msat(&*self.fee_estimator) + (*amt_to_forward * self.fee_proportional_millionths as u64 / 1000000) as u32;
-                                               if msg.amount_msat < fee as u64 || (msg.amount_msat - fee as u64) < *amt_to_forward {
+                                               let fee = amt_to_forward.checked_mul(self.fee_proportional_millionths as u64).and_then(|prop_fee| { (prop_fee / 1000000).checked_add(chan.get_our_fee_base_msat(&*self.fee_estimator) as u64) });
+                                               if fee.is_none() || msg.amount_msat < fee.unwrap() || (msg.amount_msat - fee.unwrap()) < *amt_to_forward {
                                                        Some(("Prior hop has deviated from specified fees parameters or origin node has obsolete ones", 0x1000 | 12, self.get_channel_update(chan).unwrap()))
                                                } else {
                                                        if (msg.cltv_expiry as u64) < (*outgoing_cltv_value) as u64 + CLTV_EXPIRY_DELTA as u64 {
@@ -2053,6 +2053,18 @@ impl ChannelMessageHandler for ChannelManager {
                        }
                }
        }
+
+       fn handle_error(&self, their_node_id: &PublicKey, msg: &msgs::ErrorMessage) {
+               if msg.channel_id == [0; 32] {
+                       for chan in self.list_channels() {
+                               if chan.remote_network_id == *their_node_id {
+                                       self.force_close_channel(&chan.channel_id);
+                               }
+                       }
+               } else {
+                       self.force_close_channel(&msg.channel_id);
+               }
+       }
 }
 
 #[cfg(test)]
@@ -2256,7 +2268,6 @@ mod tests {
                chain_monitor: Arc<chaininterface::ChainWatchInterfaceUtil>,
                tx_broadcaster: Arc<test_utils::TestBroadcaster>,
                chan_monitor: Arc<test_utils::TestChannelMonitor>,
-               node_id: SecretKey,
                node: Arc<ChannelManager>,
                router: Router,
        }
@@ -2803,7 +2814,7 @@ mod tests {
                        };
                        let node = ChannelManager::new(node_id.clone(), 0, true, Network::Testnet, feeest.clone(), chan_monitor.clone(), chain_monitor.clone(), tx_broadcaster.clone(), Arc::clone(&logger)).unwrap();
                        let router = Router::new(PublicKey::from_secret_key(&secp_ctx, &node_id), Arc::clone(&logger));
-                       nodes.push(Node { feeest, chain_monitor, tx_broadcaster, chan_monitor, node_id, node, router });
+                       nodes.push(Node { feeest, chain_monitor, tx_broadcaster, chan_monitor, node, router });
                }
 
                nodes