- 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::PaymentReceived {
- payment_hash,
- payment_preimage,
- payment_secret,
- amt,
- ..
- } => {
- let mut payments = inbound_payments.lock().unwrap();
- let status = match loop_channel_manager.claim_funds(payment_preimage.unwrap()) {
- true => {
- println!(
- "\nEVENT: received payment from payment hash {} of {} millisatoshis",
- hex_utils::hex_str(&payment_hash.0),
- amt
- );
- print!("> ");
- io::stdout().flush().unwrap();
- HTLCStatus::Succeeded
- }
- _ => HTLCStatus::Failed,
- };
- match payments.entry(payment_hash) {
- Entry::Occupied(mut e) => {
- let payment = e.get_mut();
- payment.status = status;
- payment.preimage = Some(payment_preimage.unwrap());
- payment.secret = Some(payment_secret);
- }
- Entry::Vacant(e) => {
- e.insert(PaymentInfo {
- preimage: Some(payment_preimage.unwrap()),
- secret: Some(payment_secret),
- status,
- amt_msat: MillisatAmount(Some(amt)),
- });
- }
- }
- }
- Event::PaymentSent { payment_preimage } => {
- let hashed = PaymentHash(Sha256::hash(&payment_preimage.0).into_inner());
- let mut payments = outbound_payments.lock().unwrap();
- for (payment_hash, payment) in payments.iter_mut() {
- if *payment_hash == hashed {
- payment.preimage = Some(payment_preimage);
- payment.status = HTLCStatus::Succeeded;
- println!(
- "\nEVENT: successfully sent payment of {} millisatoshis from \
- payment hash {:?} with preimage {:?}",
- payment.amt_msat,
- hex_utils::hex_str(&payment_hash.0),
- hex_utils::hex_str(&payment_preimage.0)
- );
- print!("> ");
- io::stdout().flush().unwrap();
- }
- }