Skip to content

Commit 9ce890d

Browse files
committed
f
1 parent b64d6fc commit 9ce890d

File tree

3 files changed

+67
-60
lines changed

3 files changed

+67
-60
lines changed

src/lib.rs

+17-5
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,8 @@ use graph::NetworkGraph;
135135
use liquidity::LiquiditySource;
136136
use payment::store::PaymentStore;
137137
use payment::{
138-
Bolt11Payment, Bolt12Payment, OnchainPayment, PayjoinPayment, PaymentDetails, SpontaneousPayment,
139-
UnifiedQrPayment,
138+
Bolt11Payment, Bolt12Payment, OnchainPayment, PayjoinPayment, PaymentDetails,
139+
SpontaneousPayment, UnifiedQrPayment,
140140
};
141141
use peer_store::{PeerInfo, PeerStore};
142142
use types::{
@@ -382,6 +382,10 @@ impl Node {
382382
let archive_cmon = Arc::clone(&self.chain_monitor);
383383
let sync_sweeper = Arc::clone(&self.output_sweeper);
384384
let sync_logger = Arc::clone(&self.logger);
385+
let sync_payjoin = match &self.payjoin_handler {
386+
Some(pj_handler) => Some(Arc::clone(pj_handler)),
387+
None => None,
388+
};
385389
let sync_wallet_timestamp = Arc::clone(&self.latest_wallet_sync_timestamp);
386390
let sync_monitor_archival_height = Arc::clone(&self.latest_channel_monitor_archival_height);
387391
let mut stop_sync = self.stop_sender.subscribe();
@@ -401,11 +405,14 @@ impl Node {
401405
return;
402406
}
403407
_ = wallet_sync_interval.tick() => {
404-
let confirmables = vec![
408+
let mut confirmables = vec![
405409
&*sync_cman as &(dyn Confirm + Sync + Send),
406410
&*sync_cmon as &(dyn Confirm + Sync + Send),
407411
&*sync_sweeper as &(dyn Confirm + Sync + Send),
408412
];
413+
if let Some(sync_payjoin) = sync_payjoin.as_ref() {
414+
confirmables.push(sync_payjoin.as_ref() as &(dyn Confirm + Sync + Send));
415+
}
409416
let now = Instant::now();
410417
let timeout_fut = tokio::time::timeout(Duration::from_secs(LDK_WALLET_SYNC_TIMEOUT_SECS), tx_sync.sync(confirmables));
411418
match timeout_fut.await {
@@ -1108,7 +1115,8 @@ impl Node {
11081115
self.bolt12_payment(),
11091116
Arc::clone(&self.config),
11101117
Arc::clone(&self.logger),
1111-
))}
1118+
))
1119+
}
11121120

