@@ -23,14 +23,6 @@ use crate::lsps0::ser::{
23
23
LSPS0_CLIENT_REJECTED_ERROR_CODE ,
24
24
} ;
25
25
use crate :: lsps2:: event:: LSPS2ServiceEvent ;
26
- use crate :: lsps2:: msgs:: {
27
- LSPS2BuyRequest , LSPS2BuyResponse , LSPS2GetInfoRequest , LSPS2GetInfoResponse , LSPS2Message ,
28
- LSPS2OpeningFeeParams , LSPS2RawOpeningFeeParams , LSPS2Request , LSPS2Response ,
29
- LSPS2_BUY_REQUEST_INVALID_OPENING_FEE_PARAMS_ERROR_CODE ,
30
- LSPS2_BUY_REQUEST_PAYMENT_SIZE_TOO_LARGE_ERROR_CODE ,
31
- LSPS2_BUY_REQUEST_PAYMENT_SIZE_TOO_SMALL_ERROR_CODE ,
32
- LSPS2_GET_INFO_REQUEST_UNRECOGNIZED_OR_STALE_TOKEN_ERROR_CODE ,
33
- } ;
34
26
use crate :: lsps2:: payment_queue:: { InterceptedHTLC , PaymentQueue } ;
35
27
use crate :: lsps2:: utils:: {
36
28
compute_opening_fee, is_expired_opening_fee_params, is_valid_opening_fee_params,
@@ -52,6 +44,15 @@ use lightning_types::payment::PaymentHash;
52
44
use bitcoin:: secp256k1:: PublicKey ;
53
45
use bitcoin:: Transaction ;
54
46
47
+ use crate :: lsps2:: msgs:: {
48
+ LSPS2BuyRequest , LSPS2BuyResponse , LSPS2GetInfoRequest , LSPS2GetInfoResponse , LSPS2Message ,
49
+ LSPS2OpeningFeeParams , LSPS2RawOpeningFeeParams , LSPS2Request , LSPS2Response ,
50
+ LSPS2_BUY_REQUEST_INVALID_OPENING_FEE_PARAMS_ERROR_CODE ,
51
+ LSPS2_BUY_REQUEST_PAYMENT_SIZE_TOO_LARGE_ERROR_CODE ,
52
+ LSPS2_BUY_REQUEST_PAYMENT_SIZE_TOO_SMALL_ERROR_CODE ,
53
+ LSPS2_GET_INFO_REQUEST_UNRECOGNIZED_OR_STALE_TOKEN_ERROR_CODE ,
54
+ } ;
55
+
55
56
const MAX_PENDING_REQUESTS_PER_PEER : usize = 10 ;
56
57
const MAX_TOTAL_PENDING_REQUESTS : usize = 1000 ;
57
58
const MAX_TOTAL_PEERS : usize = 100000 ;
@@ -112,20 +113,21 @@ enum TrustModel {
112
113
ClientTrustsLsp {
113
114
funding_tx_broadcast_safe : bool ,
114
115
payment_claimed : bool ,
115
- funding_tx : Option < Transaction > ,
116
+ funding_tx : Option < Arc < Transaction > > ,
116
117
} ,
117
118
LspTrustsClient ,
118
119
}
119
120
120
121
impl TrustModel {
121
- fn should_broadcast ( & self ) -> bool {
122
+ fn should_manually_broadcast ( & self ) -> bool {
122
123
match self {
123
124
TrustModel :: ClientTrustsLsp {
124
125
funding_tx_broadcast_safe,
125
126
payment_claimed,
126
127
funding_tx,
127
128
} => * funding_tx_broadcast_safe && * payment_claimed && funding_tx. is_some ( ) ,
128
- TrustModel :: LspTrustsClient => true ,
129
+ // in lsp-trusts-client, the broadcast is automatic, so we never need to manually broadcast.
130
+ TrustModel :: LspTrustsClient => false ,
129
131
}
130
132
}
131
133
@@ -141,7 +143,7 @@ impl TrustModel {
141
143
}
142
144
}
143
145
144
- fn set_funding_tx ( & mut self , funding_tx : Transaction ) {
146
+ fn set_funding_tx ( & mut self , funding_tx : Arc < Transaction > ) {
145
147
match self {
146
148
TrustModel :: ClientTrustsLsp { funding_tx : tx, .. } => {
147
149
* tx = Some ( funding_tx) ;
@@ -174,10 +176,17 @@ impl TrustModel {
174
176
}
175
177
}
176
178
177
- fn get_funding_tx ( & self ) -> Option < Transaction > {
179
+ fn get_funding_tx ( & self ) -> Option < Arc < Transaction > > {
178
180
match self {
179
- TrustModel :: ClientTrustsLsp { funding_tx, .. } => funding_tx. clone ( ) ,
180
- TrustModel :: LspTrustsClient => None ,
181
+ TrustModel :: ClientTrustsLsp { funding_tx : Some ( tx) , .. } => Some ( Arc :: clone ( & tx) ) ,
182
+ _ => None ,
183
+ }
184
+ }
185
+
186
+ fn is_client_trusts_lsp ( & self ) -> bool {
187
+ match self {
188
+ TrustModel :: ClientTrustsLsp { .. } => true ,
189
+ TrustModel :: LspTrustsClient => false ,
181
190
}
182
191
}
183
192
}
@@ -359,7 +368,6 @@ impl OutboundJITChannelState {
359
368
channel_id,
360
369
FeePayment { opening_fee_msat : * opening_fee_msat, htlcs } ,
361
370
) ;
362
-
363
371
* self = OutboundJITChannelState :: PendingPaymentForward {
364
372
payment_queue : core:: mem:: take ( payment_queue) ,
365
373
opening_fee_msat : * opening_fee_msat,
@@ -459,8 +467,7 @@ struct OutboundJITChannel {
459
467
user_channel_id : u128 ,
460
468
opening_fee_params : LSPS2OpeningFeeParams ,
461
469
payment_size_msat : Option < u64 > ,
462
- client_trusts_lsp : bool ,
463
- trust_model : Option < TrustModel > ,
470
+ trust_model : TrustModel ,
464
471
}
465
472
466
473
impl OutboundJITChannel {
@@ -473,23 +480,15 @@ impl OutboundJITChannel {
473
480
state : OutboundJITChannelState :: new ( ) ,
474
481
opening_fee_params,
475
482
payment_size_msat,
476
- client_trusts_lsp,
477
- trust_model : None ,
483
+ trust_model : TrustModel :: new ( client_trusts_lsp) ,
478
484
}
479
485
}
480
486
481
487
fn htlc_intercepted (
482
488
& mut self , htlc : InterceptedHTLC ,
483
489
) -> Result < Option < HTLCInterceptedAction > , LightningError > {
484
- let was_initial =
485
- matches ! ( self . state, OutboundJITChannelState :: PendingInitialPayment { .. } ) ;
486
490
let action =
487
491
self . state . htlc_intercepted ( & self . opening_fee_params , & self . payment_size_msat , htlc) ?;
488
- if was_initial && self . trust_model . is_none ( ) {
489
- if !matches ! ( self . state, OutboundJITChannelState :: PendingInitialPayment { .. } ) {
490
- self . trust_model = Some ( TrustModel :: new ( self . client_trusts_lsp ) ) ;
491
- }
492
- }
493
492
Ok ( action)
494
493
}
495
494
@@ -508,9 +507,7 @@ impl OutboundJITChannel {
508
507
fn payment_forwarded ( & mut self ) -> Result < Option < ForwardHTLCsAction > , LightningError > {
509
508
let action = self . state . payment_forwarded ( ) ?;
510
509
if action. is_some ( ) {
511
- if let Some ( tm) = & mut self . trust_model {
512
- tm. set_payment_claimed ( true ) ;
513
- }
510
+ self . trust_model . set_payment_claimed ( true ) ;
514
511
}
515
512
Ok ( action)
516
513
}
@@ -526,43 +523,24 @@ impl OutboundJITChannel {
526
523
self . is_pending_initial_payment ( ) && is_expired
527
524
}
528
525
529
- fn set_funding_tx ( & mut self , funding_tx : Transaction ) -> Result < ( ) , LightningError > {
530
- if let Some ( tm) = & mut self . trust_model {
531
- tm. set_funding_tx ( funding_tx) ;
532
- Ok ( ( ) )
533
- } else {
534
- Err ( LightningError :: from ( ChannelStateError (
535
- "Store funding transaction when JIT Channel was in invalid state" . to_string ( ) ,
536
- ) ) )
537
- }
526
+ fn set_funding_tx ( & mut self , funding_tx : Arc < Transaction > ) {
527
+ self . trust_model . set_funding_tx ( funding_tx) ;
538
528
}
539
529
540
- fn set_funding_tx_broadcast_safe (
541
- & mut self , funding_tx_broadcast_safe : bool ,
542
- ) -> Result < ( ) , LightningError > {
543
- if let Some ( tm) = & mut self . trust_model {
544
- tm. set_funding_tx_broadcast_safe ( funding_tx_broadcast_safe) ;
545
- Ok ( ( ) )
546
- } else {
547
- Err ( LightningError :: from ( ChannelStateError (
548
- "Store funding transaction broadcast safe when JIT Channel was in invalid state"
549
- . to_string ( ) ,
550
- ) ) )
551
- }
530
+ fn set_funding_tx_broadcast_safe ( & mut self , funding_tx_broadcast_safe : bool ) {
531
+ self . trust_model . set_funding_tx_broadcast_safe ( funding_tx_broadcast_safe) ;
552
532
}
553
533
554
534
fn should_broadcast_funding_transaction ( & self ) -> bool {
555
- self . trust_model . as_ref ( ) . map_or ( false , |tm| tm . should_broadcast ( ) )
535
+ self . trust_model . should_manually_broadcast ( )
556
536
}
557
537
558
- fn get_funding_tx ( & self ) -> Option < Transaction > {
559
- self . trust_model . as_ref ( ) . and_then ( |tm| tm . get_funding_tx ( ) )
538
+ fn get_funding_tx ( & self ) -> Option < Arc < Transaction > > {
539
+ self . trust_model . get_funding_tx ( )
560
540
}
561
541
562
542
fn client_trusts_lsp ( & self ) -> bool {
563
- self . trust_model
564
- . as_ref ( )
565
- . map_or ( false , |tm| matches ! ( tm, TrustModel :: ClientTrustsLsp { .. } ) )
543
+ self . trust_model . is_client_trusts_lsp ( )
566
544
}
567
545
}
568
546
@@ -803,6 +781,12 @@ where
803
781
///
804
782
/// Should be called in response to receiving a [`LSPS2ServiceEvent::BuyRequest`] event.
805
783
///
784
+ /// `client_trusts_lsp`:
785
+ /// * false (default) => "LSP trusts client": LSP broadcasts the funding
786
+ /// transaction as soon as it is safe and forwards the payment normally.
787
+ /// * true => "Client trusts LSP": LSP may defer broadcasting the funding
788
+ /// transaction until after the client claims the forwarded HTLC(s).
789
+ ///
806
790
/// [`ChannelManager::get_intercept_scid`]: lightning::ln::channelmanager::ChannelManager::get_intercept_scid
807
791
/// [`LSPS2ServiceEvent::BuyRequest`]: crate::lsps2::event::LSPS2ServiceEvent::BuyRequest
808
792
pub fn invoice_parameters_generated (
@@ -1058,14 +1042,17 @@ where
1058
1042
Err ( e) => {
1059
1043
return Err ( APIError :: APIMisuseError {
1060
1044
err : format ! (
1061
- "Forwarded payment was not applicable for JIT channel: {}" ,
1062
- e. err
1063
- ) ,
1045
+ "Forwarded payment was not applicable for JIT channel: {}" ,
1046
+ e. err
1047
+ ) ,
1064
1048
} )
1065
1049
} ,
1066
1050
}
1067
1051
1068
- self . broadcast_transaction_if_applies ( & jit_channel) ;
1052
+ self . emit_broadcast_funding_transaction_event_if_applies (
1053
+ jit_channel,
1054
+ counterparty_node_id,
1055
+ ) ;
1069
1056
}
1070
1057
} else {
1071
1058
return Err ( APIError :: APIMisuseError {
@@ -1589,7 +1576,8 @@ where
1589
1576
/// Called to store the funding transaction for a JIT channel.
1590
1577
/// This should be called when the funding transaction is created but before it's broadcast.
1591
1578
pub fn store_funding_transaction (
1592
- & self , user_channel_id : u128 , counterparty_node_id : & PublicKey , funding_tx : Transaction ,
1579
+ & self , user_channel_id : u128 , counterparty_node_id : & PublicKey ,
1580
+ funding_tx : Arc < Transaction > ,
1593
1581
) -> Result < ( ) , APIError > {
1594
1582
let outer_state_lock = self . per_peer_state . read ( ) . unwrap ( ) ;
1595
1583
let inner_state_lock =
@@ -1616,11 +1604,9 @@ where
1616
1604
) ,
1617
1605
} ) ?;
1618
1606
1619
- jit_channel
1620
- . set_funding_tx ( funding_tx)
1621
- . map_err ( |e| APIError :: APIMisuseError { err : e. err . to_string ( ) } ) ?;
1607
+ jit_channel. set_funding_tx ( funding_tx) ;
1622
1608
1623
- self . broadcast_transaction_if_applies ( jit_channel) ;
1609
+ self . emit_broadcast_funding_transaction_event_if_applies ( jit_channel, counterparty_node_id ) ;
1624
1610
Ok ( ( ) )
1625
1611
}
1626
1612
@@ -1654,20 +1640,26 @@ where
1654
1640
) ,
1655
1641
} ) ?;
1656
1642
1657
- jit_channel
1658
- . set_funding_tx_broadcast_safe ( true )
1659
- . map_err ( |e| APIError :: APIMisuseError { err : e. err . to_string ( ) } ) ?;
1643
+ jit_channel. set_funding_tx_broadcast_safe ( true ) ;
1660
1644
1661
- self . broadcast_transaction_if_applies ( jit_channel) ;
1645
+ self . emit_broadcast_funding_transaction_event_if_applies ( jit_channel, counterparty_node_id ) ;
1662
1646
Ok ( ( ) )
1663
1647
}
1664
1648
1665
- fn broadcast_transaction_if_applies ( & self , jit_channel : & OutboundJITChannel ) {
1649
+ fn emit_broadcast_funding_transaction_event_if_applies (
1650
+ & self , jit_channel : & OutboundJITChannel , counterparty_node_id : & PublicKey ,
1651
+ ) {
1666
1652
if jit_channel. should_broadcast_funding_transaction ( ) {
1667
1653
let funding_tx = jit_channel. get_funding_tx ( ) ;
1668
1654
1669
1655
if let Some ( funding_tx) = funding_tx {
1670
- self . channel_manager . get_cm ( ) . broadcast_transaction ( & funding_tx) ;
1656
+ let event_queue_notifier = self . pending_events . notifier ( ) ;
1657
+ let event = LSPS2ServiceEvent :: BroadcastFundingTransaction {
1658
+ counterparty_node_id : * counterparty_node_id,
1659
+ user_channel_id : jit_channel. user_channel_id ,
1660
+ funding_tx : funding_tx. as_ref ( ) . clone ( ) ,
1661
+ } ;
1662
+ event_queue_notifier. enqueue ( event) ;
1671
1663
}
1672
1664
}
1673
1665
}
0 commit comments