MCPcopy Create free account
hub / github.com/ElementsProject/lightning / on_lsps_lsps2_buy

Function on_lsps_lsps2_buy

plugins/lsps-plugin/src/client.rs:179–264  ·  view source on GitHub ↗

Rpc Method handler for `lsps-lsps2-buy`.

(
    p: cln_plugin::Plugin<State>,
    v: serde_json::Value,
)

Source from the content-addressed store, hash-verified

177
178/// Rpc Method handler for `lsps-lsps2-buy`.
179async 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 {}",

Callers

nothing calls this directly

Calls 10

check_peer_lsp_statusFunction · 0.85
compute_opening_feeFunction · 0.85
configurationMethod · 0.80
joinMethod · 0.80
clientMethod · 0.80
stateMethod · 0.80
ppmMethod · 0.80
as_resultMethod · 0.80
buyMethod · 0.80
msatMethod · 0.45

Tested by

no test coverage detected