Rpc Method handler for `lsps-lsps2-buy`.
(
p: cln_plugin::Plugin<State>,
v: serde_json::Value,
)
| 177 | |
| 178 | /// Rpc Method handler for `lsps-lsps2-buy`. |
| 179 | async fn on_lsps_lsps2_buy( |
| 180 | p: cln_plugin::Plugin<State>, |
| 181 | v: serde_json::Value, |
| 182 | ) -> Result<serde_json::Value, anyhow::Error> { |
| 183 | let req: ClnRpcLsps2BuyRequest = |
| 184 | serde_json::from_value(v).context("Failed to parse request JSON")?; |
| 185 | debug!( |
| 186 | "Asking for a channel from lsp {} with opening fee params {:?} and payment size {:?}", |
| 187 | req.lsp_id, req.opening_fee_params, req.payment_size_msat |
| 188 | ); |
| 189 | |
| 190 | let lsp_id = PublicKey::from_str(&req.lsp_id).context("lsp_id is not a valid public key")?; |
| 191 | |
| 192 | let dir = p.configuration().lightning_dir; |
| 193 | let rpc_path = Path::new(&dir).join(&p.configuration().rpc_file); |
| 194 | let mut cln_client = cln_rpc::ClnRpc::new(rpc_path.clone()).await?; |
| 195 | |
| 196 | let lsp_status = check_peer_lsp_status(&mut cln_client, &req.lsp_id).await?; |
| 197 | |
| 198 | // Fail early: Check that we are connected to the peer. |
| 199 | if !lsp_status.connected { |
| 200 | bail!("Not connected to peer {}", &req.lsp_id); |
| 201 | }; |
| 202 | |
| 203 | // From Blip52: LSPs MAY set the features bit numbered 729 |
| 204 | // (option_supports_lsps)... |
| 205 | // We only log that it is not set but don't fail. |
| 206 | if !lsp_status.has_lsp_feature { |
| 207 | debug!("Peer {} doesn't have the LSP feature bit set.", &req.lsp_id); |
| 208 | } |
| 209 | |
| 210 | let client = p.state().client(); |
| 211 | |
| 212 | let selected_params = req.opening_fee_params; |
| 213 | if let Some(payment_size) = req.payment_size_msat { |
| 214 | if payment_size < selected_params.min_payment_size_msat { |
| 215 | return Err(anyhow!( |
| 216 | "Requested payment size {}msat is below minimum {}msat required by LSP", |
| 217 | payment_size, |
| 218 | selected_params.min_payment_size_msat |
| 219 | )); |
| 220 | } |
| 221 | if payment_size > selected_params.max_payment_size_msat { |
| 222 | return Err(anyhow!( |
| 223 | "Requested payment size {}msat is above maximum {}msat allowed by LSP", |
| 224 | payment_size, |
| 225 | selected_params.max_payment_size_msat |
| 226 | )); |
| 227 | } |
| 228 | |
| 229 | let opening_fee = compute_opening_fee( |
| 230 | payment_size.msat(), |
| 231 | selected_params.min_fee_msat.msat(), |
| 232 | selected_params.proportional.ppm() as u64, |
| 233 | ) |
| 234 | .ok_or_else(|| { |
| 235 | warn!( |
| 236 | "Opening fee calculation overflowed for payment size {}", |
nothing calls this directly
no test coverage detected