@@ -19,7 +19,7 @@ use crate::ln::channelmanager::{self, ChannelManager, ChannelManagerReadArgs, HT
19
19
use crate :: ln:: onion_utils;
20
20
use crate :: routing:: gossip:: { NetworkUpdate , RoutingFees } ;
21
21
use crate :: routing:: router:: { get_route, PaymentParameters , Route , RouteHint , RouteHintHop } ;
22
- use crate :: ln:: features:: InitFeatures ;
22
+ use crate :: ln:: features:: { InitFeatures , InvoiceFeatures } ;
23
23
use crate :: ln:: msgs;
24
24
use crate :: ln:: msgs:: { ChannelMessageHandler , ChannelUpdate } ;
25
25
use crate :: ln:: wire:: Encode ;
@@ -790,6 +790,56 @@ fn test_onion_failure_stale_channel_update() {
790
790
do_test_onion_failure_stale_channel_update ( true ) ;
791
791
}
792
792
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
+
793
843
macro_rules! get_phantom_route {
794
844
( $nodes: expr, $amt: expr, $channel: expr) => { {
795
845
let secp_ctx = Secp256k1 :: new( ) ;
0 commit comments