- loop {
- let loop_channel_manager = channel_manager.clone();
- let mut events = channel_manager.get_and_clear_pending_events();
- events.append(&mut chain_monitor.get_and_clear_pending_events());
- for event in events {
- match event {
- Event::FundingGenerationReady {
- temporary_channel_id,
- channel_value_satoshis,
- output_script,
- ..
- } => {
- // Construct the raw transaction with one output, that is paid the amount of the
- // channel.
- let addr = WitnessProgram::from_scriptpubkey(
- &output_script[..],
- match network {
- Network::Bitcoin => bitcoin_bech32::constants::Network::Bitcoin,
- Network::Testnet => bitcoin_bech32::constants::Network::Testnet,
- Network::Regtest => bitcoin_bech32::constants::Network::Regtest,
- Network::Signet => panic!("Signet unsupported"),
- },
- )
- .expect("Lightning funding tx should always be to a SegWit output")
- .to_address();
- let mut outputs = vec![HashMap::with_capacity(1)];
- outputs[0].insert(addr, channel_value_satoshis as f64 / 100_000_000.0);
- let raw_tx = bitcoind_client.create_raw_transaction(outputs).await;
-
- // Have your wallet put the inputs into the transaction such that the output is
- // satisfied.
- let funded_tx = bitcoind_client.fund_raw_transaction(raw_tx).await;
- let change_output_position = funded_tx.changepos;
- assert!(change_output_position == 0 || change_output_position == 1);
-
- // Sign the final funding transaction and broadcast it.
- let signed_tx =
- bitcoind_client.sign_raw_transaction_with_wallet(funded_tx.hex).await;
- assert_eq!(signed_tx.complete, true);
- 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.
- loop_channel_manager
- .funding_transaction_generated(&temporary_channel_id, final_tx)
- .unwrap();
- }
- Event::FundingBroadcastSafe { funding_txo, .. } => {
- Event::PaymentReceived { payment_hash, payment_secret, amt: amt_msat } => {
- let mut payments = payment_storage.lock().unwrap();
- if let Some((Some(preimage), _, _, _)) = payments.get(&payment_hash) {
- assert!(loop_channel_manager.claim_funds(
- preimage.clone(),
- &payment_secret,
- amt_msat
- ));
- println!(
- "\nEVENT: received payment from payment_hash {} of {} satoshis",
- hex_utils::hex_str(&payment_hash.0),
- amt_msat / 1000
- );
- print!("> ");
- io::stdout().flush().unwrap();
- let (_, _, ref mut status, _) = payments.get_mut(&payment_hash).unwrap();
- *status = HTLCStatus::Succeeded;
- } else {
- println!("\nERROR: we received a payment but didn't know the preimage");
- print!("> ");
- io::stdout().flush().unwrap();
- loop_channel_manager.fail_htlc_backwards(&payment_hash, &payment_secret);
- payments.insert(
- payment_hash,
- (None, HTLCDirection::Inbound, HTLCStatus::Failed, SatoshiAmount(None)),
- );
- }
- }
- Event::PaymentSent { payment_preimage } => {
- let hashed = PaymentHash(Sha256::hash(&payment_preimage.0).into_inner());
- let mut payments = payment_storage.lock().unwrap();
- for (payment_hash, (preimage_option, _, status, amt_sat)) in payments.iter_mut()
- {
- if *payment_hash == hashed {
- *preimage_option = Some(payment_preimage);
- *status = HTLCStatus::Succeeded;
- println!(
- "\nEVENT: successfully sent payment of {} satoshis from \
- payment hash {:?} with preimage {:?}",
- amt_sat,
- hex_utils::hex_str(&payment_hash.0),
- hex_utils::hex_str(&payment_preimage.0)
- );
- print!("> ");
- io::stdout().flush().unwrap();
- }
- }
+ match event {
+ Event::FundingGenerationReady {
+ temporary_channel_id,
+ channel_value_satoshis,
+ output_script,
+ ..
+ } => {
+ // Construct the raw transaction with one output, that is paid the amount of the
+ // channel.
+ let addr = WitnessProgram::from_scriptpubkey(
+ &output_script[..],
+ match network {
+ Network::Bitcoin => bitcoin_bech32::constants::Network::Bitcoin,
+ Network::Testnet => bitcoin_bech32::constants::Network::Testnet,
+ Network::Regtest => bitcoin_bech32::constants::Network::Regtest,
+ Network::Signet => panic!("Signet unsupported"),
+ },
+ )
+ .expect("Lightning funding tx should always be to a SegWit output")
+ .to_address();
+ let mut outputs = vec![HashMap::with_capacity(1)];
+ outputs[0].insert(addr, *channel_value_satoshis as f64 / 100_000_000.0);
+ let raw_tx = bitcoind_client.create_raw_transaction(outputs).await;
+
+ // Have your wallet put the inputs into the transaction such that the output is
+ // satisfied.
+ let funded_tx = bitcoind_client.fund_raw_transaction(raw_tx).await;
+
+ // Sign the final funding transaction and broadcast it.
+ let signed_tx = bitcoind_client.sign_raw_transaction_with_wallet(funded_tx.hex).await;
+ assert_eq!(signed_tx.complete, true);
+ 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.
+ 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, 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))