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