+struct MoneyLossDetector<'a> {
+ manager: Arc<ChannelManager>,
+ monitor: Arc<channelmonitor::SimpleManyChannelMonitor<OutPoint>>,
+ handler: PeerManager<Peer<'a>>,
+
+ peers: &'a RefCell<[bool; 256]>,
+ funding_txn: Vec<Transaction>,
+ header_hashes: Vec<Sha256dHash>,
+ height: usize,
+ max_height: usize,
+
+}
+impl<'a> MoneyLossDetector<'a> {
+ pub fn new(peers: &'a RefCell<[bool; 256]>, manager: Arc<ChannelManager>, monitor: Arc<channelmonitor::SimpleManyChannelMonitor<OutPoint>>, handler: PeerManager<Peer<'a>>) -> Self {
+ MoneyLossDetector {
+ manager,
+ monitor,
+ handler,
+
+ peers,
+ funding_txn: Vec::new(),
+ header_hashes: vec![Default::default()],
+ height: 0,
+ max_height: 0,
+ }
+ }
+
+ fn connect_block(&mut self, txn: &[&Transaction], txn_idxs: &[u32]) {
+ let header = BlockHeader { version: 0x20000000, prev_blockhash: self.header_hashes[self.height], merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
+ self.height += 1;
+ self.manager.block_connected(&header, self.height as u32, txn, txn_idxs);
+ (*self.monitor).block_connected(&header, self.height as u32, txn, txn_idxs);
+ if self.header_hashes.len() > self.height {
+ self.header_hashes[self.height] = header.bitcoin_hash();
+ } else {
+ assert_eq!(self.header_hashes.len(), self.height);
+ self.header_hashes.push(header.bitcoin_hash());
+ }
+ self.max_height = cmp::max(self.height, self.max_height);
+ }
+
+ fn disconnect_block(&mut self) {
+ if self.height > 0 && (self.max_height < 6 || self.height >= self.max_height - 6) {
+ self.height -= 1;
+ let header = BlockHeader { version: 0x20000000, prev_blockhash: self.header_hashes[self.height], merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
+ self.manager.block_disconnected(&header);
+ self.monitor.block_disconnected(&header);
+ }
+ }
+}
+
+impl<'a> Drop for MoneyLossDetector<'a> {
+ fn drop(&mut self) {
+ // Disconnect all peers
+ for (idx, peer) in self.peers.borrow().iter().enumerate() {
+ if *peer {
+ self.handler.disconnect_event(&Peer{id: idx as u8, peers_connected: &self.peers});
+ }
+ }
+
+ // Force all channels onto the chain (and time out claim txn)
+ self.manager.force_close_all_channels();
+ }
+}
+