@@ -1800,7 +1800,7 @@ mod fuzzy_internal_msgs {
1800
1800
1801
1801
#[ allow( unused_imports) ]
1802
1802
use crate :: prelude:: * ;
1803
-
1803
+ use crate :: routing :: gossip :: NodeId ;
1804
1804
// These types aren't intended to be pub, but are exposed for direct fuzzing (as we deserialize
1805
1805
// them from untrusted input):
1806
1806
@@ -1811,6 +1811,15 @@ mod fuzzy_internal_msgs {
1811
1811
pub outgoing_cltv_value : u32 ,
1812
1812
}
1813
1813
1814
+ #[ allow( unused) ]
1815
+ pub struct InboundTrampolineForwardPayload {
1816
+ pub outgoing_node_id : NodeId ,
1817
+ /// The value, in msat, of the payment after this hop's fee is deducted.
1818
+ pub amt_to_forward : u64 ,
1819
+ pub outgoing_cltv_value : u32 ,
1820
+ }
1821
+
1822
+ #[ allow( unused) ]
1814
1823
pub struct InboundTrampolineEntrypointPayload {
1815
1824
pub amt_to_forward : u64 ,
1816
1825
pub outgoing_cltv_value : u32 ,
@@ -1854,6 +1863,10 @@ mod fuzzy_internal_msgs {
1854
1863
Receive ( InboundOnionReceivePayload ) ,
1855
1864
BlindedForward ( InboundOnionBlindedForwardPayload ) ,
1856
1865
BlindedReceive ( InboundOnionBlindedReceivePayload ) ,
1866
+
1867
+ // These payloads should be seen inside an inner Trampoline onion
1868
+ #[ allow( unused) ]
1869
+ TrampolineForward ( InboundTrampolineForwardPayload ) ,
1857
1870
}
1858
1871
1859
1872
pub ( crate ) enum OutboundOnionPayload < ' a > {
@@ -2914,6 +2927,7 @@ impl<NS: Deref> ReadableArgs<(Option<PublicKey>, NS)> for InboundOnionPayload wh
2914
2927
let mut payment_data: Option < FinalOnionHopData > = None ;
2915
2928
let mut encrypted_tlvs_opt: Option < WithoutLength < Vec < u8 > > > = None ;
2916
2929
let mut intro_node_blinding_point = None ;
2930
+ let mut outgoing_node_id: Option < NodeId > = None ;
2917
2931
let mut payment_metadata: Option < WithoutLength < Vec < u8 > > > = None ;
2918
2932
let mut total_msat = None ;
2919
2933
let mut keysend_preimage: Option < PaymentPreimage > = None ;
@@ -2930,6 +2944,7 @@ impl<NS: Deref> ReadableArgs<(Option<PublicKey>, NS)> for InboundOnionPayload wh
2930
2944
( 8 , payment_data, option) ,
2931
2945
( 10 , encrypted_tlvs_opt, option) ,
2932
2946
( 12 , intro_node_blinding_point, option) ,
2947
+ ( 14 , outgoing_node_id, option) ,
2933
2948
( 16 , payment_metadata, option) ,
2934
2949
( 18 , total_msat, ( option, encoding: ( u64 , HighZeroBytesDroppedBigSize ) ) ) ,
2935
2950
( 20 , trampoline_onion_packet, option) ,
@@ -3011,6 +3026,15 @@ impl<NS: Deref> ReadableArgs<(Option<PublicKey>, NS)> for InboundOnionPayload wh
3011
3026
amt_to_forward : amt. ok_or ( DecodeError :: InvalidValue ) ?,
3012
3027
outgoing_cltv_value : cltv_value. ok_or ( DecodeError :: InvalidValue ) ?,
3013
3028
} ) )
3029
+ } else if let Some ( outgoing_node_id) = outgoing_node_id {
3030
+ if payment_data. is_some ( ) || payment_metadata. is_some ( ) || encrypted_tlvs_opt. is_some ( ) ||
3031
+ total_msat. is_some ( ) || invoice_request. is_some ( )
3032
+ { return Err ( DecodeError :: InvalidValue ) }
3033
+ Ok ( Self :: TrampolineForward ( InboundTrampolineForwardPayload {
3034
+ outgoing_node_id,
3035
+ amt_to_forward : amt. ok_or ( DecodeError :: InvalidValue ) ?,
3036
+ outgoing_cltv_value : cltv_value. ok_or ( DecodeError :: InvalidValue ) ?,
3037
+ } ) )
3014
3038
} else if let Some ( trampoline_onion_packet) = trampoline_onion_packet {
3015
3039
if payment_metadata. is_some ( ) || encrypted_tlvs_opt. is_some ( ) ||
3016
3040
total_msat. is_some ( )
0 commit comments