From 0485c7a9e6d6513165b31f8f5943671f862a0135 Mon Sep 17 00:00:00 2001 From: G8XSU <3442979+G8XSU@users.noreply.github.com> Date: Wed, 25 Sep 2024 13:30:52 +0900 Subject: [PATCH 1/9] Remove PaymentId as separate type from api. --- protos/src/lib.rs | 13 +++---------- protos/src/proto/ldk_node_server.proto | 10 ++-------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/protos/src/lib.rs b/protos/src/lib.rs index 5c5fddc..3d62d28 100644 --- a/protos/src/lib.rs +++ b/protos/src/lib.rs @@ -87,15 +87,8 @@ pub struct Bolt11SendRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct Bolt11SendResponse { /// An identifier used to uniquely identify a payment. - #[prost(message, optional, tag = "1")] - pub payment_id: ::core::option::Option, -} -/// An identifier used to uniquely identify a payment. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct PaymentId { #[prost(bytes = "bytes", tag = "1")] - pub data: ::prost::bytes::Bytes, + pub payment_id: ::prost::bytes::Bytes, } /// Returns a BOLT12 offer for the given amount, if specified. /// @@ -148,8 +141,8 @@ pub struct Bolt12SendRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct Bolt12SendResponse { /// An identifier used to uniquely identify a payment. - #[prost(message, optional, tag = "1")] - pub payment_id: ::core::option::Option, + #[prost(bytes = "bytes", tag = "1")] + pub payment_id: ::prost::bytes::Bytes, } /// Creates a new outbound channel to the given remote node. /// See more: diff --git a/protos/src/proto/ldk_node_server.proto b/protos/src/proto/ldk_node_server.proto index 07409d8..e415ba1 100644 --- a/protos/src/proto/ldk_node_server.proto +++ b/protos/src/proto/ldk_node_server.proto @@ -85,13 +85,7 @@ message Bolt11SendRequest { message Bolt11SendResponse { // An identifier used to uniquely identify a payment. - PaymentId payment_id = 1; -} - -// An identifier used to uniquely identify a payment. -message PaymentId { - - bytes data = 1; + bytes payment_id = 1; } // Returns a BOLT12 offer for the given amount, if specified. @@ -141,7 +135,7 @@ message Bolt12SendRequest { message Bolt12SendResponse { // An identifier used to uniquely identify a payment. - PaymentId payment_id = 1; + bytes payment_id = 1; } // Creates a new outbound channel to the given remote node. From f57637da8bc24d1484f270332c0fca9c068601bb Mon Sep 17 00:00:00 2001 From: G8XSU <3442979+G8XSU@users.noreply.github.com> Date: Wed, 4 Sep 2024 16:23:21 -0700 Subject: [PATCH 2/9] Add Impl for OnchainReceive Api --- server/src/api/mod.rs | 1 + server/src/api/onchain_receive.rs | 12 ++++++++++++ server/src/main.rs | 1 + server/src/service.rs | 8 +++++++- 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 server/src/api/mod.rs create mode 100644 server/src/api/onchain_receive.rs diff --git a/server/src/api/mod.rs b/server/src/api/mod.rs new file mode 100644 index 0000000..ad02e7d --- /dev/null +++ b/server/src/api/mod.rs @@ -0,0 +1 @@ +pub(crate) mod onchain_receive; diff --git a/server/src/api/onchain_receive.rs b/server/src/api/onchain_receive.rs new file mode 100644 index 0000000..565bfd9 --- /dev/null +++ b/server/src/api/onchain_receive.rs @@ -0,0 +1,12 @@ +use ldk_node::Node; +use protos::{OnchainReceiveRequest, OnchainReceiveResponse}; +use std::sync::Arc; + +pub(crate) const ONCHAIN_RECEIVE_PATH: &str = "OnchainReceive"; +pub(crate) fn handle_onchain_receive_request( + node: Arc, _request: OnchainReceiveRequest, +) -> Result { + let response = + OnchainReceiveResponse { address: node.onchain_payment().new_address()?.to_string() }; + Ok(response) +} diff --git a/server/src/main.rs b/server/src/main.rs index b440903..9c9fd65 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -1,3 +1,4 @@ +mod api; mod service; use crate::service::NodeService; diff --git a/server/src/service.rs b/server/src/service.rs index 606dfd1..8820e46 100644 --- a/server/src/service.rs +++ b/server/src/service.rs @@ -11,6 +11,9 @@ use std::future::Future; use std::pin::Pin; use std::sync::Arc; +use crate::api::onchain_receive::handle_onchain_receive_request; +use crate::api::onchain_receive::ONCHAIN_RECEIVE_PATH; + #[derive(Clone)] pub struct NodeService { node: Arc, @@ -28,8 +31,11 @@ impl Service> for NodeService { type Future = Pin> + Send>>; fn call(&self, req: Request) -> Self::Future { - let _node = Arc::clone(&self.node); + let node = Arc::clone(&self.node); match req.uri().path() { + ONCHAIN_RECEIVE_PATH => { + Box::pin(handle_request(node, req, handle_onchain_receive_request)) + }, path => { let error = format!("Unknown request: {}", path).into_bytes(); Box::pin(async { From ba60e59cdb4a8040eb4947b9d73aa1739af41a8f Mon Sep 17 00:00:00 2001 From: G8XSU <3442979+G8XSU@users.noreply.github.com> Date: Wed, 4 Sep 2024 16:23:37 -0700 Subject: [PATCH 3/9] Add Impl for OnchainSend Api --- server/src/api/mod.rs | 1 + server/src/api/onchain_send.rs | 25 +++++++++++++++++++++++++ server/src/service.rs | 3 +++ 3 files changed, 29 insertions(+) create mode 100644 server/src/api/onchain_send.rs diff --git a/server/src/api/mod.rs b/server/src/api/mod.rs index ad02e7d..fe9d9a8 100644 --- a/server/src/api/mod.rs +++ b/server/src/api/mod.rs @@ -1 +1,2 @@ pub(crate) mod onchain_receive; +pub(crate) mod onchain_send; diff --git a/server/src/api/onchain_send.rs b/server/src/api/onchain_send.rs new file mode 100644 index 0000000..0e40d63 --- /dev/null +++ b/server/src/api/onchain_send.rs @@ -0,0 +1,25 @@ +use ldk_node::bitcoin::Address; +use ldk_node::Node; +use protos::{OnchainSendRequest, OnchainSendResponse}; +use std::str::FromStr; +use std::sync::Arc; + +pub(crate) const ONCHAIN_SEND_PATH: &str = "OnchainSend"; + +pub(crate) fn handle_onchain_send_request( + node: Arc, request: OnchainSendRequest, +) -> Result { + let address = Address::from_str(&request.address) + .map_err(|_| ldk_node::NodeError::InvalidAddress)? + .require_network(node.config().network) + .map_err(|_| ldk_node::NodeError::InvalidAddress)?; + let txid = match (request.amount_sats, request.send_all) { + (Some(amount_sats), None) => { + node.onchain_payment().send_to_address(&address, amount_sats)? + }, + (None, Some(true)) => node.onchain_payment().send_all_to_address(&address)?, + _ => return Err(ldk_node::NodeError::InvalidAmount), + }; + let response = OnchainSendResponse { txid: txid.to_string() }; + Ok(response) +} diff --git a/server/src/service.rs b/server/src/service.rs index 8820e46..4f9d764 100644 --- a/server/src/service.rs +++ b/server/src/service.rs @@ -13,6 +13,8 @@ use std::sync::Arc; use crate::api::onchain_receive::handle_onchain_receive_request; use crate::api::onchain_receive::ONCHAIN_RECEIVE_PATH; +use crate::api::onchain_send::handle_onchain_send_request; +use crate::api::onchain_send::ONCHAIN_SEND_PATH; #[derive(Clone)] pub struct NodeService { @@ -36,6 +38,7 @@ impl Service> for NodeService { ONCHAIN_RECEIVE_PATH => { Box::pin(handle_request(node, req, handle_onchain_receive_request)) }, + ONCHAIN_SEND_PATH => Box::pin(handle_request(node, req, handle_onchain_send_request)), path => { let error = format!("Unknown request: {}", path).into_bytes(); Box::pin(async { From d4295c8c0d5355a28088dd25ba884b58b354475f Mon Sep 17 00:00:00 2001 From: G8XSU <3442979+G8XSU@users.noreply.github.com> Date: Wed, 4 Sep 2024 16:24:07 -0700 Subject: [PATCH 4/9] Add Impl for BOLT11Receive Api --- server/src/api/bolt11_receive.rs | 21 +++++++++++++++++++++ server/src/api/mod.rs | 1 + server/src/service.rs | 5 +++++ 3 files changed, 27 insertions(+) create mode 100644 server/src/api/bolt11_receive.rs diff --git a/server/src/api/bolt11_receive.rs b/server/src/api/bolt11_receive.rs new file mode 100644 index 0000000..8778c67 --- /dev/null +++ b/server/src/api/bolt11_receive.rs @@ -0,0 +1,21 @@ +use ldk_node::Node; +use protos::{Bolt11ReceiveRequest, Bolt11ReceiveResponse}; +use std::sync::Arc; + +pub(crate) const BOLT11_RECEIVE_PATH: &str = "Bolt11Receive"; + +pub(crate) fn handle_bolt11_receive_request( + node: Arc, request: Bolt11ReceiveRequest, +) -> Result { + let invoice = match request.amount_msat { + Some(amount_msat) => { + node.bolt11_payment().receive(amount_msat, &request.description, request.expiry_secs)? + }, + None => node + .bolt11_payment() + .receive_variable_amount(&request.description, request.expiry_secs)?, + }; + + let response = Bolt11ReceiveResponse { invoice: invoice.to_string() }; + Ok(response) +} diff --git a/server/src/api/mod.rs b/server/src/api/mod.rs index fe9d9a8..9d958a6 100644 --- a/server/src/api/mod.rs +++ b/server/src/api/mod.rs @@ -1,2 +1,3 @@ +pub(crate) mod bolt11_receive; pub(crate) mod onchain_receive; pub(crate) mod onchain_send; diff --git a/server/src/service.rs b/server/src/service.rs index 4f9d764..7d44712 100644 --- a/server/src/service.rs +++ b/server/src/service.rs @@ -15,6 +15,8 @@ use crate::api::onchain_receive::handle_onchain_receive_request; use crate::api::onchain_receive::ONCHAIN_RECEIVE_PATH; use crate::api::onchain_send::handle_onchain_send_request; use crate::api::onchain_send::ONCHAIN_SEND_PATH; +use crate::api::bolt11_receive::handle_bolt11_receive_request; +use crate::api::bolt11_receive::BOLT11_RECEIVE_PATH; #[derive(Clone)] pub struct NodeService { @@ -39,6 +41,9 @@ impl Service> for NodeService { Box::pin(handle_request(node, req, handle_onchain_receive_request)) }, ONCHAIN_SEND_PATH => Box::pin(handle_request(node, req, handle_onchain_send_request)), + BOLT11_RECEIVE_PATH => { + Box::pin(handle_request(node, req, handle_bolt11_receive_request)) + }, path => { let error = format!("Unknown request: {}", path).into_bytes(); Box::pin(async { From 70fb33d6a82848fd6e787f9151a2ff111ef2a23f Mon Sep 17 00:00:00 2001 From: G8XSU <3442979+G8XSU@users.noreply.github.com> Date: Wed, 4 Sep 2024 16:24:24 -0700 Subject: [PATCH 5/9] Add Impl for OpenChannel Api --- Cargo.lock | 1 + server/Cargo.toml | 1 + server/src/api/mod.rs | 1 + server/src/api/open_channel.rs | 31 +++++++++++++++++++++++++++++++ server/src/service.rs | 3 +++ 5 files changed, 37 insertions(+) create mode 100644 server/src/api/open_channel.rs diff --git a/Cargo.lock b/Cargo.lock index 847f68a..7d1f242 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -809,6 +809,7 @@ dependencies = [ name = "ldk-node-server" version = "0.1.0" dependencies = [ + "bytes", "http-body-util", "hyper 1.4.1", "hyper-util", diff --git a/server/Cargo.toml b/server/Cargo.toml index 82fd980..285cbe2 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -13,3 +13,4 @@ hyper-util = { version = "0.1", default-features = false, features = ["server-gr tokio = { version = "1.38.0", default-features = false, features = ["time", "signal", "rt-multi-thread"] } prost = { version = "0.11.6", default-features = false, features = ["std"] } protos = { path = "../protos" } +bytes = "1.4.0" diff --git a/server/src/api/mod.rs b/server/src/api/mod.rs index 9d958a6..307ce79 100644 --- a/server/src/api/mod.rs +++ b/server/src/api/mod.rs @@ -1,3 +1,4 @@ pub(crate) mod bolt11_receive; pub(crate) mod onchain_receive; pub(crate) mod onchain_send; +pub(crate) mod open_channel; diff --git a/server/src/api/open_channel.rs b/server/src/api/open_channel.rs new file mode 100644 index 0000000..5bcb6da --- /dev/null +++ b/server/src/api/open_channel.rs @@ -0,0 +1,31 @@ +use bytes::Bytes; +use ldk_node::bitcoin::secp256k1::PublicKey; +use ldk_node::lightning::ln::msgs::SocketAddress; +use ldk_node::Node; +use protos::{OpenChannelRequest, OpenChannelResponse}; +use std::str::FromStr; +use std::sync::Arc; + +pub(crate) const OPEN_CHANNEL_PATH: &str = "OpenChannel"; + +pub(crate) fn handle_open_channel( + node: Arc, request: OpenChannelRequest, +) -> Result { + let node_id = PublicKey::from_str(&request.node_pubkey) + .map_err(|_| ldk_node::NodeError::InvalidPublicKey)?; + let address = SocketAddress::from_str(&request.address) + .map_err(|_| ldk_node::NodeError::InvalidSocketAddress)?; + let user_channel_id = node.connect_open_channel( + node_id, + address, + request.channel_amount_sats, + request.push_to_counterparty_msat, + // TODO: Allow setting ChannelConfig in open-channel. + None, + request.announce_channel, + )?; + let response = OpenChannelResponse { + user_channel_id: Bytes::from(user_channel_id.0.to_be_bytes().to_vec()), + }; + Ok(response) +} diff --git a/server/src/service.rs b/server/src/service.rs index 7d44712..e7d10e0 100644 --- a/server/src/service.rs +++ b/server/src/service.rs @@ -17,6 +17,8 @@ use crate::api::onchain_send::handle_onchain_send_request; use crate::api::onchain_send::ONCHAIN_SEND_PATH; use crate::api::bolt11_receive::handle_bolt11_receive_request; use crate::api::bolt11_receive::BOLT11_RECEIVE_PATH; +use crate::api::open_channel::handle_open_channel; +use crate::api::open_channel::OPEN_CHANNEL_PATH; #[derive(Clone)] pub struct NodeService { @@ -44,6 +46,7 @@ impl Service> for NodeService { BOLT11_RECEIVE_PATH => { Box::pin(handle_request(node, req, handle_bolt11_receive_request)) }, + OPEN_CHANNEL_PATH => Box::pin(handle_request(node, req, handle_open_channel)), path => { let error = format!("Unknown request: {}", path).into_bytes(); Box::pin(async { From 41eaa1b6ed7bda7e69dbe350fd20b8249041cf1b Mon Sep 17 00:00:00 2001 From: G8XSU <3442979+G8XSU@users.noreply.github.com> Date: Wed, 4 Sep 2024 16:49:50 -0700 Subject: [PATCH 6/9] Add Impl for Bolt11Send Api --- server/src/api/bolt11_send.rs | 23 +++++++++++++++++++++++ server/src/api/mod.rs | 1 + server/src/service.rs | 3 +++ 3 files changed, 27 insertions(+) create mode 100644 server/src/api/bolt11_send.rs diff --git a/server/src/api/bolt11_send.rs b/server/src/api/bolt11_send.rs new file mode 100644 index 0000000..a5d41e8 --- /dev/null +++ b/server/src/api/bolt11_send.rs @@ -0,0 +1,23 @@ +use bytes::Bytes; +use ldk_node::lightning_invoice::Bolt11Invoice; +use ldk_node::Node; +use protos::{Bolt11SendRequest, Bolt11SendResponse}; +use std::str::FromStr; +use std::sync::Arc; + +pub(crate) const BOLT11_SEND_PATH: &str = "Bolt11Send"; + +pub(crate) fn handle_bolt11_send_request( + node: Arc, request: Bolt11SendRequest, +) -> Result { + let invoice = Bolt11Invoice::from_str(&request.invoice.as_str()) + .map_err(|_| ldk_node::NodeError::InvalidInvoice)?; + + let payment_id = match request.amount_msat { + None => node.bolt11_payment().send(&invoice), + Some(amount_msat) => node.bolt11_payment().send_using_amount(&invoice, amount_msat), + }?; + + let response = Bolt11SendResponse { payment_id: Bytes::from(payment_id.0.to_vec()) }; + Ok(response) +} diff --git a/server/src/api/mod.rs b/server/src/api/mod.rs index 307ce79..1f6b050 100644 --- a/server/src/api/mod.rs +++ b/server/src/api/mod.rs @@ -1,4 +1,5 @@ pub(crate) mod bolt11_receive; +pub(crate) mod bolt11_send; pub(crate) mod onchain_receive; pub(crate) mod onchain_send; pub(crate) mod open_channel; diff --git a/server/src/service.rs b/server/src/service.rs index e7d10e0..69f2502 100644 --- a/server/src/service.rs +++ b/server/src/service.rs @@ -19,6 +19,8 @@ use crate::api::bolt11_receive::handle_bolt11_receive_request; use crate::api::bolt11_receive::BOLT11_RECEIVE_PATH; use crate::api::open_channel::handle_open_channel; use crate::api::open_channel::OPEN_CHANNEL_PATH; +use crate::api::bolt11_send::handle_bolt11_send_request; +use crate::api::bolt11_send::BOLT11_SEND_PATH; #[derive(Clone)] pub struct NodeService { @@ -46,6 +48,7 @@ impl Service> for NodeService { BOLT11_RECEIVE_PATH => { Box::pin(handle_request(node, req, handle_bolt11_receive_request)) }, + BOLT11_SEND_PATH => Box::pin(handle_request(node, req, handle_bolt11_send_request)), OPEN_CHANNEL_PATH => Box::pin(handle_request(node, req, handle_open_channel)), path => { let error = format!("Unknown request: {}", path).into_bytes(); From ac90b8f752ddd8b4fb572890b138b0cd09d345c4 Mon Sep 17 00:00:00 2001 From: G8XSU <3442979+G8XSU@users.noreply.github.com> Date: Wed, 4 Sep 2024 17:24:44 -0700 Subject: [PATCH 7/9] Add Impl for Bolt12Receive Api --- server/src/api/bolt12_receive.rs | 17 +++++++++++++++++ server/src/api/mod.rs | 1 + server/src/service.rs | 5 +++++ 3 files changed, 23 insertions(+) create mode 100644 server/src/api/bolt12_receive.rs diff --git a/server/src/api/bolt12_receive.rs b/server/src/api/bolt12_receive.rs new file mode 100644 index 0000000..9a5ae79 --- /dev/null +++ b/server/src/api/bolt12_receive.rs @@ -0,0 +1,17 @@ +use ldk_node::Node; +use protos::{Bolt12ReceiveRequest, Bolt12ReceiveResponse}; +use std::sync::Arc; + +pub(crate) const BOLT12_RECEIVE_PATH: &str = "Bolt12Receive"; + +pub(crate) fn handle_bolt12_receive_request( + node: Arc, request: Bolt12ReceiveRequest, +) -> Result { + let offer = match request.amount_msat { + Some(amount_msat) => node.bolt12_payment().receive(amount_msat, &request.description)?, + None => node.bolt12_payment().receive_variable_amount(&request.description)?, + }; + + let response = Bolt12ReceiveResponse { offer: offer.to_string() }; + Ok(response) +} diff --git a/server/src/api/mod.rs b/server/src/api/mod.rs index 1f6b050..9b7d580 100644 --- a/server/src/api/mod.rs +++ b/server/src/api/mod.rs @@ -1,5 +1,6 @@ pub(crate) mod bolt11_receive; pub(crate) mod bolt11_send; +pub(crate) mod bolt12_receive; pub(crate) mod onchain_receive; pub(crate) mod onchain_send; pub(crate) mod open_channel; diff --git a/server/src/service.rs b/server/src/service.rs index 69f2502..74d98b3 100644 --- a/server/src/service.rs +++ b/server/src/service.rs @@ -21,6 +21,8 @@ use crate::api::open_channel::handle_open_channel; use crate::api::open_channel::OPEN_CHANNEL_PATH; use crate::api::bolt11_send::handle_bolt11_send_request; use crate::api::bolt11_send::BOLT11_SEND_PATH; +use crate::api::bolt12_receive::handle_bolt12_receive_request; +use crate::api::bolt12_receive::BOLT12_RECEIVE_PATH; #[derive(Clone)] pub struct NodeService { @@ -49,6 +51,9 @@ impl Service> for NodeService { Box::pin(handle_request(node, req, handle_bolt11_receive_request)) }, BOLT11_SEND_PATH => Box::pin(handle_request(node, req, handle_bolt11_send_request)), + BOLT12_RECEIVE_PATH => { + Box::pin(handle_request(node, req, handle_bolt12_receive_request)) + }, OPEN_CHANNEL_PATH => Box::pin(handle_request(node, req, handle_open_channel)), path => { let error = format!("Unknown request: {}", path).into_bytes(); From e63d1aee5dd3f5abdacd87f8c247896fa43bb13a Mon Sep 17 00:00:00 2001 From: G8XSU <3442979+G8XSU@users.noreply.github.com> Date: Wed, 4 Sep 2024 17:25:26 -0700 Subject: [PATCH 8/9] Add Impl for Bolt12Send Api --- server/src/api/bolt12_send.rs | 25 +++++++++++++++++++++++++ server/src/api/mod.rs | 1 + server/src/service.rs | 3 +++ 3 files changed, 29 insertions(+) create mode 100644 server/src/api/bolt12_send.rs diff --git a/server/src/api/bolt12_send.rs b/server/src/api/bolt12_send.rs new file mode 100644 index 0000000..8718e0a --- /dev/null +++ b/server/src/api/bolt12_send.rs @@ -0,0 +1,25 @@ +use bytes::Bytes; +use ldk_node::lightning::offers::offer::Offer; +use ldk_node::Node; +use protos::{Bolt12SendRequest, Bolt12SendResponse}; +use std::str::FromStr; +use std::sync::Arc; + +pub(crate) const BOLT12_SEND_PATH: &str = "Bolt12Send"; + +pub(crate) fn handle_bolt12_send_request( + node: Arc, request: Bolt12SendRequest, +) -> Result { + let offer = + Offer::from_str(&request.offer.as_str()).map_err(|_| ldk_node::NodeError::InvalidOffer)?; + + let payment_id = match request.amount_msat { + None => node.bolt12_payment().send(&offer, request.payer_note), + Some(amount_msat) => { + node.bolt12_payment().send_using_amount(&offer, request.payer_note, amount_msat) + }, + }?; + + let response = Bolt12SendResponse { payment_id: Bytes::from(payment_id.0.to_vec()) }; + Ok(response) +} diff --git a/server/src/api/mod.rs b/server/src/api/mod.rs index 9b7d580..39a9528 100644 --- a/server/src/api/mod.rs +++ b/server/src/api/mod.rs @@ -1,6 +1,7 @@ pub(crate) mod bolt11_receive; pub(crate) mod bolt11_send; pub(crate) mod bolt12_receive; +pub(crate) mod bolt12_send; pub(crate) mod onchain_receive; pub(crate) mod onchain_send; pub(crate) mod open_channel; diff --git a/server/src/service.rs b/server/src/service.rs index 74d98b3..9e8656b 100644 --- a/server/src/service.rs +++ b/server/src/service.rs @@ -23,6 +23,8 @@ use crate::api::bolt11_send::handle_bolt11_send_request; use crate::api::bolt11_send::BOLT11_SEND_PATH; use crate::api::bolt12_receive::handle_bolt12_receive_request; use crate::api::bolt12_receive::BOLT12_RECEIVE_PATH; +use crate::api::bolt12_send::handle_bolt12_send_request; +use crate::api::bolt12_send::BOLT12_SEND_PATH; #[derive(Clone)] pub struct NodeService { @@ -54,6 +56,7 @@ impl Service> for NodeService { BOLT12_RECEIVE_PATH => { Box::pin(handle_request(node, req, handle_bolt12_receive_request)) }, + BOLT12_SEND_PATH => Box::pin(handle_request(node, req, handle_bolt12_send_request)), OPEN_CHANNEL_PATH => Box::pin(handle_request(node, req, handle_open_channel)), path => { let error = format!("Unknown request: {}", path).into_bytes(); From 92d33616c2023db108e7985e5ae525e63342a4c5 Mon Sep 17 00:00:00 2001 From: G8XSU <3442979+G8XSU@users.noreply.github.com> Date: Wed, 11 Sep 2024 16:32:31 -0700 Subject: [PATCH 9/9] Add Impl for CloseChannel Api --- server/src/api/close_channel.rs | 26 ++++++++++++++++++++++++++ server/src/api/mod.rs | 1 + server/src/service.rs | 15 +++++++++------ 3 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 server/src/api/close_channel.rs diff --git a/server/src/api/close_channel.rs b/server/src/api/close_channel.rs new file mode 100644 index 0000000..73e0d5c --- /dev/null +++ b/server/src/api/close_channel.rs @@ -0,0 +1,26 @@ +use ldk_node::bitcoin::secp256k1::PublicKey; +use ldk_node::{Node, UserChannelId}; +use protos::{CloseChannelRequest, CloseChannelResponse}; +use std::str::FromStr; +use std::sync::Arc; + +pub(crate) const CLOSE_CHANNEL_PATH: &str = "CloseChannel"; + +pub(crate) fn handle_close_channel_request( + node: Arc, request: CloseChannelRequest, +) -> Result { + //TODO: Should this be string? + let mut user_channel_id_bytes = [0u8; 16]; + user_channel_id_bytes.copy_from_slice(&request.user_channel_id); + let user_channel_id = UserChannelId(u128::from_be_bytes(user_channel_id_bytes)); + let counterparty_node_id = PublicKey::from_str(&request.counterparty_node_id) + .map_err(|_| ldk_node::NodeError::InvalidPublicKey)?; + + match request.force_close { + Some(true) => node.force_close_channel(&user_channel_id, counterparty_node_id)?, + _ => node.close_channel(&user_channel_id, counterparty_node_id)?, + }; + + let response = CloseChannelResponse {}; + Ok(response) +} diff --git a/server/src/api/mod.rs b/server/src/api/mod.rs index 39a9528..42aa262 100644 --- a/server/src/api/mod.rs +++ b/server/src/api/mod.rs @@ -2,6 +2,7 @@ pub(crate) mod bolt11_receive; pub(crate) mod bolt11_send; pub(crate) mod bolt12_receive; pub(crate) mod bolt12_send; +pub(crate) mod close_channel; pub(crate) mod onchain_receive; pub(crate) mod onchain_send; pub(crate) mod open_channel; diff --git a/server/src/service.rs b/server/src/service.rs index 9e8656b..ef4aa25 100644 --- a/server/src/service.rs +++ b/server/src/service.rs @@ -11,20 +11,22 @@ use std::future::Future; use std::pin::Pin; use std::sync::Arc; -use crate::api::onchain_receive::handle_onchain_receive_request; -use crate::api::onchain_receive::ONCHAIN_RECEIVE_PATH; -use crate::api::onchain_send::handle_onchain_send_request; -use crate::api::onchain_send::ONCHAIN_SEND_PATH; use crate::api::bolt11_receive::handle_bolt11_receive_request; use crate::api::bolt11_receive::BOLT11_RECEIVE_PATH; -use crate::api::open_channel::handle_open_channel; -use crate::api::open_channel::OPEN_CHANNEL_PATH; use crate::api::bolt11_send::handle_bolt11_send_request; use crate::api::bolt11_send::BOLT11_SEND_PATH; use crate::api::bolt12_receive::handle_bolt12_receive_request; use crate::api::bolt12_receive::BOLT12_RECEIVE_PATH; use crate::api::bolt12_send::handle_bolt12_send_request; use crate::api::bolt12_send::BOLT12_SEND_PATH; +use crate::api::close_channel::handle_close_channel_request; +use crate::api::close_channel::CLOSE_CHANNEL_PATH; +use crate::api::onchain_receive::handle_onchain_receive_request; +use crate::api::onchain_receive::ONCHAIN_RECEIVE_PATH; +use crate::api::onchain_send::handle_onchain_send_request; +use crate::api::onchain_send::ONCHAIN_SEND_PATH; +use crate::api::open_channel::handle_open_channel; +use crate::api::open_channel::OPEN_CHANNEL_PATH; #[derive(Clone)] pub struct NodeService { @@ -58,6 +60,7 @@ impl Service> for NodeService { }, BOLT12_SEND_PATH => Box::pin(handle_request(node, req, handle_bolt12_send_request)), OPEN_CHANNEL_PATH => Box::pin(handle_request(node, req, handle_open_channel)), + CLOSE_CHANNEL_PATH => Box::pin(handle_request(node, req, handle_close_channel_request)), path => { let error = format!("Unknown request: {}", path).into_bytes(); Box::pin(async {