@@ -2878,10 +2878,10 @@ mod tests {
28782878 use crate :: ln:: { PaymentPreimage , PaymentHash , PaymentSecret } ;
28792879 use crate :: ln:: ChannelId ;
28802880 use crate :: ln:: features:: { ChannelFeatures , ChannelTypeFeatures , InitFeatures , NodeFeatures } ;
2881- use crate :: ln:: msgs:: { self , FinalOnionHopData , OnionErrorPacket } ;
2881+ use crate :: ln:: msgs:: { self , FinalOnionHopData , OnionErrorPacket , VariableLengthOnionPacket } ;
28822882 use crate :: ln:: msgs:: SocketAddress ;
28832883 use crate :: routing:: gossip:: { NodeAlias , NodeId } ;
2884- use crate :: util:: ser:: { Writeable , Readable , ReadableArgs , Hostname , TransactionU16LenLimited } ;
2884+ use crate :: util:: ser:: { Writeable , Readable , ReadableArgs , Hostname , TransactionU16LenLimited , BigSize } ;
28852885 use crate :: util:: test_utils;
28862886
28872887 use bitcoin:: hashes:: hex:: FromHex ;
@@ -4171,6 +4171,45 @@ mod tests {
41714171 } else { panic ! ( ) ; }
41724172 }
41734173
4174+ #[ test]
4175+ fn encoding_final_onion_hop_data_with_trampoline_packet ( ) {
4176+ let secp_ctx = Secp256k1 :: new ( ) ;
4177+ let ( private_key, public_key) = get_keys_from ! ( "0101010101010101010101010101010101010101010101010101010101010101" , secp_ctx) ;
4178+
4179+ let compressed_public_key = public_key. serialize ( ) ;
4180+ assert_eq ! ( compressed_public_key. len( ) , 33 ) ;
4181+
4182+ let trampoline_packet = VariableLengthOnionPacket {
4183+ version : 0 ,
4184+ public_key : Ok ( public_key) ,
4185+ hop_data : vec ! [ 1 ; 650 ] , // this should be the standard encoded length
4186+ hmac : [ 2 ; 32 ] ,
4187+ } ;
4188+ let encoded_trampoline_packet = trampoline_packet. encode ( ) ;
4189+ assert_eq ! ( encoded_trampoline_packet. len( ) , 718 ) ;
4190+
4191+ let msg = msgs:: OutboundOnionPayload :: Receive {
4192+ payment_data : None ,
4193+ payment_metadata : None ,
4194+ keysend_preimage : None ,
4195+ custom_tlvs : Vec :: new ( ) ,
4196+ amt_msat : 0x0badf00d01020304 ,
4197+ outgoing_cltv_value : 0xffffffff ,
4198+ trampoline_packet : Some ( trampoline_packet)
4199+ } ;
4200+ let encoded_payload = msg. encode ( ) ;
4201+
4202+ let trampoline_type_bytes = & encoded_payload[ 19 ..=23 ] ;
4203+ let mut trampoline_type_cursor = Cursor :: new ( trampoline_type_bytes) ;
4204+ let trampoline_type_big_size: BigSize = Readable :: read ( & mut trampoline_type_cursor) . unwrap ( ) ;
4205+ assert_eq ! ( trampoline_type_big_size. 0 , 66100 ) ;
4206+
4207+ let trampoline_length_bytes = & encoded_payload[ 24 ..=26 ] ;
4208+ let mut trampoline_length_cursor = Cursor :: new ( trampoline_length_bytes) ;
4209+ let trampoline_length_big_size: BigSize = Readable :: read ( & mut trampoline_length_cursor) . unwrap ( ) ;
4210+ assert_eq ! ( trampoline_length_big_size. 0 , encoded_trampoline_packet. len( ) as u64 ) ;
4211+ }
4212+
41744213 #[ test]
41754214 fn query_channel_range_end_blocknum ( ) {
41764215 let tests: Vec < ( u32 , u32 , u32 ) > = vec ! [
0 commit comments