diff --git a/src/event.rs b/src/event.rs index eb3467728..6744b9585 100644 --- a/src/event.rs +++ b/src/event.rs @@ -19,7 +19,8 @@ use lightning::routing::gossip::NodeId; use lightning::util::errors::APIError; use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer}; -use bitcoin::secp256k1::Secp256k1; +use bitcoin::secp256k1::{PublicKey, Secp256k1}; +use bitcoin::OutPoint; use rand::{thread_rng, Rng}; use std::collections::VecDeque; use std::ops::Deref; @@ -48,6 +49,19 @@ pub enum Event { /// The value, in thousandths of a satoshi, that has been received. amount_msat: u64, }, + /// A channel has been created and is pending confirmation on-chain. + ChannelPending { + /// The `channel_id` of the channel. + channel_id: [u8; 32], + /// The `user_channel_id` of the channel. + user_channel_id: u128, + /// The `temporary_channel_id` this channel used to be known by during channel establishment. + former_temporary_channel_id: [u8; 32], + /// The `node_id` of the channel counterparty. + counterparty_node_id: PublicKey, + /// The outpoint of the channel's funding transaction. + funding_txo: OutPoint, + }, /// A channel is ready to be used. ChannelReady { /// The `channel_id` of the channel. @@ -79,7 +93,14 @@ impl_writeable_tlv_based_enum!(Event, (0, channel_id, required), (1, user_channel_id, required), }, - (4, ChannelClosed) => { + (4, ChannelPending) => { + (0, channel_id, required), + (1, user_channel_id, required), + (2, former_temporary_channel_id, required), + (3, counterparty_node_id, required), + (4, funding_txo, required), + }, + (5, ChannelClosed) => { (0, channel_id, required), (1, user_channel_id, required), }; @@ -607,20 +628,34 @@ where } } LdkEvent::ChannelPending { - channel_id: _, - user_channel_id: _, - former_temporary_channel_id: _, - counterparty_node_id: _, - funding_txo: _, + channel_id, + user_channel_id, + former_temporary_channel_id, + counterparty_node_id, + funding_txo, } => { - // TODO! + log_info!( + self.logger, + "New channel {} with counterparty {} has been created and is pending confirmation on chain.", + hex_utils::to_string(&channel_id), + counterparty_node_id, + ); + self.event_queue + .add_event(Event::ChannelPending { + channel_id, + user_channel_id, + former_temporary_channel_id: former_temporary_channel_id.unwrap(), + counterparty_node_id, + funding_txo, + }) + .expect("Failed to push to event queue"); } LdkEvent::ChannelReady { channel_id, user_channel_id, counterparty_node_id, .. } => { log_info!( self.logger, - "Channel {} with {} ready to be used.", + "Channel {} with counterparty {} ready to be used.", hex_utils::to_string(&channel_id), counterparty_node_id, ); diff --git a/src/test/functional_tests.rs b/src/test/functional_tests.rs index e2074af57..3761e6704 100644 --- a/src/test/functional_tests.rs +++ b/src/test/functional_tests.rs @@ -4,7 +4,6 @@ use crate::{Builder, Error, Event, PaymentDirection, PaymentStatus}; use bitcoin::Amount; -use std::time::Duration; #[test] fn channel_full_cycle() { let (bitcoind, electrsd) = setup_bitcoind_and_electrsd(); @@ -36,13 +35,16 @@ fn channel_full_cycle() { let node_b_addr = format!("{}@{}", node_b.node_id(), node_b.listening_address().unwrap()); node_a.connect_open_channel(&node_b_addr, 50000, true).unwrap(); - let funding_txo = loop { - let details = node_a.list_channels(); + expect_event!(node_a, ChannelPending); - if details.is_empty() || details[0].funding_txo.is_none() { - std::thread::sleep(Duration::from_secs(1)); - } else { - break details[0].funding_txo.unwrap(); + let funding_txo = match node_b.next_event() { + ref e @ Event::ChannelPending { funding_txo, .. } => { + println!("{} got event {:?}", std::stringify!(node_b), e); + node_b.event_handled(); + funding_txo + } + ref e => { + panic!("{} got unexpected event!: {:?}", std::stringify!(node_b), e); } }; @@ -168,7 +170,7 @@ fn channel_full_cycle() { expect_event!(node_a, ChannelClosed); expect_event!(node_b, ChannelClosed); - wait_for_outpoint_spend(&electrsd, funding_txo.into_bitcoin_outpoint()); + wait_for_outpoint_spend(&electrsd, funding_txo); generate_blocks_and_wait(&bitcoind, &electrsd, 1); node_a.sync_wallets().unwrap();