@@ -56,7 +56,7 @@ use crate::types::features::{Bolt12InvoiceFeatures, ChannelFeatures, ChannelType
56
56
#[cfg(any(feature = "_test_utils", test))]
57
57
use crate::types::features::Bolt11InvoiceFeatures;
58
58
use crate::routing::router::{BlindedTail, FixedRouter, InFlightHtlcs, Path, Payee, PaymentParameters, Route, RouteParameters, Router};
59
- use crate::ln::onion_payment::{check_incoming_htlc_cltv, create_recv_pending_htlc_info, create_fwd_pending_htlc_info, decode_incoming_update_add_htlc_onion, InboundHTLCErr, NextPacketDetails};
59
+ use crate::ln::onion_payment::{check_incoming_htlc_cltv, create_recv_pending_htlc_info, create_fwd_pending_htlc_info, decode_incoming_update_add_htlc_onion, InboundHTLCErr, NextPacketDetails, HopConnector };
60
60
use crate::ln::msgs;
61
61
use crate::ln::onion_utils;
62
62
use crate::ln::onion_utils::{HTLCFailReason, INVALID_ONION_BLINDING};
@@ -4262,11 +4262,15 @@ where
4262
4262
// we don't allow forwards outbound over them.
4263
4263
return Err(("Refusing to forward to a private channel based on our config.", 0x4000 | 10));
4264
4264
}
4265
- if chan.context.get_channel_type().supports_scid_privacy() && next_packet.outgoing_scid != chan.context.outbound_scid_alias() {
4266
- // `option_scid_alias` (referred to in LDK as `scid_privacy`) means
4267
- // "refuse to forward unless the SCID alias was used", so we pretend
4268
- // we don't have the channel here.
4269
- return Err(("Refusing to forward over real channel SCID as our counterparty requested.", 0x4000 | 10));
4265
+ if let HopConnector::ShortChannelId(outgoing_scid) = next_packet.outgoing_connector {
4266
+ if chan.context.get_channel_type().supports_scid_privacy() && outgoing_scid != chan.context.outbound_scid_alias() {
4267
+ // `option_scid_alias` (referred to in LDK as `scid_privacy`) means
4268
+ // "refuse to forward unless the SCID alias was used", so we pretend
4269
+ // we don't have the channel here.
4270
+ return Err(("Refusing to forward over real channel SCID as our counterparty requested.", 0x4000 | 10));
4271
+ }
4272
+ } else {
4273
+ return Err(("Cannot forward by Node ID without SCID.", 0x4000 | 10));
4270
4274
}
4271
4275
4272
4276
// Note that we could technically not return an error yet here and just hope
@@ -4318,7 +4322,13 @@ where
4318
4322
fn can_forward_htlc(
4319
4323
&self, msg: &msgs::UpdateAddHTLC, next_packet_details: &NextPacketDetails
4320
4324
) -> Result<(), (&'static str, u16)> {
4321
- match self.do_funded_channel_callback(next_packet_details.outgoing_scid, |chan: &mut FundedChannel<SP>| {
4325
+ let outgoing_scid = match next_packet_details.outgoing_connector {
4326
+ HopConnector::ShortChannelId(scid) => scid,
4327
+ HopConnector::Trampoline { .. } => {
4328
+ return Err(("Cannot forward by Node ID without SCID.", 0x4000 | 10));
4329
+ }
4330
+ };
4331
+ match self.do_funded_channel_callback(outgoing_scid, |chan: &mut FundedChannel<SP>| {
4322
4332
self.can_forward_htlc_to_outgoing_channel(chan, msg, next_packet_details)
4323
4333
}) {
4324
4334
Some(Ok(())) => {},
@@ -4327,8 +4337,8 @@ where
4327
4337
// If we couldn't find the channel info for the scid, it may be a phantom or
4328
4338
// intercept forward.
4329
4339
if (self.default_configuration.accept_intercept_htlcs &&
4330
- fake_scid::is_valid_intercept(&self.fake_scid_rand_bytes, next_packet_details. outgoing_scid, &self.chain_hash)) ||
4331
- fake_scid::is_valid_phantom(&self.fake_scid_rand_bytes, next_packet_details. outgoing_scid, &self.chain_hash)
4340
+ fake_scid::is_valid_intercept(&self.fake_scid_rand_bytes, outgoing_scid, &self.chain_hash)) ||
4341
+ fake_scid::is_valid_phantom(&self.fake_scid_rand_bytes, outgoing_scid, &self.chain_hash)
4332
4342
{} else {
4333
4343
return Err(("Don't have available channel for forwarding as requested.", 0x4000 | 10));
4334
4344
}
@@ -5680,7 +5690,12 @@ where
5680
5690
};
5681
5691
5682
5692
let is_intro_node_blinded_forward = next_hop.is_intro_node_blinded_forward();
5683
- let outgoing_scid_opt = next_packet_details_opt.as_ref().map(|d| d.outgoing_scid);
5693
+ let outgoing_scid_opt = next_packet_details_opt.as_ref().and_then(|d| {
5694
+ match d.outgoing_connector {
5695
+ HopConnector::ShortChannelId(scid) => { Some(scid) }
5696
+ HopConnector::Trampoline { .. } => { None }
5697
+ }
5698
+ });
5684
5699
5685
5700
// Process the HTLC on the incoming channel.
5686
5701
match self.do_funded_channel_callback(incoming_scid, |chan: &mut FundedChannel<SP>| {
0 commit comments