Skip to content

Commit 72e1c91

Browse files
Refactor send_payment internals for retries 2
Retrying a partial payment means send_payment_internal needs to be parameterized by a total payment amount, else 'HTLC values do not match' errors
1 parent 5d31630 commit 72e1c91

File tree

1 file changed

+9
-5
lines changed

1 file changed

+9
-5
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1998,10 +1998,10 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
19981998
/// bit set (either as required or as available). If multiple paths are present in the Route,
19991999
/// we assume the invoice had the basic_mpp feature set.
20002000
pub fn send_payment(&self, route: &Route, payment_hash: PaymentHash, payment_secret: &Option<PaymentSecret>) -> Result<PaymentId, PaymentSendFailure> {
2001-
self.send_payment_internal(route, payment_hash, payment_secret, None, None)
2001+
self.send_payment_internal(route, payment_hash, payment_secret, None, None, None)
20022002
}
20032003

2004-
fn send_payment_internal(&self, route: &Route, payment_hash: PaymentHash, payment_secret: &Option<PaymentSecret>, keysend_preimage: Option<PaymentPreimage>, payment_id: Option<PaymentId>) -> Result<PaymentId, PaymentSendFailure> {
2004+
fn send_payment_internal(&self, route: &Route, payment_hash: PaymentHash, payment_secret: &Option<PaymentSecret>, keysend_preimage: Option<PaymentPreimage>, payment_id: Option<PaymentId>, recv_value_msat: Option<u64>) -> Result<PaymentId, PaymentSendFailure> {
20052005
if route.paths.len() < 1 {
20062006
return Err(PaymentSendFailure::ParameterError(APIError::RouteError{err: "There must be at least one path to send over"}));
20072007
}
@@ -2035,6 +2035,10 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
20352035
if path_errs.iter().any(|e| e.is_err()) {
20362036
return Err(PaymentSendFailure::PathParameterError(path_errs));
20372037
}
2038+
if let Some(amt_msat) = recv_value_msat {
2039+
debug_assert!(amt_msat >= total_value);
2040+
total_value = amt_msat;
2041+
}
20382042

20392043
let cur_height = self.best_block.read().unwrap().height() + 1;
20402044
let mut results = Vec::new();
@@ -2083,7 +2087,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
20832087
None => PaymentPreimage(self.keys_manager.get_secure_random_bytes()),
20842088
};
20852089
let payment_hash = PaymentHash(Sha256::hash(&preimage.0).into_inner());
2086-
match self.send_payment_internal(route, payment_hash, &None, Some(preimage), None) {
2090+
match self.send_payment_internal(route, payment_hash, &None, Some(preimage), None, None) {
20872091
Ok(payment_id) => Ok((payment_hash, payment_id)),
20882092
Err(e) => Err(e)
20892093
}
@@ -5936,7 +5940,7 @@ mod tests {
59365940

59375941
let test_preimage = PaymentPreimage([42; 32]);
59385942
let mismatch_payment_hash = PaymentHash([43; 32]);
5939-
let _ = nodes[0].node.send_payment_internal(&route, mismatch_payment_hash, &None, Some(test_preimage), None).unwrap();
5943+
let _ = nodes[0].node.send_payment_internal(&route, mismatch_payment_hash, &None, Some(test_preimage), None, None).unwrap();
59405944
check_added_monitors!(nodes[0], 1);
59415945

59425946
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
@@ -5973,7 +5977,7 @@ mod tests {
59735977
let test_preimage = PaymentPreimage([42; 32]);
59745978
let test_secret = PaymentSecret([43; 32]);
59755979
let payment_hash = PaymentHash(Sha256::hash(&test_preimage.0).into_inner());
5976-
let _ = nodes[0].node.send_payment_internal(&route, payment_hash, &Some(test_secret), Some(test_preimage), None).unwrap();
5980+
let _ = nodes[0].node.send_payment_internal(&route, payment_hash, &Some(test_secret), Some(test_preimage), None, None).unwrap();
59775981
check_added_monitors!(nodes[0], 1);
59785982

59795983
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());

0 commit comments

Comments
 (0)