1
+ use crate :: logger:: log_error;
1
2
use crate :: types:: { ChannelManager , KeysManager , LiquidityManager , PeerManager } ;
2
3
use crate :: Config ;
3
4
4
5
use lightning:: ln:: msgs:: SocketAddress ;
5
6
use lightning:: util:: logger:: Logger ;
6
7
use lightning:: util:: persist:: KVStore ;
7
8
use lightning_liquidity:: events:: Event ;
9
+ use lightning_liquidity:: lsps0:: msgs:: RequestId ;
8
10
use lightning_liquidity:: lsps2:: event:: LSPS2ClientEvent ;
11
+ use lightning_liquidity:: lsps2:: msgs:: OpeningFeeParams ;
9
12
10
13
use bitcoin:: secp256k1:: PublicKey ;
11
14
15
+ use tokio:: sync:: oneshot;
16
+
17
+ use std:: collections:: HashMap ;
12
18
use std:: ops:: Deref ;
13
- use std:: sync:: Arc ;
19
+ use std:: sync:: { Arc , Mutex } ;
14
20
15
21
struct LSPS2Service {
16
22
address : SocketAddress ,
17
23
node_id : PublicKey ,
18
24
token : Option < String > ,
25
+ pending_fee_requests : Mutex < HashMap < RequestId , oneshot:: Sender < LSPS2FeeResponse > > > ,
26
+ pending_buy_requests : Mutex < HashMap < RequestId , oneshot:: Sender < LSPS2BuyResponse > > > ,
19
27
}
20
28
21
29
pub ( crate ) struct LiquiditySource < K : KVStore + Sync + Send + ' static , L : Deref >
39
47
channel_manager : Arc < ChannelManager < K > > , keys_manager : Arc < KeysManager > ,
40
48
liquidity_manager : Arc < LiquidityManager < K > > , config : Arc < Config > , logger : L ,
41
49
) -> Self {
42
- let lsps2_service = Some ( LSPS2Service { address, node_id, token } ) ;
50
+ let pending_fee_requests = Mutex :: new ( HashMap :: new ( ) ) ;
51
+ let pending_buy_requests = Mutex :: new ( HashMap :: new ( ) ) ;
52
+ let lsps2_service = Some ( LSPS2Service {
53
+ address,
54
+ node_id,
55
+ token,
56
+ pending_fee_requests,
57
+ pending_buy_requests,
58
+ } ) ;
43
59
Self { lsps2_service, channel_manager, keys_manager, liquidity_manager, config, logger }
44
60
}
45
61
@@ -55,19 +71,123 @@ where
55
71
pub ( crate ) async fn handle_next_event ( & self ) {
56
72
match self . liquidity_manager . next_event_async ( ) . await {
57
73
Event :: LSPS2Client ( LSPS2ClientEvent :: OpeningParametersReady {
58
- counterparty_node_id : _,
59
- opening_fee_params_menu : _,
60
- min_payment_size_msat : _,
61
- max_payment_size_msat : _,
62
- } ) => { }
74
+ request_id,
75
+ counterparty_node_id,
76
+ opening_fee_params_menu,
77
+ } ) => {
78
+ if let Some ( lsps2_service) = self . lsps2_service . as_ref ( ) {
79
+ if counterparty_node_id != lsps2_service. node_id {
80
+ debug_assert ! (
81
+ false ,
82
+ "Received response from unexpected LSP counterparty. This should never happen."
83
+ ) ;
84
+ log_error ! (
85
+ self . logger,
86
+ "Received response from unexpected LSP counterparty. This should never happen."
87
+ ) ;
88
+ return ;
89
+ }
90
+
91
+ if let Some ( sender) =
92
+ lsps2_service. pending_fee_requests . lock ( ) . unwrap ( ) . remove ( & request_id)
93
+ {
94
+ let response = LSPS2FeeResponse {
95
+ opening_fee_params_menu,
96
+ } ;
97
+
98
+ match sender. send ( response) {
99
+ Ok ( ( ) ) => ( ) ,
100
+ Err ( e) => {
101
+ log_error ! (
102
+ self . logger,
103
+ "Failed to handle response from liquidity service: {:?}" ,
104
+ e
105
+ ) ;
106
+ }
107
+ }
108
+ } else {
109
+ debug_assert ! (
110
+ false ,
111
+ "Received response from liquidity service for unknown request."
112
+ ) ;
113
+ log_error ! (
114
+ self . logger,
115
+ "Received response from liquidity service for unknown request."
116
+ ) ;
117
+ }
118
+ } else {
119
+ log_error ! (
120
+ self . logger,
121
+ "Received unexpected LSPS2Client::OpeningParametersReady event!"
122
+ ) ;
123
+ }
124
+ }
63
125
Event :: LSPS2Client ( LSPS2ClientEvent :: InvoiceParametersReady {
64
- counterparty_node_id : _,
65
- intercept_scid : _,
66
- cltv_expiry_delta : _,
67
- payment_size_msat : _,
68
- user_channel_id : _,
69
- } ) => { }
70
- _ => { }
126
+ request_id,
127
+ counterparty_node_id,
128
+ intercept_scid,
129
+ cltv_expiry_delta,
130
+ ..
131
+ } ) => {
132
+ if let Some ( lsps2_service) = self . lsps2_service . as_ref ( ) {
133
+ if counterparty_node_id != lsps2_service. node_id {
134
+ debug_assert ! (
135
+ false ,
136
+ "Received response from unexpected LSP counterparty. This should never happen."
137
+ ) ;
138
+ log_error ! (
139
+ self . logger,
140
+ "Received response from unexpected LSP counterparty. This should never happen."
141
+ ) ;
142
+ return ;
143
+ }
144
+
145
+ if let Some ( sender) =
146
+ lsps2_service. pending_buy_requests . lock ( ) . unwrap ( ) . remove ( & request_id)
147
+ {
148
+ let response = LSPS2BuyResponse { intercept_scid, cltv_expiry_delta } ;
149
+
150
+ match sender. send ( response) {
151
+ Ok ( ( ) ) => ( ) ,
152
+ Err ( e) => {
153
+ log_error ! (
154
+ self . logger,
155
+ "Failed to handle response from liquidity service: {:?}" ,
156
+ e
157
+ ) ;
158
+ }
159
+ }
160
+ } else {
161
+ debug_assert ! (
162
+ false ,
163
+ "Received response from liquidity service for unknown request."
164
+ ) ;
165
+ log_error ! (
166
+ self . logger,
167
+ "Received response from liquidity service for unknown request."
168
+ ) ;
169
+ }
170
+ } else {
171
+ log_error ! (
172
+ self . logger,
173
+ "Received unexpected LSPS2Client::InvoiceParametersReady event!"
174
+ ) ;
175
+ }
176
+ }
177
+ e => {
178
+ log_error ! ( self . logger, "Received unexpected liquidity event: {:?}" , e) ;
179
+ }
71
180
}
72
181
}
73
182
}
183
+
184
+ #[ derive( Debug , Clone ) ]
185
+ pub ( crate ) struct LSPS2FeeResponse {
186
+ opening_fee_params_menu : Vec < OpeningFeeParams > ,
187
+ }
188
+
189
+ #[ derive( Debug , Clone ) ]
190
+ pub ( crate ) struct LSPS2BuyResponse {
191
+ intercept_scid : u64 ,
192
+ cltv_expiry_delta : u32 ,
193
+ }
0 commit comments