mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-24 06:57:53 +01:00
Allow users to specify the PaymentId
for new outbound payments
Inc986e52ce8
, an `MppId` was added to `HTLCSource` objects as a way of correlating HTLCs which belong to the same payment when the `ChannelManager` sees an HTLC succeed/fail. This allows it to have awareness of the state of all HTLCs in a payment when it generates the ultimate user-facing payment success/failure events. This was used in the same PR to avoid generating duplicative success/failure events for a single payment. Because the field was only used as an internal token to correlate HTLCs, and retries were not supported, it was generated randomly by calling the `KeysInterface`'s 32-byte random-fetching function. This also provided a backwards-compatibility story as the existing HTLC randomization key was re-used for older clients. In28eea12bbe
`MppId` was renamed to the current `PaymentId` which was then used expose the `retry_payment` interface, allowing users to send new HTLCs which are considered a part of an existing payment. At no point has the payment-sending API seriously considered idempotency, a major drawback which leaves the API unsafe in most deployments. Luckily, there is a simple solution - because the `PaymentId` must be unique, and because payment information for a given payment is held for several blocks after a payment completes/fails, it represents an obvious idempotency token. Here we simply require the user provide the `PaymentId` directly in `send_payment`, allowing them to use whatever token they may already have for a payment's idempotency token.
This commit is contained in:
parent
fc9a4c22d1
commit
a10223d1ff
14 changed files with 410 additions and 320 deletions
|
@ -38,7 +38,7 @@ use lightning::chain::transaction::OutPoint;
|
|||
use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
|
||||
use lightning::chain::keysinterface::{KeyMaterial, KeysInterface, InMemorySigner, Recipient};
|
||||
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
|
||||
use lightning::ln::channelmanager::{self, ChainParameters, ChannelManager, PaymentSendFailure, ChannelManagerReadArgs};
|
||||
use lightning::ln::channelmanager::{self, ChainParameters, ChannelManager, PaymentSendFailure, ChannelManagerReadArgs, PaymentId};
|
||||
use lightning::ln::channel::FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE;
|
||||
use lightning::ln::msgs::{CommitmentUpdate, ChannelMessageHandler, DecodeError, UpdateAddHTLC, Init};
|
||||
use lightning::ln::script::ShutdownScript;
|
||||
|
@ -308,9 +308,12 @@ fn get_payment_secret_hash(dest: &ChanMan, payment_id: &mut u8) -> Option<(Payme
|
|||
}
|
||||
|
||||
#[inline]
|
||||
fn send_payment(source: &ChanMan, dest: &ChanMan, dest_chan_id: u64, amt: u64, payment_id: &mut u8) -> bool {
|
||||
fn send_payment(source: &ChanMan, dest: &ChanMan, dest_chan_id: u64, amt: u64, payment_id: &mut u8, payment_idx: &mut u64) -> bool {
|
||||
let (payment_secret, payment_hash) =
|
||||
if let Some((secret, hash)) = get_payment_secret_hash(dest, payment_id) { (secret, hash) } else { return true; };
|
||||
let mut payment_id = [0; 32];
|
||||
payment_id[0..8].copy_from_slice(&payment_idx.to_ne_bytes());
|
||||
*payment_idx += 1;
|
||||
if let Err(err) = source.send_payment(&Route {
|
||||
paths: vec![vec![RouteHop {
|
||||
pubkey: dest.get_our_node_id(),
|
||||
|
@ -321,15 +324,18 @@ fn send_payment(source: &ChanMan, dest: &ChanMan, dest_chan_id: u64, amt: u64, p
|
|||
cltv_expiry_delta: 200,
|
||||
}]],
|
||||
payment_params: None,
|
||||
}, payment_hash, &Some(payment_secret)) {
|
||||
}, payment_hash, &Some(payment_secret), PaymentId(payment_id)) {
|
||||
check_payment_err(err);
|
||||
false
|
||||
} else { true }
|
||||
}
|
||||
#[inline]
|
||||
fn send_hop_payment(source: &ChanMan, middle: &ChanMan, middle_chan_id: u64, dest: &ChanMan, dest_chan_id: u64, amt: u64, payment_id: &mut u8) -> bool {
|
||||
fn send_hop_payment(source: &ChanMan, middle: &ChanMan, middle_chan_id: u64, dest: &ChanMan, dest_chan_id: u64, amt: u64, payment_id: &mut u8, payment_idx: &mut u64) -> bool {
|
||||
let (payment_secret, payment_hash) =
|
||||
if let Some((secret, hash)) = get_payment_secret_hash(dest, payment_id) { (secret, hash) } else { return true; };
|
||||
let mut payment_id = [0; 32];
|
||||
payment_id[0..8].copy_from_slice(&payment_idx.to_ne_bytes());
|
||||
*payment_idx += 1;
|
||||
if let Err(err) = source.send_payment(&Route {
|
||||
paths: vec![vec![RouteHop {
|
||||
pubkey: middle.get_our_node_id(),
|
||||
|
@ -347,7 +353,7 @@ fn send_hop_payment(source: &ChanMan, middle: &ChanMan, middle_chan_id: u64, des
|
|||
cltv_expiry_delta: 200,
|
||||
}]],
|
||||
payment_params: None,
|
||||
}, payment_hash, &Some(payment_secret)) {
|
||||
}, payment_hash, &Some(payment_secret), PaymentId(payment_id)) {
|
||||
check_payment_err(err);
|
||||
false
|
||||
} else { true }
|
||||
|
@ -553,6 +559,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
|
|||
let chan_b = nodes[2].list_usable_channels()[0].short_channel_id.unwrap();
|
||||
|
||||
let mut payment_id: u8 = 0;
|
||||
let mut payment_idx: u64 = 0;
|
||||
|
||||
let mut chan_a_disconnected = false;
|
||||
let mut chan_b_disconnected = false;
|
||||
|
@ -1036,61 +1043,61 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
|
|||
},
|
||||
|
||||
// 1/10th the channel size:
|
||||
0x30 => { send_payment(&nodes[0], &nodes[1], chan_a, 10_000_000, &mut payment_id); },
|
||||
0x31 => { send_payment(&nodes[1], &nodes[0], chan_a, 10_000_000, &mut payment_id); },
|
||||
0x32 => { send_payment(&nodes[1], &nodes[2], chan_b, 10_000_000, &mut payment_id); },
|
||||
0x33 => { send_payment(&nodes[2], &nodes[1], chan_b, 10_000_000, &mut payment_id); },
|
||||
0x34 => { send_hop_payment(&nodes[0], &nodes[1], chan_a, &nodes[2], chan_b, 10_000_000, &mut payment_id); },
|
||||
0x35 => { send_hop_payment(&nodes[2], &nodes[1], chan_b, &nodes[0], chan_a, 10_000_000, &mut payment_id); },
|
||||
0x30 => { send_payment(&nodes[0], &nodes[1], chan_a, 10_000_000, &mut payment_id, &mut payment_idx); },
|
||||
0x31 => { send_payment(&nodes[1], &nodes[0], chan_a, 10_000_000, &mut payment_id, &mut payment_idx); },
|
||||
0x32 => { send_payment(&nodes[1], &nodes[2], chan_b, 10_000_000, &mut payment_id, &mut payment_idx); },
|
||||
0x33 => { send_payment(&nodes[2], &nodes[1], chan_b, 10_000_000, &mut payment_id, &mut payment_idx); },
|
||||
0x34 => { send_hop_payment(&nodes[0], &nodes[1], chan_a, &nodes[2], chan_b, 10_000_000, &mut payment_id, &mut payment_idx); },
|
||||
0x35 => { send_hop_payment(&nodes[2], &nodes[1], chan_b, &nodes[0], chan_a, 10_000_000, &mut payment_id, &mut payment_idx); },
|
||||
|
||||
0x38 => { send_payment(&nodes[0], &nodes[1], chan_a, 1_000_000, &mut payment_id); },
|
||||
0x39 => { send_payment(&nodes[1], &nodes[0], chan_a, 1_000_000, &mut payment_id); },
|
||||
0x3a => { send_payment(&nodes[1], &nodes[2], chan_b, 1_000_000, &mut payment_id); },
|
||||
0x3b => { send_payment(&nodes[2], &nodes[1], chan_b, 1_000_000, &mut payment_id); },
|
||||
0x3c => { send_hop_payment(&nodes[0], &nodes[1], chan_a, &nodes[2], chan_b, 1_000_000, &mut payment_id); },
|
||||
0x3d => { send_hop_payment(&nodes[2], &nodes[1], chan_b, &nodes[0], chan_a, 1_000_000, &mut payment_id); },
|
||||
0x38 => { send_payment(&nodes[0], &nodes[1], chan_a, 1_000_000, &mut payment_id, &mut payment_idx); },
|
||||
0x39 => { send_payment(&nodes[1], &nodes[0], chan_a, 1_000_000, &mut payment_id, &mut payment_idx); },
|
||||
0x3a => { send_payment(&nodes[1], &nodes[2], chan_b, 1_000_000, &mut payment_id, &mut payment_idx); },
|
||||
0x3b => { send_payment(&nodes[2], &nodes[1], chan_b, 1_000_000, &mut payment_id, &mut payment_idx); },
|
||||
0x3c => { send_hop_payment(&nodes[0], &nodes[1], chan_a, &nodes[2], chan_b, 1_000_000, &mut payment_id, &mut payment_idx); },
|
||||
0x3d => { send_hop_payment(&nodes[2], &nodes[1], chan_b, &nodes[0], chan_a, 1_000_000, &mut payment_id, &mut payment_idx); },
|
||||
|
||||
0x40 => { send_payment(&nodes[0], &nodes[1], chan_a, 100_000, &mut payment_id); },
|
||||
0x41 => { send_payment(&nodes[1], &nodes[0], chan_a, 100_000, &mut payment_id); },
|
||||
0x42 => { send_payment(&nodes[1], &nodes[2], chan_b, 100_000, &mut payment_id); },
|
||||
0x43 => { send_payment(&nodes[2], &nodes[1], chan_b, 100_000, &mut payment_id); },
|
||||
0x44 => { send_hop_payment(&nodes[0], &nodes[1], chan_a, &nodes[2], chan_b, 100_000, &mut payment_id); },
|
||||
0x45 => { send_hop_payment(&nodes[2], &nodes[1], chan_b, &nodes[0], chan_a, 100_000, &mut payment_id); },
|
||||
0x40 => { send_payment(&nodes[0], &nodes[1], chan_a, 100_000, &mut payment_id, &mut payment_idx); },
|
||||
0x41 => { send_payment(&nodes[1], &nodes[0], chan_a, 100_000, &mut payment_id, &mut payment_idx); },
|
||||
0x42 => { send_payment(&nodes[1], &nodes[2], chan_b, 100_000, &mut payment_id, &mut payment_idx); },
|
||||
0x43 => { send_payment(&nodes[2], &nodes[1], chan_b, 100_000, &mut payment_id, &mut payment_idx); },
|
||||
0x44 => { send_hop_payment(&nodes[0], &nodes[1], chan_a, &nodes[2], chan_b, 100_000, &mut payment_id, &mut payment_idx); },
|
||||
0x45 => { send_hop_payment(&nodes[2], &nodes[1], chan_b, &nodes[0], chan_a, 100_000, &mut payment_id, &mut payment_idx); },
|
||||
|
||||
0x48 => { send_payment(&nodes[0], &nodes[1], chan_a, 10_000, &mut payment_id); },
|
||||
0x49 => { send_payment(&nodes[1], &nodes[0], chan_a, 10_000, &mut payment_id); },
|
||||
0x4a => { send_payment(&nodes[1], &nodes[2], chan_b, 10_000, &mut payment_id); },
|
||||
0x4b => { send_payment(&nodes[2], &nodes[1], chan_b, 10_000, &mut payment_id); },
|
||||
0x4c => { send_hop_payment(&nodes[0], &nodes[1], chan_a, &nodes[2], chan_b, 10_000, &mut payment_id); },
|
||||
0x4d => { send_hop_payment(&nodes[2], &nodes[1], chan_b, &nodes[0], chan_a, 10_000, &mut payment_id); },
|
||||
0x48 => { send_payment(&nodes[0], &nodes[1], chan_a, 10_000, &mut payment_id, &mut payment_idx); },
|
||||
0x49 => { send_payment(&nodes[1], &nodes[0], chan_a, 10_000, &mut payment_id, &mut payment_idx); },
|
||||
0x4a => { send_payment(&nodes[1], &nodes[2], chan_b, 10_000, &mut payment_id, &mut payment_idx); },
|
||||
0x4b => { send_payment(&nodes[2], &nodes[1], chan_b, 10_000, &mut payment_id, &mut payment_idx); },
|
||||
0x4c => { send_hop_payment(&nodes[0], &nodes[1], chan_a, &nodes[2], chan_b, 10_000, &mut payment_id, &mut payment_idx); },
|
||||
0x4d => { send_hop_payment(&nodes[2], &nodes[1], chan_b, &nodes[0], chan_a, 10_000, &mut payment_id, &mut payment_idx); },
|
||||
|
||||
0x50 => { send_payment(&nodes[0], &nodes[1], chan_a, 1_000, &mut payment_id); },
|
||||
0x51 => { send_payment(&nodes[1], &nodes[0], chan_a, 1_000, &mut payment_id); },
|
||||
0x52 => { send_payment(&nodes[1], &nodes[2], chan_b, 1_000, &mut payment_id); },
|
||||
0x53 => { send_payment(&nodes[2], &nodes[1], chan_b, 1_000, &mut payment_id); },
|
||||
0x54 => { send_hop_payment(&nodes[0], &nodes[1], chan_a, &nodes[2], chan_b, 1_000, &mut payment_id); },
|
||||
0x55 => { send_hop_payment(&nodes[2], &nodes[1], chan_b, &nodes[0], chan_a, 1_000, &mut payment_id); },
|
||||
0x50 => { send_payment(&nodes[0], &nodes[1], chan_a, 1_000, &mut payment_id, &mut payment_idx); },
|
||||
0x51 => { send_payment(&nodes[1], &nodes[0], chan_a, 1_000, &mut payment_id, &mut payment_idx); },
|
||||
0x52 => { send_payment(&nodes[1], &nodes[2], chan_b, 1_000, &mut payment_id, &mut payment_idx); },
|
||||
0x53 => { send_payment(&nodes[2], &nodes[1], chan_b, 1_000, &mut payment_id, &mut payment_idx); },
|
||||
0x54 => { send_hop_payment(&nodes[0], &nodes[1], chan_a, &nodes[2], chan_b, 1_000, &mut payment_id, &mut payment_idx); },
|
||||
0x55 => { send_hop_payment(&nodes[2], &nodes[1], chan_b, &nodes[0], chan_a, 1_000, &mut payment_id, &mut payment_idx); },
|
||||
|
||||
0x58 => { send_payment(&nodes[0], &nodes[1], chan_a, 100, &mut payment_id); },
|
||||
0x59 => { send_payment(&nodes[1], &nodes[0], chan_a, 100, &mut payment_id); },
|
||||
0x5a => { send_payment(&nodes[1], &nodes[2], chan_b, 100, &mut payment_id); },
|
||||
0x5b => { send_payment(&nodes[2], &nodes[1], chan_b, 100, &mut payment_id); },
|
||||
0x5c => { send_hop_payment(&nodes[0], &nodes[1], chan_a, &nodes[2], chan_b, 100, &mut payment_id); },
|
||||
0x5d => { send_hop_payment(&nodes[2], &nodes[1], chan_b, &nodes[0], chan_a, 100, &mut payment_id); },
|
||||
0x58 => { send_payment(&nodes[0], &nodes[1], chan_a, 100, &mut payment_id, &mut payment_idx); },
|
||||
0x59 => { send_payment(&nodes[1], &nodes[0], chan_a, 100, &mut payment_id, &mut payment_idx); },
|
||||
0x5a => { send_payment(&nodes[1], &nodes[2], chan_b, 100, &mut payment_id, &mut payment_idx); },
|
||||
0x5b => { send_payment(&nodes[2], &nodes[1], chan_b, 100, &mut payment_id, &mut payment_idx); },
|
||||
0x5c => { send_hop_payment(&nodes[0], &nodes[1], chan_a, &nodes[2], chan_b, 100, &mut payment_id, &mut payment_idx); },
|
||||
0x5d => { send_hop_payment(&nodes[2], &nodes[1], chan_b, &nodes[0], chan_a, 100, &mut payment_id, &mut payment_idx); },
|
||||
|
||||
0x60 => { send_payment(&nodes[0], &nodes[1], chan_a, 10, &mut payment_id); },
|
||||
0x61 => { send_payment(&nodes[1], &nodes[0], chan_a, 10, &mut payment_id); },
|
||||
0x62 => { send_payment(&nodes[1], &nodes[2], chan_b, 10, &mut payment_id); },
|
||||
0x63 => { send_payment(&nodes[2], &nodes[1], chan_b, 10, &mut payment_id); },
|
||||
0x64 => { send_hop_payment(&nodes[0], &nodes[1], chan_a, &nodes[2], chan_b, 10, &mut payment_id); },
|
||||
0x65 => { send_hop_payment(&nodes[2], &nodes[1], chan_b, &nodes[0], chan_a, 10, &mut payment_id); },
|
||||
0x60 => { send_payment(&nodes[0], &nodes[1], chan_a, 10, &mut payment_id, &mut payment_idx); },
|
||||
0x61 => { send_payment(&nodes[1], &nodes[0], chan_a, 10, &mut payment_id, &mut payment_idx); },
|
||||
0x62 => { send_payment(&nodes[1], &nodes[2], chan_b, 10, &mut payment_id, &mut payment_idx); },
|
||||
0x63 => { send_payment(&nodes[2], &nodes[1], chan_b, 10, &mut payment_id, &mut payment_idx); },
|
||||
0x64 => { send_hop_payment(&nodes[0], &nodes[1], chan_a, &nodes[2], chan_b, 10, &mut payment_id, &mut payment_idx); },
|
||||
0x65 => { send_hop_payment(&nodes[2], &nodes[1], chan_b, &nodes[0], chan_a, 10, &mut payment_id, &mut payment_idx); },
|
||||
|
||||
0x68 => { send_payment(&nodes[0], &nodes[1], chan_a, 1, &mut payment_id); },
|
||||
0x69 => { send_payment(&nodes[1], &nodes[0], chan_a, 1, &mut payment_id); },
|
||||
0x6a => { send_payment(&nodes[1], &nodes[2], chan_b, 1, &mut payment_id); },
|
||||
0x6b => { send_payment(&nodes[2], &nodes[1], chan_b, 1, &mut payment_id); },
|
||||
0x6c => { send_hop_payment(&nodes[0], &nodes[1], chan_a, &nodes[2], chan_b, 1, &mut payment_id); },
|
||||
0x6d => { send_hop_payment(&nodes[2], &nodes[1], chan_b, &nodes[0], chan_a, 1, &mut payment_id); },
|
||||
0x68 => { send_payment(&nodes[0], &nodes[1], chan_a, 1, &mut payment_id, &mut payment_idx); },
|
||||
0x69 => { send_payment(&nodes[1], &nodes[0], chan_a, 1, &mut payment_id, &mut payment_idx); },
|
||||
0x6a => { send_payment(&nodes[1], &nodes[2], chan_b, 1, &mut payment_id, &mut payment_idx); },
|
||||
0x6b => { send_payment(&nodes[2], &nodes[1], chan_b, 1, &mut payment_id, &mut payment_idx); },
|
||||
0x6c => { send_hop_payment(&nodes[0], &nodes[1], chan_a, &nodes[2], chan_b, 1, &mut payment_id, &mut payment_idx); },
|
||||
0x6d => { send_hop_payment(&nodes[2], &nodes[1], chan_b, &nodes[0], chan_a, 1, &mut payment_id, &mut payment_idx); },
|
||||
|
||||
0x80 => {
|
||||
let max_feerate = last_htlc_clear_fee_a * FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE as u32;
|
||||
|
@ -1173,11 +1180,11 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
|
|||
|
||||
// Finally, make sure that at least one end of each channel can make a substantial payment
|
||||
assert!(
|
||||
send_payment(&nodes[0], &nodes[1], chan_a, 10_000_000, &mut payment_id) ||
|
||||
send_payment(&nodes[1], &nodes[0], chan_a, 10_000_000, &mut payment_id));
|
||||
send_payment(&nodes[0], &nodes[1], chan_a, 10_000_000, &mut payment_id, &mut payment_idx) ||
|
||||
send_payment(&nodes[1], &nodes[0], chan_a, 10_000_000, &mut payment_id, &mut payment_idx));
|
||||
assert!(
|
||||
send_payment(&nodes[1], &nodes[2], chan_b, 10_000_000, &mut payment_id) ||
|
||||
send_payment(&nodes[2], &nodes[1], chan_b, 10_000_000, &mut payment_id));
|
||||
send_payment(&nodes[1], &nodes[2], chan_b, 10_000_000, &mut payment_id, &mut payment_idx) ||
|
||||
send_payment(&nodes[2], &nodes[1], chan_b, 10_000_000, &mut payment_id, &mut payment_idx));
|
||||
|
||||
last_htlc_clear_fee_a = fee_est_a.ret_val.load(atomic::Ordering::Acquire);
|
||||
last_htlc_clear_fee_b = fee_est_b.ret_val.load(atomic::Ordering::Acquire);
|
||||
|
|
|
@ -35,7 +35,7 @@ use lightning::chain::chainmonitor;
|
|||
use lightning::chain::transaction::OutPoint;
|
||||
use lightning::chain::keysinterface::{InMemorySigner, Recipient, KeyMaterial, KeysInterface};
|
||||
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
|
||||
use lightning::ln::channelmanager::{ChainParameters, ChannelManager};
|
||||
use lightning::ln::channelmanager::{ChainParameters, ChannelManager, PaymentId};
|
||||
use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor,IgnoringMessageHandler};
|
||||
use lightning::ln::msgs::DecodeError;
|
||||
use lightning::ln::script::ShutdownScript;
|
||||
|
@ -482,7 +482,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
|
|||
sha.input(&payment_hash.0[..]);
|
||||
payment_hash.0 = Sha256::from_engine(sha).into_inner();
|
||||
payments_sent += 1;
|
||||
match channelmanager.send_payment(&route, payment_hash, &None) {
|
||||
match channelmanager.send_payment(&route, payment_hash, &None, PaymentId(payment_hash.0)) {
|
||||
Ok(_) => {},
|
||||
Err(_) => return,
|
||||
}
|
||||
|
@ -510,7 +510,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
|
|||
let mut payment_secret = PaymentSecret([0; 32]);
|
||||
payment_secret.0[0..8].copy_from_slice(&be64_to_array(payments_sent));
|
||||
payments_sent += 1;
|
||||
match channelmanager.send_payment(&route, payment_hash, &Some(payment_secret)) {
|
||||
match channelmanager.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)) {
|
||||
Ok(_) => {},
|
||||
Err(_) => return,
|
||||
}
|
||||
|
|
|
@ -604,14 +604,16 @@ where
|
|||
fn send_payment(
|
||||
&self, route: &Route, payment_hash: PaymentHash, payment_secret: &Option<PaymentSecret>
|
||||
) -> Result<PaymentId, PaymentSendFailure> {
|
||||
self.send_payment(route, payment_hash, payment_secret)
|
||||
let payment_id = PaymentId(payment_hash.0);
|
||||
self.send_payment(route, payment_hash, payment_secret, payment_id).map(|()| payment_id)
|
||||
}
|
||||
|
||||
fn send_spontaneous_payment(
|
||||
&self, route: &Route, payment_preimage: PaymentPreimage,
|
||||
) -> Result<PaymentId, PaymentSendFailure> {
|
||||
self.send_spontaneous_payment(route, Some(payment_preimage))
|
||||
.map(|(_, payment_id)| payment_id)
|
||||
let payment_id = PaymentId(sha256::Hash::hash(&payment_preimage.0).into_inner());
|
||||
self.send_spontaneous_payment(route, Some(payment_preimage), payment_id)
|
||||
.map(|_| payment_id)
|
||||
}
|
||||
|
||||
fn retry_payment(
|
||||
|
@ -681,7 +683,7 @@ mod test {
|
|||
use bitcoin_hashes::sha256::Hash as Sha256;
|
||||
use lightning::chain::keysinterface::PhantomKeysManager;
|
||||
use lightning::ln::{PaymentPreimage, PaymentHash};
|
||||
use lightning::ln::channelmanager::{self, PhantomRouteHints, MIN_FINAL_CLTV_EXPIRY};
|
||||
use lightning::ln::channelmanager::{self, PhantomRouteHints, MIN_FINAL_CLTV_EXPIRY, PaymentId};
|
||||
use lightning::ln::functional_test_utils::*;
|
||||
use lightning::ln::msgs::ChannelMessageHandler;
|
||||
use lightning::routing::router::{PaymentParameters, RouteParameters, find_route};
|
||||
|
@ -741,7 +743,7 @@ mod test {
|
|||
let payment_event = {
|
||||
let mut payment_hash = PaymentHash([0; 32]);
|
||||
payment_hash.0.copy_from_slice(&invoice.payment_hash().as_ref()[0..32]);
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(invoice.payment_secret().clone())).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(invoice.payment_secret().clone()), PaymentId(payment_hash.0)).unwrap();
|
||||
let mut added_monitors = nodes[0].chain_monitor.added_monitors.lock().unwrap();
|
||||
assert_eq!(added_monitors.len(), 1);
|
||||
added_monitors.clear();
|
||||
|
@ -1046,7 +1048,7 @@ mod test {
|
|||
let (payment_event, fwd_idx) = {
|
||||
let mut payment_hash = PaymentHash([0; 32]);
|
||||
payment_hash.0.copy_from_slice(&invoice.payment_hash().as_ref()[0..32]);
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(invoice.payment_secret().clone())).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(invoice.payment_secret().clone()), PaymentId(payment_hash.0)).unwrap();
|
||||
let mut added_monitors = nodes[0].chain_monitor.added_monitors.lock().unwrap();
|
||||
assert_eq!(added_monitors.len(), 1);
|
||||
added_monitors.clear();
|
||||
|
|
|
@ -757,7 +757,7 @@ mod tests {
|
|||
use crate::{get_htlc_update_msgs, get_local_commitment_txn, get_revoke_commit_msgs, get_route_and_payment_hash, unwrap_send_err};
|
||||
use crate::chain::{ChannelMonitorUpdateStatus, Confirm, Watch};
|
||||
use crate::chain::channelmonitor::LATENCY_GRACE_PERIOD_BLOCKS;
|
||||
use crate::ln::channelmanager::{self, PaymentSendFailure};
|
||||
use crate::ln::channelmanager::{self, PaymentSendFailure, PaymentId};
|
||||
use crate::ln::functional_test_utils::*;
|
||||
use crate::ln::msgs::ChannelMessageHandler;
|
||||
use crate::util::errors::APIError;
|
||||
|
@ -883,7 +883,7 @@ mod tests {
|
|||
// If the ChannelManager tries to update the channel, however, the ChainMonitor will pass
|
||||
// the update through to the ChannelMonitor which will refuse it (as the channel is closed).
|
||||
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::Completed);
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, second_payment_hash, &Some(second_payment_secret)),
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, second_payment_hash, &Some(second_payment_secret), PaymentId(second_payment_hash.0)),
|
||||
true, APIError::ChannelUnavailable { ref err },
|
||||
assert!(err.contains("ChannelMonitor storage failure")));
|
||||
check_added_monitors!(nodes[0], 2); // After the failure we generate a close-channel monitor update
|
||||
|
|
|
@ -3846,7 +3846,7 @@ mod tests {
|
|||
use crate::ln::{PaymentPreimage, PaymentHash};
|
||||
use crate::ln::chan_utils;
|
||||
use crate::ln::chan_utils::{HTLCOutputInCommitment, ChannelPublicKeys, ChannelTransactionParameters, HolderCommitmentTransaction, CounterpartyChannelTransactionParameters};
|
||||
use crate::ln::channelmanager::{self, PaymentSendFailure};
|
||||
use crate::ln::channelmanager::{self, PaymentSendFailure, PaymentId};
|
||||
use crate::ln::functional_test_utils::*;
|
||||
use crate::ln::script::ShutdownScript;
|
||||
use crate::util::errors::APIError;
|
||||
|
@ -3911,7 +3911,7 @@ mod tests {
|
|||
// If the ChannelManager tries to update the channel, however, the ChainMonitor will pass
|
||||
// the update through to the ChannelMonitor which will refuse it (as the channel is closed).
|
||||
let (route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[1], nodes[0], 100_000);
|
||||
unwrap_send_err!(nodes[1].node.send_payment(&route, payment_hash, &Some(payment_secret)),
|
||||
unwrap_send_err!(nodes[1].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)),
|
||||
true, APIError::ChannelUnavailable { ref err },
|
||||
assert!(err.contains("ChannelMonitor storage failure")));
|
||||
check_added_monitors!(nodes[1], 2); // After the failure we generate a close-channel monitor update
|
||||
|
|
|
@ -19,7 +19,7 @@ use bitcoin::network::constants::Network;
|
|||
use crate::chain::channelmonitor::{ANTI_REORG_DELAY, ChannelMonitor};
|
||||
use crate::chain::transaction::OutPoint;
|
||||
use crate::chain::{ChannelMonitorUpdateStatus, Listen, Watch};
|
||||
use crate::ln::channelmanager::{self, ChannelManager, ChannelManagerReadArgs, RAACommitmentOrder, PaymentSendFailure};
|
||||
use crate::ln::channelmanager::{self, ChannelManager, ChannelManagerReadArgs, RAACommitmentOrder, PaymentSendFailure, PaymentId};
|
||||
use crate::ln::channel::AnnouncementSigsState;
|
||||
use crate::ln::msgs;
|
||||
use crate::ln::msgs::{ChannelMessageHandler, RoutingMessageHandler};
|
||||
|
@ -51,7 +51,7 @@ fn test_simple_monitor_permanent_update_fail() {
|
|||
|
||||
let (route, payment_hash_1, _, payment_secret_1) = get_route_and_payment_hash!(&nodes[0], nodes[1], 1000000);
|
||||
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::PermanentFailure);
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1)), true, APIError::ChannelUnavailable {..}, {});
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1), PaymentId(payment_hash_1.0)), true, APIError::ChannelUnavailable {..}, {});
|
||||
check_added_monitors!(nodes[0], 2);
|
||||
|
||||
let events_1 = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -170,7 +170,7 @@ fn do_test_simple_monitor_temporary_update_fail(disconnect: bool) {
|
|||
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
|
||||
|
||||
{
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1)), false, APIError::MonitorUpdateInProgress, {});
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1), PaymentId(payment_hash_1.0)), false, APIError::MonitorUpdateInProgress, {});
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
}
|
||||
|
||||
|
@ -221,7 +221,7 @@ fn do_test_simple_monitor_temporary_update_fail(disconnect: bool) {
|
|||
let (route, payment_hash_2, _, payment_secret_2) = get_route_and_payment_hash!(&nodes[0], nodes[1], 1000000);
|
||||
{
|
||||
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2)), false, APIError::MonitorUpdateInProgress, {});
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2), PaymentId(payment_hash_2.0)), false, APIError::MonitorUpdateInProgress, {});
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
}
|
||||
|
||||
|
@ -285,7 +285,7 @@ fn do_test_monitor_temporary_update_fail(disconnect_count: usize) {
|
|||
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
{
|
||||
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2)), false, APIError::MonitorUpdateInProgress, {});
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2), PaymentId(payment_hash_2.0)), false, APIError::MonitorUpdateInProgress, {});
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
}
|
||||
|
||||
|
@ -624,7 +624,7 @@ fn test_monitor_update_fail_cs() {
|
|||
|
||||
let (route, our_payment_hash, payment_preimage, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
{
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
}
|
||||
|
||||
|
@ -716,7 +716,7 @@ fn test_monitor_update_fail_no_rebroadcast() {
|
|||
|
||||
let (route, our_payment_hash, payment_preimage_1, payment_secret_1) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
{
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(payment_secret_1)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(payment_secret_1), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
}
|
||||
|
||||
|
@ -764,14 +764,14 @@ fn test_monitor_update_raa_while_paused() {
|
|||
send_payment(&nodes[0], &[&nodes[1]], 5000000);
|
||||
let (route, our_payment_hash_1, payment_preimage_1, our_payment_secret_1) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
{
|
||||
nodes[0].node.send_payment(&route, our_payment_hash_1, &Some(our_payment_secret_1)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash_1, &Some(our_payment_secret_1), PaymentId(our_payment_hash_1.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
}
|
||||
let send_event_1 = SendEvent::from_event(nodes[0].node.get_and_clear_pending_msg_events().remove(0));
|
||||
|
||||
let (route, our_payment_hash_2, payment_preimage_2, our_payment_secret_2) = get_route_and_payment_hash!(nodes[1], nodes[0], 1000000);
|
||||
{
|
||||
nodes[1].node.send_payment(&route, our_payment_hash_2, &Some(our_payment_secret_2)).unwrap();
|
||||
nodes[1].node.send_payment(&route, our_payment_hash_2, &Some(our_payment_secret_2), PaymentId(our_payment_hash_2.0)).unwrap();
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
}
|
||||
let send_event_2 = SendEvent::from_event(nodes[1].node.get_and_clear_pending_msg_events().remove(0));
|
||||
|
@ -860,7 +860,7 @@ fn do_test_monitor_update_fail_raa(test_ignore_second_cs: bool) {
|
|||
// holding cell.
|
||||
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[2], 1000000);
|
||||
{
|
||||
nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2), PaymentId(payment_hash_2.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
}
|
||||
|
||||
|
@ -885,7 +885,7 @@ fn do_test_monitor_update_fail_raa(test_ignore_second_cs: bool) {
|
|||
// being paused waiting a monitor update.
|
||||
let (route, payment_hash_3, _, payment_secret_3) = get_route_and_payment_hash!(nodes[0], nodes[2], 1000000);
|
||||
{
|
||||
nodes[0].node.send_payment(&route, payment_hash_3, &Some(payment_secret_3)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_3, &Some(payment_secret_3), PaymentId(payment_hash_3.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
}
|
||||
|
||||
|
@ -904,7 +904,7 @@ fn do_test_monitor_update_fail_raa(test_ignore_second_cs: bool) {
|
|||
let (payment_preimage_4, payment_hash_4) = if test_ignore_second_cs {
|
||||
// Try to route another payment backwards from 2 to make sure 1 holds off on responding
|
||||
let (route, payment_hash_4, payment_preimage_4, payment_secret_4) = get_route_and_payment_hash!(nodes[2], nodes[0], 1000000);
|
||||
nodes[2].node.send_payment(&route, payment_hash_4, &Some(payment_secret_4)).unwrap();
|
||||
nodes[2].node.send_payment(&route, payment_hash_4, &Some(payment_secret_4), PaymentId(payment_hash_4.0)).unwrap();
|
||||
check_added_monitors!(nodes[2], 1);
|
||||
|
||||
send_event = SendEvent::from_event(nodes[2].node.get_and_clear_pending_msg_events().remove(0));
|
||||
|
@ -1198,9 +1198,9 @@ fn raa_no_response_awaiting_raa_state() {
|
|||
// requires only an RAA response due to AwaitingRAA) we can deliver the RAA and require the CS
|
||||
// generation during RAA while in monitor-update-failed state.
|
||||
{
|
||||
nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1), PaymentId(payment_hash_1.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2), PaymentId(payment_hash_2.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 0);
|
||||
}
|
||||
|
||||
|
@ -1250,7 +1250,7 @@ fn raa_no_response_awaiting_raa_state() {
|
|||
// chanmon_fail_consistency test required it to actually find the bug (by seeing out-of-sync
|
||||
// commitment transaction states) whereas here we can explicitly check for it.
|
||||
{
|
||||
nodes[0].node.send_payment(&route, payment_hash_3, &Some(payment_secret_3)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_3, &Some(payment_secret_3), PaymentId(payment_hash_3.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 0);
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
}
|
||||
|
@ -1340,7 +1340,7 @@ fn claim_while_disconnected_monitor_update_fail() {
|
|||
// the monitor still failed
|
||||
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
{
|
||||
nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2), PaymentId(payment_hash_2.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
}
|
||||
|
||||
|
@ -1430,7 +1430,7 @@ fn monitor_failed_no_reestablish_response() {
|
|||
// on receipt).
|
||||
let (route, payment_hash_1, payment_preimage_1, payment_secret_1) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
{
|
||||
nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1), PaymentId(payment_hash_1.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
}
|
||||
|
||||
|
@ -1503,7 +1503,7 @@ fn first_message_on_recv_ordering() {
|
|||
// can deliver it and fail the monitor update.
|
||||
let (route, payment_hash_1, payment_preimage_1, payment_secret_1) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
{
|
||||
nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1), PaymentId(payment_hash_1.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
}
|
||||
|
||||
|
@ -1526,7 +1526,7 @@ fn first_message_on_recv_ordering() {
|
|||
// Route the second payment, generating an update_add_htlc/commitment_signed
|
||||
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
{
|
||||
nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2), PaymentId(payment_hash_2.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
}
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -1610,7 +1610,7 @@ fn test_monitor_update_fail_claim() {
|
|||
|
||||
let (route, payment_hash_2, _, payment_secret_2) = get_route_and_payment_hash!(nodes[2], nodes[0], 1_000_000);
|
||||
{
|
||||
nodes[2].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2)).unwrap();
|
||||
nodes[2].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2), PaymentId(payment_hash_2.0)).unwrap();
|
||||
check_added_monitors!(nodes[2], 1);
|
||||
}
|
||||
|
||||
|
@ -1627,7 +1627,7 @@ fn test_monitor_update_fail_claim() {
|
|||
commitment_signed_dance!(nodes[1], nodes[2], payment_event.commitment_msg, false, true);
|
||||
|
||||
let (_, payment_hash_3, payment_secret_3) = get_payment_preimage_hash!(nodes[0]);
|
||||
nodes[2].node.send_payment(&route, payment_hash_3, &Some(payment_secret_3)).unwrap();
|
||||
nodes[2].node.send_payment(&route, payment_hash_3, &Some(payment_secret_3), PaymentId(payment_hash_3.0)).unwrap();
|
||||
check_added_monitors!(nodes[2], 1);
|
||||
|
||||
let mut events = nodes[2].node.get_and_clear_pending_msg_events();
|
||||
|
@ -1717,7 +1717,7 @@ fn test_monitor_update_on_pending_forwards() {
|
|||
|
||||
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) = get_route_and_payment_hash!(nodes[2], nodes[0], 1000000);
|
||||
{
|
||||
nodes[2].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2)).unwrap();
|
||||
nodes[2].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2), PaymentId(payment_hash_2.0)).unwrap();
|
||||
check_added_monitors!(nodes[2], 1);
|
||||
}
|
||||
|
||||
|
@ -1777,7 +1777,7 @@ fn monitor_update_claim_fail_no_response() {
|
|||
// Now start forwarding a second payment, skipping the last RAA so B is in AwaitingRAA
|
||||
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
{
|
||||
nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2), PaymentId(payment_hash_2.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
}
|
||||
|
||||
|
@ -1964,7 +1964,7 @@ fn test_path_paused_mpp() {
|
|||
// Now check that we get the right return value, indicating that the first path succeeded but
|
||||
// the second got a MonitorUpdateInProgress err. This implies
|
||||
// PaymentSendFailure::PartialFailure as some paths succeeded, preventing retry.
|
||||
if let Err(PaymentSendFailure::PartialFailure { results, ..}) = nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)) {
|
||||
if let Err(PaymentSendFailure::PartialFailure { results, ..}) = nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)) {
|
||||
assert_eq!(results.len(), 2);
|
||||
if let Ok(()) = results[0] {} else { panic!(); }
|
||||
if let Err(APIError::MonitorUpdateInProgress) = results[1] {} else { panic!(); }
|
||||
|
@ -2009,7 +2009,7 @@ fn test_pending_update_fee_ack_on_reconnect() {
|
|||
send_payment(&nodes[0], &[&nodes[1]], 100_000_00);
|
||||
|
||||
let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(&nodes[1], nodes[0], 1_000_000);
|
||||
nodes[1].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[1].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
let bs_initial_send_msgs = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
||||
// bs_initial_send_msgs are not delivered until they are re-generated after reconnect
|
||||
|
@ -2260,12 +2260,12 @@ fn do_channel_holding_cell_serialize(disconnect: bool, reload_a: bool) {
|
|||
// (c) will not be freed from the holding cell.
|
||||
let (payment_preimage_0, payment_hash_0, _) = route_payment(&nodes[1], &[&nodes[0]], 100_000);
|
||||
|
||||
nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1), PaymentId(payment_hash_1.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let send = SendEvent::from_node(&nodes[0]);
|
||||
assert_eq!(send.msgs.len(), 1);
|
||||
|
||||
nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2), PaymentId(payment_hash_2.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 0);
|
||||
|
||||
chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
|
||||
|
@ -2457,7 +2457,7 @@ fn do_test_reconnect_dup_htlc_claims(htlc_status: HTLCStatusAtDupClaim, second_f
|
|||
// In order to get the HTLC claim into the holding cell at nodes[1], we need nodes[1] to be
|
||||
// awaiting a remote revoke_and_ack from nodes[0].
|
||||
let (route, second_payment_hash, _, second_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 100_000);
|
||||
nodes[0].node.send_payment(&route, second_payment_hash, &Some(second_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, second_payment_hash, &Some(second_payment_secret), PaymentId(second_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let send_event = SendEvent::from_event(nodes[0].node.get_and_clear_pending_msg_events().remove(0));
|
||||
|
|
|
@ -488,12 +488,6 @@ pub(crate) enum PendingOutboundPayment {
|
|||
}
|
||||
|
||||
impl PendingOutboundPayment {
|
||||
fn is_retryable(&self) -> bool {
|
||||
match self {
|
||||
PendingOutboundPayment::Retryable { .. } => true,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
fn is_fulfilled(&self) -> bool {
|
||||
match self {
|
||||
PendingOutboundPayment::Fulfilled { .. } => true,
|
||||
|
@ -1206,6 +1200,9 @@ pub enum PaymentSendFailure {
|
|||
/// All paths which were attempted failed to send, with no channel state change taking place.
|
||||
/// You can freely retry the payment in full (though you probably want to do so over different
|
||||
/// paths than the ones selected).
|
||||
///
|
||||
/// [`ChannelManager::abandon_payment`] does *not* need to be called for this payment and
|
||||
/// [`ChannelManager::retry_payment`] will *not* work for this payment.
|
||||
AllFailedRetrySafe(Vec<APIError>),
|
||||
/// Some paths which were attempted failed to send, though possibly not all. At least some
|
||||
/// paths have irrevocably committed to the HTLC and retrying the payment in full would result
|
||||
|
@ -2434,10 +2431,9 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
|||
}
|
||||
|
||||
// Only public for testing, this should otherwise never be called direcly
|
||||
pub(crate) fn send_payment_along_path(&self, path: &Vec<RouteHop>, payment_params: &Option<PaymentParameters>, payment_hash: &PaymentHash, payment_secret: &Option<PaymentSecret>, total_value: u64, cur_height: u32, payment_id: PaymentId, keysend_preimage: &Option<PaymentPreimage>) -> Result<(), APIError> {
|
||||
pub(crate) fn send_payment_along_path(&self, path: &Vec<RouteHop>, payment_params: &Option<PaymentParameters>, payment_hash: &PaymentHash, payment_secret: &Option<PaymentSecret>, total_value: u64, cur_height: u32, payment_id: PaymentId, keysend_preimage: &Option<PaymentPreimage>, session_priv_bytes: [u8; 32]) -> Result<(), APIError> {
|
||||
log_trace!(self.logger, "Attempting to send payment for path with next hop {}", path.first().unwrap().short_channel_id);
|
||||
let prng_seed = self.keys_manager.get_secure_random_bytes();
|
||||
let session_priv_bytes = self.keys_manager.get_secure_random_bytes();
|
||||
let session_priv = SecretKey::from_slice(&session_priv_bytes[..]).expect("RNG is busted");
|
||||
|
||||
let onion_keys = onion_utils::construct_onion_keys(&self.secp_ctx, &path, &session_priv)
|
||||
|
@ -2453,36 +2449,11 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
|||
let err: Result<(), _> = loop {
|
||||
let mut channel_lock = self.channel_state.lock().unwrap();
|
||||
|
||||
let mut pending_outbounds = self.pending_outbound_payments.lock().unwrap();
|
||||
let payment_entry = pending_outbounds.entry(payment_id);
|
||||
if let hash_map::Entry::Occupied(payment) = &payment_entry {
|
||||
if !payment.get().is_retryable() {
|
||||
return Err(APIError::RouteError {
|
||||
err: "Payment already completed"
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
let id = match channel_lock.short_to_chan_info.get(&path.first().unwrap().short_channel_id) {
|
||||
None => return Err(APIError::ChannelUnavailable{err: "No channel available with first hop!".to_owned()}),
|
||||
Some((_cp_id, chan_id)) => chan_id.clone(),
|
||||
};
|
||||
|
||||
macro_rules! insert_outbound_payment {
|
||||
() => {
|
||||
let payment = payment_entry.or_insert_with(|| PendingOutboundPayment::Retryable {
|
||||
session_privs: HashSet::new(),
|
||||
pending_amt_msat: 0,
|
||||
pending_fee_msat: Some(0),
|
||||
payment_hash: *payment_hash,
|
||||
payment_secret: *payment_secret,
|
||||
starting_block_height: self.best_block.read().unwrap().height(),
|
||||
total_msat: total_value,
|
||||
});
|
||||
assert!(payment.insert(session_priv_bytes, path));
|
||||
}
|
||||
}
|
||||
|
||||
let channel_state = &mut *channel_lock;
|
||||
if let hash_map::Entry::Occupied(mut chan) = channel_state.by_id.entry(id) {
|
||||
match {
|
||||
|
@ -2511,9 +2482,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
|||
RAACommitmentOrder::CommitmentFirst, false, true))
|
||||
{
|
||||
(ChannelMonitorUpdateStatus::PermanentFailure, Err(e)) => break Err(e),
|
||||
(ChannelMonitorUpdateStatus::Completed, Ok(())) => {
|
||||
insert_outbound_payment!();
|
||||
},
|
||||
(ChannelMonitorUpdateStatus::Completed, Ok(())) => {},
|
||||
(ChannelMonitorUpdateStatus::InProgress, Err(_)) => {
|
||||
// Note that MonitorUpdateInProgress here indicates (per function
|
||||
// docs) that we will resend the commitment update once monitor
|
||||
|
@ -2521,7 +2490,6 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
|||
// indicating that it is unsafe to retry the payment wholesale,
|
||||
// which we do in the send_payment check for
|
||||
// MonitorUpdateInProgress, below.
|
||||
insert_outbound_payment!(); // Only do this after possibly break'ing on Perm failure above.
|
||||
return Err(APIError::MonitorUpdateInProgress);
|
||||
},
|
||||
_ => unreachable!(),
|
||||
|
@ -2540,7 +2508,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
|||
},
|
||||
});
|
||||
},
|
||||
None => { insert_outbound_payment!(); },
|
||||
None => { },
|
||||
}
|
||||
} else { unreachable!(); }
|
||||
return Ok(());
|
||||
|
@ -2559,14 +2527,20 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
|||
/// Value parameters are provided via the last hop in route, see documentation for RouteHop
|
||||
/// fields for more info.
|
||||
///
|
||||
/// Note that if the payment_hash already exists elsewhere (eg you're sending a duplicative
|
||||
/// payment), we don't do anything to stop you! We always try to ensure that if the provided
|
||||
/// next hop knows the preimage to payment_hash they can claim an additional amount as
|
||||
/// specified in the last hop in the route! Thus, you should probably do your own
|
||||
/// payment_preimage tracking (which you should already be doing as they represent "proof of
|
||||
/// payment") and prevent double-sends yourself.
|
||||
/// If a pending payment is currently in-flight with the same [`PaymentId`] provided, this
|
||||
/// method will error with an [`APIError::RouteError`]. Note, however, that once a payment
|
||||
/// is no longer pending (either via [`ChannelManager::abandon_payment`], or handling of an
|
||||
/// [`Event::PaymentSent`]) LDK will not stop you from sending a second payment with the same
|
||||
/// [`PaymentId`].
|
||||
///
|
||||
/// May generate SendHTLCs message(s) event on success, which should be relayed.
|
||||
/// Thus, in order to ensure duplicate payments are not sent, you should implement your own
|
||||
/// tracking of payments, including state to indicate once a payment has completed. Because you
|
||||
/// should also ensure that [`PaymentHash`]es are not re-used, for simplicity, you should
|
||||
/// consider using the [`PaymentHash`] as the key for tracking payments. In that case, the
|
||||
/// [`PaymentId`] should be a copy of the [`PaymentHash`] bytes.
|
||||
///
|
||||
/// May generate SendHTLCs message(s) event on success, which should be relayed (e.g. via
|
||||
/// [`PeerManager::process_events`]).
|
||||
///
|
||||
/// Each path may have a different return value, and PaymentSendValue may return a Vec with
|
||||
/// each entry matching the corresponding-index entry in the route paths, see
|
||||
|
@ -2590,14 +2564,55 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
|||
/// newer nodes, it will be provided to you in the invoice. If you do not have one, the Route
|
||||
/// must not contain multiple paths as multi-path payments require a recipient-provided
|
||||
/// payment_secret.
|
||||
///
|
||||
/// If a payment_secret *is* provided, we assume that the invoice had the payment_secret feature
|
||||
/// bit set (either as required or as available). If multiple paths are present in the Route,
|
||||
/// we assume the invoice had the basic_mpp feature set.
|
||||
pub fn send_payment(&self, route: &Route, payment_hash: PaymentHash, payment_secret: &Option<PaymentSecret>) -> Result<PaymentId, PaymentSendFailure> {
|
||||
self.send_payment_internal(route, payment_hash, payment_secret, None, None, None)
|
||||
///
|
||||
/// [`Event::PaymentSent`]: events::Event::PaymentSent
|
||||
/// [`PeerManager::process_events`]: crate::ln::peer_handler::PeerManager::process_events
|
||||
pub fn send_payment(&self, route: &Route, payment_hash: PaymentHash, payment_secret: &Option<PaymentSecret>, payment_id: PaymentId) -> Result<(), PaymentSendFailure> {
|
||||
let onion_session_privs = self.add_new_pending_payment(payment_hash, *payment_secret, payment_id, route)?;
|
||||
self.send_payment_internal(route, payment_hash, payment_secret, None, payment_id, None, onion_session_privs)
|
||||
}
|
||||
|
||||
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> {
|
||||
#[cfg(test)]
|
||||
pub(crate) fn test_add_new_pending_payment(&self, payment_hash: PaymentHash, payment_secret: Option<PaymentSecret>, payment_id: PaymentId, route: &Route) -> Result<Vec<[u8; 32]>, PaymentSendFailure> {
|
||||
self.add_new_pending_payment(payment_hash, payment_secret, payment_id, route)
|
||||
}
|
||||
|
||||
fn add_new_pending_payment(&self, payment_hash: PaymentHash, payment_secret: Option<PaymentSecret>, payment_id: PaymentId, route: &Route) -> Result<Vec<[u8; 32]>, PaymentSendFailure> {
|
||||
let mut onion_session_privs = Vec::with_capacity(route.paths.len());
|
||||
for _ in 0..route.paths.len() {
|
||||
onion_session_privs.push(self.keys_manager.get_secure_random_bytes());
|
||||
}
|
||||
|
||||
let mut pending_outbounds = self.pending_outbound_payments.lock().unwrap();
|
||||
match pending_outbounds.entry(payment_id) {
|
||||
hash_map::Entry::Occupied(_) => Err(PaymentSendFailure::ParameterError(APIError::RouteError {
|
||||
err: "Payment already in progress"
|
||||
})),
|
||||
hash_map::Entry::Vacant(entry) => {
|
||||
let payment = entry.insert(PendingOutboundPayment::Retryable {
|
||||
session_privs: HashSet::new(),
|
||||
pending_amt_msat: 0,
|
||||
pending_fee_msat: Some(0),
|
||||
payment_hash,
|
||||
payment_secret,
|
||||
starting_block_height: self.best_block.read().unwrap().height(),
|
||||
total_msat: route.get_total_amount(),
|
||||
});
|
||||
|
||||
for (path, session_priv_bytes) in route.paths.iter().zip(onion_session_privs.iter()) {
|
||||
assert!(payment.insert(*session_priv_bytes, path));
|
||||
}
|
||||
|
||||
Ok(onion_session_privs)
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
fn send_payment_internal(&self, route: &Route, payment_hash: PaymentHash, payment_secret: &Option<PaymentSecret>, keysend_preimage: Option<PaymentPreimage>, payment_id: PaymentId, recv_value_msat: Option<u64>, onion_session_privs: Vec<[u8; 32]>) -> Result<(), PaymentSendFailure> {
|
||||
if route.paths.len() < 1 {
|
||||
return Err(PaymentSendFailure::ParameterError(APIError::RouteError{err: "There must be at least one path to send over"}));
|
||||
}
|
||||
|
@ -2607,7 +2622,6 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
|||
let mut total_value = 0;
|
||||
let our_node_id = self.get_our_node_id();
|
||||
let mut path_errs = Vec::with_capacity(route.paths.len());
|
||||
let payment_id = if let Some(id) = payment_id { id } else { PaymentId(self.keys_manager.get_secure_random_bytes()) };
|
||||
'path_check: for path in route.paths.iter() {
|
||||
if path.len() < 1 || path.len() > 20 {
|
||||
path_errs.push(Err(APIError::RouteError{err: "Path didn't go anywhere/had bogus size"}));
|
||||
|
@ -2632,8 +2646,28 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
|||
|
||||
let cur_height = self.best_block.read().unwrap().height() + 1;
|
||||
let mut results = Vec::new();
|
||||
for path in route.paths.iter() {
|
||||
results.push(self.send_payment_along_path(&path, &route.payment_params, &payment_hash, payment_secret, total_value, cur_height, payment_id, &keysend_preimage));
|
||||
debug_assert_eq!(route.paths.len(), onion_session_privs.len());
|
||||
for (path, session_priv) in route.paths.iter().zip(onion_session_privs.into_iter()) {
|
||||
let mut path_res = self.send_payment_along_path(&path, &route.payment_params, &payment_hash, payment_secret, total_value, cur_height, payment_id, &keysend_preimage, session_priv);
|
||||
match path_res {
|
||||
Ok(_) => {},
|
||||
Err(APIError::MonitorUpdateInProgress) => {
|
||||
// While a MonitorUpdateInProgress is an Err(_), the payment is still
|
||||
// considered "in flight" and we shouldn't remove it from the
|
||||
// PendingOutboundPayment set.
|
||||
},
|
||||
Err(_) => {
|
||||
let mut pending_outbounds = self.pending_outbound_payments.lock().unwrap();
|
||||
if let Some(payment) = pending_outbounds.get_mut(&payment_id) {
|
||||
let removed = payment.remove(&session_priv, Some(path));
|
||||
debug_assert!(removed, "This can't happen as the payment has an entry for this path added by callers");
|
||||
} else {
|
||||
debug_assert!(false, "This can't happen as the payment was added by callers");
|
||||
path_res = Err(APIError::APIMisuseError { err: "Internal error: payment disappeared during processing. Please report this bug!".to_owned() });
|
||||
}
|
||||
}
|
||||
}
|
||||
results.push(path_res);
|
||||
}
|
||||
let mut has_ok = false;
|
||||
let mut has_err = false;
|
||||
|
@ -2667,12 +2701,13 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
|||
} else { None },
|
||||
})
|
||||
} else if has_err {
|
||||
// If we failed to send any paths, we shouldn't have inserted the new PaymentId into
|
||||
// our `pending_outbound_payments` map at all.
|
||||
debug_assert!(self.pending_outbound_payments.lock().unwrap().get(&payment_id).is_none());
|
||||
// If we failed to send any paths, we should remove the new PaymentId from the
|
||||
// `pending_outbound_payments` map, as the user isn't expected to `abandon_payment`.
|
||||
let removed = self.pending_outbound_payments.lock().unwrap().remove(&payment_id).is_some();
|
||||
debug_assert!(removed, "We should always have a pending payment to remove here");
|
||||
Err(PaymentSendFailure::AllFailedRetrySafe(results.drain(..).map(|r| r.unwrap_err()).collect()))
|
||||
} else {
|
||||
Ok(payment_id)
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2696,44 +2731,55 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
|||
}
|
||||
}
|
||||
|
||||
let mut onion_session_privs = Vec::with_capacity(route.paths.len());
|
||||
for _ in 0..route.paths.len() {
|
||||
onion_session_privs.push(self.keys_manager.get_secure_random_bytes());
|
||||
}
|
||||
|
||||
let (total_msat, payment_hash, payment_secret) = {
|
||||
let outbounds = self.pending_outbound_payments.lock().unwrap();
|
||||
if let Some(payment) = outbounds.get(&payment_id) {
|
||||
match payment {
|
||||
PendingOutboundPayment::Retryable {
|
||||
total_msat, payment_hash, payment_secret, pending_amt_msat, ..
|
||||
} => {
|
||||
let retry_amt_msat: u64 = route.paths.iter().map(|path| path.last().unwrap().fee_msat).sum();
|
||||
if retry_amt_msat + *pending_amt_msat > *total_msat * (100 + RETRY_OVERFLOW_PERCENTAGE) / 100 {
|
||||
let mut outbounds = self.pending_outbound_payments.lock().unwrap();
|
||||
match outbounds.get_mut(&payment_id) {
|
||||
Some(payment) => {
|
||||
let res = match payment {
|
||||
PendingOutboundPayment::Retryable {
|
||||
total_msat, payment_hash, payment_secret, pending_amt_msat, ..
|
||||
} => {
|
||||
let retry_amt_msat: u64 = route.paths.iter().map(|path| path.last().unwrap().fee_msat).sum();
|
||||
if retry_amt_msat + *pending_amt_msat > *total_msat * (100 + RETRY_OVERFLOW_PERCENTAGE) / 100 {
|
||||
return Err(PaymentSendFailure::ParameterError(APIError::APIMisuseError {
|
||||
err: format!("retry_amt_msat of {} will put pending_amt_msat (currently: {}) more than 10% over total_payment_amt_msat of {}", retry_amt_msat, pending_amt_msat, total_msat).to_string()
|
||||
}))
|
||||
}
|
||||
(*total_msat, *payment_hash, *payment_secret)
|
||||
},
|
||||
PendingOutboundPayment::Legacy { .. } => {
|
||||
return Err(PaymentSendFailure::ParameterError(APIError::APIMisuseError {
|
||||
err: format!("retry_amt_msat of {} will put pending_amt_msat (currently: {}) more than 10% over total_payment_amt_msat of {}", retry_amt_msat, pending_amt_msat, total_msat).to_string()
|
||||
err: "Unable to retry payments that were initially sent on LDK versions prior to 0.0.102".to_string()
|
||||
}))
|
||||
}
|
||||
(*total_msat, *payment_hash, *payment_secret)
|
||||
},
|
||||
PendingOutboundPayment::Legacy { .. } => {
|
||||
return Err(PaymentSendFailure::ParameterError(APIError::APIMisuseError {
|
||||
err: "Unable to retry payments that were initially sent on LDK versions prior to 0.0.102".to_string()
|
||||
}))
|
||||
},
|
||||
PendingOutboundPayment::Fulfilled { .. } => {
|
||||
return Err(PaymentSendFailure::ParameterError(APIError::APIMisuseError {
|
||||
err: "Payment already completed".to_owned()
|
||||
}));
|
||||
},
|
||||
PendingOutboundPayment::Abandoned { .. } => {
|
||||
return Err(PaymentSendFailure::ParameterError(APIError::APIMisuseError {
|
||||
err: "Payment already abandoned (with some HTLCs still pending)".to_owned()
|
||||
}));
|
||||
},
|
||||
}
|
||||
} else {
|
||||
return Err(PaymentSendFailure::ParameterError(APIError::APIMisuseError {
|
||||
err: format!("Payment with ID {} not found", log_bytes!(payment_id.0)),
|
||||
}))
|
||||
},
|
||||
PendingOutboundPayment::Fulfilled { .. } => {
|
||||
return Err(PaymentSendFailure::ParameterError(APIError::APIMisuseError {
|
||||
err: "Payment already completed".to_owned()
|
||||
}));
|
||||
},
|
||||
PendingOutboundPayment::Abandoned { .. } => {
|
||||
return Err(PaymentSendFailure::ParameterError(APIError::APIMisuseError {
|
||||
err: "Payment already abandoned (with some HTLCs still pending)".to_owned()
|
||||
}));
|
||||
},
|
||||
};
|
||||
for (path, session_priv_bytes) in route.paths.iter().zip(onion_session_privs.iter()) {
|
||||
assert!(payment.insert(*session_priv_bytes, path));
|
||||
}
|
||||
res
|
||||
},
|
||||
None =>
|
||||
return Err(PaymentSendFailure::ParameterError(APIError::APIMisuseError {
|
||||
err: format!("Payment with ID {} not found", log_bytes!(payment_id.0)),
|
||||
})),
|
||||
}
|
||||
};
|
||||
return self.send_payment_internal(route, payment_hash, &payment_secret, None, Some(payment_id), Some(total_msat)).map(|_| ())
|
||||
self.send_payment_internal(route, payment_hash, &payment_secret, None, payment_id, Some(total_msat), onion_session_privs)
|
||||
}
|
||||
|
||||
/// Signals that no further retries for the given payment will occur.
|
||||
|
@ -2773,7 +2819,8 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
|||
/// would be able to guess -- otherwise, an intermediate node may claim the payment and it will
|
||||
/// never reach the recipient.
|
||||
///
|
||||
/// See [`send_payment`] documentation for more details on the return value of this function.
|
||||
/// See [`send_payment`] documentation for more details on the return value of this function
|
||||
/// and idempotency guarantees provided by the [`PaymentId`] key.
|
||||
///
|
||||
/// Similar to regular payments, you MUST NOT reuse a `payment_preimage` value. See
|
||||
/// [`send_payment`] for more information about the risks of duplicate preimage usage.
|
||||
|
@ -2781,14 +2828,16 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
|||
/// Note that `route` must have exactly one path.
|
||||
///
|
||||
/// [`send_payment`]: Self::send_payment
|
||||
pub fn send_spontaneous_payment(&self, route: &Route, payment_preimage: Option<PaymentPreimage>) -> Result<(PaymentHash, PaymentId), PaymentSendFailure> {
|
||||
pub fn send_spontaneous_payment(&self, route: &Route, payment_preimage: Option<PaymentPreimage>, payment_id: PaymentId) -> Result<PaymentHash, PaymentSendFailure> {
|
||||
let preimage = match payment_preimage {
|
||||
Some(p) => p,
|
||||
None => PaymentPreimage(self.keys_manager.get_secure_random_bytes()),
|
||||
};
|
||||
let payment_hash = PaymentHash(Sha256::hash(&preimage.0).into_inner());
|
||||
match self.send_payment_internal(route, payment_hash, &None, Some(preimage), None, None) {
|
||||
Ok(payment_id) => Ok((payment_hash, payment_id)),
|
||||
let onion_session_privs = self.add_new_pending_payment(payment_hash, None, payment_id, &route)?;
|
||||
|
||||
match self.send_payment_internal(route, payment_hash, &None, Some(preimage), payment_id, None, onion_session_privs) {
|
||||
Ok(()) => Ok(payment_hash),
|
||||
Err(e) => Err(e)
|
||||
}
|
||||
}
|
||||
|
@ -2808,9 +2857,10 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
|||
}
|
||||
|
||||
let route = Route { paths: vec![hops], payment_params: None };
|
||||
let onion_session_privs = self.add_new_pending_payment(payment_hash, None, payment_id, &route)?;
|
||||
|
||||
match self.send_payment_internal(&route, payment_hash, &None, None, Some(payment_id), None) {
|
||||
Ok(payment_id) => Ok((payment_hash, payment_id)),
|
||||
match self.send_payment_internal(&route, payment_hash, &None, None, payment_id, None, onion_session_privs) {
|
||||
Ok(()) => Ok((payment_hash, payment_id)),
|
||||
Err(e) => Err(e)
|
||||
}
|
||||
}
|
||||
|
@ -7406,18 +7456,22 @@ mod tests {
|
|||
|
||||
// First, send a partial MPP payment.
|
||||
let (route, our_payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(&nodes[0], nodes[1], 100_000);
|
||||
let mut mpp_route = route.clone();
|
||||
mpp_route.paths.push(mpp_route.paths[0].clone());
|
||||
|
||||
let payment_id = PaymentId([42; 32]);
|
||||
// Use the utility function send_payment_along_path to send the payment with MPP data which
|
||||
// indicates there are more HTLCs coming.
|
||||
let cur_height = CHAN_CONFIRM_DEPTH + 1; // route_payment calls send_payment, which adds 1 to the current height. So we do the same here to match.
|
||||
nodes[0].node.send_payment_along_path(&route.paths[0], &route.payment_params, &our_payment_hash, &Some(payment_secret), 200_000, cur_height, payment_id, &None).unwrap();
|
||||
let session_privs = nodes[0].node.add_new_pending_payment(our_payment_hash, Some(payment_secret), payment_id, &mpp_route).unwrap();
|
||||
nodes[0].node.send_payment_along_path(&mpp_route.paths[0], &route.payment_params, &our_payment_hash, &Some(payment_secret), 200_000, cur_height, payment_id, &None, session_privs[0]).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
pass_along_path(&nodes[0], &[&nodes[1]], 200_000, our_payment_hash, Some(payment_secret), events.drain(..).next().unwrap(), false, None);
|
||||
|
||||
// Next, send a keysend payment with the same payment_hash and make sure it fails.
|
||||
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage)).unwrap();
|
||||
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage), PaymentId(payment_preimage.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -7440,7 +7494,7 @@ mod tests {
|
|||
expect_payment_failed!(nodes[0], our_payment_hash, true);
|
||||
|
||||
// Send the second half of the original MPP payment.
|
||||
nodes[0].node.send_payment_along_path(&route.paths[0], &route.payment_params, &our_payment_hash, &Some(payment_secret), 200_000, cur_height, payment_id, &None).unwrap();
|
||||
nodes[0].node.send_payment_along_path(&mpp_route.paths[1], &route.payment_params, &our_payment_hash, &Some(payment_secret), 200_000, cur_height, payment_id, &None, session_privs[1]).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -7538,7 +7592,7 @@ mod tests {
|
|||
&nodes[0].node.get_our_node_id(), &route_params, &nodes[0].network_graph,
|
||||
None, nodes[0].logger, &scorer, &random_seed_bytes
|
||||
).unwrap();
|
||||
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage)).unwrap();
|
||||
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage), PaymentId(payment_preimage.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -7571,7 +7625,7 @@ mod tests {
|
|||
&nodes[0].node.get_our_node_id(), &route_params, &nodes[0].network_graph,
|
||||
None, nodes[0].logger, &scorer, &random_seed_bytes
|
||||
).unwrap();
|
||||
let (payment_hash, _) = nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage)).unwrap();
|
||||
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage), PaymentId(payment_preimage.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -7581,7 +7635,7 @@ mod tests {
|
|||
|
||||
// Next, attempt a regular payment and make sure it fails.
|
||||
let payment_secret = PaymentSecret([43; 32]);
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -7624,7 +7678,7 @@ mod tests {
|
|||
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let route_params = RouteParameters {
|
||||
payment_params: PaymentParameters::for_keysend(payee_pubkey),
|
||||
final_value_msat: 10000,
|
||||
final_value_msat: 10_000,
|
||||
final_cltv_expiry_delta: 40,
|
||||
};
|
||||
let network_graph = nodes[0].network_graph;
|
||||
|
@ -7638,7 +7692,8 @@ mod tests {
|
|||
|
||||
let test_preimage = PaymentPreimage([42; 32]);
|
||||
let mismatch_payment_hash = PaymentHash([43; 32]);
|
||||
let _ = nodes[0].node.send_payment_internal(&route, mismatch_payment_hash, &None, Some(test_preimage), None, None).unwrap();
|
||||
let session_privs = nodes[0].node.add_new_pending_payment(mismatch_payment_hash, None, PaymentId(mismatch_payment_hash.0), &route).unwrap();
|
||||
nodes[0].node.send_payment_internal(&route, mismatch_payment_hash, &None, Some(test_preimage), PaymentId(mismatch_payment_hash.0), None, session_privs).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
|
@ -7668,7 +7723,7 @@ mod tests {
|
|||
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let route_params = RouteParameters {
|
||||
payment_params: PaymentParameters::for_keysend(payee_pubkey),
|
||||
final_value_msat: 10000,
|
||||
final_value_msat: 10_000,
|
||||
final_cltv_expiry_delta: 40,
|
||||
};
|
||||
let network_graph = nodes[0].network_graph;
|
||||
|
@ -7683,7 +7738,8 @@ mod tests {
|
|||
let test_preimage = PaymentPreimage([42; 32]);
|
||||
let test_secret = PaymentSecret([43; 32]);
|
||||
let payment_hash = PaymentHash(Sha256::hash(&test_preimage.0).into_inner());
|
||||
let _ = nodes[0].node.send_payment_internal(&route, payment_hash, &Some(test_secret), Some(test_preimage), None, None).unwrap();
|
||||
let session_privs = nodes[0].node.add_new_pending_payment(payment_hash, Some(test_secret), PaymentId(payment_hash.0), &route).unwrap();
|
||||
nodes[0].node.send_payment_internal(&route, payment_hash, &Some(test_secret), Some(test_preimage), PaymentId(payment_hash.0), None, session_privs).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
|
@ -7720,7 +7776,7 @@ mod tests {
|
|||
route.paths[1][0].short_channel_id = chan_2_id;
|
||||
route.paths[1][1].short_channel_id = chan_4_id;
|
||||
|
||||
match nodes[0].node.send_payment(&route, payment_hash, &None).unwrap_err() {
|
||||
match nodes[0].node.send_payment(&route, payment_hash, &None, PaymentId(payment_hash.0)).unwrap_err() {
|
||||
PaymentSendFailure::ParameterError(APIError::APIMisuseError { ref err }) => {
|
||||
assert!(regex::Regex::new(r"Payment secret is required for multi-path payments").unwrap().is_match(err)) },
|
||||
_ => panic!("unexpected error")
|
||||
|
@ -7875,7 +7931,7 @@ pub mod bench {
|
|||
use crate::chain::Listen;
|
||||
use crate::chain::chainmonitor::{ChainMonitor, Persist};
|
||||
use crate::chain::keysinterface::{KeysManager, KeysInterface, InMemorySigner};
|
||||
use crate::ln::channelmanager::{self, BestBlock, ChainParameters, ChannelManager, PaymentHash, PaymentPreimage};
|
||||
use crate::ln::channelmanager::{self, BestBlock, ChainParameters, ChannelManager, PaymentHash, PaymentPreimage, PaymentId};
|
||||
use crate::ln::functional_test_utils::*;
|
||||
use crate::ln::msgs::{ChannelMessageHandler, Init};
|
||||
use crate::routing::gossip::NetworkGraph;
|
||||
|
@ -8002,7 +8058,7 @@ pub mod bench {
|
|||
let payment_hash = PaymentHash(Sha256::hash(&payment_preimage.0[..]).into_inner());
|
||||
let payment_secret = $node_b.create_inbound_payment_for_hash(payment_hash, None, 7200).unwrap();
|
||||
|
||||
$node_a.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
$node_a.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
let payment_event = SendEvent::from_event($node_a.get_and_clear_pending_msg_events().pop().unwrap());
|
||||
$node_b.handle_update_add_htlc(&$node_a.get_our_node_id(), &payment_event.msgs[0]);
|
||||
$node_b.handle_commitment_signed(&$node_a.get_our_node_id(), &payment_event.commitment_msg);
|
||||
|
|
|
@ -1636,7 +1636,8 @@ pub fn expect_payment_failed_conditions<'a, 'b, 'c, 'd, 'e>(
|
|||
}
|
||||
|
||||
pub fn send_along_route_with_secret<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, route: Route, expected_paths: &[&[&Node<'a, 'b, 'c>]], recv_value: u64, our_payment_hash: PaymentHash, our_payment_secret: PaymentSecret) -> PaymentId {
|
||||
let payment_id = origin_node.node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
let payment_id = PaymentId(origin_node.keys_manager.backing.get_secure_random_bytes());
|
||||
origin_node.node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), payment_id).unwrap();
|
||||
check_added_monitors!(origin_node, expected_paths.len());
|
||||
pass_along_route(origin_node, expected_paths, recv_value, our_payment_hash, our_payment_secret);
|
||||
payment_id
|
||||
|
@ -1883,7 +1884,7 @@ pub fn route_over_limit<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_rou
|
|||
}
|
||||
|
||||
let (_, our_payment_hash, our_payment_preimage) = get_payment_preimage_hash!(expected_route.last().unwrap());
|
||||
unwrap_send_err!(origin_node.node.send_payment(&route, our_payment_hash, &Some(our_payment_preimage)), true, APIError::ChannelUnavailable { ref err },
|
||||
unwrap_send_err!(origin_node.node.send_payment(&route, our_payment_hash, &Some(our_payment_preimage), PaymentId(our_payment_hash.0)), true, APIError::ChannelUnavailable { ref err },
|
||||
assert!(err.contains("Cannot send value that would put us over the max HTLC value in flight our peer will accept")));
|
||||
}
|
||||
|
||||
|
|
|
@ -253,7 +253,7 @@ fn test_async_inbound_update_fee() {
|
|||
|
||||
// ...but before it's delivered, nodes[1] starts to send a payment back to nodes[0]...
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[1], nodes[0], 40000);
|
||||
nodes[1].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[1].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
|
||||
let payment_event = {
|
||||
|
@ -352,7 +352,7 @@ fn test_update_fee_unordered_raa() {
|
|||
|
||||
// ...but before it's delivered, nodes[1] starts to send a payment back to nodes[0]...
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[1], nodes[0], 40000);
|
||||
nodes[1].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[1].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
|
||||
let payment_event = {
|
||||
|
@ -781,7 +781,7 @@ fn test_update_fee_with_fundee_update_add_htlc() {
|
|||
let (route, our_payment_hash, our_payment_preimage, our_payment_secret) = get_route_and_payment_hash!(nodes[1], nodes[0], 800000);
|
||||
|
||||
// nothing happens since node[1] is in AwaitingRemoteRevoke
|
||||
nodes[1].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[1].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
{
|
||||
let mut added_monitors = nodes[0].chain_monitor.added_monitors.lock().unwrap();
|
||||
assert_eq!(added_monitors.len(), 0);
|
||||
|
@ -1093,7 +1093,7 @@ fn holding_cell_htlc_counting() {
|
|||
let mut payments = Vec::new();
|
||||
for _ in 0..crate::ln::channel::OUR_MAX_HTLCS {
|
||||
let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[1], nodes[2], 100000);
|
||||
nodes[1].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[1].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
payments.push((payment_preimage, payment_hash));
|
||||
}
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
|
@ -1108,7 +1108,7 @@ fn holding_cell_htlc_counting() {
|
|||
// another HTLC.
|
||||
let (route, payment_hash_1, _, payment_secret_1) = get_route_and_payment_hash!(nodes[1], nodes[2], 100000);
|
||||
{
|
||||
unwrap_send_err!(nodes[1].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1)), true, APIError::ChannelUnavailable { ref err },
|
||||
unwrap_send_err!(nodes[1].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1), PaymentId(payment_hash_1.0)), true, APIError::ChannelUnavailable { ref err },
|
||||
assert!(regex::Regex::new(r"Cannot push more than their max accepted HTLCs \(\d+\)").unwrap().is_match(err)));
|
||||
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
|
||||
nodes[1].logger.assert_log_contains("lightning::ln::channelmanager".to_string(), "Cannot push more than their max accepted HTLCs".to_string(), 1);
|
||||
|
@ -1117,7 +1117,7 @@ fn holding_cell_htlc_counting() {
|
|||
// This should also be true if we try to forward a payment.
|
||||
let (route, payment_hash_2, _, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[2], 100000);
|
||||
{
|
||||
nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2), PaymentId(payment_hash_2.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
}
|
||||
|
||||
|
@ -1330,7 +1330,7 @@ fn test_basic_channel_reserve() {
|
|||
let commit_tx_fee = 2 * commit_tx_fee_msat(get_feerate!(nodes[0], chan.2), 1 + 1, get_opt_anchors!(nodes[0], chan.2));
|
||||
let max_can_send = 5000000 - channel_reserve - commit_tx_fee;
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], max_can_send + 1);
|
||||
let err = nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).err().unwrap();
|
||||
let err = nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).err().unwrap();
|
||||
match err {
|
||||
PaymentSendFailure::AllFailedRetrySafe(ref fails) => {
|
||||
match &fails[0] {
|
||||
|
@ -1506,7 +1506,7 @@ fn test_chan_reserve_violation_outbound_htlc_inbound_chan() {
|
|||
|
||||
// However one more HTLC should be significantly over the reserve amount and fail.
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[1], nodes[0], 1_000_000);
|
||||
unwrap_send_err!(nodes[1].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)), true, APIError::ChannelUnavailable { ref err },
|
||||
unwrap_send_err!(nodes[1].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)), true, APIError::ChannelUnavailable { ref err },
|
||||
assert_eq!(err, "Cannot send value that would put counterparty balance under holder-announced channel reserve value"));
|
||||
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
|
||||
nodes[1].logger.assert_log("lightning::ln::channelmanager".to_string(), "Cannot send value that would put counterparty balance under holder-announced channel reserve value".to_string(), 1);
|
||||
|
@ -1597,7 +1597,7 @@ fn test_chan_reserve_dust_inbound_htlcs_outbound_chan() {
|
|||
|
||||
// One more than the dust amt should fail, however.
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[1], nodes[0], dust_amt + 1);
|
||||
unwrap_send_err!(nodes[1].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)), true, APIError::ChannelUnavailable { ref err },
|
||||
unwrap_send_err!(nodes[1].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)), true, APIError::ChannelUnavailable { ref err },
|
||||
assert_eq!(err, "Cannot send value that would put counterparty balance under holder-announced channel reserve value"));
|
||||
}
|
||||
|
||||
|
@ -1691,7 +1691,7 @@ fn test_chan_reserve_violation_inbound_htlc_inbound_chan() {
|
|||
// Add a pending HTLC.
|
||||
let (route_1, our_payment_hash_1, _, our_payment_secret_1) = get_route_and_payment_hash!(nodes[0], nodes[2], amt_msat_1);
|
||||
let payment_event_1 = {
|
||||
nodes[0].node.send_payment(&route_1, our_payment_hash_1, &Some(our_payment_secret_1)).unwrap();
|
||||
nodes[0].node.send_payment(&route_1, our_payment_hash_1, &Some(our_payment_secret_1), PaymentId(our_payment_hash_1.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -1801,7 +1801,7 @@ fn test_channel_reserve_holding_cell_htlcs() {
|
|||
route.paths[0].last_mut().unwrap().fee_msat += 1;
|
||||
assert!(route.paths[0].iter().rev().skip(1).all(|h| h.fee_msat == feemsat));
|
||||
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)), true, APIError::ChannelUnavailable { ref err },
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)), true, APIError::ChannelUnavailable { ref err },
|
||||
assert!(regex::Regex::new(r"Cannot send value that would put us over the max HTLC value in flight our peer will accept \(\d+\)").unwrap().is_match(err)));
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
nodes[0].logger.assert_log_contains("lightning::ln::channelmanager".to_string(), "Cannot send value that would put us over the max HTLC value in flight our peer will accept".to_string(), 1);
|
||||
|
@ -1857,7 +1857,7 @@ fn test_channel_reserve_holding_cell_htlcs() {
|
|||
|
||||
let (route_1, our_payment_hash_1, our_payment_preimage_1, our_payment_secret_1) = get_route_and_payment_hash!(nodes[0], nodes[2], recv_value_1);
|
||||
let payment_event_1 = {
|
||||
nodes[0].node.send_payment(&route_1, our_payment_hash_1, &Some(our_payment_secret_1)).unwrap();
|
||||
nodes[0].node.send_payment(&route_1, our_payment_hash_1, &Some(our_payment_secret_1), PaymentId(our_payment_hash_1.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -1870,7 +1870,7 @@ fn test_channel_reserve_holding_cell_htlcs() {
|
|||
let recv_value_2 = stat01.value_to_self_msat - amt_msat_1 - stat01.channel_reserve_msat - total_fee_msat - commit_tx_fee_2_htlcs;
|
||||
{
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], recv_value_2 + 1);
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)), true, APIError::ChannelUnavailable { ref err },
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)), true, APIError::ChannelUnavailable { ref err },
|
||||
assert!(regex::Regex::new(r"Cannot send value that would put our balance under counterparty-announced channel reserve value \(\d+\)").unwrap().is_match(err)));
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
}
|
||||
|
@ -1888,7 +1888,7 @@ fn test_channel_reserve_holding_cell_htlcs() {
|
|||
// now see if they go through on both sides
|
||||
let (route_21, our_payment_hash_21, our_payment_preimage_21, our_payment_secret_21) = get_route_and_payment_hash!(nodes[0], nodes[2], recv_value_21);
|
||||
// but this will stuck in the holding cell
|
||||
nodes[0].node.send_payment(&route_21, our_payment_hash_21, &Some(our_payment_secret_21)).unwrap();
|
||||
nodes[0].node.send_payment(&route_21, our_payment_hash_21, &Some(our_payment_secret_21), PaymentId(our_payment_hash_21.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 0);
|
||||
let events = nodes[0].node.get_and_clear_pending_events();
|
||||
assert_eq!(events.len(), 0);
|
||||
|
@ -1896,7 +1896,7 @@ fn test_channel_reserve_holding_cell_htlcs() {
|
|||
// test with outbound holding cell amount > 0
|
||||
{
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], recv_value_22+1);
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)), true, APIError::ChannelUnavailable { ref err },
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)), true, APIError::ChannelUnavailable { ref err },
|
||||
assert!(regex::Regex::new(r"Cannot send value that would put our balance under counterparty-announced channel reserve value \(\d+\)").unwrap().is_match(err)));
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
nodes[0].logger.assert_log_contains("lightning::ln::channelmanager".to_string(), "Cannot send value that would put our balance under counterparty-announced channel reserve value".to_string(), 2);
|
||||
|
@ -1904,7 +1904,7 @@ fn test_channel_reserve_holding_cell_htlcs() {
|
|||
|
||||
let (route_22, our_payment_hash_22, our_payment_preimage_22, our_payment_secret_22) = get_route_and_payment_hash!(nodes[0], nodes[2], recv_value_22);
|
||||
// this will also stuck in the holding cell
|
||||
nodes[0].node.send_payment(&route_22, our_payment_hash_22, &Some(our_payment_secret_22)).unwrap();
|
||||
nodes[0].node.send_payment(&route_22, our_payment_hash_22, &Some(our_payment_secret_22), PaymentId(our_payment_hash_22.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 0);
|
||||
assert!(nodes[0].node.get_and_clear_pending_events().is_empty());
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
@ -2040,7 +2040,7 @@ fn channel_reserve_in_flight_removes() {
|
|||
// Start routing the third HTLC (this is just used to get everyone in the right state).
|
||||
let (route, payment_hash_3, payment_preimage_3, payment_secret_3) = get_route_and_payment_hash!(nodes[0], nodes[1], 100000);
|
||||
let send_1 = {
|
||||
nodes[0].node.send_payment(&route, payment_hash_3, &Some(payment_secret_3)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_3, &Some(payment_secret_3), PaymentId(payment_hash_3.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -2114,7 +2114,7 @@ fn channel_reserve_in_flight_removes() {
|
|||
// to A to ensure that A doesn't count the almost-removed HTLC in update_add processing.
|
||||
let (route, payment_hash_4, payment_preimage_4, payment_secret_4) = get_route_and_payment_hash!(nodes[1], nodes[0], 10000);
|
||||
let send_2 = {
|
||||
nodes[1].node.send_payment(&route, payment_hash_4, &Some(payment_secret_4)).unwrap();
|
||||
nodes[1].node.send_payment(&route, payment_hash_4, &Some(payment_secret_4), PaymentId(payment_hash_4.0)).unwrap();
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
let mut events = nodes[1].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -3154,7 +3154,7 @@ fn do_test_commitment_revoked_fail_backward_exhaustive(deliver_bs_raa: bool, use
|
|||
// Add a fourth HTLC, this one will get sequestered away in nodes[1]'s holding cell waiting
|
||||
// on nodes[2]'s RAA.
|
||||
let (route, fourth_payment_hash, _, fourth_payment_secret) = get_route_and_payment_hash!(nodes[1], nodes[2], 1000000);
|
||||
nodes[1].node.send_payment(&route, fourth_payment_hash, &Some(fourth_payment_secret)).unwrap();
|
||||
nodes[1].node.send_payment(&route, fourth_payment_hash, &Some(fourth_payment_secret), PaymentId(fourth_payment_hash.0)).unwrap();
|
||||
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
|
||||
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
|
||||
check_added_monitors!(nodes[1], 0);
|
||||
|
@ -3315,7 +3315,7 @@ fn fail_backward_pending_htlc_upon_channel_failure() {
|
|||
// Alice -> Bob: Route a payment but without Bob sending revoke_and_ack.
|
||||
{
|
||||
let (route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 50_000);
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let payment_event = {
|
||||
|
@ -3330,7 +3330,7 @@ fn fail_backward_pending_htlc_upon_channel_failure() {
|
|||
// Alice -> Bob: Route another payment but now Alice waits for Bob's earlier revoke_and_ack.
|
||||
let (route, failed_payment_hash, _, failed_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 50_000);
|
||||
{
|
||||
nodes[0].node.send_payment(&route, failed_payment_hash, &Some(failed_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, failed_payment_hash, &Some(failed_payment_secret), PaymentId(failed_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 0);
|
||||
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
@ -3423,7 +3423,7 @@ fn test_force_close_fail_back() {
|
|||
let (route, our_payment_hash, our_payment_preimage, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], 1000000);
|
||||
|
||||
let mut payment_event = {
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -3640,7 +3640,7 @@ fn do_test_drop_messages_peer_disconnect(messages_delivered: u8, simulate_broken
|
|||
let (route, payment_hash_1, payment_preimage_1, payment_secret_1) = get_route_and_payment_hash!(nodes[0], nodes[1], 1_000_000);
|
||||
|
||||
let payment_event = {
|
||||
nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1), PaymentId(payment_hash_1.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -4070,7 +4070,7 @@ fn test_drop_messages_peer_disconnect_dual_htlc() {
|
|||
|
||||
// Now try to send a second payment which will fail to send
|
||||
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2), PaymentId(payment_hash_2.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let events_1 = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -4222,7 +4222,8 @@ fn do_test_htlc_timeout(send_partial_mpp: bool) {
|
|||
// indicates there are more HTLCs coming.
|
||||
let cur_height = CHAN_CONFIRM_DEPTH + 1; // route_payment calls send_payment, which adds 1 to the current height. So we do the same here to match.
|
||||
let payment_id = PaymentId([42; 32]);
|
||||
nodes[0].node.send_payment_along_path(&route.paths[0], &route.payment_params, &our_payment_hash, &Some(payment_secret), 200000, cur_height, payment_id, &None).unwrap();
|
||||
let session_privs = nodes[0].node.test_add_new_pending_payment(our_payment_hash, Some(payment_secret), payment_id, &route).unwrap();
|
||||
nodes[0].node.send_payment_along_path(&route.paths[0], &route.payment_params, &our_payment_hash, &Some(payment_secret), 200_000, cur_height, payment_id, &None, session_privs[0]).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -4287,7 +4288,7 @@ fn do_test_holding_cell_htlc_add_timeouts(forwarded_htlc: bool) {
|
|||
// Route a first payment to get the 1 -> 2 channel in awaiting_raa...
|
||||
let (route, first_payment_hash, _, first_payment_secret) = get_route_and_payment_hash!(nodes[1], nodes[2], 100000);
|
||||
{
|
||||
nodes[1].node.send_payment(&route, first_payment_hash, &Some(first_payment_secret)).unwrap();
|
||||
nodes[1].node.send_payment(&route, first_payment_hash, &Some(first_payment_secret), PaymentId(first_payment_hash.0)).unwrap();
|
||||
}
|
||||
assert_eq!(nodes[1].node.get_and_clear_pending_msg_events().len(), 1);
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
|
@ -4295,7 +4296,7 @@ fn do_test_holding_cell_htlc_add_timeouts(forwarded_htlc: bool) {
|
|||
// Now attempt to route a second payment, which should be placed in the holding cell
|
||||
let sending_node = if forwarded_htlc { &nodes[0] } else { &nodes[1] };
|
||||
let (route, second_payment_hash, _, second_payment_secret) = get_route_and_payment_hash!(sending_node, nodes[2], 100000);
|
||||
sending_node.node.send_payment(&route, second_payment_hash, &Some(second_payment_secret)).unwrap();
|
||||
sending_node.node.send_payment(&route, second_payment_hash, &Some(second_payment_secret), PaymentId(second_payment_hash.0)).unwrap();
|
||||
if forwarded_htlc {
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let payment_event = SendEvent::from_event(nodes[0].node.get_and_clear_pending_msg_events().remove(0));
|
||||
|
@ -5976,7 +5977,7 @@ fn do_htlc_claim_current_remote_commitment_only(use_dust: bool) {
|
|||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let (route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], if use_dust { 50000 } else { 3000000 });
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let _as_update = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
|
@ -6222,7 +6223,7 @@ fn test_fail_holding_cell_htlc_upon_free() {
|
|||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], max_can_send);
|
||||
|
||||
// Send a payment which passes reserve checks but gets stuck in the holding cell.
|
||||
let our_payment_id = nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
chan_stat = get_channel_value_stat!(nodes[0], chan.2);
|
||||
assert_eq!(chan_stat.holding_cell_outbound_amount_msat, max_can_send);
|
||||
|
||||
|
@ -6248,7 +6249,7 @@ fn test_fail_holding_cell_htlc_upon_free() {
|
|||
assert_eq!(events.len(), 1);
|
||||
match &events[0] {
|
||||
&Event::PaymentPathFailed { ref payment_id, ref payment_hash, ref payment_failed_permanently, ref network_update, ref all_paths_failed, ref short_channel_id, .. } => {
|
||||
assert_eq!(our_payment_id, *payment_id.as_ref().unwrap());
|
||||
assert_eq!(PaymentId(our_payment_hash.0), *payment_id.as_ref().unwrap());
|
||||
assert_eq!(our_payment_hash.clone(), *payment_hash);
|
||||
assert_eq!(*payment_failed_permanently, false);
|
||||
assert_eq!(*all_paths_failed, true);
|
||||
|
@ -6302,10 +6303,11 @@ fn test_free_and_fail_holding_cell_htlcs() {
|
|||
let (route_2, payment_hash_2, _, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[1], amt_2);
|
||||
|
||||
// Send 2 payments which pass reserve checks but get stuck in the holding cell.
|
||||
nodes[0].node.send_payment(&route_1, payment_hash_1, &Some(payment_secret_1)).unwrap();
|
||||
nodes[0].node.send_payment(&route_1, payment_hash_1, &Some(payment_secret_1), PaymentId(payment_hash_1.0)).unwrap();
|
||||
chan_stat = get_channel_value_stat!(nodes[0], chan.2);
|
||||
assert_eq!(chan_stat.holding_cell_outbound_amount_msat, amt_1);
|
||||
let payment_id_2 = nodes[0].node.send_payment(&route_2, payment_hash_2, &Some(payment_secret_2)).unwrap();
|
||||
let payment_id_2 = PaymentId(nodes[0].keys_manager.get_secure_random_bytes());
|
||||
nodes[0].node.send_payment(&route_2, payment_hash_2, &Some(payment_secret_2), payment_id_2).unwrap();
|
||||
chan_stat = get_channel_value_stat!(nodes[0], chan.2);
|
||||
assert_eq!(chan_stat.holding_cell_outbound_amount_msat, amt_1 + amt_2);
|
||||
|
||||
|
@ -6427,7 +6429,7 @@ fn test_fail_holding_cell_htlc_upon_free_multihop() {
|
|||
let max_can_send = 5000000 - channel_reserve - 2*commit_tx_fee_msat(feerate, 1 + 1, opt_anchors) - total_routing_fee_msat;
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], max_can_send);
|
||||
let payment_event = {
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -6529,7 +6531,7 @@ fn test_update_add_htlc_bolt2_sender_value_below_minimum_msat() {
|
|||
let (mut route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 100000);
|
||||
route.paths[0][0].fee_msat = 100;
|
||||
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)), true, APIError::ChannelUnavailable { ref err },
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)), true, APIError::ChannelUnavailable { ref err },
|
||||
assert!(regex::Regex::new(r"Cannot send less than their minimum HTLC value \(\d+\)").unwrap().is_match(err)));
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
nodes[0].logger.assert_log_contains("lightning::ln::channelmanager".to_string(), "Cannot send less than their minimum HTLC value".to_string(), 1);
|
||||
|
@ -6546,7 +6548,7 @@ fn test_update_add_htlc_bolt2_sender_zero_value_msat() {
|
|||
|
||||
let (mut route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 100000);
|
||||
route.paths[0][0].fee_msat = 0;
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)), true, APIError::ChannelUnavailable { ref err },
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)), true, APIError::ChannelUnavailable { ref err },
|
||||
assert_eq!(err, "Cannot send 0-msat HTLC"));
|
||||
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
@ -6563,7 +6565,7 @@ fn test_update_add_htlc_bolt2_receiver_zero_value_msat() {
|
|||
let _chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 95000000, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 100000);
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
updates.update_add_htlcs[0].amount_msat = 0;
|
||||
|
@ -6589,7 +6591,7 @@ fn test_update_add_htlc_bolt2_sender_cltv_expiry_too_high() {
|
|||
.with_features(channelmanager::provided_invoice_features());
|
||||
let (mut route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], payment_params, 100000000, 0);
|
||||
route.paths[0].last_mut().unwrap().cltv_expiry_delta = 500000001;
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)), true, APIError::RouteError { ref err },
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)), true, APIError::RouteError { ref err },
|
||||
assert_eq!(err, &"Channel CLTV overflowed?"));
|
||||
}
|
||||
|
||||
|
@ -6608,7 +6610,7 @@ fn test_update_add_htlc_bolt2_sender_exceed_max_htlc_num_and_htlc_id_increment()
|
|||
for i in 0..max_accepted_htlcs {
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 100000);
|
||||
let payment_event = {
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -6628,7 +6630,7 @@ fn test_update_add_htlc_bolt2_sender_exceed_max_htlc_num_and_htlc_id_increment()
|
|||
expect_payment_received!(nodes[1], our_payment_hash, our_payment_secret, 100000);
|
||||
}
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 100000);
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)), true, APIError::ChannelUnavailable { ref err },
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)), true, APIError::ChannelUnavailable { ref err },
|
||||
assert!(regex::Regex::new(r"Cannot push more than their max accepted HTLCs \(\d+\)").unwrap().is_match(err)));
|
||||
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
@ -6652,7 +6654,7 @@ fn test_update_add_htlc_bolt2_sender_exceed_max_htlc_value_in_flight() {
|
|||
// Manually create a route over our max in flight (which our router normally automatically
|
||||
// limits us to.
|
||||
route.paths[0][0].fee_msat = max_in_flight + 1;
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)), true, APIError::ChannelUnavailable { ref err },
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)), true, APIError::ChannelUnavailable { ref err },
|
||||
assert!(regex::Regex::new(r"Cannot send value that would put us over the max HTLC value in flight our peer will accept \(\d+\)").unwrap().is_match(err)));
|
||||
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
@ -6678,7 +6680,7 @@ fn test_update_add_htlc_bolt2_receiver_check_amount_received_more_than_min() {
|
|||
}
|
||||
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], htlc_minimum_msat);
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
updates.update_add_htlcs[0].amount_msat = htlc_minimum_msat-1;
|
||||
|
@ -6708,7 +6710,7 @@ fn test_update_add_htlc_bolt2_receiver_sender_can_afford_amount_sent() {
|
|||
|
||||
let max_can_send = 5000000 - channel_reserve - commit_tx_fee_outbound;
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], max_can_send);
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
|
||||
|
@ -6775,7 +6777,7 @@ fn test_update_add_htlc_bolt2_receiver_check_max_in_flight_msat() {
|
|||
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 1000000, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
updates.update_add_htlcs[0].amount_msat = get_channel_value_stat!(nodes[1], chan.2).counterparty_max_htlc_value_in_flight_msat + 1;
|
||||
|
@ -6798,7 +6800,7 @@ fn test_update_add_htlc_bolt2_receiver_check_cltv_expiry() {
|
|||
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 95000000, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
updates.update_add_htlcs[0].cltv_expiry = 500000000;
|
||||
|
@ -6823,7 +6825,7 @@ fn test_update_add_htlc_bolt2_receiver_check_repeated_id_ignore() {
|
|||
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &updates.update_add_htlcs[0]);
|
||||
|
@ -6868,7 +6870,7 @@ fn test_update_fulfill_htlc_bolt2_update_fulfill_htlc_before_commitment() {
|
|||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let (route, our_payment_hash, our_payment_preimage, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
|
@ -6900,7 +6902,7 @@ fn test_update_fulfill_htlc_bolt2_update_fail_htlc_before_commitment() {
|
|||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &updates.update_add_htlcs[0]);
|
||||
|
@ -6931,7 +6933,7 @@ fn test_update_fulfill_htlc_bolt2_update_fail_malformed_htlc_before_commitment()
|
|||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &updates.update_add_htlcs[0]);
|
||||
|
@ -7048,7 +7050,7 @@ fn test_update_fulfill_htlc_bolt2_missing_badonion_bit_for_malformed_htlc_messag
|
|||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 1000000, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let mut updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
|
@ -7099,7 +7101,7 @@ fn test_update_fulfill_htlc_bolt2_after_malformed_htlc_message_must_forward_upda
|
|||
|
||||
//First hop
|
||||
let mut payment_event = {
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -7173,7 +7175,7 @@ fn test_channel_failed_after_message_with_badonion_node_perm_bits_set() {
|
|||
|
||||
// First hop
|
||||
let mut payment_event = {
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
SendEvent::from_node(&nodes[0])
|
||||
};
|
||||
|
@ -7654,7 +7656,7 @@ fn test_check_htlc_underpaying() {
|
|||
let route = get_route(&nodes[0].node.get_our_node_id(), &payment_params, &nodes[0].network_graph.read_only(), None, 10_000, TEST_FINAL_CLTV, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
|
||||
let (_, our_payment_hash, _) = get_payment_preimage_hash!(nodes[0]);
|
||||
let our_payment_secret = nodes[1].node.create_inbound_payment_for_hash(our_payment_hash, Some(100_000), 7200).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -8291,7 +8293,7 @@ fn test_pending_claimed_htlc_no_balance_underflow() {
|
|||
route.payment_params = None; // This is all wrong, but unnecessary
|
||||
route.paths[0][0].pubkey = nodes[0].node.get_our_node_id();
|
||||
let (_, payment_hash_2, payment_secret_2) = get_payment_preimage_hash!(nodes[0]);
|
||||
nodes[1].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2)).unwrap();
|
||||
nodes[1].node.send_payment(&route, payment_hash_2, &Some(payment_secret_2), PaymentId(payment_hash_2.0)).unwrap();
|
||||
|
||||
assert_eq!(nodes[1].node.list_channels()[0].balance_msat, 1_000_000);
|
||||
}
|
||||
|
@ -8674,7 +8676,7 @@ fn test_preimage_storage() {
|
|||
{
|
||||
let (payment_hash, payment_secret) = nodes[1].node.create_inbound_payment(Some(100_000), 7200).unwrap();
|
||||
let (route, _, _, _) = get_route_and_payment_hash!(nodes[0], nodes[1], 100_000);
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
let mut payment_event = SendEvent::from_event(events.pop().unwrap());
|
||||
|
@ -8744,7 +8746,7 @@ fn test_secret_timeout() {
|
|||
|
||||
{
|
||||
let (route, _, _, _) = get_route_and_payment_hash!(nodes[0], nodes[1], 100_000);
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(our_payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
let mut payment_event = SendEvent::from_event(events.pop().unwrap());
|
||||
|
@ -8814,17 +8816,17 @@ fn test_bad_secret_hash() {
|
|||
let expected_error_data = [0, 0, 0, 0, 0, 1, 0x86, 0xa0, 0, 0, 0, CHAN_CONFIRM_DEPTH as u8];
|
||||
|
||||
// Send a payment with the right payment hash but the wrong payment secret
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(random_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(random_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
handle_unknown_invalid_payment_data!(our_payment_hash);
|
||||
expect_payment_failed!(nodes[0], our_payment_hash, true, expected_error_code, expected_error_data);
|
||||
|
||||
// Send a payment with a random payment hash, but the right payment secret
|
||||
nodes[0].node.send_payment(&route, random_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, random_payment_hash, &Some(our_payment_secret), PaymentId(random_payment_hash.0)).unwrap();
|
||||
handle_unknown_invalid_payment_data!(random_payment_hash);
|
||||
expect_payment_failed!(nodes[0], random_payment_hash, true, expected_error_code, expected_error_data);
|
||||
|
||||
// Send a payment with a random payment hash and random payment secret
|
||||
nodes[0].node.send_payment(&route, random_payment_hash, &Some(random_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, random_payment_hash, &Some(random_payment_secret), PaymentId(random_payment_hash.0)).unwrap();
|
||||
handle_unknown_invalid_payment_data!(random_payment_hash);
|
||||
expect_payment_failed!(nodes[0], random_payment_hash, true, expected_error_code, expected_error_data);
|
||||
}
|
||||
|
@ -8969,7 +8971,7 @@ fn test_concurrent_monitor_claim() {
|
|||
// Route another payment to generate another update with still previous HTLC pending
|
||||
let (route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[1], nodes[0], 3000000);
|
||||
{
|
||||
nodes[1].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[1].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
}
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
|
||||
|
@ -9686,7 +9688,7 @@ fn test_forwardable_regen() {
|
|||
|
||||
// First send a payment to nodes[1]
|
||||
let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 100_000);
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -9699,7 +9701,7 @@ fn test_forwardable_regen() {
|
|||
|
||||
// Next send a payment which is forwarded by nodes[1]
|
||||
let (route_2, payment_hash_2, payment_preimage_2, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[2], 200_000);
|
||||
nodes[0].node.send_payment(&route_2, payment_hash_2, &Some(payment_secret_2)).unwrap();
|
||||
nodes[0].node.send_payment(&route_2, payment_hash_2, &Some(payment_secret_2), PaymentId(payment_hash_2.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -9799,7 +9801,7 @@ fn do_test_dup_htlc_second_rejected(test_for_second_fail_panic: bool) {
|
|||
let (our_payment_preimage, our_payment_hash, our_payment_secret) = get_payment_preimage_hash!(&nodes[1]);
|
||||
|
||||
{
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -9811,7 +9813,8 @@ fn do_test_dup_htlc_second_rejected(test_for_second_fail_panic: bool) {
|
|||
expect_payment_received!(nodes[1], our_payment_hash, our_payment_secret, 10_000);
|
||||
|
||||
{
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
// Note that we use a different PaymentId here to allow us to duplicativly pay
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_secret.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -9911,8 +9914,16 @@ fn test_inconsistent_mpp_params() {
|
|||
|
||||
let cur_height = nodes[0].best_block_info().1;
|
||||
let payment_id = PaymentId([42; 32]);
|
||||
|
||||
let session_privs = {
|
||||
// We create a fake route here so that we start with three pending HTLCs, which we'll
|
||||
// ultimately have, just not right away.
|
||||
let mut dup_route = route.clone();
|
||||
dup_route.paths.push(route.paths[1].clone());
|
||||
nodes[0].node.test_add_new_pending_payment(our_payment_hash, Some(our_payment_secret), payment_id, &dup_route).unwrap()
|
||||
};
|
||||
{
|
||||
nodes[0].node.send_payment_along_path(&route.paths[0], &payment_params_opt, &our_payment_hash, &Some(our_payment_secret), 15_000_000, cur_height, payment_id, &None).unwrap();
|
||||
nodes[0].node.send_payment_along_path(&route.paths[0], &payment_params_opt, &our_payment_hash, &Some(our_payment_secret), 15_000_000, cur_height, payment_id, &None, session_privs[0]).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -9922,7 +9933,7 @@ fn test_inconsistent_mpp_params() {
|
|||
assert!(nodes[3].node.get_and_clear_pending_events().is_empty());
|
||||
|
||||
{
|
||||
nodes[0].node.send_payment_along_path(&route.paths[1], &payment_params_opt, &our_payment_hash, &Some(our_payment_secret), 14_000_000, cur_height, payment_id, &None).unwrap();
|
||||
nodes[0].node.send_payment_along_path(&route.paths[1], &payment_params_opt, &our_payment_hash, &Some(our_payment_secret), 14_000_000, cur_height, payment_id, &None, session_privs[1]).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -9967,7 +9978,7 @@ fn test_inconsistent_mpp_params() {
|
|||
|
||||
expect_payment_failed_conditions(&nodes[0], our_payment_hash, true, PaymentFailedConditions::new().mpp_parts_remain());
|
||||
|
||||
nodes[0].node.send_payment_along_path(&route.paths[1], &payment_params_opt, &our_payment_hash, &Some(our_payment_secret), 15_000_000, cur_height, payment_id, &None).unwrap();
|
||||
nodes[0].node.send_payment_along_path(&route.paths[1], &payment_params_opt, &our_payment_hash, &Some(our_payment_secret), 15_000_000, cur_height, payment_id, &None, session_privs[2]).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -9998,7 +10009,7 @@ fn test_keysend_payments_to_public_node() {
|
|||
let route = find_route(&payer_pubkey, &route_params, &network_graph, None, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
|
||||
|
||||
let test_preimage = PaymentPreimage([42; 32]);
|
||||
let (payment_hash, _) = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage)).unwrap();
|
||||
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage), PaymentId(test_preimage.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -10036,7 +10047,7 @@ fn test_keysend_payments_to_private_node() {
|
|||
).unwrap();
|
||||
|
||||
let test_preimage = PaymentPreimage([42; 32]);
|
||||
let (payment_hash, _) = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage)).unwrap();
|
||||
let payment_hash = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage), PaymentId(test_preimage.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -10087,7 +10098,7 @@ fn test_double_partial_claim() {
|
|||
pass_failed_payment_back(&nodes[0], &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], false, payment_hash);
|
||||
|
||||
// nodes[1] now retries one of the two paths...
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 2);
|
||||
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -10139,7 +10150,7 @@ fn do_test_partial_claim_before_restart(persist_both_monitors: bool) {
|
|||
core::cmp::Ordering::Less } else { core::cmp::Ordering::Greater }
|
||||
});
|
||||
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 2);
|
||||
|
||||
// Send the payment through to nodes[3] *without* clearing the PaymentReceived event
|
||||
|
@ -10378,7 +10389,7 @@ fn do_test_max_dust_htlc_exposure(dust_outbound_balance: bool, exposure_breach_e
|
|||
// Note, we need sent payment to be above outbound dust threshold on counterparty_tx of 2132 sats
|
||||
for i in 0..dust_outbound_htlc_on_holder_tx {
|
||||
let (route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], dust_outbound_htlc_on_holder_tx_msat);
|
||||
if let Err(_) = nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)) { panic!("Unexpected event at dust HTLC {}", i); }
|
||||
if let Err(_) = nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)) { panic!("Unexpected event at dust HTLC {}", i); }
|
||||
}
|
||||
} else {
|
||||
// Inbound dust threshold: 2324 sats (`dust_buffer_feerate` * HTLC_SUCCESS_TX_WEIGHT / 1000 + holder's `dust_limit_satoshis`)
|
||||
|
@ -10394,7 +10405,7 @@ fn do_test_max_dust_htlc_exposure(dust_outbound_balance: bool, exposure_breach_e
|
|||
// Outbound dust balance: 5000 sats
|
||||
for i in 0..dust_htlc_on_counterparty_tx {
|
||||
let (route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], dust_htlc_on_counterparty_tx_msat);
|
||||
if let Err(_) = nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)) { panic!("Unexpected event at dust HTLC {}", i); }
|
||||
if let Err(_) = nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)) { panic!("Unexpected event at dust HTLC {}", i); }
|
||||
}
|
||||
} else {
|
||||
// Inbound dust threshold: 2031 sats (`dust_buffer_feerate` * HTLC_TIMEOUT_TX_WEIGHT / 1000 + counteparty's `dust_limit_satoshis`)
|
||||
|
@ -10413,13 +10424,13 @@ fn do_test_max_dust_htlc_exposure(dust_outbound_balance: bool, exposure_breach_e
|
|||
if on_holder_tx {
|
||||
let dust_outbound_overflow = dust_outbound_htlc_on_holder_tx_msat * (dust_outbound_htlc_on_holder_tx + 1);
|
||||
let dust_inbound_overflow = dust_inbound_htlc_on_holder_tx_msat * dust_inbound_htlc_on_holder_tx + dust_outbound_htlc_on_holder_tx_msat;
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable { ref err }, assert_eq!(err, &format!("Cannot send value that would put our exposure to dust HTLCs at {} over the limit {} on holder commitment tx", if dust_outbound_balance { dust_outbound_overflow } else { dust_inbound_overflow }, config.channel_config.max_dust_htlc_exposure_msat)));
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)), true, APIError::ChannelUnavailable { ref err }, assert_eq!(err, &format!("Cannot send value that would put our exposure to dust HTLCs at {} over the limit {} on holder commitment tx", if dust_outbound_balance { dust_outbound_overflow } else { dust_inbound_overflow }, config.channel_config.max_dust_htlc_exposure_msat)));
|
||||
} else {
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable { ref err }, assert_eq!(err, &format!("Cannot send value that would put our exposure to dust HTLCs at {} over the limit {} on counterparty commitment tx", dust_overflow, config.channel_config.max_dust_htlc_exposure_msat)));
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)), true, APIError::ChannelUnavailable { ref err }, assert_eq!(err, &format!("Cannot send value that would put our exposure to dust HTLCs at {} over the limit {} on counterparty commitment tx", dust_overflow, config.channel_config.max_dust_htlc_exposure_msat)));
|
||||
}
|
||||
} else if exposure_breach_event == ExposureEvent::AtHTLCReception {
|
||||
let (route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[1], nodes[0], if on_holder_tx { dust_inbound_htlc_on_holder_tx_msat } else { dust_htlc_on_counterparty_tx_msat });
|
||||
nodes[1].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[1].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
let mut events = nodes[1].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -10437,7 +10448,7 @@ fn do_test_max_dust_htlc_exposure(dust_outbound_balance: bool, exposure_breach_e
|
|||
}
|
||||
} else if exposure_breach_event == ExposureEvent::AtUpdateFeeOutbound {
|
||||
let (route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 2_500_000);
|
||||
if let Err(_) = nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)) { panic!("Unexpected event at update_fee-swallowed HTLC", ); }
|
||||
if let Err(_) = nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)) { panic!("Unexpected event at update_fee-swallowed HTLC", ); }
|
||||
{
|
||||
let mut feerate_lock = chanmon_cfgs[0].fee_estimator.sat_per_kw.lock().unwrap();
|
||||
*feerate_lock = *feerate_lock * 10;
|
||||
|
|
|
@ -13,7 +13,7 @@ use crate::chain::channelmonitor::{ANTI_REORG_DELAY, Balance};
|
|||
use crate::chain::transaction::OutPoint;
|
||||
use crate::chain::chaininterface::LowerBoundedFeeEstimator;
|
||||
use crate::ln::channel;
|
||||
use crate::ln::channelmanager::{self, BREAKDOWN_TIMEOUT};
|
||||
use crate::ln::channelmanager::{self, BREAKDOWN_TIMEOUT, PaymentId};
|
||||
use crate::ln::msgs::ChannelMessageHandler;
|
||||
use crate::util::events::{Event, MessageSendEvent, MessageSendEventsProvider, ClosureReason, HTLCDestination};
|
||||
|
||||
|
@ -52,7 +52,7 @@ fn chanmon_fail_from_stale_commitment() {
|
|||
let (update_a, _, chan_id_2, _) = create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let (route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], 1_000_000);
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let bs_txn = get_local_commitment_txn!(nodes[1], chan_id_2);
|
||||
|
@ -598,7 +598,7 @@ fn test_balances_on_local_commitment_htlcs() {
|
|||
|
||||
let (route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 10_000_000);
|
||||
let htlc_cltv_timeout = nodes[0].best_block_info().1 + TEST_FINAL_CLTV + 1; // Note ChannelManager adds one to CLTV timeouts for safety
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
|
@ -609,7 +609,7 @@ fn test_balances_on_local_commitment_htlcs() {
|
|||
expect_payment_received!(nodes[1], payment_hash, payment_secret, 10_000_000);
|
||||
|
||||
let (route_2, payment_hash_2, payment_preimage_2, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[1], 20_000_000);
|
||||
nodes[0].node.send_payment(&route_2, payment_hash_2, &Some(payment_secret_2)).unwrap();
|
||||
nodes[0].node.send_payment(&route_2, payment_hash_2, &Some(payment_secret_2), PaymentId(payment_hash_2.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
|
|
|
@ -15,7 +15,7 @@ use crate::chain::channelmonitor::{ChannelMonitor, CLTV_CLAIM_BUFFER, LATENCY_GR
|
|||
use crate::chain::keysinterface::{KeysInterface, Recipient};
|
||||
use crate::ln::{PaymentHash, PaymentSecret};
|
||||
use crate::ln::channel::EXPIRE_PREV_CONFIG_TICKS;
|
||||
use crate::ln::channelmanager::{self, ChannelManager, ChannelManagerReadArgs, HTLCForwardInfo, CLTV_FAR_FAR_AWAY, MIN_CLTV_EXPIRY_DELTA, PendingHTLCInfo, PendingHTLCRouting};
|
||||
use crate::ln::channelmanager::{self, ChannelManager, ChannelManagerReadArgs, HTLCForwardInfo, CLTV_FAR_FAR_AWAY, MIN_CLTV_EXPIRY_DELTA, PendingHTLCInfo, PendingHTLCRouting, PaymentId};
|
||||
use crate::ln::onion_utils;
|
||||
use crate::routing::gossip::{NetworkUpdate, RoutingFees, NodeId};
|
||||
use crate::routing::router::{get_route, PaymentParameters, Route, RouteHint, RouteHintHop};
|
||||
|
@ -82,7 +82,8 @@ fn run_onion_failure_test_with_fail_intercept<F1,F2,F3>(_name: &str, test_case:
|
|||
}
|
||||
|
||||
// 0 ~~> 2 send payment
|
||||
nodes[0].node.send_payment(&route, payment_hash.clone(), &Some(*payment_secret)).unwrap();
|
||||
let payment_id = PaymentId(nodes[0].keys_manager.backing.get_secure_random_bytes());
|
||||
nodes[0].node.send_payment(&route, *payment_hash, &Some(*payment_secret), payment_id).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let update_0 = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
// temper update_add (0 => 1)
|
||||
|
@ -212,6 +213,16 @@ fn run_onion_failure_test_with_fail_intercept<F1,F2,F3>(_name: &str, test_case:
|
|||
} else {
|
||||
panic!("Unexpected event");
|
||||
}
|
||||
nodes[0].node.abandon_payment(payment_id);
|
||||
let events = nodes[0].node.get_and_clear_pending_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
match events[0] {
|
||||
Event::PaymentFailed { payment_hash: ev_payment_hash, payment_id: ev_payment_id } => {
|
||||
assert_eq!(*payment_hash, ev_payment_hash);
|
||||
assert_eq!(payment_id, ev_payment_id);
|
||||
}
|
||||
_ => panic!("Unexpected second event"),
|
||||
}
|
||||
}
|
||||
|
||||
impl msgs::ChannelUpdate {
|
||||
|
@ -274,7 +285,7 @@ fn test_fee_failures() {
|
|||
|
||||
// positive case
|
||||
let (route, payment_hash_success, payment_preimage_success, payment_secret_success) = get_route_and_payment_hash!(nodes[0], nodes[2], 40_000);
|
||||
nodes[0].node.send_payment(&route, payment_hash_success, &Some(payment_secret_success)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_success, &Some(payment_secret_success), PaymentId(payment_hash_success.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
pass_along_route(&nodes[0], &[&[&nodes[1], &nodes[2]]], 40_000, payment_hash_success, payment_secret_success);
|
||||
claim_payment(&nodes[0], &[&nodes[1], &nodes[2]], payment_preimage_success);
|
||||
|
@ -295,7 +306,7 @@ fn test_fee_failures() {
|
|||
}
|
||||
|
||||
let (payment_preimage_success, payment_hash_success, payment_secret_success) = get_payment_preimage_hash!(nodes[2]);
|
||||
nodes[0].node.send_payment(&route, payment_hash_success, &Some(payment_secret_success)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash_success, &Some(payment_secret_success), PaymentId(payment_hash_success.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
pass_along_route(&nodes[0], &[&[&nodes[1], &nodes[2]]], 40_000, payment_hash_success, payment_secret_success);
|
||||
claim_payment(&nodes[0], &[&nodes[1], &nodes[2]], payment_preimage_success);
|
||||
|
@ -1011,7 +1022,7 @@ fn test_phantom_onion_hmac_failure() {
|
|||
let (route, phantom_scid) = get_phantom_route!(nodes, recv_value_msat, channel);
|
||||
|
||||
// Route the HTLC through to the destination.
|
||||
nodes[0].node.send_payment(&route, payment_hash.clone(), &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let update_0 = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
let mut update_add = update_0.update_add_htlcs[0].clone();
|
||||
|
@ -1072,7 +1083,7 @@ fn test_phantom_invalid_onion_payload() {
|
|||
// We'll use the session priv later when constructing an invalid onion packet.
|
||||
let session_priv = [3; 32];
|
||||
*nodes[0].keys_manager.override_random_bytes.lock().unwrap() = Some(session_priv);
|
||||
nodes[0].node.send_payment(&route, payment_hash.clone(), &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let update_0 = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
let mut update_add = update_0.update_add_htlcs[0].clone();
|
||||
|
@ -1143,7 +1154,7 @@ fn test_phantom_final_incorrect_cltv_expiry() {
|
|||
let (route, phantom_scid) = get_phantom_route!(nodes, recv_value_msat, channel);
|
||||
|
||||
// Route the HTLC through to the destination.
|
||||
nodes[0].node.send_payment(&route, payment_hash.clone(), &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let update_0 = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
let mut update_add = update_0.update_add_htlcs[0].clone();
|
||||
|
@ -1202,7 +1213,7 @@ fn test_phantom_failure_too_low_cltv() {
|
|||
route.paths[0][1].cltv_expiry_delta = 5;
|
||||
|
||||
// Route the HTLC through to the destination.
|
||||
nodes[0].node.send_payment(&route, payment_hash.clone(), &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let update_0 = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
let mut update_add = update_0.update_add_htlcs[0].clone();
|
||||
|
@ -1245,7 +1256,7 @@ fn test_phantom_failure_too_low_recv_amt() {
|
|||
let (mut route, phantom_scid) = get_phantom_route!(nodes, bad_recv_amt_msat, channel);
|
||||
|
||||
// Route the HTLC through to the destination.
|
||||
nodes[0].node.send_payment(&route, payment_hash.clone(), &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let update_0 = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
let mut update_add = update_0.update_add_htlcs[0].clone();
|
||||
|
@ -1297,7 +1308,7 @@ fn test_phantom_dust_exposure_failure() {
|
|||
let (mut route, _) = get_phantom_route!(nodes, max_dust_exposure + 1, channel);
|
||||
|
||||
// Route the HTLC through to the destination.
|
||||
nodes[0].node.send_payment(&route, payment_hash.clone(), &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let update_0 = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
let mut update_add = update_0.update_add_htlcs[0].clone();
|
||||
|
@ -1340,7 +1351,7 @@ fn test_phantom_failure_reject_payment() {
|
|||
let (mut route, phantom_scid) = get_phantom_route!(nodes, recv_amt_msat, channel);
|
||||
|
||||
// Route the HTLC through to the destination.
|
||||
nodes[0].node.send_payment(&route, payment_hash.clone(), &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let update_0 = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
let mut update_add = update_0.update_add_htlcs[0].clone();
|
||||
|
|
|
@ -53,7 +53,8 @@ fn retry_single_path_payment() {
|
|||
send_payment(&nodes[1], &vec!(&nodes[2])[..], 2_000_000);
|
||||
|
||||
// Make sure the payment fails on the first hop.
|
||||
let payment_id = nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
let payment_id = PaymentId(payment_hash.0);
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), payment_id).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -138,7 +139,8 @@ fn mpp_retry() {
|
|||
route.paths[1][1].short_channel_id = chan_4_update.contents.short_channel_id;
|
||||
|
||||
// Initiate the MPP payment.
|
||||
let payment_id = nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
let payment_id = PaymentId(payment_hash.0);
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), payment_id).unwrap();
|
||||
check_added_monitors!(nodes[0], 2); // one monitor per path
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 2);
|
||||
|
@ -222,7 +224,7 @@ fn do_mpp_receive_timeout(send_partial_mpp: bool) {
|
|||
route.paths[1][1].short_channel_id = chan_4_update.contents.short_channel_id;
|
||||
|
||||
// Initiate the MPP payment.
|
||||
let _ = nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 2); // one monitor per path
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 2);
|
||||
|
@ -290,7 +292,7 @@ fn retry_expired_payment() {
|
|||
send_payment(&nodes[1], &vec!(&nodes[2])[..], 2_000_000);
|
||||
|
||||
// Make sure the payment fails on the first hop.
|
||||
let payment_id = nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -314,7 +316,7 @@ fn retry_expired_payment() {
|
|||
connect_blocks(&nodes[0], 3);
|
||||
|
||||
// Retry the payment and make sure it errors as expected.
|
||||
if let Err(PaymentSendFailure::ParameterError(APIError::APIMisuseError { err })) = nodes[0].node.retry_payment(&route, payment_id) {
|
||||
if let Err(PaymentSendFailure::ParameterError(APIError::APIMisuseError { err })) = nodes[0].node.retry_payment(&route, PaymentId(payment_hash.0)) {
|
||||
assert!(err.contains("not found"));
|
||||
} else {
|
||||
panic!("Unexpected error");
|
||||
|
@ -341,7 +343,7 @@ fn no_pending_leak_on_initial_send_failure() {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)),
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)),
|
||||
true, APIError::ChannelUnavailable { ref err },
|
||||
assert_eq!(err, "Peer for first hop currently disconnected/pending monitor update!"));
|
||||
|
||||
|
@ -378,7 +380,7 @@ fn do_retry_with_no_persist(confirm_before_reload: bool) {
|
|||
// out and retry.
|
||||
let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], 1_000_000);
|
||||
let (payment_preimage_1, payment_hash_1, _, payment_id_1) = send_along_route(&nodes[0], route.clone(), &[&nodes[1], &nodes[2]], 1_000_000);
|
||||
let payment_id = nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -543,7 +545,7 @@ fn do_retry_with_no_persist(confirm_before_reload: bool) {
|
|||
}
|
||||
|
||||
assert!(nodes[0].node.retry_payment(&new_route, payment_id_1).is_err()); // Shouldn't be allowed to retry a fulfilled payment
|
||||
nodes[0].node.retry_payment(&new_route, payment_id).unwrap();
|
||||
nodes[0].node.retry_payment(&new_route, PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -1060,7 +1062,7 @@ fn get_ldk_payment_preimage() {
|
|||
&nodes[0].node.get_our_node_id(), &payment_params, &nodes[0].network_graph.read_only(),
|
||||
Some(&nodes[0].node.list_usable_channels().iter().collect::<Vec<_>>()),
|
||||
amt_msat, TEST_FINAL_CLTV, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
|
||||
let _payment_id = nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
// Make sure to use `get_payment_preimage`
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
use crate::chain::{ChannelMonitorUpdateStatus, Watch};
|
||||
use crate::chain::channelmonitor::ChannelMonitor;
|
||||
use crate::chain::keysinterface::{Recipient, KeysInterface};
|
||||
use crate::ln::channelmanager::{self, ChannelManager, ChannelManagerReadArgs, MIN_CLTV_EXPIRY_DELTA};
|
||||
use crate::ln::channelmanager::{self, ChannelManager, ChannelManagerReadArgs, MIN_CLTV_EXPIRY_DELTA, PaymentId};
|
||||
use crate::routing::gossip::RoutingFees;
|
||||
use crate::routing::router::{PaymentParameters, RouteHint, RouteHintHop};
|
||||
use crate::ln::features::ChannelTypeFeatures;
|
||||
|
@ -77,7 +77,7 @@ fn test_priv_forwarding_rejection() {
|
|||
.with_route_hints(last_hops);
|
||||
let (route, our_payment_hash, our_payment_preimage, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, 10_000, TEST_FINAL_CLTV);
|
||||
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let payment_event = SendEvent::from_event(nodes[0].node.get_and_clear_pending_msg_events().remove(0));
|
||||
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &payment_event.msgs[0]);
|
||||
|
@ -162,7 +162,7 @@ fn test_priv_forwarding_rejection() {
|
|||
get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, nodes[2].node.get_our_node_id());
|
||||
get_event_msg!(nodes[2], MessageSendEvent::SendChannelUpdate, nodes[1].node.get_our_node_id());
|
||||
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
pass_along_route(&nodes[0], &[&[&nodes[1], &nodes[2]]], 10_000, our_payment_hash, our_payment_secret);
|
||||
claim_payment(&nodes[0], &[&nodes[1], &nodes[2]], our_payment_preimage);
|
||||
|
@ -280,7 +280,7 @@ fn test_routed_scid_alias() {
|
|||
.with_route_hints(hop_hints);
|
||||
let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, 100_000, 42);
|
||||
assert_eq!(route.paths[0][1].short_channel_id, last_hop[0].inbound_scid_alias.unwrap());
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
pass_along_route(&nodes[0], &[&[&nodes[1], &nodes[2]]], 100_000, payment_hash, payment_secret);
|
||||
|
@ -433,7 +433,7 @@ fn test_inbound_scid_privacy() {
|
|||
.with_route_hints(hop_hints.clone());
|
||||
let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, 100_000, 42);
|
||||
assert_eq!(route.paths[0][1].short_channel_id, last_hop[0].inbound_scid_alias.unwrap());
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
pass_along_route(&nodes[0], &[&[&nodes[1], &nodes[2]]], 100_000, payment_hash, payment_secret);
|
||||
|
@ -448,7 +448,7 @@ fn test_inbound_scid_privacy() {
|
|||
.with_route_hints(hop_hints);
|
||||
let (route_2, payment_hash_2, _, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params_2, 100_000, 42);
|
||||
assert_eq!(route_2.paths[0][1].short_channel_id, last_hop[0].short_channel_id.unwrap());
|
||||
nodes[0].node.send_payment(&route_2, payment_hash_2, &Some(payment_secret_2)).unwrap();
|
||||
nodes[0].node.send_payment(&route_2, payment_hash_2, &Some(payment_secret_2), PaymentId(payment_hash_2.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let payment_event = SendEvent::from_node(&nodes[0]);
|
||||
|
@ -503,7 +503,7 @@ fn test_scid_alias_returned() {
|
|||
route.paths[0][1].fee_msat = 10_000_000; // Overshoot the last channel's value
|
||||
|
||||
// Route the HTLC through to the destination.
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let as_updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &as_updates.update_add_htlcs[0]);
|
||||
|
@ -547,7 +547,7 @@ fn test_scid_alias_returned() {
|
|||
route.paths[0][0].fee_msat = 0; // But set fee paid to the middle hop to 0
|
||||
|
||||
// Route the HTLC through to the destination.
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let as_updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &as_updates.update_add_htlcs[0]);
|
||||
|
@ -697,7 +697,7 @@ fn test_0conf_channel_with_async_monitor() {
|
|||
// failure before we've ever confirmed the funding transaction. This previously caused a panic.
|
||||
let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], 1_000_000);
|
||||
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
let as_send = SendEvent::from_node(&nodes[0]);
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
|
||||
use crate::chain::keysinterface::KeysInterface;
|
||||
use crate::chain::transaction::OutPoint;
|
||||
use crate::ln::channelmanager::{self, PaymentSendFailure};
|
||||
use crate::ln::channelmanager::{self, PaymentSendFailure, PaymentId};
|
||||
use crate::routing::router::{PaymentParameters, get_route};
|
||||
use crate::ln::msgs;
|
||||
use crate::ln::msgs::{ChannelMessageHandler, ErrorAction};
|
||||
|
@ -97,8 +97,8 @@ fn updates_shutdown_wait() {
|
|||
let route_1 = get_route(&nodes[0].node.get_our_node_id(), &payment_params_1, &nodes[0].network_graph.read_only(), None, 100000, TEST_FINAL_CLTV, &logger, &scorer, &random_seed_bytes).unwrap();
|
||||
let payment_params_2 = PaymentParameters::from_node_id(nodes[0].node.get_our_node_id()).with_features(channelmanager::provided_invoice_features());
|
||||
let route_2 = get_route(&nodes[1].node.get_our_node_id(), &payment_params_2, &nodes[1].network_graph.read_only(), None, 100000, TEST_FINAL_CLTV, &logger, &scorer, &random_seed_bytes).unwrap();
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route_1, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});
|
||||
unwrap_send_err!(nodes[1].node.send_payment(&route_2, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route_1, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)), true, APIError::ChannelUnavailable {..}, {});
|
||||
unwrap_send_err!(nodes[1].node.send_payment(&route_2, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)), true, APIError::ChannelUnavailable {..}, {});
|
||||
|
||||
nodes[2].node.claim_funds(payment_preimage_0);
|
||||
check_added_monitors!(nodes[2], 1);
|
||||
|
@ -158,7 +158,7 @@ fn htlc_fail_async_shutdown() {
|
|||
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], 100000);
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
|
||||
assert_eq!(updates.update_add_htlcs.len(), 1);
|
||||
|
|
Loading…
Add table
Reference in a new issue