@@ -42,7 +42,7 @@ use crate::io_extras::read_to_end;
42
42
43
43
use crate :: util:: 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
@@ -1145,6 +1145,7 @@ mod fuzzy_internal_msgs {
1145
1145
} ,
1146
1146
FinalNode {
1147
1147
payment_data : Option < FinalOnionHopData > ,
1148
+ payment_metadata : Option < Vec < u8 > > ,
1148
1149
keysend_preimage : Option < PaymentPreimage > ,
1149
1150
} ,
1150
1151
}
@@ -1576,11 +1577,12 @@ impl Writeable for OnionHopData {
1576
1577
( 6 , short_channel_id, required)
1577
1578
} ) ;
1578
1579
} ,
1579
- OnionHopDataFormat :: FinalNode { ref payment_data, ref keysend_preimage } => {
1580
+ OnionHopDataFormat :: FinalNode { ref payment_data, ref payment_metadata , ref keysend_preimage } => {
1580
1581
_encode_varint_length_prefixed_tlv ! ( w, {
1581
1582
( 2 , HighZeroBytesDroppedBigSize ( self . amt_to_forward) , required) ,
1582
1583
( 4 , HighZeroBytesDroppedBigSize ( self . outgoing_cltv_value) , required) ,
1583
1584
( 8 , payment_data, option) ,
1585
+ ( 16 , payment_metadata. as_ref( ) . map( |m| WithoutLength ( m) ) , option) ,
1584
1586
( 5482373484 , keysend_preimage, option)
1585
1587
} ) ;
1586
1588
} ,
@@ -1595,29 +1597,33 @@ impl Readable for OnionHopData {
1595
1597
let mut cltv_value = HighZeroBytesDroppedBigSize ( 0u32 ) ;
1596
1598
let mut short_id: Option < u64 > = None ;
1597
1599
let mut payment_data: Option < FinalOnionHopData > = None ;
1600
+ let mut payment_metadata: Option < WithoutLength < Vec < u8 > > > = None ;
1598
1601
let mut keysend_preimage: Option < PaymentPreimage > = None ;
1599
1602
read_tlv_fields ! ( r, {
1600
1603
( 2 , amt, required) ,
1601
1604
( 4 , cltv_value, required) ,
1602
1605
( 6 , short_id, option) ,
1603
1606
( 8 , payment_data, option) ,
1607
+ ( 16 , payment_metadata, option) ,
1604
1608
// See https://github.com/lightning/blips/blob/master/blip-0003.md
1605
1609
( 5482373484 , keysend_preimage, option)
1606
1610
} ) ;
1607
1611
1608
1612
let format = if let Some ( short_channel_id) = short_id {
1609
1613
if payment_data. is_some ( ) { return Err ( DecodeError :: InvalidValue ) ; }
1614
+ if payment_metadata. is_some ( ) { return Err ( DecodeError :: InvalidValue ) ; }
1610
1615
OnionHopDataFormat :: NonFinalNode {
1611
1616
short_channel_id,
1612
1617
}
1613
1618
} else {
1614
- if let & Some ( ref data) = & payment_data {
1619
+ if let Some ( data) = & mut payment_data {
1615
1620
if data. total_msat > MAX_VALUE_MSAT {
1616
1621
return Err ( DecodeError :: InvalidValue ) ;
1617
1622
}
1618
1623
}
1619
1624
OnionHopDataFormat :: FinalNode {
1620
1625
payment_data,
1626
+ payment_metadata : payment_metadata. map ( |w| w. 0 ) ,
1621
1627
keysend_preimage,
1622
1628
}
1623
1629
} ;
@@ -2783,6 +2789,7 @@ mod tests {
2783
2789
let mut msg = msgs:: OnionHopData {
2784
2790
format : OnionHopDataFormat :: FinalNode {
2785
2791
payment_data : None ,
2792
+ payment_metadata : None ,
2786
2793
keysend_preimage : None ,
2787
2794
} ,
2788
2795
amt_to_forward : 0x0badf00d01020304 ,
@@ -2806,6 +2813,7 @@ mod tests {
2806
2813
payment_secret : expected_payment_secret,
2807
2814
total_msat : 0x1badca1f
2808
2815
} ) ,
2816
+ payment_metadata : None ,
2809
2817
keysend_preimage : None ,
2810
2818
} ,
2811
2819
amt_to_forward : 0x0badf00d01020304 ,
@@ -2820,6 +2828,7 @@ mod tests {
2820
2828
payment_secret,
2821
2829
total_msat : 0x1badca1f
2822
2830
} ) ,
2831
+ payment_metadata : None ,
2823
2832
keysend_preimage : None ,
2824
2833
} = msg. format {
2825
2834
assert_eq ! ( payment_secret, expected_payment_secret) ;
0 commit comments