channel_value_satoshis: u64,
/// The script which should be used in the transaction output.
output_script: Script,
- /// The value passed in to ChannelManager::create_channel
+ /// The `user_channel_id` value passed in to [`ChannelManager::create_channel`], or 0 for
+ /// an inbound channel.
+ ///
+ /// [`ChannelManager::create_channel`]: crate::ln::channelmanager::ChannelManager::create_channel
user_channel_id: u64,
},
/// Indicates we've received money! Just gotta dig out that payment preimage and feed it to
all_paths_failed: bool,
/// The payment path that failed.
path: Vec<RouteHop>,
+ /// The channel responsible for the failed payment path.
+ ///
+ /// If this is `Some`, then the corresponding channel should be avoided when the payment is
+ /// retried. May be `None` for older [`Event`] serializations.
+ short_channel_id: Option<u64>,
#[cfg(test)]
error_code: Option<u16>,
#[cfg(test)]
/// The channel_id of the channel which has been closed. Note that on-chain transactions
/// resolving the channel are likely still awaiting confirmation.
channel_id: [u8; 32],
+ /// The `user_channel_id` value passed in to [`ChannelManager::create_channel`], or 0 for
+ /// an inbound channel. This will always be zero for objects serialized with LDK versions
+ /// prior to 0.0.102.
+ ///
+ /// [`ChannelManager::create_channel`]: crate::ln::channelmanager::ChannelManager::create_channel
+ user_channel_id: u64,
/// The reason the channel was closed.
reason: ClosureReason
},
});
},
&Event::PaymentPathFailed { ref payment_hash, ref rejected_by_dest, ref network_update,
- ref all_paths_failed, ref path,
+ ref all_paths_failed, ref path, ref short_channel_id,
#[cfg(test)]
ref error_code,
#[cfg(test)]
(2, rejected_by_dest, required),
(3, all_paths_failed, required),
(5, path, vec_type),
+ (7, short_channel_id, option),
});
},
&Event::PendingHTLCsForwardable { time_forwardable: _ } => {
(2, claim_from_onchain_tx, required),
});
},
- &Event::ChannelClosed { ref channel_id, ref reason } => {
+ &Event::ChannelClosed { ref channel_id, ref user_channel_id, ref reason } => {
9u8.write(writer)?;
write_tlv_fields!(writer, {
(0, channel_id, required),
+ (1, user_channel_id, required),
(2, reason, required)
});
},
let mut network_update = None;
let mut all_paths_failed = Some(true);
let mut path: Option<Vec<RouteHop>> = Some(vec![]);
+ let mut short_channel_id = None;
read_tlv_fields!(reader, {
(0, payment_hash, required),
(1, network_update, ignorable),
(2, rejected_by_dest, required),
(3, all_paths_failed, option),
(5, path, vec_type),
+ (7, short_channel_id, ignorable),
});
Ok(Some(Event::PaymentPathFailed {
payment_hash,
network_update,
all_paths_failed: all_paths_failed.unwrap(),
path: path.unwrap(),
+ short_channel_id,
#[cfg(test)]
error_code,
#[cfg(test)]
let f = || {
let mut channel_id = [0; 32];
let mut reason = None;
+ let mut user_channel_id_opt = None;
read_tlv_fields!(reader, {
(0, channel_id, required),
+ (1, user_channel_id_opt, option),
(2, reason, ignorable),
});
if reason.is_none() { return Ok(None); }
- Ok(Some(Event::ChannelClosed { channel_id, reason: reason.unwrap() }))
+ let user_channel_id = if let Some(id) = user_channel_id_opt { id } else { 0 };
+ Ok(Some(Event::ChannelClosed { channel_id, user_channel_id, reason: reason.unwrap() }))
};
f()
},