+/// A [`CandidateRouteHop::FirstHop`] entry.
+#[derive(Clone, Debug)]
+pub struct CandidateFirstHop<'a> {
+ /// Channel details of the first hop
+ ///
+ /// [`ChannelDetails::get_outbound_payment_scid`] MUST be `Some` (indicating the channel
+ /// has been funded and is able to pay), and accessor methods may panic otherwise.
+ ///
+ /// [`find_route`] validates this prior to constructing a [`CandidateRouteHop`].
+ pub details: &'a ChannelDetails,
+ /// The node id of the payer, which is also the source side of this candidate route hop.
+ pub payer_node_id: &'a NodeId,
+ /// A unique ID which describes the payer. It will not conlict with any
+ /// [`NodeInfo::node_counter`]s, but may be equal to one if the payer is a public node.
+ payer_node_counter: u32,
+ /// A unique ID which describes the first hop counterparty. It will not conlict with any
+ /// [`NodeInfo::node_counter`]s, but may be equal to one if the counterparty is a public node.
+ target_node_counter: u32,
+}
+
+/// A [`CandidateRouteHop::PublicHop`] entry.
+#[derive(Clone, Debug)]
+pub struct CandidatePublicHop<'a> {
+ /// Information about the channel, including potentially its capacity and
+ /// direction-specific information.
+ pub info: DirectedChannelInfo<'a>,
+ /// The short channel ID of the channel, i.e. the identifier by which we refer to this
+ /// channel.
+ pub short_channel_id: u64,
+}
+
+/// A [`CandidateRouteHop::PrivateHop`] entry.
+#[derive(Clone, Debug)]
+pub struct CandidatePrivateHop<'a> {
+ /// Information about the private hop communicated via BOLT 11.
+ pub hint: &'a RouteHintHop,
+ /// Node id of the next hop in BOLT 11 route hint.
+ pub target_node_id: &'a NodeId,
+ /// A unique ID which describes the source node of the hop (further from the payment target).
+ /// It will not conlict with any [`NodeInfo::node_counter`]s, but may be equal to one if the
+ /// node is a public node.
+ source_node_counter: u32,
+ /// A unique ID which describes the destination node of the hop (towards the payment target).
+ /// It will not conlict with any [`NodeInfo::node_counter`]s, but may be equal to one if the
+ /// node is a public node.
+ target_node_counter: u32,
+
+}
+
+/// A [`CandidateRouteHop::Blinded`] entry.
+#[derive(Clone, Debug)]
+pub struct CandidateBlindedPath<'a> {
+ /// Information about the blinded path including the fee, HTLC amount limits, and
+ /// cryptographic material required to build an HTLC through the given path.
+ pub hint: &'a (BlindedPayInfo, BlindedPath),
+ /// Index of the hint in the original list of blinded hints.
+ ///
+ /// This is used to cheaply uniquely identify this blinded path, even though we don't have
+ /// a short channel ID for this hop.
+ hint_idx: usize,
+ /// A unique ID which describes the introduction point of the blinded path.
+ /// It will not conlict with any [`NodeInfo::node_counter`]s, but will generally be equal to
+ /// one from the public network graph (assuming the introduction point is a public node).
+ source_node_counter: u32,
+}
+
+/// A [`CandidateRouteHop::OneHopBlinded`] entry.
+#[derive(Clone, Debug)]
+pub struct CandidateOneHopBlindedPath<'a> {
+ /// Information about the blinded path including the fee, HTLC amount limits, and
+ /// cryptographic material required to build an HTLC terminating with the given path.
+ ///
+ /// Note that the [`BlindedPayInfo`] is ignored here.
+ pub hint: &'a (BlindedPayInfo, BlindedPath),
+ /// Index of the hint in the original list of blinded hints.
+ ///
+ /// This is used to cheaply uniquely identify this blinded path, even though we don't have
+ /// a short channel ID for this hop.
+ hint_idx: usize,
+ /// A unique ID which describes the introduction point of the blinded path.
+ /// It will not conlict with any [`NodeInfo::node_counter`]s, but will generally be equal to
+ /// one from the public network graph (assuming the introduction point is a public node).
+ source_node_counter: u32,
+}
+