@@ -42,7 +42,7 @@ use crate::io_extras::read_to_end;
42
42
43
43
use crate :: events:: { MessageSendEventsProvider , OnionMessageProvider } ;
44
44
use crate :: util:: logger;
45
- use crate :: util:: ser:: { LengthReadable , Readable , ReadableArgs , Writeable , Writer , FixedLengthReader , HighZeroBytesDroppedBigSize , Hostname } ;
45
+ use crate :: util:: ser:: { LengthReadable , Readable , ReadableArgs , Writeable , Writer , WithoutLength , FixedLengthReader , HighZeroBytesDroppedBigSize , Hostname } ;
46
46
47
47
use crate :: ln:: { PaymentPreimage , PaymentHash , PaymentSecret } ;
48
48
@@ -1168,6 +1168,7 @@ mod fuzzy_internal_msgs {
1168
1168
} ,
1169
1169
FinalNode {
1170
1170
payment_data : Option < FinalOnionHopData > ,
1171
+ payment_metadata : Option < Vec < u8 > > ,
1171
1172
keysend_preimage : Option < PaymentPreimage > ,
1172
1173
} ,
1173
1174
}
@@ -1661,11 +1662,12 @@ impl Writeable for OnionHopData {
1661
1662
( 6 , short_channel_id, required)
1662
1663
} ) ;
1663
1664
} ,
1664
- OnionHopDataFormat :: FinalNode { ref payment_data, ref keysend_preimage } => {
1665
+ OnionHopDataFormat :: FinalNode { ref payment_data, ref payment_metadata , ref keysend_preimage } => {
1665
1666
_encode_varint_length_prefixed_tlv ! ( w, {
1666
1667
( 2 , HighZeroBytesDroppedBigSize ( self . amt_to_forward) , required) ,
1667
1668
( 4 , HighZeroBytesDroppedBigSize ( self . outgoing_cltv_value) , required) ,
1668
1669
( 8 , payment_data, option) ,
1670
+ ( 16 , payment_metadata. as_ref( ) . map( |m| WithoutLength ( m) ) , option) ,
1669
1671
( 5482373484 , keysend_preimage, option)
1670
1672
} ) ;
1671
1673
} ,
@@ -1680,29 +1682,33 @@ impl Readable for OnionHopData {
1680
1682
let mut cltv_value = HighZeroBytesDroppedBigSize ( 0u32 ) ;
1681
1683
let mut short_id: Option < u64 > = None ;
1682
1684
let mut payment_data: Option < FinalOnionHopData > = None ;
1685
+ let mut payment_metadata: Option < WithoutLength < Vec < u8 > > > = None ;
1683
1686
let mut keysend_preimage: Option < PaymentPreimage > = None ;
1684
1687
read_tlv_fields ! ( r, {
1685
1688
( 2 , amt, required) ,
1686
1689
( 4 , cltv_value, required) ,
1687
1690
( 6 , short_id, option) ,
1688
1691
( 8 , payment_data, option) ,
1692
+ ( 16 , payment_metadata, option) ,
1689
1693
// See https://github.com/lightning/blips/blob/master/blip-0003.md
1690
1694
( 5482373484 , keysend_preimage, option)
1691
1695
} ) ;
1692
1696
1693
1697
let format = if let Some ( short_channel_id) = short_id {
1694
1698
if payment_data. is_some ( ) { return Err ( DecodeError :: InvalidValue ) ; }
1699
+ if payment_metadata. is_some ( ) { return Err ( DecodeError :: InvalidValue ) ; }
1695
1700
OnionHopDataFormat :: NonFinalNode {
1696
1701
short_channel_id,
1697
1702
}
1698
1703
} else {
1699
- if let & Some ( ref data) = & payment_data {
1704
+ if let Some ( data) = & payment_data {
1700
1705
if data. total_msat > MAX_VALUE_MSAT {
1701
1706
return Err ( DecodeError :: InvalidValue ) ;
1702
1707
}
1703
1708
}
1704
1709
OnionHopDataFormat :: FinalNode {
1705
1710
payment_data,
1711
+ payment_metadata : payment_metadata. map ( |w| w. 0 ) ,
1706
1712
keysend_preimage,
1707
1713
}
1708
1714
} ;
@@ -2880,6 +2886,7 @@ mod tests {
2880
2886
let mut msg = msgs:: OnionHopData {
2881
2887
format : OnionHopDataFormat :: FinalNode {
2882
2888
payment_data : None ,
2889
+ payment_metadata : None ,
2883
2890
keysend_preimage : None ,
2884
2891
} ,
2885
2892
amt_to_forward : 0x0badf00d01020304 ,
@@ -2903,6 +2910,7 @@ mod tests {
2903
2910
payment_secret : expected_payment_secret,
2904
2911
total_msat : 0x1badca1f
2905
2912
} ) ,
2913
+ payment_metadata : None ,
2906
2914
keysend_preimage : None ,
2907
2915
} ,
2908
2916
amt_to_forward : 0x0badf00d01020304 ,
@@ -2917,6 +2925,7 @@ mod tests {
2917
2925
payment_secret,
2918
2926
total_msat : 0x1badca1f
2919
2927
} ) ,
2928
+ payment_metadata : None ,
2920
2929
keysend_preimage : None ,
2921
2930
} = msg. format {
2922
2931
assert_eq ! ( payment_secret, expected_payment_secret) ;
0 commit comments