From eafb0e27ad7af2cb101bbd130284c54aa64f253d Mon Sep 17 00:00:00 2001 From: Elias Rohrer Date: Tue, 28 Nov 2023 12:43:40 +0100 Subject: [PATCH 1/6] Hide LSPS1 support behind `lsps1` cfg flag As the implementation isn't ready as of yet, we hide LSPS1 for now but make sure we test it in CI so that future changes don't break code compatibility. --- .github/workflows/build.yml | 2 ++ src/events.rs | 2 ++ src/lib.rs | 2 +- src/transport/message_handler.rs | 23 ++++++++++++++++++++--- src/transport/msgs.rs | 19 +++++++++++++++---- 5 files changed, 40 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9e66a72..6f2b238 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -47,3 +47,5 @@ jobs: run: rustup component add rustfmt && cargo fmt --all -- --check - name: Test on Rust ${{ matrix.toolchain }} run: cargo test + - name: Test on Rust ${{ matrix.toolchain }} with LSPS1 support + run: RUSTFLAGS="--cfg lsps1" cargo test diff --git a/src/events.rs b/src/events.rs index bb1e9b6..2ec126e 100644 --- a/src/events.rs +++ b/src/events.rs @@ -15,6 +15,7 @@ //! //! [`LiquidityManager::get_and_clear_pending_events`]: crate::LiquidityManager::get_and_clear_pending_events /// [`crate::LiquidityManager::get_and_clear_pending_events()`] to receive events. +#[cfg(lsps1)] use crate::channel_request; use crate::jit_channel; use std::collections::VecDeque; @@ -63,5 +64,6 @@ pub enum Event { /// An LSPS2 (JIT Channel) protocol event. LSPS2(jit_channel::LSPS2Event), /// An LSPS1 protocol event. + #[cfg(lsps1)] LSPS1(channel_request::event::Event), } diff --git a/src/lib.rs b/src/lib.rs index 37cc9dd..86fcaeb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,13 +18,13 @@ #![allow(clippy::drop_non_drop)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#[cfg(lsps1)] mod channel_request; pub mod events; pub mod jit_channel; mod transport; mod utils; -pub use channel_request::event::Event as LSPS1Event; pub use transport::message_handler::{ JITChannelsConfig, LiquidityManager, LiquidityProviderConfig, }; diff --git a/src/transport/message_handler.rs b/src/transport/message_handler.rs index 066ec9b..d77d794 100644 --- a/src/transport/message_handler.rs +++ b/src/transport/message_handler.rs @@ -1,8 +1,13 @@ #![allow(missing_docs)] -use crate::channel_request::channel_manager::CRManager; -use crate::channel_request::msgs::{ - ChannelInfo, OptionsSupported, Order, OrderId, OrderState, Payment, + +#[cfg(lsps1)] +use { + crate::channel_request::channel_manager::CRManager, + crate::channel_request::msgs::{ + ChannelInfo, OptionsSupported, Order, OrderId, OrderState, Payment, + }, }; + use crate::events::{Event, EventQueue}; use crate::jit_channel::channel_manager::JITChannelManager; use crate::jit_channel::msgs::{OpeningFeeParams, RawOpeningFeeParams}; @@ -57,6 +62,7 @@ pub(crate) trait ProtocolMessageHandler { /// to provide liquidity services to clients. pub struct LiquidityProviderConfig { /// LSPS1 Configuration + #[cfg(lsps1)] pub lsps1_config: Option, /// Optional configuration for JIT channels /// should you want to support them. @@ -75,6 +81,7 @@ pub struct JITChannelsConfig { pub max_payment_size_msat: u64, } +#[cfg(lsps1)] pub struct CRChannelConfig { pub token: Option, pub max_fees: Option, @@ -135,6 +142,7 @@ pub struct LiquidityManager< pending_events: Arc, request_id_to_method_map: Mutex>, lsps0_message_handler: LSPS0MessageHandler, + #[cfg(lsps1)] lsps1_message_handler: Option>, lsps2_message_handler: @@ -207,6 +215,7 @@ where { }) }); + #[cfg(lsps1)] let lsps1_message_handler = provider_config.as_ref().and_then(|config| { config.lsps1_config.as_ref().map(|lsps1_config| { CRManager::new( @@ -224,6 +233,7 @@ where { pending_events, request_id_to_method_map: Mutex::new(HashMap::new()), lsps0_message_handler, + #[cfg(lsps1)] lsps1_message_handler, lsps2_message_handler, provider_config, @@ -261,6 +271,7 @@ where { pub fn set_peer_manager( &self, peer_manager: Arc>, ) { + #[cfg(lsps1)] if let Some(lsps1_message_handler) = &self.lsps1_message_handler { lsps1_message_handler.set_peer_manager(peer_manager.clone()); } @@ -269,6 +280,7 @@ where { } } + #[cfg(lsps1)] pub fn request_for_info( &self, counterparty_node_id: PublicKey, channel_id: u128, ) -> Result<(), APIError> { @@ -278,6 +290,7 @@ where { Ok(()) } + #[cfg(lsps1)] pub fn place_order( &self, channel_id: u128, counterparty_node_id: &PublicKey, order: Order, ) -> Result<(), APIError> { @@ -287,6 +300,7 @@ where { Ok(()) } + #[cfg(lsps1)] pub fn send_invoice_for_order( &self, request_id: RequestId, counterparty_node_id: &PublicKey, payment: Payment, created_at: chrono::DateTime, expires_at: chrono::DateTime, @@ -303,6 +317,7 @@ where { Ok(()) } + #[cfg(lsps1)] pub fn check_order_status( self, channel_id: u128, counterparty_node_id: &PublicKey, order_id: OrderId, ) -> Result<(), APIError> { @@ -312,6 +327,7 @@ where { Ok(()) } + #[cfg(lsps1)] pub fn update_order_status( &self, request_id: RequestId, counterparty_node_id: PublicKey, order_id: OrderId, order_state: OrderState, channel: Option, @@ -508,6 +524,7 @@ where { LSPSMessage::LSPS0(msg) => { self.lsps0_message_handler.handle_message(msg, sender_node_id)?; } + #[cfg(lsps1)] LSPSMessage::LSPS1(msg) => match &self.lsps1_message_handler { Some(lsps1_message_handler) => { lsps1_message_handler.handle_message(msg, sender_node_id)?; diff --git a/src/transport/msgs.rs b/src/transport/msgs.rs index bf89249..ee9c142 100644 --- a/src/transport/msgs.rs +++ b/src/transport/msgs.rs @@ -1,3 +1,4 @@ +#[cfg(lsps1)] use crate::channel_request::msgs::{ LSPS1Message, LSPS1Request, LSPS1Response, LSPS1_CREATE_ORDER_METHOD_NAME, LSPS1_GET_INFO_METHOD_NAME, LSPS1_GET_ORDER_METHOD_NAME, @@ -97,8 +98,9 @@ impl TryFrom for LSPS0Message { match message { LSPSMessage::Invalid => Err(()), LSPSMessage::LSPS0(message) => Ok(message), - LSPSMessage::LSPS2(_) => Err(()), + #[cfg(lsps1)] LSPSMessage::LSPS1(_) => Err(()), + LSPSMessage::LSPS2(_) => Err(()), } } } @@ -113,8 +115,9 @@ impl From for LSPSMessage { pub enum LSPSMessage { Invalid, LSPS0(LSPS0Message), - LSPS2(LSPS2Message), + #[cfg(lsps1)] LSPS1(LSPS1Message), + LSPS2(LSPS2Message), } impl LSPSMessage { @@ -131,10 +134,11 @@ impl LSPSMessage { LSPSMessage::LSPS0(LSPS0Message::Request(request_id, request)) => { Some((request_id.0.clone(), request.method().to_string())) } - LSPSMessage::LSPS2(LSPS2Message::Request(request_id, request)) => { + #[cfg(lsps1)] + LSPSMessage::LSPS1(LSPS1Message::Request(request_id, request)) => { Some((request_id.0.clone(), request.method().to_string())) } - LSPSMessage::LSPS1(LSPS1Message::Request(request_id, request)) => { + LSPSMessage::LSPS2(LSPS2Message::Request(request_id, request)) => { Some((request_id.0.clone(), request.method().to_string())) } _ => None, @@ -175,6 +179,7 @@ impl Serialize for LSPSMessage { } } } + #[cfg(lsps1)] LSPSMessage::LSPS1(LSPS1Message::Request(request_id, request)) => { jsonrpc_object.serialize_field(JSONRPC_ID_FIELD_KEY, &request_id.0)?; jsonrpc_object.serialize_field(JSONRPC_METHOD_FIELD_KEY, request.method())?; @@ -191,6 +196,7 @@ impl Serialize for LSPSMessage { } } } + #[cfg(lsps1)] LSPSMessage::LSPS1(LSPS1Message::Response(request_id, response)) => { jsonrpc_object.serialize_field(JSONRPC_ID_FIELD_KEY, &request_id.0)?; @@ -319,6 +325,7 @@ impl<'de, 'a> Visitor<'de> for LSPSMessageVisitor<'a> { LSPS0Request::ListProtocols(ListProtocolsRequest {}), ))) } + #[cfg(lsps1)] LSPS1_GET_INFO_METHOD_NAME => { let request = serde_json::from_value(params.unwrap_or(json!({}))) .map_err(de::Error::custom)?; @@ -327,6 +334,7 @@ impl<'de, 'a> Visitor<'de> for LSPSMessageVisitor<'a> { LSPS1Request::GetInfo(request), ))) } + #[cfg(lsps1)] LSPS1_CREATE_ORDER_METHOD_NAME => { let request = serde_json::from_value(params.unwrap_or(json!({}))) .map_err(de::Error::custom)?; @@ -335,6 +343,7 @@ impl<'de, 'a> Visitor<'de> for LSPSMessageVisitor<'a> { LSPS1Request::CreateOrder(request), ))) } + #[cfg(lsps1)] LSPS1_GET_ORDER_METHOD_NAME => { let request = serde_json::from_value(params.unwrap_or(json!({}))) .map_err(de::Error::custom)?; @@ -403,6 +412,7 @@ impl<'de, 'a> Visitor<'de> for LSPSMessageVisitor<'a> { Err(de::Error::custom("Received invalid lsps2.get_versions response.")) } } + #[cfg(lsps1)] LSPS1_CREATE_ORDER_METHOD_NAME => { if let Some(error) = error { Ok(LSPSMessage::LSPS1(LSPS1Message::Response( @@ -420,6 +430,7 @@ impl<'de, 'a> Visitor<'de> for LSPSMessageVisitor<'a> { Err(de::Error::custom("Received invalid JSON-RPC object: one of method, result, or error required")) } } + #[cfg(lsps1)] LSPS1_GET_ORDER_METHOD_NAME => { if let Some(error) = error { Ok(LSPSMessage::LSPS1(LSPS1Message::Response( From b6badc0a74bd7cf55eb218faba791f36c8f91ada Mon Sep 17 00:00:00 2001 From: Elias Rohrer Date: Tue, 28 Nov 2023 12:51:04 +0100 Subject: [PATCH 2/6] Rename `transport` module to `lsps0` --- src/channel_request/channel_manager.rs | 6 +++--- src/channel_request/event.rs | 2 +- src/channel_request/msgs.rs | 2 +- src/jit_channel/channel_manager.rs | 6 +++--- src/jit_channel/event.rs | 2 +- src/jit_channel/msgs.rs | 2 +- src/lib.rs | 7 ++----- src/{transport => lsps0}/message_handler.rs | 6 +++--- src/{transport => lsps0}/mod.rs | 0 src/{transport => lsps0}/msgs.rs | 0 src/{transport => lsps0}/protocol.rs | 4 ++-- src/utils.rs | 2 +- 12 files changed, 18 insertions(+), 21 deletions(-) rename src/{transport => lsps0}/message_handler.rs (99%) rename src/{transport => lsps0}/mod.rs (100%) rename src/{transport => lsps0}/msgs.rs (100%) rename src/{transport => lsps0}/protocol.rs (98%) diff --git a/src/channel_request/channel_manager.rs b/src/channel_request/channel_manager.rs index 4ec4535..d393ecd 100644 --- a/src/channel_request/channel_manager.rs +++ b/src/channel_request/channel_manager.rs @@ -26,10 +26,10 @@ use lightning::util::errors::APIError; use lightning::util::logger::{Level, Logger}; use crate::events::EventQueue; -use crate::transport::message_handler::{CRChannelConfig, ProtocolMessageHandler}; -use crate::transport::msgs::{LSPSMessage, RequestId}; +use crate::lsps0::message_handler::{CRChannelConfig, ProtocolMessageHandler}; +use crate::lsps0::msgs::{LSPSMessage, RequestId}; use crate::utils; -use crate::{events::Event, transport::msgs::ResponseError}; +use crate::{events::Event, lsps0::msgs::ResponseError}; use super::msgs::{ ChannelInfo, CreateOrderRequest, CreateOrderResponse, GetInfoRequest, GetInfoResponse, diff --git a/src/channel_request/event.rs b/src/channel_request/event.rs index 9942e82..946979f 100644 --- a/src/channel_request/event.rs +++ b/src/channel_request/event.rs @@ -3,7 +3,7 @@ use bitcoin::secp256k1::PublicKey; use super::msgs::{ChannelInfo, OptionsSupported, Order, OrderId, Payment}; -use crate::transport::msgs::RequestId; +use crate::lsps0::msgs::RequestId; /// An "Event" which you should probably take some action in response to. #[derive(Clone, Debug, PartialEq, Eq)] diff --git a/src/channel_request/msgs.rs b/src/channel_request/msgs.rs index 2d8dd0e..3248789 100644 --- a/src/channel_request/msgs.rs +++ b/src/channel_request/msgs.rs @@ -3,7 +3,7 @@ use std::convert::TryFrom; use serde::{Deserialize, Serialize}; -use crate::transport::msgs::{LSPSMessage, RequestId, ResponseError}; +use crate::lsps0::msgs::{LSPSMessage, RequestId, ResponseError}; pub(crate) const LSPS1_GET_INFO_METHOD_NAME: &str = "lsps1.get_info"; pub(crate) const LSPS1_CREATE_ORDER_METHOD_NAME: &str = "lsps1.create_order"; diff --git a/src/jit_channel/channel_manager.rs b/src/jit_channel/channel_manager.rs index 0bee08f..875299c 100644 --- a/src/jit_channel/channel_manager.rs +++ b/src/jit_channel/channel_manager.rs @@ -29,9 +29,9 @@ use lightning::util::logger::{Level, Logger}; use crate::events::EventQueue; use crate::jit_channel::utils::{compute_opening_fee, is_valid_opening_fee_params}; use crate::jit_channel::LSPS2Event; -use crate::transport::message_handler::ProtocolMessageHandler; -use crate::transport::msgs::{LSPSMessage, RequestId}; -use crate::{events::Event, transport::msgs::ResponseError}; +use crate::lsps0::message_handler::ProtocolMessageHandler; +use crate::lsps0::msgs::{LSPSMessage, RequestId}; +use crate::{events::Event, lsps0::msgs::ResponseError}; use crate::{utils, JITChannelsConfig}; use crate::jit_channel::msgs::{ diff --git a/src/jit_channel/event.rs b/src/jit_channel/event.rs index 1216de8..ca727eb 100644 --- a/src/jit_channel/event.rs +++ b/src/jit_channel/event.rs @@ -10,7 +10,7 @@ use bitcoin::secp256k1::PublicKey; use super::msgs::OpeningFeeParams; -use crate::transport::msgs::RequestId; +use crate::lsps0::msgs::RequestId; /// An event which you should probably take some action in response to. #[derive(Clone, Debug, PartialEq, Eq)] diff --git a/src/jit_channel/msgs.rs b/src/jit_channel/msgs.rs index f984a1b..41b03f3 100644 --- a/src/jit_channel/msgs.rs +++ b/src/jit_channel/msgs.rs @@ -6,7 +6,7 @@ use bitcoin::hashes::{Hash, HashEngine}; use chrono::Utc; use serde::{Deserialize, Serialize}; -use crate::transport::msgs::{LSPSMessage, RequestId, ResponseError}; +use crate::lsps0::msgs::{LSPSMessage, RequestId, ResponseError}; use crate::utils; pub(crate) const LSPS2_GET_VERSIONS_METHOD_NAME: &str = "lsps2.get_versions"; diff --git a/src/lib.rs b/src/lib.rs index 86fcaeb..67fdd4a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,10 +22,7 @@ mod channel_request; pub mod events; pub mod jit_channel; -mod transport; +mod lsps0; mod utils; -pub use transport::message_handler::{ - JITChannelsConfig, LiquidityManager, LiquidityProviderConfig, -}; -pub use transport::msgs::{RawLSPSMessage, LSPS_MESSAGE_TYPE_ID}; +pub use lsps0::message_handler::{JITChannelsConfig, LiquidityManager, LiquidityProviderConfig}; diff --git a/src/transport/message_handler.rs b/src/lsps0/message_handler.rs similarity index 99% rename from src/transport/message_handler.rs rename to src/lsps0/message_handler.rs index d77d794..e62da59 100644 --- a/src/transport/message_handler.rs +++ b/src/lsps0/message_handler.rs @@ -11,9 +11,9 @@ use { use crate::events::{Event, EventQueue}; use crate::jit_channel::channel_manager::JITChannelManager; use crate::jit_channel::msgs::{OpeningFeeParams, RawOpeningFeeParams}; -use crate::transport::msgs::RequestId; -use crate::transport::msgs::{LSPSMessage, RawLSPSMessage, LSPS_MESSAGE_TYPE_ID}; -use crate::transport::protocol::LSPS0MessageHandler; +use crate::lsps0::msgs::RequestId; +use crate::lsps0::msgs::{LSPSMessage, RawLSPSMessage, LSPS_MESSAGE_TYPE_ID}; +use crate::lsps0::protocol::LSPS0MessageHandler; use chrono::Utc; use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator}; diff --git a/src/transport/mod.rs b/src/lsps0/mod.rs similarity index 100% rename from src/transport/mod.rs rename to src/lsps0/mod.rs diff --git a/src/transport/msgs.rs b/src/lsps0/msgs.rs similarity index 100% rename from src/transport/msgs.rs rename to src/lsps0/msgs.rs diff --git a/src/transport/protocol.rs b/src/lsps0/protocol.rs similarity index 98% rename from src/transport/protocol.rs rename to src/lsps0/protocol.rs index bc9c118..3aa4feb 100644 --- a/src/transport/protocol.rs +++ b/src/lsps0/protocol.rs @@ -5,8 +5,8 @@ use lightning::util::logger::Level; use std::ops::Deref; use std::sync::{Arc, Mutex}; -use crate::transport::message_handler::ProtocolMessageHandler; -use crate::transport::msgs::{ +use crate::lsps0::message_handler::ProtocolMessageHandler; +use crate::lsps0::msgs::{ LSPS0Message, LSPS0Request, LSPS0Response, LSPSMessage, ListProtocolsRequest, ListProtocolsResponse, RequestId, ResponseError, }; diff --git a/src/utils.rs b/src/utils.rs index c5969db..d80d8de 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -2,7 +2,7 @@ use bitcoin::secp256k1::PublicKey; use lightning::sign::EntropySource; use std::{fmt::Write, ops::Deref}; -use crate::transport::msgs::RequestId; +use crate::lsps0::msgs::RequestId; /// Maximum transaction index that can be used in a `short_channel_id`. /// This value is based on the 3-bytes available for tx index. From b628a59646458cded7c67957e703b9631edf7e09 Mon Sep 17 00:00:00 2001 From: Elias Rohrer Date: Tue, 28 Nov 2023 12:52:38 +0100 Subject: [PATCH 3/6] Rename `channel_request` module to `lsps1` --- src/events.rs | 6 +++--- src/lib.rs | 4 ++-- src/lsps0/message_handler.rs | 6 ++---- src/lsps0/msgs.rs | 10 +++++----- src/{channel_request => lsps1}/channel_manager.rs | 0 src/{channel_request => lsps1}/event.rs | 0 src/{channel_request => lsps1}/mod.rs | 0 src/{channel_request => lsps1}/msgs.rs | 0 src/{channel_request => lsps1}/utils.rs | 0 9 files changed, 12 insertions(+), 14 deletions(-) rename src/{channel_request => lsps1}/channel_manager.rs (100%) rename src/{channel_request => lsps1}/event.rs (100%) rename src/{channel_request => lsps1}/mod.rs (100%) rename src/{channel_request => lsps1}/msgs.rs (100%) rename src/{channel_request => lsps1}/utils.rs (100%) diff --git a/src/events.rs b/src/events.rs index 2ec126e..e213550 100644 --- a/src/events.rs +++ b/src/events.rs @@ -14,10 +14,10 @@ //! [`LiquidityManager::get_and_clear_pending_events`] to receive events. //! //! [`LiquidityManager::get_and_clear_pending_events`]: crate::LiquidityManager::get_and_clear_pending_events +use crate::jit_channel; /// [`crate::LiquidityManager::get_and_clear_pending_events()`] to receive events. #[cfg(lsps1)] -use crate::channel_request; -use crate::jit_channel; +use crate::lsps1; use std::collections::VecDeque; use std::sync::{Condvar, Mutex}; @@ -65,5 +65,5 @@ pub enum Event { LSPS2(jit_channel::LSPS2Event), /// An LSPS1 protocol event. #[cfg(lsps1)] - LSPS1(channel_request::event::Event), + LSPS1(lsps1::event::Event), } diff --git a/src/lib.rs b/src/lib.rs index 67fdd4a..fc8b3cf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,11 +18,11 @@ #![allow(clippy::drop_non_drop)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] -#[cfg(lsps1)] -mod channel_request; pub mod events; pub mod jit_channel; mod lsps0; +#[cfg(lsps1)] +mod lsps1; mod utils; pub use lsps0::message_handler::{JITChannelsConfig, LiquidityManager, LiquidityProviderConfig}; diff --git a/src/lsps0/message_handler.rs b/src/lsps0/message_handler.rs index e62da59..649abab 100644 --- a/src/lsps0/message_handler.rs +++ b/src/lsps0/message_handler.rs @@ -2,10 +2,8 @@ #[cfg(lsps1)] use { - crate::channel_request::channel_manager::CRManager, - crate::channel_request::msgs::{ - ChannelInfo, OptionsSupported, Order, OrderId, OrderState, Payment, - }, + crate::lsps1::channel_manager::CRManager, + crate::lsps1::msgs::{ChannelInfo, OptionsSupported, Order, OrderId, OrderState, Payment}, }; use crate::events::{Event, EventQueue}; diff --git a/src/lsps0/msgs.rs b/src/lsps0/msgs.rs index ee9c142..a570371 100644 --- a/src/lsps0/msgs.rs +++ b/src/lsps0/msgs.rs @@ -1,12 +1,12 @@ -#[cfg(lsps1)] -use crate::channel_request::msgs::{ - LSPS1Message, LSPS1Request, LSPS1Response, LSPS1_CREATE_ORDER_METHOD_NAME, - LSPS1_GET_INFO_METHOD_NAME, LSPS1_GET_ORDER_METHOD_NAME, -}; use crate::jit_channel::msgs::{ LSPS2Message, LSPS2Request, LSPS2Response, LSPS2_BUY_METHOD_NAME, LSPS2_GET_INFO_METHOD_NAME, LSPS2_GET_VERSIONS_METHOD_NAME, }; +#[cfg(lsps1)] +use crate::lsps1::msgs::{ + LSPS1Message, LSPS1Request, LSPS1Response, LSPS1_CREATE_ORDER_METHOD_NAME, + LSPS1_GET_INFO_METHOD_NAME, LSPS1_GET_ORDER_METHOD_NAME, +}; use lightning::impl_writeable_msg; use lightning::ln::wire; use serde::de; diff --git a/src/channel_request/channel_manager.rs b/src/lsps1/channel_manager.rs similarity index 100% rename from src/channel_request/channel_manager.rs rename to src/lsps1/channel_manager.rs diff --git a/src/channel_request/event.rs b/src/lsps1/event.rs similarity index 100% rename from src/channel_request/event.rs rename to src/lsps1/event.rs diff --git a/src/channel_request/mod.rs b/src/lsps1/mod.rs similarity index 100% rename from src/channel_request/mod.rs rename to src/lsps1/mod.rs diff --git a/src/channel_request/msgs.rs b/src/lsps1/msgs.rs similarity index 100% rename from src/channel_request/msgs.rs rename to src/lsps1/msgs.rs diff --git a/src/channel_request/utils.rs b/src/lsps1/utils.rs similarity index 100% rename from src/channel_request/utils.rs rename to src/lsps1/utils.rs From 68158e78e59348252ced3873f5bb881e009e9a1b Mon Sep 17 00:00:00 2001 From: Elias Rohrer Date: Tue, 28 Nov 2023 13:04:58 +0100 Subject: [PATCH 4/6] Rename `jit_channel` module to `lsps2` --- src/events.rs | 6 +- src/lib.rs | 2 +- src/lsps0/message_handler.rs | 22 +-- src/lsps0/msgs.rs | 8 +- src/{jit_channel => lsps2}/channel_manager.rs | 154 ++++++++---------- src/{jit_channel => lsps2}/event.rs | 10 +- src/{jit_channel => lsps2}/mod.rs | 0 src/{jit_channel => lsps2}/msgs.rs | 4 +- src/{jit_channel => lsps2}/utils.rs | 2 +- 9 files changed, 94 insertions(+), 114 deletions(-) rename src/{jit_channel => lsps2}/channel_manager.rs (91%) rename src/{jit_channel => lsps2}/event.rs (94%) rename src/{jit_channel => lsps2}/mod.rs (100%) rename src/{jit_channel => lsps2}/msgs.rs (99%) rename src/{jit_channel => lsps2}/utils.rs (97%) diff --git a/src/events.rs b/src/events.rs index e213550..9038c7a 100644 --- a/src/events.rs +++ b/src/events.rs @@ -14,10 +14,10 @@ //! [`LiquidityManager::get_and_clear_pending_events`] to receive events. //! //! [`LiquidityManager::get_and_clear_pending_events`]: crate::LiquidityManager::get_and_clear_pending_events -use crate::jit_channel; -/// [`crate::LiquidityManager::get_and_clear_pending_events()`] to receive events. + #[cfg(lsps1)] use crate::lsps1; +use crate::lsps2; use std::collections::VecDeque; use std::sync::{Condvar, Mutex}; @@ -62,7 +62,7 @@ impl EventQueue { #[derive(Debug, Clone, PartialEq, Eq)] pub enum Event { /// An LSPS2 (JIT Channel) protocol event. - LSPS2(jit_channel::LSPS2Event), + LSPS2(lsps2::LSPS2Event), /// An LSPS1 protocol event. #[cfg(lsps1)] LSPS1(lsps1::event::Event), diff --git a/src/lib.rs b/src/lib.rs index fc8b3cf..9d5df54 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,10 +19,10 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] pub mod events; -pub mod jit_channel; mod lsps0; #[cfg(lsps1)] mod lsps1; +pub mod lsps2; mod utils; pub use lsps0::message_handler::{JITChannelsConfig, LiquidityManager, LiquidityProviderConfig}; diff --git a/src/lsps0/message_handler.rs b/src/lsps0/message_handler.rs index 649abab..38709e7 100644 --- a/src/lsps0/message_handler.rs +++ b/src/lsps0/message_handler.rs @@ -7,11 +7,11 @@ use { }; use crate::events::{Event, EventQueue}; -use crate::jit_channel::channel_manager::JITChannelManager; -use crate::jit_channel::msgs::{OpeningFeeParams, RawOpeningFeeParams}; use crate::lsps0::msgs::RequestId; use crate::lsps0::msgs::{LSPSMessage, RawLSPSMessage, LSPS_MESSAGE_TYPE_ID}; use crate::lsps0::protocol::LSPS0MessageHandler; +use crate::lsps2::channel_manager::JITChannelManager; +use crate::lsps2::msgs::{OpeningFeeParams, RawOpeningFeeParams}; use chrono::Utc; use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator}; @@ -64,7 +64,7 @@ pub struct LiquidityProviderConfig { pub lsps1_config: Option, /// Optional configuration for JIT channels /// should you want to support them. - pub jit_channels: Option, + pub lsps2_config: Option, } /// Configuration options for JIT channels. @@ -202,10 +202,10 @@ where { ); let lsps2_message_handler = provider_config.as_ref().and_then(|config| { - config.jit_channels.as_ref().map(|jit_channels_config| { + config.lsps2_config.as_ref().map(|config| { JITChannelManager::new( entropy_source.clone(), - jit_channels_config, + config, Arc::clone(&pending_messages), Arc::clone(&pending_events), Arc::clone(&channel_manager), @@ -355,7 +355,7 @@ where { /// /// `token` is an optional String that will be provided to the LSP. /// It can be used by the LSP as an API key, coupon code, or some other way to identify a user. - pub fn jit_channel_create_invoice( + pub fn lsps2_create_invoice( &self, counterparty_node_id: PublicKey, payment_size_msat: Option, token: Option, user_channel_id: u128, ) -> Result<(), APIError> { @@ -379,7 +379,7 @@ where { /// /// Should be called in response to receiving a [`LSPS2Event::GetInfo`] event. /// - /// [`LSPS2Event::GetInfo`]: crate::jit_channel::LSPS2Event::GetInfo + /// [`LSPS2Event::GetInfo`]: crate::lsps2::LSPS2Event::GetInfo pub fn invalid_token_provided( &self, counterparty_node_id: PublicKey, request_id: RequestId, ) -> Result<(), APIError> { @@ -397,7 +397,7 @@ where { /// /// Should be called in response to receiving a [`LSPS2Event::GetInfo`] event. /// - /// [`LSPS2Event::GetInfo`]: crate::jit_channel::LSPS2Event::GetInfo + /// [`LSPS2Event::GetInfo`]: crate::lsps2::LSPS2Event::GetInfo pub fn opening_fee_params_generated( &self, counterparty_node_id: PublicKey, request_id: RequestId, opening_fee_params_menu: Vec, @@ -422,7 +422,7 @@ where { /// /// Should be called in response to receiving a [`LSPS2Event::GetInfoResponse`] event. /// - /// [`LSPS2Event::GetInfoResponse`]: crate::jit_channel::LSPS2Event::GetInfoResponse + /// [`LSPS2Event::GetInfoResponse`]: crate::lsps2::LSPS2Event::GetInfoResponse pub fn opening_fee_params_selected( &self, counterparty_node_id: PublicKey, channel_id: u128, opening_fee_params: OpeningFeeParams, @@ -445,7 +445,7 @@ where { /// /// Should be called in response to receiving a [`LSPS2Event::BuyRequest`] event. /// - /// [`LSPS2Event::BuyRequest`]: crate::jit_channel::LSPS2Event::BuyRequest + /// [`LSPS2Event::BuyRequest`]: crate::lsps2::LSPS2Event::BuyRequest pub fn invoice_parameters_generated( &self, counterparty_node_id: PublicKey, request_id: RequestId, scid: u64, cltv_expiry_delta: u32, client_trusts_lsp: bool, @@ -477,7 +477,7 @@ where { /// Will do nothing if the scid does not match any of the ones we gave out. /// /// [`Event::HTLCIntercepted`]: lightning::events::Event::HTLCIntercepted - /// [`LSPS2Event::OpenChannel`]: crate::jit_channel::LSPS2Event::OpenChannel + /// [`LSPS2Event::OpenChannel`]: crate::lsps2::LSPS2Event::OpenChannel pub fn htlc_intercepted( &self, scid: u64, intercept_id: InterceptId, expected_outbound_amount_msat: u64, ) -> Result<(), APIError> { diff --git a/src/lsps0/msgs.rs b/src/lsps0/msgs.rs index a570371..baddeb0 100644 --- a/src/lsps0/msgs.rs +++ b/src/lsps0/msgs.rs @@ -1,12 +1,12 @@ -use crate::jit_channel::msgs::{ - LSPS2Message, LSPS2Request, LSPS2Response, LSPS2_BUY_METHOD_NAME, LSPS2_GET_INFO_METHOD_NAME, - LSPS2_GET_VERSIONS_METHOD_NAME, -}; #[cfg(lsps1)] use crate::lsps1::msgs::{ LSPS1Message, LSPS1Request, LSPS1Response, LSPS1_CREATE_ORDER_METHOD_NAME, LSPS1_GET_INFO_METHOD_NAME, LSPS1_GET_ORDER_METHOD_NAME, }; +use crate::lsps2::msgs::{ + LSPS2Message, LSPS2Request, LSPS2Response, LSPS2_BUY_METHOD_NAME, LSPS2_GET_INFO_METHOD_NAME, + LSPS2_GET_VERSIONS_METHOD_NAME, +}; use lightning::impl_writeable_msg; use lightning::ln::wire; use serde::de; diff --git a/src/jit_channel/channel_manager.rs b/src/lsps2/channel_manager.rs similarity index 91% rename from src/jit_channel/channel_manager.rs rename to src/lsps2/channel_manager.rs index 875299c..965b7cf 100644 --- a/src/jit_channel/channel_manager.rs +++ b/src/lsps2/channel_manager.rs @@ -27,14 +27,14 @@ use lightning::util::errors::APIError; use lightning::util::logger::{Level, Logger}; use crate::events::EventQueue; -use crate::jit_channel::utils::{compute_opening_fee, is_valid_opening_fee_params}; -use crate::jit_channel::LSPS2Event; use crate::lsps0::message_handler::ProtocolMessageHandler; use crate::lsps0::msgs::{LSPSMessage, RequestId}; +use crate::lsps2::utils::{compute_opening_fee, is_valid_opening_fee_params}; +use crate::lsps2::LSPS2Event; use crate::{events::Event, lsps0::msgs::ResponseError}; use crate::{utils, JITChannelsConfig}; -use crate::jit_channel::msgs::{ +use crate::lsps2::msgs::{ BuyRequest, BuyResponse, GetInfoRequest, GetInfoResponse, GetVersionsRequest, GetVersionsResponse, JitChannelScid, LSPS2Message, LSPS2Request, LSPS2Response, OpeningFeeParams, RawOpeningFeeParams, LSPS2_BUY_REQUEST_INVALID_OPENING_FEE_PARAMS_ERROR_CODE, @@ -185,9 +185,9 @@ impl InboundJITChannel { } pub fn invoice_params_received( - &mut self, client_trusts_lsp: bool, jit_channel_scid: JitChannelScid, + &mut self, client_trusts_lsp: bool, lsps2_scid: JitChannelScid, ) -> Result<(), LightningError> { - self.state = self.state.invoice_params_received(client_trusts_lsp, jit_channel_scid)?; + self.state = self.state.invoice_params_received(client_trusts_lsp, lsps2_scid)?; Ok(()) } } @@ -370,20 +370,20 @@ struct PeerState { } impl PeerState { - pub fn insert_inbound_channel(&mut self, jit_channel_id: u128, channel: InboundJITChannel) { - self.inbound_channels_by_id.insert(jit_channel_id, channel); + pub fn insert_inbound_channel(&mut self, lsps2_id: u128, channel: InboundJITChannel) { + self.inbound_channels_by_id.insert(lsps2_id, channel); } pub fn insert_outbound_channel(&mut self, scid: u64, channel: OutboundJITChannel) { self.outbound_channels_by_scid.insert(scid, channel); } - pub fn insert_request(&mut self, request_id: RequestId, jit_channel_id: u128) { - self.request_to_cid.insert(request_id, jit_channel_id); + pub fn insert_request(&mut self, request_id: RequestId, lsps2_id: u128) { + self.request_to_cid.insert(request_id, lsps2_id); } - pub fn remove_inbound_channel(&mut self, jit_channel_id: u128) { - self.inbound_channels_by_id.remove(&jit_channel_id); + pub fn remove_inbound_channel(&mut self, lsps2_id: u128) { + self.inbound_channels_by_id.remove(&lsps2_id); } pub fn remove_outbound_channel(&mut self, scid: u64) { @@ -490,19 +490,18 @@ where &self, counterparty_node_id: PublicKey, payment_size_msat: Option, token: Option, user_channel_id: u128, ) { - let jit_channel_id = self.generate_jit_channel_id(); - let channel = - InboundJITChannel::new(jit_channel_id, user_channel_id, payment_size_msat, token); + let lsps2_id = self.generate_lsps2_id(); + let channel = InboundJITChannel::new(lsps2_id, user_channel_id, payment_size_msat, token); let mut outer_state_lock = self.per_peer_state.write().unwrap(); let inner_state_lock = outer_state_lock .entry(counterparty_node_id) .or_insert(Mutex::new(PeerState::default())); let peer_state = inner_state_lock.get_mut().unwrap(); - peer_state.insert_inbound_channel(jit_channel_id, channel); + peer_state.insert_inbound_channel(lsps2_id, channel); let request_id = self.generate_request_id(); - peer_state.insert_request(request_id.clone(), jit_channel_id); + peer_state.insert_request(request_id.clone(), lsps2_id); { let mut pending_messages = self.pending_messages.lock().unwrap(); @@ -589,27 +588,25 @@ where } pub fn opening_fee_params_selected( - &self, counterparty_node_id: PublicKey, jit_channel_id: u128, + &self, counterparty_node_id: PublicKey, lsps2_id: u128, opening_fee_params: OpeningFeeParams, ) -> Result<(), APIError> { let outer_state_lock = self.per_peer_state.read().unwrap(); match outer_state_lock.get(&counterparty_node_id) { Some(inner_state_lock) => { let mut peer_state = inner_state_lock.lock().unwrap(); - if let Some(jit_channel) = - peer_state.inbound_channels_by_id.get_mut(&jit_channel_id) - { - let version = match jit_channel.opening_fee_params_selected() { + if let Some(lsps2) = peer_state.inbound_channels_by_id.get_mut(&lsps2_id) { + let version = match lsps2.opening_fee_params_selected() { Ok(version) => version, Err(e) => { - peer_state.remove_inbound_channel(jit_channel_id); + peer_state.remove_inbound_channel(lsps2_id); return Err(APIError::APIMisuseError { err: e.err }); } }; let request_id = self.generate_request_id(); - let payment_size_msat = jit_channel.config.payment_size_msat; - peer_state.insert_request(request_id.clone(), jit_channel_id); + let payment_size_msat = lsps2.config.payment_size_msat; + peer_state.insert_request(request_id.clone(), lsps2_id); { let mut pending_messages = self.pending_messages.lock().unwrap(); @@ -631,7 +628,7 @@ where } } else { return Err(APIError::APIMisuseError { - err: format!("Channel with id {} not found", jit_channel_id), + err: format!("Channel with id {} not found", lsps2_id), }); } } @@ -662,7 +659,7 @@ where peer_by_scid.insert(scid, counterparty_node_id); } - let outbound_jit_channel = OutboundJITChannel::new( + let outbound_lsps2 = OutboundJITChannel::new( scid, cltv_expiry_delta, client_trusts_lsp, @@ -670,13 +667,13 @@ where buy_request.opening_fee_params, ); - peer_state.insert_outbound_channel(scid, outbound_jit_channel); + peer_state.insert_outbound_channel(scid, outbound_lsps2); self.enqueue_response( counterparty_node_id, request_id, LSPS2Response::Buy(BuyResponse { - jit_channel_scid: scid.into(), + lsps2_scid: scid.into(), lsp_cltv_expiry_delta: cltv_expiry_delta, client_trusts_lsp, }), @@ -704,9 +701,9 @@ where match outer_state_lock.get(counterparty_node_id) { Some(inner_state_lock) => { let mut peer_state = inner_state_lock.lock().unwrap(); - if let Some(jit_channel) = peer_state.outbound_channels_by_scid.get_mut(&scid) { + if let Some(lsps2) = peer_state.outbound_channels_by_scid.get_mut(&scid) { let htlc = InterceptedHTLC { intercept_id, expected_outbound_amount_msat }; - match jit_channel.htlc_intercepted(htlc) { + match lsps2.htlc_intercepted(htlc) { Ok(Some((opening_fee_msat, amt_to_forward_msat))) => { self.enqueue_event(Event::LSPS2(LSPS2Event::OpenChannel { their_network_key: counterparty_node_id.clone(), @@ -745,8 +742,8 @@ where match outer_state_lock.get(counterparty_node_id) { Some(inner_state_lock) => { let mut peer_state = inner_state_lock.lock().unwrap(); - if let Some(jit_channel) = peer_state.outbound_channels_by_scid.get_mut(&scid) { - match jit_channel.channel_ready() { + if let Some(lsps2) = peer_state.outbound_channels_by_scid.get_mut(&scid) { + match lsps2.channel_ready() { Ok((htlcs, total_amt_to_forward_msat)) => { let amounts_to_forward_msat = calculate_amount_to_forward_per_htlc( &htlcs, @@ -793,7 +790,7 @@ where Ok(()) } - fn generate_jit_channel_id(&self) -> u128 { + fn generate_lsps2_id(&self) -> u128 { let bytes = self.entropy_source.get_secure_random_bytes(); let mut id_bytes: [u8; 16] = [0; 16]; id_bytes.copy_from_slice(&bytes[0..16]); @@ -844,7 +841,7 @@ where Some(inner_state_lock) => { let mut peer_state = inner_state_lock.lock().unwrap(); - let jit_channel_id = + let lsps2_id = peer_state.request_to_cid.remove(&request_id).ok_or(LightningError { err: format!( "Received get_versions response for an unknown request: {:?}", @@ -853,29 +850,27 @@ where action: ErrorAction::IgnoreAndLog(Level::Info), })?; - let jit_channel = peer_state - .inbound_channels_by_id - .get_mut(&jit_channel_id) - .ok_or(LightningError { + let lsps2 = + peer_state.inbound_channels_by_id.get_mut(&lsps2_id).ok_or(LightningError { err: format!( "Received get_versions response for an unknown channel: {:?}", - jit_channel_id + lsps2_id ), action: ErrorAction::IgnoreAndLog(Level::Info), })?; - let token = jit_channel.config.token.clone(); + let token = lsps2.config.token.clone(); - let version = match jit_channel.versions_received(result.versions) { + let version = match lsps2.versions_received(result.versions) { Ok(version) => version, Err(e) => { - peer_state.remove_inbound_channel(jit_channel_id); + peer_state.remove_inbound_channel(lsps2_id); return Err(e); } }; let request_id = self.generate_request_id(); - peer_state.insert_request(request_id.clone(), jit_channel_id); + peer_state.insert_request(request_id.clone(), lsps2_id); { let mut pending_messages = self.pending_messages.lock().unwrap(); @@ -952,7 +947,7 @@ where Some(inner_state_lock) => { let mut peer_state = inner_state_lock.lock().unwrap(); - let jit_channel_id = + let lsps2_id = peer_state.request_to_cid.remove(&request_id).ok_or(LightningError { err: format!( "Received get_info response for an unknown request: {:?}", @@ -961,19 +956,17 @@ where action: ErrorAction::IgnoreAndLog(Level::Info), })?; - let jit_channel = peer_state - .inbound_channels_by_id - .get_mut(&jit_channel_id) - .ok_or(LightningError { + let lsps2 = + peer_state.inbound_channels_by_id.get_mut(&lsps2_id).ok_or(LightningError { err: format!( "Received get_info response for an unknown channel: {:?}", - jit_channel_id + lsps2_id ), action: ErrorAction::IgnoreAndLog(Level::Info), })?; - if let Err(e) = jit_channel.info_received() { - peer_state.remove_inbound_channel(jit_channel_id); + if let Err(e) = lsps2.info_received() { + peer_state.remove_inbound_channel(lsps2_id); return Err(e); } @@ -982,8 +975,8 @@ where opening_fee_params_menu: result.opening_fee_params_menu, min_payment_size_msat: result.min_payment_size_msat, max_payment_size_msat: result.max_payment_size_msat, - jit_channel_id: jit_channel.id, - user_channel_id: jit_channel.config.user_id, + lsps2_id: lsps2.id, + user_channel_id: lsps2.config.user_id, })); } None => { @@ -1008,7 +1001,7 @@ where Some(inner_state_lock) => { let mut peer_state = inner_state_lock.lock().unwrap(); - let jit_channel_id = + let lsps2_id = peer_state.request_to_cid.remove(&request_id).ok_or(LightningError { err: format!( "Received get_info error for an unknown request: {:?}", @@ -1017,15 +1010,10 @@ where action: ErrorAction::IgnoreAndLog(Level::Info), })?; - peer_state.inbound_channels_by_id.remove(&jit_channel_id).ok_or( - LightningError { - err: format!( - "Received get_info error for an unknown channel: {:?}", - jit_channel_id - ), - action: ErrorAction::IgnoreAndLog(Level::Info), - }, - )?; + peer_state.inbound_channels_by_id.remove(&lsps2_id).ok_or(LightningError { + err: format!("Received get_info error for an unknown channel: {:?}", lsps2_id), + action: ErrorAction::IgnoreAndLog(Level::Info), + })?; Ok(()) } None => { @@ -1173,7 +1161,7 @@ where Some(inner_state_lock) => { let mut peer_state = inner_state_lock.lock().unwrap(); - let jit_channel_id = + let lsps2_id = peer_state.request_to_cid.remove(&request_id).ok_or(LightningError { err: format!( "Received buy response for an unknown request: {:?}", @@ -1182,39 +1170,36 @@ where action: ErrorAction::IgnoreAndLog(Level::Info), })?; - let jit_channel = peer_state - .inbound_channels_by_id - .get_mut(&jit_channel_id) - .ok_or(LightningError { + let lsps2 = + peer_state.inbound_channels_by_id.get_mut(&lsps2_id).ok_or(LightningError { err: format!( "Received buy response for an unknown channel: {:?}", - jit_channel_id + lsps2_id ), action: ErrorAction::IgnoreAndLog(Level::Info), })?; - if let Err(e) = jit_channel.invoice_params_received( - result.client_trusts_lsp, - result.jit_channel_scid.clone(), - ) { - peer_state.remove_inbound_channel(jit_channel_id); + if let Err(e) = lsps2 + .invoice_params_received(result.client_trusts_lsp, result.lsps2_scid.clone()) + { + peer_state.remove_inbound_channel(lsps2_id); return Err(e); } - if let Ok(scid) = result.jit_channel_scid.to_scid() { + if let Ok(scid) = result.lsps2_scid.to_scid() { self.enqueue_event(Event::LSPS2(LSPS2Event::InvoiceGenerationReady { counterparty_node_id: *counterparty_node_id, scid, cltv_expiry_delta: result.lsp_cltv_expiry_delta, - payment_size_msat: jit_channel.config.payment_size_msat, + payment_size_msat: lsps2.config.payment_size_msat, client_trusts_lsp: result.client_trusts_lsp, - user_channel_id: jit_channel.config.user_id, + user_channel_id: lsps2.config.user_id, })); } else { return Err(LightningError { err: format!( "Received buy response with an invalid scid {:?}", - result.jit_channel_scid + result.lsps2_scid ), action: ErrorAction::IgnoreAndLog(Level::Info), }); @@ -1241,20 +1226,15 @@ where Some(inner_state_lock) => { let mut peer_state = inner_state_lock.lock().unwrap(); - let jit_channel_id = + let lsps2_id = peer_state.request_to_cid.remove(&request_id).ok_or(LightningError { err: format!("Received buy error for an unknown request: {:?}", request_id), action: ErrorAction::IgnoreAndLog(Level::Info), })?; - let _jit_channel = peer_state - .inbound_channels_by_id - .remove(&jit_channel_id) - .ok_or(LightningError { - err: format!( - "Received buy error for an unknown channel: {:?}", - jit_channel_id - ), + let _lsps2 = + peer_state.inbound_channels_by_id.remove(&lsps2_id).ok_or(LightningError { + err: format!("Received buy error for an unknown channel: {:?}", lsps2_id), action: ErrorAction::IgnoreAndLog(Level::Info), })?; Ok(()) diff --git a/src/jit_channel/event.rs b/src/lsps2/event.rs similarity index 94% rename from src/jit_channel/event.rs rename to src/lsps2/event.rs index ca727eb..6fb8d88 100644 --- a/src/jit_channel/event.rs +++ b/src/lsps2/event.rs @@ -49,7 +49,7 @@ pub enum LSPS2Event { /// It needs to be passed to [`LiquidityManager::opening_fee_params_selected`]. /// /// [`LiquidityManager::opening_fee_params_selected`]: crate::LiquidityManager::opening_fee_params_selected - jit_channel_id: u128, + lsps2_id: u128, /// The node id of the LSP that provided this response. counterparty_node_id: PublicKey, /// The menu of fee parameters the LSP is offering at this time. @@ -59,9 +59,9 @@ pub enum LSPS2Event { min_payment_size_msat: u64, /// The max payment size allowed when opening the channel. max_payment_size_msat: u64, - /// The user_channel_id value passed in to [`LiquidityManager::jit_channel_create_invoice`]. + /// The user_channel_id value passed in to [`LiquidityManager::lsps2_create_invoice`]. /// - /// [`LiquidityManager::jit_channel_create_invoice`]: crate::LiquidityManager::jit_channel_create_invoice + /// [`LiquidityManager::lsps2_create_invoice`]: crate::LiquidityManager::lsps2_create_invoice user_channel_id: u128, }, /// A client has selected a opening fee parameter to use and would like to @@ -103,9 +103,9 @@ pub enum LSPS2Event { payment_size_msat: Option, /// The trust model the LSP expects. client_trusts_lsp: bool, - /// The `user_channel_id` value passed in to [`LiquidityManager::jit_channel_create_invoice`]. + /// The `user_channel_id` value passed in to [`LiquidityManager::lsps2_create_invoice`]. /// - /// [`LiquidityManager::jit_channel_create_invoice`]: crate::LiquidityManager::jit_channel_create_invoice + /// [`LiquidityManager::lsps2_create_invoice`]: crate::LiquidityManager::lsps2_create_invoice user_channel_id: u128, }, /// You should open a channel using [`ChannelManager::create_channel`]. diff --git a/src/jit_channel/mod.rs b/src/lsps2/mod.rs similarity index 100% rename from src/jit_channel/mod.rs rename to src/lsps2/mod.rs diff --git a/src/jit_channel/msgs.rs b/src/lsps2/msgs.rs similarity index 99% rename from src/jit_channel/msgs.rs rename to src/lsps2/msgs.rs index 41b03f3..f6174f9 100644 --- a/src/jit_channel/msgs.rs +++ b/src/lsps2/msgs.rs @@ -150,7 +150,7 @@ impl JitChannelScid { #[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] pub struct BuyResponse { /// The short channel id used by LSP to identify need to open channel. - pub jit_channel_scid: JitChannelScid, + pub lsps2_scid: JitChannelScid, /// The locktime expiry delta the lsp requires. pub lsp_cltv_expiry_delta: u32, /// A flag that indicates who is trusting who. @@ -225,7 +225,7 @@ impl From for LSPSMessage { #[cfg(test)] mod tests { use super::*; - use crate::jit_channel::utils::is_valid_opening_fee_params; + use crate::lsps2::utils::is_valid_opening_fee_params; #[test] fn into_opening_fee_params_produces_valid_promise() { diff --git a/src/jit_channel/utils.rs b/src/lsps2/utils.rs similarity index 97% rename from src/jit_channel/utils.rs rename to src/lsps2/utils.rs index 09decca..b411745 100644 --- a/src/jit_channel/utils.rs +++ b/src/lsps2/utils.rs @@ -5,7 +5,7 @@ use bitcoin::hashes::{Hash, HashEngine}; use std::convert::TryInto; use std::time::{SystemTime, UNIX_EPOCH}; -use crate::jit_channel::msgs::OpeningFeeParams; +use crate::lsps2::msgs::OpeningFeeParams; use crate::utils; /// Determines if the given parameters are valid given the secret used to generate the promise. From 718dd2bcd036512ddd9343544f3e5e9b3d0d33d1 Mon Sep 17 00:00:00 2001 From: Elias Rohrer Date: Tue, 28 Nov 2023 15:47:20 +0100 Subject: [PATCH 5/6] f Revert unnecessary renames to `jit_channel` --- src/lsps2/channel_manager.rs | 148 ++++++++++++++++++++--------------- src/lsps2/event.rs | 2 +- src/lsps2/msgs.rs | 2 +- 3 files changed, 86 insertions(+), 66 deletions(-) diff --git a/src/lsps2/channel_manager.rs b/src/lsps2/channel_manager.rs index 965b7cf..2e1a5b8 100644 --- a/src/lsps2/channel_manager.rs +++ b/src/lsps2/channel_manager.rs @@ -185,9 +185,9 @@ impl InboundJITChannel { } pub fn invoice_params_received( - &mut self, client_trusts_lsp: bool, lsps2_scid: JitChannelScid, + &mut self, client_trusts_lsp: bool, jit_channel_scid: JitChannelScid, ) -> Result<(), LightningError> { - self.state = self.state.invoice_params_received(client_trusts_lsp, lsps2_scid)?; + self.state = self.state.invoice_params_received(client_trusts_lsp, jit_channel_scid)?; Ok(()) } } @@ -370,20 +370,20 @@ struct PeerState { } impl PeerState { - pub fn insert_inbound_channel(&mut self, lsps2_id: u128, channel: InboundJITChannel) { - self.inbound_channels_by_id.insert(lsps2_id, channel); + pub fn insert_inbound_channel(&mut self, jit_channel_id: u128, channel: InboundJITChannel) { + self.inbound_channels_by_id.insert(jit_channel_id, channel); } pub fn insert_outbound_channel(&mut self, scid: u64, channel: OutboundJITChannel) { self.outbound_channels_by_scid.insert(scid, channel); } - pub fn insert_request(&mut self, request_id: RequestId, lsps2_id: u128) { - self.request_to_cid.insert(request_id, lsps2_id); + pub fn insert_request(&mut self, request_id: RequestId, jit_channel_id: u128) { + self.request_to_cid.insert(request_id, jit_channel_id); } - pub fn remove_inbound_channel(&mut self, lsps2_id: u128) { - self.inbound_channels_by_id.remove(&lsps2_id); + pub fn remove_inbound_channel(&mut self, jit_channel_id: u128) { + self.inbound_channels_by_id.remove(&jit_channel_id); } pub fn remove_outbound_channel(&mut self, scid: u64) { @@ -490,18 +490,19 @@ where &self, counterparty_node_id: PublicKey, payment_size_msat: Option, token: Option, user_channel_id: u128, ) { - let lsps2_id = self.generate_lsps2_id(); - let channel = InboundJITChannel::new(lsps2_id, user_channel_id, payment_size_msat, token); + let jit_channel_id = self.generate_jit_channel_id(); + let channel = + InboundJITChannel::new(jit_channel_id, user_channel_id, payment_size_msat, token); let mut outer_state_lock = self.per_peer_state.write().unwrap(); let inner_state_lock = outer_state_lock .entry(counterparty_node_id) .or_insert(Mutex::new(PeerState::default())); let peer_state = inner_state_lock.get_mut().unwrap(); - peer_state.insert_inbound_channel(lsps2_id, channel); + peer_state.insert_inbound_channel(jit_channel_id, channel); let request_id = self.generate_request_id(); - peer_state.insert_request(request_id.clone(), lsps2_id); + peer_state.insert_request(request_id.clone(), jit_channel_id); { let mut pending_messages = self.pending_messages.lock().unwrap(); @@ -588,25 +589,27 @@ where } pub fn opening_fee_params_selected( - &self, counterparty_node_id: PublicKey, lsps2_id: u128, + &self, counterparty_node_id: PublicKey, jit_channel_id: u128, opening_fee_params: OpeningFeeParams, ) -> Result<(), APIError> { let outer_state_lock = self.per_peer_state.read().unwrap(); match outer_state_lock.get(&counterparty_node_id) { Some(inner_state_lock) => { let mut peer_state = inner_state_lock.lock().unwrap(); - if let Some(lsps2) = peer_state.inbound_channels_by_id.get_mut(&lsps2_id) { - let version = match lsps2.opening_fee_params_selected() { + if let Some(jit_channel) = + peer_state.inbound_channels_by_id.get_mut(&jit_channel_id) + { + let version = match jit_channel.opening_fee_params_selected() { Ok(version) => version, Err(e) => { - peer_state.remove_inbound_channel(lsps2_id); + peer_state.remove_inbound_channel(jit_channel_id); return Err(APIError::APIMisuseError { err: e.err }); } }; let request_id = self.generate_request_id(); - let payment_size_msat = lsps2.config.payment_size_msat; - peer_state.insert_request(request_id.clone(), lsps2_id); + let payment_size_msat = jit_channel.config.payment_size_msat; + peer_state.insert_request(request_id.clone(), jit_channel_id); { let mut pending_messages = self.pending_messages.lock().unwrap(); @@ -628,7 +631,7 @@ where } } else { return Err(APIError::APIMisuseError { - err: format!("Channel with id {} not found", lsps2_id), + err: format!("Channel with id {} not found", jit_channel_id), }); } } @@ -659,7 +662,7 @@ where peer_by_scid.insert(scid, counterparty_node_id); } - let outbound_lsps2 = OutboundJITChannel::new( + let outbound_jit_channel = OutboundJITChannel::new( scid, cltv_expiry_delta, client_trusts_lsp, @@ -667,13 +670,13 @@ where buy_request.opening_fee_params, ); - peer_state.insert_outbound_channel(scid, outbound_lsps2); + peer_state.insert_outbound_channel(scid, outbound_jit_channel); self.enqueue_response( counterparty_node_id, request_id, LSPS2Response::Buy(BuyResponse { - lsps2_scid: scid.into(), + jit_channel_scid: scid.into(), lsp_cltv_expiry_delta: cltv_expiry_delta, client_trusts_lsp, }), @@ -701,9 +704,9 @@ where match outer_state_lock.get(counterparty_node_id) { Some(inner_state_lock) => { let mut peer_state = inner_state_lock.lock().unwrap(); - if let Some(lsps2) = peer_state.outbound_channels_by_scid.get_mut(&scid) { + if let Some(jit_channel) = peer_state.outbound_channels_by_scid.get_mut(&scid) { let htlc = InterceptedHTLC { intercept_id, expected_outbound_amount_msat }; - match lsps2.htlc_intercepted(htlc) { + match jit_channel.htlc_intercepted(htlc) { Ok(Some((opening_fee_msat, amt_to_forward_msat))) => { self.enqueue_event(Event::LSPS2(LSPS2Event::OpenChannel { their_network_key: counterparty_node_id.clone(), @@ -742,8 +745,8 @@ where match outer_state_lock.get(counterparty_node_id) { Some(inner_state_lock) => { let mut peer_state = inner_state_lock.lock().unwrap(); - if let Some(lsps2) = peer_state.outbound_channels_by_scid.get_mut(&scid) { - match lsps2.channel_ready() { + if let Some(jit_channel) = peer_state.outbound_channels_by_scid.get_mut(&scid) { + match jit_channel.channel_ready() { Ok((htlcs, total_amt_to_forward_msat)) => { let amounts_to_forward_msat = calculate_amount_to_forward_per_htlc( &htlcs, @@ -790,7 +793,7 @@ where Ok(()) } - fn generate_lsps2_id(&self) -> u128 { + fn generate_jit_channel_id(&self) -> u128 { let bytes = self.entropy_source.get_secure_random_bytes(); let mut id_bytes: [u8; 16] = [0; 16]; id_bytes.copy_from_slice(&bytes[0..16]); @@ -841,7 +844,7 @@ where Some(inner_state_lock) => { let mut peer_state = inner_state_lock.lock().unwrap(); - let lsps2_id = + let jit_channel_id = peer_state.request_to_cid.remove(&request_id).ok_or(LightningError { err: format!( "Received get_versions response for an unknown request: {:?}", @@ -850,27 +853,29 @@ where action: ErrorAction::IgnoreAndLog(Level::Info), })?; - let lsps2 = - peer_state.inbound_channels_by_id.get_mut(&lsps2_id).ok_or(LightningError { + let jit_channel = peer_state + .inbound_channels_by_id + .get_mut(&jit_channel_id) + .ok_or(LightningError { err: format!( "Received get_versions response for an unknown channel: {:?}", - lsps2_id + jit_channel_id, ), action: ErrorAction::IgnoreAndLog(Level::Info), })?; - let token = lsps2.config.token.clone(); + let token = jit_channel.config.token.clone(); - let version = match lsps2.versions_received(result.versions) { + let version = match jit_channel.versions_received(result.versions) { Ok(version) => version, Err(e) => { - peer_state.remove_inbound_channel(lsps2_id); + peer_state.remove_inbound_channel(jit_channel_id); return Err(e); } }; let request_id = self.generate_request_id(); - peer_state.insert_request(request_id.clone(), lsps2_id); + peer_state.insert_request(request_id.clone(), jit_channel_id); { let mut pending_messages = self.pending_messages.lock().unwrap(); @@ -947,7 +952,7 @@ where Some(inner_state_lock) => { let mut peer_state = inner_state_lock.lock().unwrap(); - let lsps2_id = + let jit_channel_id = peer_state.request_to_cid.remove(&request_id).ok_or(LightningError { err: format!( "Received get_info response for an unknown request: {:?}", @@ -956,17 +961,19 @@ where action: ErrorAction::IgnoreAndLog(Level::Info), })?; - let lsps2 = - peer_state.inbound_channels_by_id.get_mut(&lsps2_id).ok_or(LightningError { + let jit_channel = peer_state + .inbound_channels_by_id + .get_mut(&jit_channel_id) + .ok_or(LightningError { err: format!( "Received get_info response for an unknown channel: {:?}", - lsps2_id + jit_channel_id ), action: ErrorAction::IgnoreAndLog(Level::Info), })?; - if let Err(e) = lsps2.info_received() { - peer_state.remove_inbound_channel(lsps2_id); + if let Err(e) = jit_channel.info_received() { + peer_state.remove_inbound_channel(jit_channel_id); return Err(e); } @@ -975,8 +982,8 @@ where opening_fee_params_menu: result.opening_fee_params_menu, min_payment_size_msat: result.min_payment_size_msat, max_payment_size_msat: result.max_payment_size_msat, - lsps2_id: lsps2.id, - user_channel_id: lsps2.config.user_id, + jit_channel_id, + user_channel_id: jit_channel.config.user_id, })); } None => { @@ -1001,7 +1008,7 @@ where Some(inner_state_lock) => { let mut peer_state = inner_state_lock.lock().unwrap(); - let lsps2_id = + let jit_channel_id = peer_state.request_to_cid.remove(&request_id).ok_or(LightningError { err: format!( "Received get_info error for an unknown request: {:?}", @@ -1010,10 +1017,15 @@ where action: ErrorAction::IgnoreAndLog(Level::Info), })?; - peer_state.inbound_channels_by_id.remove(&lsps2_id).ok_or(LightningError { - err: format!("Received get_info error for an unknown channel: {:?}", lsps2_id), - action: ErrorAction::IgnoreAndLog(Level::Info), - })?; + peer_state.inbound_channels_by_id.remove(&jit_channel_id).ok_or( + LightningError { + err: format!( + "Received get_info error for an unknown channel: {:?}", + jit_channel_id + ), + action: ErrorAction::IgnoreAndLog(Level::Info), + }, + )?; Ok(()) } None => { @@ -1161,7 +1173,7 @@ where Some(inner_state_lock) => { let mut peer_state = inner_state_lock.lock().unwrap(); - let lsps2_id = + let jit_channel_id = peer_state.request_to_cid.remove(&request_id).ok_or(LightningError { err: format!( "Received buy response for an unknown request: {:?}", @@ -1170,36 +1182,39 @@ where action: ErrorAction::IgnoreAndLog(Level::Info), })?; - let lsps2 = - peer_state.inbound_channels_by_id.get_mut(&lsps2_id).ok_or(LightningError { + let jit_channel = peer_state + .inbound_channels_by_id + .get_mut(&jit_channel_id) + .ok_or(LightningError { err: format!( "Received buy response for an unknown channel: {:?}", - lsps2_id + jit_channel_id ), action: ErrorAction::IgnoreAndLog(Level::Info), })?; - if let Err(e) = lsps2 - .invoice_params_received(result.client_trusts_lsp, result.lsps2_scid.clone()) - { - peer_state.remove_inbound_channel(lsps2_id); + if let Err(e) = jit_channel.invoice_params_received( + result.client_trusts_lsp, + result.jit_channel_scid.clone(), + ) { + peer_state.remove_inbound_channel(jit_channel_id); return Err(e); } - if let Ok(scid) = result.lsps2_scid.to_scid() { + if let Ok(scid) = result.jit_channel_scid.to_scid() { self.enqueue_event(Event::LSPS2(LSPS2Event::InvoiceGenerationReady { counterparty_node_id: *counterparty_node_id, scid, cltv_expiry_delta: result.lsp_cltv_expiry_delta, - payment_size_msat: lsps2.config.payment_size_msat, + payment_size_msat: jit_channel.config.payment_size_msat, client_trusts_lsp: result.client_trusts_lsp, - user_channel_id: lsps2.config.user_id, + user_channel_id: jit_channel.config.user_id, })); } else { return Err(LightningError { err: format!( "Received buy response with an invalid scid {:?}", - result.lsps2_scid + result.jit_channel_scid ), action: ErrorAction::IgnoreAndLog(Level::Info), }); @@ -1226,15 +1241,20 @@ where Some(inner_state_lock) => { let mut peer_state = inner_state_lock.lock().unwrap(); - let lsps2_id = + let jit_channel_id = peer_state.request_to_cid.remove(&request_id).ok_or(LightningError { err: format!("Received buy error for an unknown request: {:?}", request_id), action: ErrorAction::IgnoreAndLog(Level::Info), })?; - let _lsps2 = - peer_state.inbound_channels_by_id.remove(&lsps2_id).ok_or(LightningError { - err: format!("Received buy error for an unknown channel: {:?}", lsps2_id), + let _jit_channel = peer_state + .inbound_channels_by_id + .remove(&jit_channel_id) + .ok_or(LightningError { + err: format!( + "Received buy error for an unknown channel: {:?}", + jit_channel_id + ), action: ErrorAction::IgnoreAndLog(Level::Info), })?; Ok(()) diff --git a/src/lsps2/event.rs b/src/lsps2/event.rs index 6fb8d88..40082ea 100644 --- a/src/lsps2/event.rs +++ b/src/lsps2/event.rs @@ -49,7 +49,7 @@ pub enum LSPS2Event { /// It needs to be passed to [`LiquidityManager::opening_fee_params_selected`]. /// /// [`LiquidityManager::opening_fee_params_selected`]: crate::LiquidityManager::opening_fee_params_selected - lsps2_id: u128, + jit_channel_id: u128, /// The node id of the LSP that provided this response. counterparty_node_id: PublicKey, /// The menu of fee parameters the LSP is offering at this time. diff --git a/src/lsps2/msgs.rs b/src/lsps2/msgs.rs index f6174f9..5867df2 100644 --- a/src/lsps2/msgs.rs +++ b/src/lsps2/msgs.rs @@ -150,7 +150,7 @@ impl JitChannelScid { #[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] pub struct BuyResponse { /// The short channel id used by LSP to identify need to open channel. - pub lsps2_scid: JitChannelScid, + pub jit_channel_scid: JitChannelScid, /// The locktime expiry delta the lsp requires. pub lsp_cltv_expiry_delta: u32, /// A flag that indicates who is trusting who. From ad3cc2f8c497225140c164040015494bbade3c76 Mon Sep 17 00:00:00 2001 From: Elias Rohrer Date: Tue, 28 Nov 2023 13:56:08 +0100 Subject: [PATCH 6/6] Use `AChannelManaager` / `APeerManager` to simplify types --- src/lsps0/message_handler.rs | 227 +++++++---------------------------- src/lsps1/channel_manager.rs | 134 +++++---------------- src/lsps2/channel_manager.rs | 130 +++++--------------- 3 files changed, 104 insertions(+), 387 deletions(-) diff --git a/src/lsps0/message_handler.rs b/src/lsps0/message_handler.rs index 38709e7..efd75d9 100644 --- a/src/lsps0/message_handler.rs +++ b/src/lsps0/message_handler.rs @@ -13,27 +13,25 @@ use crate::lsps0::protocol::LSPS0MessageHandler; use crate::lsps2::channel_manager::JITChannelManager; use crate::lsps2::msgs::{OpeningFeeParams, RawOpeningFeeParams}; -use chrono::Utc; -use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator}; use lightning::chain::{self, BestBlock, Confirm, Filter, Listen}; -use lightning::ln::channelmanager::{ChainParameters, ChannelManager, InterceptId}; +use lightning::ln::channelmanager::{AChannelManager, ChainParameters, InterceptId}; use lightning::ln::features::{InitFeatures, NodeFeatures}; -use lightning::ln::msgs::{ - ChannelMessageHandler, ErrorAction, LightningError, OnionMessageHandler, RoutingMessageHandler, -}; -use lightning::ln::peer_handler::{CustomMessageHandler, PeerManager, SocketDescriptor}; +use lightning::ln::msgs::{ErrorAction, LightningError}; +use lightning::ln::peer_handler::{APeerManager, CustomMessageHandler}; use lightning::ln::wire::CustomMessageReader; use lightning::ln::ChannelId; -use lightning::routing::router::Router; -use lightning::sign::{EntropySource, NodeSigner, SignerProvider}; +use lightning::sign::EntropySource; use lightning::util::errors::APIError; -use lightning::util::logger::{Level, Logger}; +use lightning::util::logger::Level; use lightning::util::ser::Readable; use bitcoin::blockdata::constants::genesis_block; use bitcoin::secp256k1::PublicKey; use bitcoin::BlockHash; +#[cfg(lsps1)] +use chrono::Utc; + use std::collections::HashMap; use std::convert::TryFrom; use std::ops::Deref; @@ -108,32 +106,13 @@ pub struct CRChannelConfig { /// [`Event::ChannelReady`]: lightning::events::Event::ChannelReady pub struct LiquidityManager< ES: Deref + Clone, - M: Deref, - T: Deref, - F: Deref, - R: Deref, - SP: Deref, - L: Deref, - Descriptor: SocketDescriptor, - RM: Deref, - CM: Deref, - OM: Deref, - CMH: Deref, - NS: Deref, - C: Deref, + CM: Deref + Clone, + PM: Deref + Clone, + C: Deref + Clone, > where ES::Target: EntropySource, - M::Target: chain::Watch<::Signer>, - T::Target: BroadcasterInterface, - F::Target: FeeEstimator, - R::Target: Router, - SP::Target: SignerProvider, - L::Target: Logger, - RM::Target: RoutingMessageHandler, - CM::Target: ChannelMessageHandler, - OM::Target: OnionMessageHandler, - CMH::Target: CustomMessageHandler, - NS::Target: NodeSigner, + CM::Target: AChannelManager, + PM::Target: APeerManager, C::Target: Filter, { pending_messages: Arc>>, @@ -141,55 +120,29 @@ pub struct LiquidityManager< request_id_to_method_map: Mutex>, lsps0_message_handler: LSPS0MessageHandler, #[cfg(lsps1)] - lsps1_message_handler: - Option>, - lsps2_message_handler: - Option>, + lsps1_message_handler: Option>, + lsps2_message_handler: Option>, provider_config: Option, - channel_manager: Arc>, + channel_manager: CM, chain_source: Option, genesis_hash: Option, best_block: Option>, } -impl< - ES: Deref + Clone, - M: Deref, - T: Deref, - F: Deref, - R: Deref, - SP: Deref, - L: Deref, - Descriptor: SocketDescriptor, - RM: Deref, - CM: Deref, - OM: Deref, - CMH: Deref, - NS: Deref, - C: Deref, - > LiquidityManager +impl + LiquidityManager where ES::Target: EntropySource, - M::Target: chain::Watch<::Signer>, - T::Target: BroadcasterInterface, - F::Target: FeeEstimator, - R::Target: Router, - SP::Target: SignerProvider, - L::Target: Logger, - RM::Target: RoutingMessageHandler, - CM::Target: ChannelMessageHandler, - OM::Target: OnionMessageHandler, - CMH::Target: CustomMessageHandler, - NS::Target: NodeSigner, + CM::Target: AChannelManager, + PM::Target: APeerManager, C::Target: Filter, { /// Constructor for the [`LiquidityManager`]. /// /// Sets up the required protocol message handlers based on the given [`LiquidityProviderConfig`]. pub fn new( - entropy_source: ES, provider_config: Option, - channel_manager: Arc>, chain_source: Option, - chain_params: Option, + entropy_source: ES, provider_config: Option, channel_manager: CM, + chain_source: Option, chain_params: Option, ) -> Self where { let pending_messages = Arc::new(Mutex::new(vec![])); @@ -208,7 +161,7 @@ where { config, Arc::clone(&pending_messages), Arc::clone(&pending_events), - Arc::clone(&channel_manager), + channel_manager.clone(), ) }) }); @@ -221,7 +174,8 @@ where { lsps1_config, Arc::clone(&pending_messages), Arc::clone(&pending_events), - Arc::clone(&channel_manager), + channel_manager.clone(), + chain_source.clone(), ) }) }); @@ -266,9 +220,8 @@ where { /// your background processor uses. /// /// [`PeerManager`]: lightning::ln::peer_handler::PeerManager - pub fn set_peer_manager( - &self, peer_manager: Arc>, - ) { + /// [`PeerManager::process_events`]: lightning::ln::peer_handler::PeerManager::process_events + pub fn set_peer_manager(&self, peer_manager: PM) { #[cfg(lsps1)] if let Some(lsps1_message_handler) = &self.lsps1_message_handler { lsps1_message_handler.set_peer_manager(peer_manager.clone()); @@ -549,36 +502,12 @@ where { } } -impl< - ES: Deref + Clone + Clone, - M: Deref, - T: Deref, - F: Deref, - R: Deref, - SP: Deref, - L: Deref, - Descriptor: SocketDescriptor, - RM: Deref, - CM: Deref, - OM: Deref, - CMH: Deref, - NS: Deref, - C: Deref, - > CustomMessageReader - for LiquidityManager +impl + CustomMessageReader for LiquidityManager where ES::Target: EntropySource, - M::Target: chain::Watch<::Signer>, - T::Target: BroadcasterInterface, - F::Target: FeeEstimator, - R::Target: Router, - SP::Target: SignerProvider, - L::Target: Logger, - RM::Target: RoutingMessageHandler, - CM::Target: ChannelMessageHandler, - OM::Target: OnionMessageHandler, - CMH::Target: CustomMessageHandler, - NS::Target: NodeSigner, + CM::Target: AChannelManager, + PM::Target: APeerManager, C::Target: Filter, { type CustomMessage = RawLSPSMessage; @@ -593,36 +522,12 @@ where } } -impl< - ES: Deref + Clone, - M: Deref, - T: Deref, - F: Deref, - R: Deref, - SP: Deref, - L: Deref, - Descriptor: SocketDescriptor, - RM: Deref, - CM: Deref, - OM: Deref, - CMH: Deref, - NS: Deref, - C: Deref, - > CustomMessageHandler - for LiquidityManager +impl CustomMessageHandler + for LiquidityManager where ES::Target: EntropySource, - M::Target: chain::Watch<::Signer>, - T::Target: BroadcasterInterface, - F::Target: FeeEstimator, - R::Target: Router, - SP::Target: SignerProvider, - L::Target: Logger, - RM::Target: RoutingMessageHandler, - CM::Target: ChannelMessageHandler, - OM::Target: OnionMessageHandler, - CMH::Target: CustomMessageHandler, - NS::Target: NodeSigner, + CM::Target: AChannelManager, + PM::Target: APeerManager, C::Target: Filter, { fn handle_custom_message( @@ -681,35 +586,12 @@ where } } -impl< - ES: Deref + Clone, - M: Deref, - T: Deref, - F: Deref, - R: Deref, - SP: Deref, - L: Deref, - Descriptor: SocketDescriptor, - RM: Deref, - CM: Deref, - OM: Deref, - CMH: Deref, - NS: Deref, - C: Deref, - > Listen for LiquidityManager +impl Listen + for LiquidityManager where ES::Target: EntropySource, - M::Target: chain::Watch<::Signer>, - T::Target: BroadcasterInterface, - F::Target: FeeEstimator, - R::Target: Router, - SP::Target: SignerProvider, - L::Target: Logger, - RM::Target: RoutingMessageHandler, - CM::Target: ChannelMessageHandler, - OM::Target: OnionMessageHandler, - CMH::Target: CustomMessageHandler, - NS::Target: NodeSigner, + CM::Target: AChannelManager, + PM::Target: APeerManager, C::Target: Filter, { fn filtered_block_connected( @@ -745,35 +627,12 @@ where } } -impl< - ES: Deref + Clone, - M: Deref, - T: Deref, - F: Deref, - R: Deref, - SP: Deref, - L: Deref, - Descriptor: SocketDescriptor, - RM: Deref, - CM: Deref, - OM: Deref, - CMH: Deref, - NS: Deref, - C: Deref, - > Confirm for LiquidityManager +impl Confirm + for LiquidityManager where ES::Target: EntropySource, - M::Target: chain::Watch<::Signer>, - T::Target: BroadcasterInterface, - F::Target: FeeEstimator, - R::Target: Router, - SP::Target: SignerProvider, - L::Target: Logger, - RM::Target: RoutingMessageHandler, - CM::Target: ChannelMessageHandler, - OM::Target: OnionMessageHandler, - CMH::Target: CustomMessageHandler, - NS::Target: NodeSigner, + CM::Target: AChannelManager, + PM::Target: APeerManager, C::Target: Filter, { fn transactions_confirmed( diff --git a/src/lsps1/channel_manager.rs b/src/lsps1/channel_manager.rs index d393ecd..2d0d09b 100644 --- a/src/lsps1/channel_manager.rs +++ b/src/lsps1/channel_manager.rs @@ -13,17 +13,13 @@ use std::ops::Deref; use std::sync::{Arc, Mutex, RwLock}; use bitcoin::secp256k1::PublicKey; -use lightning::chain; -use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator}; -use lightning::ln::channelmanager::ChannelManager; -use lightning::ln::msgs::{ - ChannelMessageHandler, ErrorAction, LightningError, OnionMessageHandler, RoutingMessageHandler, -}; -use lightning::ln::peer_handler::{CustomMessageHandler, PeerManager, SocketDescriptor}; -use lightning::routing::router::Router; -use lightning::sign::{EntropySource, NodeSigner, SignerProvider}; +use lightning::chain::Filter; +use lightning::ln::channelmanager::AChannelManager; +use lightning::ln::msgs::{ErrorAction, LightningError}; +use lightning::ln::peer_handler::APeerManager; +use lightning::sign::EntropySource; use lightning::util::errors::APIError; -use lightning::util::logger::{Level, Logger}; +use lightning::util::logger::Level; use crate::events::EventQueue; use crate::lsps0::message_handler::{CRChannelConfig, ProtocolMessageHandler}; @@ -276,37 +272,17 @@ impl PeerState { } } -pub struct CRManager< - ES: Deref, - M: Deref, - T: Deref, - F: Deref, - R: Deref, - SP: Deref, - Descriptor: SocketDescriptor, - L: Deref, - RM: Deref, - CM: Deref, - OM: Deref, - CMH: Deref, - NS: Deref, -> where +pub struct CRManager +where ES::Target: EntropySource, - M::Target: chain::Watch<::Signer>, - T::Target: BroadcasterInterface, - F::Target: FeeEstimator, - R::Target: Router, - SP::Target: SignerProvider, - L::Target: Logger, - RM::Target: RoutingMessageHandler, - CM::Target: ChannelMessageHandler, - OM::Target: OnionMessageHandler, - CMH::Target: CustomMessageHandler, - NS::Target: NodeSigner, + CM::Target: AChannelManager, + PM::Target: APeerManager, + C::Target: Filter, { entropy_source: ES, - peer_manager: Mutex>>>, - channel_manager: Arc>, + channel_manager: CM, + peer_manager: Mutex>, + chain_source: Option, pending_messages: Arc>>, pending_events: Arc, per_peer_state: RwLock>>, @@ -315,57 +291,34 @@ pub struct CRManager< max_fees: Option, } -impl< - ES: Deref, - M: Deref, - T: Deref, - F: Deref, - R: Deref, - SP: Deref, - Descriptor: SocketDescriptor, - L: Deref, - RM: Deref, - CM: Deref, - OM: Deref, - CMH: Deref, - NS: Deref, - > CRManager +impl CRManager where ES::Target: EntropySource, - M::Target: chain::Watch<::Signer>, - T::Target: BroadcasterInterface, - F::Target: FeeEstimator, - R::Target: Router, - SP::Target: SignerProvider, - L::Target: Logger, - RM::Target: RoutingMessageHandler, - CM::Target: ChannelMessageHandler, - OM::Target: OnionMessageHandler, - CMH::Target: CustomMessageHandler, - NS::Target: NodeSigner, + CM::Target: AChannelManager, + PM::Target: APeerManager, + C::Target: Filter, + ES::Target: EntropySource, { pub(crate) fn new( entropy_source: ES, config: &CRChannelConfig, pending_messages: Arc>>, - pending_events: Arc, - channel_manager: Arc>, + pending_events: Arc, channel_manager: CM, chain_source: Option, ) -> Self { Self { entropy_source, + channel_manager, + peer_manager: Mutex::new(None), + chain_source, pending_messages, pending_events, per_peer_state: RwLock::new(HashMap::new()), - peer_manager: Mutex::new(None), - channel_manager, options_config: config.options_supported.clone(), website: config.website.clone(), max_fees: config.max_fees, } } - pub fn set_peer_manager( - &self, peer_manager: Arc>, - ) { + pub fn set_peer_manager(&self, peer_manager: PM) { *self.peer_manager.lock().unwrap() = Some(peer_manager); } @@ -391,7 +344,7 @@ where } if let Some(peer_manager) = self.peer_manager.lock().unwrap().as_ref() { - peer_manager.process_events(); + peer_manager.as_ref().process_events(); } } @@ -515,7 +468,7 @@ where )); } if let Some(peer_manager) = self.peer_manager.lock().unwrap().as_ref() { - peer_manager.process_events(); + peer_manager.as_ref().process_events(); } } None => { @@ -780,7 +733,7 @@ where )); } if let Some(peer_manager) = self.peer_manager.lock().unwrap().as_ref() { - peer_manager.process_events(); + peer_manager.as_ref().process_events(); } } else { return Err(APIError::APIMisuseError { @@ -980,7 +933,7 @@ where } if let Some(peer_manager) = self.peer_manager.lock().unwrap().as_ref() { - peer_manager.process_events(); + peer_manager.as_ref().process_events(); } } @@ -1006,34 +959,13 @@ where } } -impl< - ES: Deref, - M: Deref, - T: Deref, - F: Deref, - R: Deref, - SP: Deref, - Descriptor: SocketDescriptor, - L: Deref, - RM: Deref, - CM: Deref, - OM: Deref, - CMH: Deref, - NS: Deref, - > ProtocolMessageHandler for CRManager +impl ProtocolMessageHandler + for CRManager where ES::Target: EntropySource, - M::Target: chain::Watch<::Signer>, - T::Target: BroadcasterInterface, - F::Target: FeeEstimator, - R::Target: Router, - SP::Target: SignerProvider, - L::Target: Logger, - RM::Target: RoutingMessageHandler, - CM::Target: ChannelMessageHandler, - OM::Target: OnionMessageHandler, - CMH::Target: CustomMessageHandler, - NS::Target: NodeSigner, + CM::Target: AChannelManager, + PM::Target: APeerManager, + C::Target: Filter, { type ProtocolMessage = LSPS1Message; const PROTOCOL_NUMBER: Option = Some(2); diff --git a/src/lsps2/channel_manager.rs b/src/lsps2/channel_manager.rs index 2e1a5b8..059bdce 100644 --- a/src/lsps2/channel_manager.rs +++ b/src/lsps2/channel_manager.rs @@ -13,18 +13,13 @@ use std::ops::Deref; use std::sync::{Arc, Mutex, RwLock}; use bitcoin::secp256k1::PublicKey; -use lightning::chain; -use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator}; -use lightning::ln::channelmanager::{ChannelManager, InterceptId}; -use lightning::ln::msgs::{ - ChannelMessageHandler, ErrorAction, LightningError, OnionMessageHandler, RoutingMessageHandler, -}; -use lightning::ln::peer_handler::{CustomMessageHandler, PeerManager, SocketDescriptor}; +use lightning::ln::channelmanager::{AChannelManager, InterceptId}; +use lightning::ln::msgs::{ErrorAction, LightningError}; +use lightning::ln::peer_handler::APeerManager; use lightning::ln::ChannelId; -use lightning::routing::router::Router; -use lightning::sign::{EntropySource, NodeSigner, SignerProvider}; +use lightning::sign::EntropySource; use lightning::util::errors::APIError; -use lightning::util::logger::{Level, Logger}; +use lightning::util::logger::Level; use crate::events::EventQueue; use crate::lsps0::message_handler::ProtocolMessageHandler; @@ -391,37 +386,15 @@ impl PeerState { } } -pub struct JITChannelManager< - ES: Deref, - M: Deref, - T: Deref, - F: Deref, - R: Deref, - SP: Deref, - Descriptor: SocketDescriptor, - L: Deref, - RM: Deref, - CM: Deref, - OM: Deref, - CMH: Deref, - NS: Deref, -> where +pub struct JITChannelManager +where ES::Target: EntropySource, - M::Target: chain::Watch<::Signer>, - T::Target: BroadcasterInterface, - F::Target: FeeEstimator, - R::Target: Router, - SP::Target: SignerProvider, - L::Target: Logger, - RM::Target: RoutingMessageHandler, - CM::Target: ChannelMessageHandler, - OM::Target: OnionMessageHandler, - CMH::Target: CustomMessageHandler, - NS::Target: NodeSigner, + CM::Target: AChannelManager, + PM::Target: APeerManager, { entropy_source: ES, - peer_manager: Mutex>>>, - channel_manager: Arc>, + peer_manager: Mutex>, + channel_manager: CM, pending_messages: Arc>>, pending_events: Arc, per_peer_state: RwLock>>, @@ -431,40 +404,16 @@ pub struct JITChannelManager< max_payment_size_msat: u64, } -impl< - ES: Deref, - M: Deref, - T: Deref, - F: Deref, - R: Deref, - SP: Deref, - Descriptor: SocketDescriptor, - L: Deref, - RM: Deref, - CM: Deref, - OM: Deref, - CMH: Deref, - NS: Deref, - > JITChannelManager +impl JITChannelManager where ES::Target: EntropySource, - M::Target: chain::Watch<::Signer>, - T::Target: BroadcasterInterface, - F::Target: FeeEstimator, - R::Target: Router, - SP::Target: SignerProvider, - L::Target: Logger, - RM::Target: RoutingMessageHandler, - CM::Target: ChannelMessageHandler, - OM::Target: OnionMessageHandler, - CMH::Target: CustomMessageHandler, - NS::Target: NodeSigner, + CM::Target: AChannelManager, + PM::Target: APeerManager, { pub(crate) fn new( entropy_source: ES, config: &JITChannelsConfig, pending_messages: Arc>>, - pending_events: Arc, - channel_manager: Arc>, + pending_events: Arc, channel_manager: CM, ) -> Self { Self { entropy_source, @@ -480,9 +429,7 @@ where } } - pub fn set_peer_manager( - &self, peer_manager: Arc>, - ) { + pub fn set_peer_manager(&self, peer_manager: PM) { *self.peer_manager.lock().unwrap() = Some(peer_manager); } @@ -514,7 +461,7 @@ where } if let Some(peer_manager) = self.peer_manager.lock().unwrap().as_ref() { - peer_manager.process_events(); + peer_manager.as_ref().process_events(); } } @@ -627,7 +574,7 @@ where )); } if let Some(peer_manager) = self.peer_manager.lock().unwrap().as_ref() { - peer_manager.process_events(); + peer_manager.as_ref().process_events(); } } else { return Err(APIError::APIMisuseError { @@ -717,7 +664,9 @@ where } Ok(None) => {} Err(e) => { - self.channel_manager.fail_intercepted_htlc(intercept_id)?; + self.channel_manager + .get_cm() + .fail_intercepted_htlc(intercept_id)?; peer_state.outbound_channels_by_scid.remove(&scid); // TODO: cleanup peer_by_scid return Err(APIError::APIMisuseError { err: e.err }); @@ -756,7 +705,7 @@ where for (intercept_id, amount_to_forward_msat) in amounts_to_forward_msat { - self.channel_manager.forward_intercepted_htlc( + self.channel_manager.get_cm().forward_intercepted_htlc( intercept_id, channel_id, *counterparty_node_id, @@ -815,7 +764,7 @@ where } if let Some(peer_manager) = self.peer_manager.lock().unwrap().as_ref() { - peer_manager.process_events(); + peer_manager.as_ref().process_events(); } } @@ -890,7 +839,7 @@ where } if let Some(peer_manager) = self.peer_manager.lock().unwrap().as_ref() { - peer_manager.process_events(); + peer_manager.as_ref().process_events(); } } None => { @@ -1266,35 +1215,12 @@ where } } -impl< - ES: Deref, - M: Deref, - T: Deref, - F: Deref, - R: Deref, - SP: Deref, - Descriptor: SocketDescriptor, - L: Deref, - RM: Deref, - CM: Deref, - OM: Deref, - CMH: Deref, - NS: Deref, - > ProtocolMessageHandler - for JITChannelManager +impl ProtocolMessageHandler + for JITChannelManager where ES::Target: EntropySource, - M::Target: chain::Watch<::Signer>, - T::Target: BroadcasterInterface, - F::Target: FeeEstimator, - R::Target: Router, - SP::Target: SignerProvider, - L::Target: Logger, - RM::Target: RoutingMessageHandler, - CM::Target: ChannelMessageHandler, - OM::Target: OnionMessageHandler, - CMH::Target: CustomMessageHandler, - NS::Target: NodeSigner, + CM::Target: AChannelManager, + PM::Target: APeerManager, { type ProtocolMessage = LSPS2Message; const PROTOCOL_NUMBER: Option = Some(2);