- let params = RouteParameters {
- payee,
- final_value_msat: invoice.amount_milli_satoshis().or(amount_msats).unwrap(),
- final_cltv_expiry_delta: invoice.min_final_cltv_expiry() as u32,
- };
- let first_hops = self.payer.first_hops();
- let route = self.router.find_route(
- &payer,
- ¶ms,
- Some(&first_hops.iter().collect::<Vec<_>>()),
- &self.scorer.lock(),
- ).map_err(|e| PaymentError::Routing(e))?;
-
- let payment_secret = Some(invoice.payment_secret().clone());
- let payment_id = match self.payer.send_payment(&route, payment_hash, &payment_secret) {
- Ok(payment_id) => payment_id,
- Err(PaymentSendFailure::ParameterError(e)) =>
- return Err(PaymentError::Sending(PaymentSendFailure::ParameterError(e))),
- Err(PaymentSendFailure::PathParameterError(e)) =>
- return Err(PaymentError::Sending(PaymentSendFailure::PathParameterError(e))),
- Err(PaymentSendFailure::AllFailedRetrySafe(e)) => {
- if retry_count >= self.retry_attempts.0 {
- return Err(PaymentError::Sending(PaymentSendFailure::AllFailedRetrySafe(e)))
- }
- break None;
- },
- Err(PaymentSendFailure::PartialFailure { results: _, failed_paths_retry, payment_id }) => {
- if let Some(retry_data) = failed_paths_retry {
- entry.insert(retry_count);
- break Some((retry_data, payment_id));
- } else {
- // This may happen if we send a payment and some paths fail, but
- // only due to a temporary monitor failure or the like, implying
- // they're really in-flight, but we haven't sent the initial
- // HTLC-Add messages yet.
- payment_id
- }
- },
- };
- entry.insert(retry_count);
- return Ok(payment_id);