11131121
/// Returns a Payjoin payment handler allowing to send Payjoin transactions
11141122
///
@@ -1347,11 +1355,15 @@ impl Node {
13471355
let fee_estimator = Arc::clone(&self.fee_estimator);
13481356
let sync_sweeper = Arc::clone(&self.output_sweeper);
13491357
let sync_logger = Arc::clone(&self.logger);
1350-
let confirmables = vec![
1358+
let sync_payjoin = &self.payjoin_handler.as_ref();
1359+
let mut confirmables = vec![
13511360
&*sync_cman as &(dyn Confirm + Sync + Send),
13521361
&*sync_cmon as &(dyn Confirm + Sync + Send),
13531362
&*sync_sweeper as &(dyn Confirm + Sync + Send),
13541363
];
1364+
if let Some(sync_payjoin) = sync_payjoin {
1365+
confirmables.push(sync_payjoin.as_ref() as &(dyn Confirm + Sync + Send));
1366+
}
13551367
let sync_wallet_timestamp = Arc::clone(&self.latest_wallet_sync_timestamp);
13561368
let sync_fee_rate_update_timestamp =
13571369
Arc::clone(&self.latest_fee_rate_cache_update_timestamp);

src/payment/payjoin/handler.rs

+48-55
Original file line numberDiff line numberDiff line change
@@ -134,80 +134,72 @@ impl PayjoinHandler {
134134
) -> Result<Transaction, Error> {
135135
let wallet = self.wallet.clone();
136136
wallet.sign_payjoin_proposal(payjoin_proposal, original_psbt)?;
137+
137138
let proposal_tx = payjoin_proposal.clone().extract_tx();
138-
match self
139-
.transactions
140-
.read()
141-
.unwrap()
142-
.iter()
143-
.position(|t| t.original_psbt() == original_psbt)
144-
{
145-
Some(pos) => {
146-
let pj_tx = self.transactions.write().unwrap().remove(pos);
147-
pj_tx.waiting_first_confirmation(proposal_tx.clone())?;
148-
let txid = proposal_tx.txid();
149-
// watch proposal transaction
150-
self.chain_source.register_tx(&txid, Script::empty());
151-
Ok(proposal_tx)
152-
},
153-
None => {
154-
log_error!(
155-
self.logger,
156-
"Failed to process Payjoin response: transaction not found"
157-
);
158-
Err(Error::PayjoinResponseProcessingFailed)
159-
},
139+
let mut transactions = self.transactions.write().unwrap();
140+
let pos = transactions.iter().position(|t| t.original_psbt() == original_psbt);
141+
if let Some(pos) = pos {
142+
let pj_tx = transactions.remove(pos);
143+
pj_tx.waiting_first_confirmation(proposal_tx.clone())?;
144+
let txid = proposal_tx.txid();
145+
// watch proposal transaction
146+
self.chain_source.register_tx(&txid, Script::empty());
147+
self.event_queue.add_event(Event::PayjoinPaymentBroadcasted {
148+
txid,
149+
amount_sats: pj_tx.amount().to_sat(),
150+
recipient: pj_tx.receiver().clone().into(),
151+
})?;
152+
Ok(proposal_tx)
153+
} else {
154+
log_error!(self.logger, "Failed to process Payjoin response: transaction not found");
155+
Err(Error::PayjoinResponseProcessingFailed)
160156
}
161157
}
162158

163159
pub(crate) fn handle_request_failure(
164160
&self, original_psbt: &Psbt, reason: PayjoinPaymentFailureReason,
165161
) -> Result<(), Error> {
166-
match self
167-
.transactions
168-
.read()
169-
.unwrap()
170-
.iter()
171-
.position(|o| o.original_psbt() == original_psbt)
172-
{
173-
Some(pos) => {
174-
let mut transactions = self.transactions.write().unwrap();
175-
let tx = transactions.remove(pos);
176-
let payment_id: [u8; 32] =
177-
tx.original_psbt().unsigned_tx.txid()[..].try_into().map_err(|_| {
178-
log_error!(
162+
let mut transactions = self.transactions.write().unwrap();
163+
let pos = transactions.iter().position(|t| t.original_psbt() == original_psbt);
164+
if let Some(pos) = pos {
165+
let tx = transactions.remove(pos);
166+
let payment_id: [u8; 32] =
167+
tx.original_psbt().unsigned_tx.txid()[..].try_into().map_err(|_| {
168+
log_error!(
179169
self.logger,
180170
"Failed to handle request failure for Payjoin payment: invalid payment id"
181171
);
182-
Error::PayjoinRequestSendingFailed
183-
})?;
184-
let mut update_details = PaymentDetailsUpdate::new(PaymentId(payment_id));
185-
update_details.status = Some(PaymentStatus::Failed);
186-
let _ = self.payment_store.update(&update_details);
187-
self.event_queue.add_event(Event::PayjoinPaymentFailed {
188-
txid: original_psbt.unsigned_tx.txid(),
189-
recipient: tx.receiver().clone().into(),
190-
amount_sats: tx.amount().to_sat(),
191-
reason,
192-
})
193-
},
194-
None => {
195-
log_error!(
196-
self.logger,
197-
"Failed to handle request failure for Payjoin payment: transaction not found"
198-
);
199-
Err(Error::PayjoinRequestSendingFailed)
200-
},
172+
Error::PayjoinRequestSendingFailed
173+
})?;
174+
let mut update_details = PaymentDetailsUpdate::new(PaymentId(payment_id));
175+
update_details.status = Some(PaymentStatus::Failed);
176+
let _ = self.payment_store.update(&update_details);
177+
self.event_queue.add_event(Event::PayjoinPaymentFailed {
178+
txid: original_psbt.unsigned_tx.txid(),
179+
recipient: tx.receiver().clone().into(),
180+
amount_sats: tx.amount().to_sat(),
181+
reason,
182+
})
183+
}
184+
else {
185+
log_error!(
186+
self.logger,
187+
"Failed to handle request failure for Payjoin payment: transaction not found"
188+
);
189+
Err(Error::PayjoinRequestSendingFailed)
201190
}
202191
}
203192

204193
fn internal_transactions_confirmed(
205194
&self, header: &Header, txdata: &TransactionData, height: u32,
206195
) {
196+
dbg!("internal transactions confirmed");
207197
let (_, tx) = txdata[0];
208198
let confirmed_tx_txid = tx.txid();
209199
let mut transactions = self.transactions.write().unwrap();
210-
if let Some(pos) = transactions.iter().position(|o| o.txid() == confirmed_tx_txid) {
200+
let pos = transactions.iter().position(|t| t.txid() == confirmed_tx_txid);
201+
dbg!(&pos);
202+
if let Some(pos) = pos {
211203
match transactions.remove(pos) {
212204
PayjoinTransaction::PendingReceiverResponse { original_psbt, receiver, amount } => {
213205
println!("Payjoin receiver broadcasted original psbt transaction!");
@@ -300,6 +292,7 @@ impl PayjoinHandler {
300292
}
301293
}
302294

295+
303296
impl Confirm for PayjoinHandler {
304297
fn transactions_confirmed(&self, header: &Header, txdata: &TransactionData, height: u32) {
305298
self.internal_transactions_confirmed(header, txdata, height);

src/payment/payjoin/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,12 @@ impl PayjoinPayment {
132132
break;
133133
},
134134
Ok(None) => {
135+
dbg!("Payjoin request sent, waiting for response...");
135136
log_info!(logger, "Payjoin request sent, waiting for response...");
136137
continue;
137138
}
138139
Err(e) => {
140+
dbg!(&e);
139141
log_error!(logger, "Failed to send Payjoin request : {}", e);
140142
let _ = payjoin_handler.handle_request_failure(&original_psbt, PayjoinPaymentFailureReason::RequestSendingFailed);
141143
break;

0 commit comments

Comments
 (0)