@@ -19,7 +19,7 @@ use crate::ln::channelmanager::{self, ChannelManager, ChannelManagerReadArgs, HT
1919use crate :: ln:: onion_utils;
2020use crate :: routing:: gossip:: { NetworkUpdate , RoutingFees } ;
2121use crate :: routing:: router:: { get_route, PaymentParameters , Route , RouteHint , RouteHintHop } ;
22- use crate :: ln:: features:: InitFeatures ;
22+ use crate :: ln:: features:: { InitFeatures , InvoiceFeatures } ;
2323use crate :: ln:: msgs;
2424use crate :: ln:: msgs:: { ChannelMessageHandler , ChannelUpdate } ;
2525use crate :: ln:: wire:: Encode ;
@@ -790,6 +790,56 @@ fn test_onion_failure_stale_channel_update() {
790790 do_test_onion_failure_stale_channel_update ( true ) ;
791791}
792792
793+ #[ test]
794+ fn test_always_create_tlv_format_onion_payloads ( ) {
795+ // Verify that we always generate tlv onion format payloads, even if the features specifically
796+ // specifies no support for variable length onions, as the legacy payload format has been
797+ // deprecated in BOLT4.
798+ let chanmon_cfgs = create_chanmon_cfgs ( 3 ) ;
799+ let mut node_cfgs = create_node_cfgs ( 3 , & chanmon_cfgs) ;
800+
801+ // Set `node[1]`'s config features to features which return `false` for
802+ // `supports_variable_length_onion()`
803+ let mut no_variable_length_onion_features = InitFeatures :: empty ( ) ;
804+ no_variable_length_onion_features. set_static_remote_key_required ( ) ;
805+ let mut node_1_cfg = & mut node_cfgs[ 1 ] ;
806+ node_1_cfg. features = no_variable_length_onion_features;
807+
808+ let node_chanmgrs = create_node_chanmgrs ( 3 , & node_cfgs, & [ None , None , None ] ) ;
809+ let mut nodes = create_network ( 3 , & node_cfgs, & node_chanmgrs) ;
810+
811+ create_announced_chan_between_nodes ( & nodes, 0 , 1 , InitFeatures :: empty ( ) , InitFeatures :: empty ( ) ) ;
812+ create_announced_chan_between_nodes ( & nodes, 1 , 2 , InitFeatures :: empty ( ) , InitFeatures :: empty ( ) ) ;
813+
814+ let payment_params = PaymentParameters :: from_node_id ( nodes[ 2 ] . node . get_our_node_id ( ) )
815+ . with_features ( InvoiceFeatures :: empty ( ) ) ;
816+ let ( route, _payment_hash, _payment_preimage, _payment_secret) = get_route_and_payment_hash ! ( nodes[ 0 ] , nodes[ 2 ] , payment_params, 40000 , TEST_FINAL_CLTV ) ;
817+
818+ let hops = & route. paths [ 0 ] ;
819+ // Asserts that the first hop to `node[1]` signals no support for variable length onions.
820+ assert ! ( !hops[ 0 ] . node_features. supports_variable_length_onion( ) ) ;
821+ // Asserts that the first hop to `node[1]` signals no support for variable length onions.
822+ assert ! ( !hops[ 1 ] . node_features. supports_variable_length_onion( ) ) ;
823+
824+ let cur_height = nodes[ 0 ] . best_block_info ( ) . 1 + 1 ;
825+ let ( onion_payloads, _htlc_msat, _htlc_cltv) = onion_utils:: build_onion_payloads ( & route. paths [ 0 ] , 40000 , & None , cur_height, & None ) . unwrap ( ) ;
826+
827+ match onion_payloads[ 0 ] . format {
828+ msgs:: OnionHopDataFormat :: NonFinalNode { ..} => { } ,
829+ _ => { panic ! (
830+ "Should have generated a `msgs::OnionHopDataFormat::NonFinalNode` payload for `hops[0]`,
831+ despite that the features signals no support for variable length onions"
832+ ) }
833+ }
834+ match onion_payloads[ 1 ] . format {
835+ msgs:: OnionHopDataFormat :: FinalNode { ..} => { } ,
836+ _ => { panic ! (
837+ "Should have generated a `msgs::OnionHopDataFormat::FinalNode` payload for `hops[1]`,
838+ despite that the features signals no support for variable length onions"
839+ ) }
840+ }
841+ }
842+
793843macro_rules! get_phantom_route {
794844 ( $nodes: expr, $amt: expr, $channel: expr) => { {
795845 let secp_ctx = Secp256k1 :: new( ) ;
0 commit comments