@@ -30,7 +30,7 @@ use chain::transaction::OutPoint;
3030use ln:: channel:: { Channel , ChannelError } ;
3131use ln:: channelmonitor:: { ChannelMonitor , ChannelMonitorUpdate , ChannelMonitorUpdateErr , ManyChannelMonitor , CLTV_CLAIM_BUFFER , LATENCY_GRACE_PERIOD_BLOCKS , ANTI_REORG_DELAY } ;
3232use ln:: features:: { InitFeatures , NodeFeatures } ;
33- use ln:: router:: Route ;
33+ use ln:: router:: { Route , RouteHop } ;
3434use ln:: msgs;
3535use ln:: onion_utils;
3636use ln:: msgs:: { ChannelMessageHandler , DecodeError , LightningError } ;
@@ -132,7 +132,7 @@ struct ClaimableHTLC {
132132pub ( super ) enum HTLCSource {
133133 PreviousHopData ( HTLCPreviousHopData ) ,
134134 OutboundRoute {
135- route : Route ,
135+ path : Vec < RouteHop > ,
136136 session_priv : SecretKey ,
137137 /// Technically we can recalculate this from the route, but we cache it here to avoid
138138 /// doing a double-pass on route when we get a failure back
@@ -143,7 +143,7 @@ pub(super) enum HTLCSource {
143143impl HTLCSource {
144144 pub fn dummy ( ) -> Self {
145145 HTLCSource :: OutboundRoute {
146- route : Route { hops : Vec :: new ( ) } ,
146+ path : Vec :: new ( ) ,
147147 session_priv : SecretKey :: from_slice ( & [ 1 ; 32 ] ) . unwrap ( ) ,
148148 first_hop_htlc_msat : 0 ,
149149 }
@@ -1202,23 +1202,26 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref> ChannelMan
12021202 /// If a payment_secret *is* provided, we assume that the invoice had the basic_mpp feature bit
12031203 /// set (either as required or as available).
12041204 pub fn send_payment ( & self , route : Route , payment_hash : PaymentHash , payment_secret : Option < & [ u8 ; 32 ] > ) -> Result < ( ) , APIError > {
1205- if route. hops . len ( ) < 1 || route. hops . len ( ) > 20 {
1206- return Err ( APIError :: RouteError { err : "Route didn't go anywhere/had bogus size" } ) ;
1205+ if route. paths . len ( ) < 1 || route. paths . len ( ) > 1 {
1206+ return Err ( APIError :: RouteError { err : "We currently don't support MPP, and we need at least one path" } ) ;
1207+ }
1208+ if route. paths [ 0 ] . len ( ) < 1 || route. paths [ 0 ] . len ( ) > 20 {
1209+ return Err ( APIError :: RouteError { err : "Path didn't go anywhere/had bogus size" } ) ;
12071210 }
12081211 let our_node_id = self . get_our_node_id ( ) ;
1209- for ( idx, hop) in route. hops . iter ( ) . enumerate ( ) {
1210- if idx != route. hops . len ( ) - 1 && hop. pubkey == our_node_id {
1211- return Err ( APIError :: RouteError { err : "Route went through us but wasn't a simple rebalance loop to us" } ) ;
1212+ for ( idx, hop) in route. paths [ 0 ] . iter ( ) . enumerate ( ) {
1213+ if idx != route. paths [ 0 ] . len ( ) - 1 && hop. pubkey == our_node_id {
1214+ return Err ( APIError :: RouteError { err : "Path went through us but wasn't a simple rebalance loop to us" } ) ;
12121215 }
12131216 }
12141217
12151218 let ( session_priv, prng_seed) = self . keys_manager . get_onion_rand ( ) ;
12161219
12171220 let cur_height = self . latest_block_height . load ( Ordering :: Acquire ) as u32 + 1 ;
12181221
1219- let onion_keys = secp_call ! ( onion_utils:: construct_onion_keys( & self . secp_ctx, & route, & session_priv) ,
1222+ let onion_keys = secp_call ! ( onion_utils:: construct_onion_keys( & self . secp_ctx, & route. paths [ 0 ] , & session_priv) ,
12201223 APIError :: RouteError { err: "Pubkey along hop was maliciously selected" } ) ;
1221- let ( onion_payloads, htlc_msat, htlc_cltv) = onion_utils:: build_onion_payloads ( & route, payment_secret, cur_height) ?;
1224+ let ( onion_payloads, htlc_msat, htlc_cltv) = onion_utils:: build_onion_payloads ( & route. paths [ 0 ] , payment_secret, cur_height) ?;
12221225 if onion_utils:: route_size_insane ( & onion_payloads) {
12231226 return Err ( APIError :: RouteError { err : "Route size too large considering onion data" } ) ;
12241227 }
@@ -1229,22 +1232,22 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref> ChannelMan
12291232 let mut channel_lock = self . channel_state . lock ( ) . unwrap ( ) ;
12301233 let err: Result < ( ) , _ > = loop {
12311234
1232- let id = match channel_lock. short_to_id . get ( & route. hops . first ( ) . unwrap ( ) . short_channel_id ) {
1235+ let id = match channel_lock. short_to_id . get ( & route. paths [ 0 ] . first ( ) . unwrap ( ) . short_channel_id ) {
12331236 None => return Err ( APIError :: ChannelUnavailable { err : "No channel available with first hop!" } ) ,
12341237 Some ( id) => id. clone ( ) ,
12351238 } ;
12361239
12371240 let channel_state = & mut * channel_lock;
12381241 if let hash_map:: Entry :: Occupied ( mut chan) = channel_state. by_id . entry ( id) {
12391242 match {
1240- if chan. get ( ) . get_their_node_id ( ) != route. hops . first ( ) . unwrap ( ) . pubkey {
1243+ if chan. get ( ) . get_their_node_id ( ) != route. paths [ 0 ] . first ( ) . unwrap ( ) . pubkey {
12411244 return Err ( APIError :: RouteError { err : "Node ID mismatch on first hop!" } ) ;
12421245 }
12431246 if !chan. get ( ) . is_live ( ) {
12441247 return Err ( APIError :: ChannelUnavailable { err : "Peer for first hop currently disconnected/pending monitor update!" } ) ;
12451248 }
12461249 break_chan_entry ! ( self , chan. get_mut( ) . send_htlc_and_commit( htlc_msat, payment_hash. clone( ) , htlc_cltv, HTLCSource :: OutboundRoute {
1247- route : route. clone( ) ,
1250+ path : route. paths [ 0 ] . clone( ) ,
12481251 session_priv: session_priv. clone( ) ,
12491252 first_hop_htlc_msat: htlc_msat,
12501253 } , onion_packet) , channel_state, chan)
@@ -1260,7 +1263,7 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref> ChannelMan
12601263 }
12611264
12621265 channel_state. pending_msg_events . push ( events:: MessageSendEvent :: UpdateHTLCs {
1263- node_id : route. hops . first ( ) . unwrap ( ) . pubkey ,
1266+ node_id : route. paths [ 0 ] . first ( ) . unwrap ( ) . pubkey ,
12641267 updates : msgs:: CommitmentUpdate {
12651268 update_add_htlcs : vec ! [ update_add] ,
12661269 update_fulfill_htlcs : Vec :: new ( ) ,
@@ -1277,7 +1280,7 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref> ChannelMan
12771280 return Ok ( ( ) ) ;
12781281 } ;
12791282
1280- match handle_error ! ( self , err, route. hops . first( ) . unwrap( ) . pubkey, channel_lock) {
1283+ match handle_error ! ( self , err, route. paths [ 0 ] . first( ) . unwrap( ) . pubkey, channel_lock) {
12811284 Ok ( _) => unreachable ! ( ) ,
12821285 Err ( e) => { Err ( APIError :: ChannelUnavailable { err : e. err } ) }
12831286 }
@@ -1730,7 +1733,7 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref> ChannelMan
17301733 //between the branches here. We should make this async and move it into the forward HTLCs
17311734 //timer handling.
17321735 match source {
1733- HTLCSource :: OutboundRoute { ref route , .. } => {
1736+ HTLCSource :: OutboundRoute { ref path , .. } => {
17341737 log_trace ! ( self , "Failing outbound payment HTLC with payment_hash {}" , log_bytes!( payment_hash. 0 ) ) ;
17351738 mem:: drop ( channel_state_lock) ;
17361739 match & onion_error {
@@ -1772,7 +1775,7 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref> ChannelMan
17721775 self . pending_events . lock ( ) . unwrap ( ) . push (
17731776 events:: Event :: PaymentFailed {
17741777 payment_hash : payment_hash. clone ( ) ,
1775- rejected_by_dest : route . hops . len ( ) == 1 ,
1778+ rejected_by_dest : path . len ( ) == 1 ,
17761779#[ cfg( test) ]
17771780 error_code : Some ( * failure_code) ,
17781781 }
@@ -1836,9 +1839,19 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref> ChannelMan
18361839 let mut channel_state = Some ( self . channel_state . lock ( ) . unwrap ( ) ) ;
18371840 let removed_source = channel_state. as_mut ( ) . unwrap ( ) . claimable_htlcs . remove ( & ( payment_hash, * payment_secret) ) ;
18381841 if let Some ( mut sources) = removed_source {
1842+ assert ! ( !sources. is_empty( ) ) ;
1843+ let passes_value = if let & Some ( ref data) = & sources[ 0 ] . payment_data {
1844+ assert ! ( payment_secret. is_some( ) ) ;
1845+ if data. total_msat == expected_amount { true } else { false }
1846+ } else {
1847+ assert ! ( payment_secret. is_none( ) ) ;
1848+ false
1849+ } ;
1850+
1851+ let mut one_claimed = false ;
18391852 for htlc in sources. drain ( ..) {
18401853 if channel_state. is_none ( ) { channel_state = Some ( self . channel_state . lock ( ) . unwrap ( ) ) ; }
1841- if htlc. value < expected_amount || htlc. value > expected_amount * 2 {
1854+ if !passes_value && ( htlc. value < expected_amount || htlc. value > expected_amount * 2 ) {
18421855 let mut htlc_msat_data = byte_utils:: be64_to_array ( htlc. value ) . to_vec ( ) ;
18431856 let mut height_data = byte_utils:: be32_to_array ( self . latest_block_height . load ( Ordering :: Acquire ) as u32 ) . to_vec ( ) ;
18441857 htlc_msat_data. append ( & mut height_data) ;
@@ -1847,9 +1860,10 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref> ChannelMan
18471860 HTLCFailReason :: Reason { failure_code : 0x4000 |15 , data : htlc_msat_data } ) ;
18481861 } else {
18491862 self . claim_funds_internal ( channel_state. take ( ) . unwrap ( ) , HTLCSource :: PreviousHopData ( htlc. prev_hop ) , payment_preimage) ;
1863+ one_claimed = true ;
18501864 }
18511865 }
1852- true
1866+ one_claimed
18531867 } else { false }
18541868 }
18551869 fn claim_funds_internal ( & self , mut channel_state_lock : MutexGuard < ChannelHolder < ChanSigner > > , source : HTLCSource , payment_preimage : PaymentPreimage ) {
@@ -3308,9 +3322,9 @@ impl Writeable for HTLCSource {
33083322 0u8 . write ( writer) ?;
33093323 hop_data. write ( writer) ?;
33103324 } ,
3311- & HTLCSource :: OutboundRoute { ref route , ref session_priv, ref first_hop_htlc_msat } => {
3325+ & HTLCSource :: OutboundRoute { ref path , ref session_priv, ref first_hop_htlc_msat } => {
33123326 1u8 . write ( writer) ?;
3313- route . write ( writer) ?;
3327+ path . write ( writer) ?;
33143328 session_priv. write ( writer) ?;
33153329 first_hop_htlc_msat. write ( writer) ?;
33163330 }
@@ -3324,7 +3338,7 @@ impl Readable for HTLCSource {
33243338 match <u8 as Readable >:: read ( reader) ? {
33253339 0 => Ok ( HTLCSource :: PreviousHopData ( Readable :: read ( reader) ?) ) ,
33263340 1 => Ok ( HTLCSource :: OutboundRoute {
3327- route : Readable :: read ( reader) ?,
3341+ path : Readable :: read ( reader) ?,
33283342 session_priv : Readable :: read ( reader) ?,
33293343 first_hop_htlc_msat : Readable :: read ( reader) ?,
33303344 } ) ,
0 commit comments