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..9038c7a 100644 --- a/src/events.rs +++ b/src/events.rs @@ -14,9 +14,10 @@ //! [`LiquidityManager::get_and_clear_pending_events`] to receive events. //! //! [`LiquidityManager::get_and_clear_pending_events`]: crate::LiquidityManager::get_and_clear_pending_events -/// [`crate::LiquidityManager::get_and_clear_pending_events()`] to receive events. -use crate::channel_request; -use crate::jit_channel; + +#[cfg(lsps1)] +use crate::lsps1; +use crate::lsps2; use std::collections::VecDeque; use std::sync::{Condvar, Mutex}; @@ -61,7 +62,8 @@ 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. - LSPS1(channel_request::event::Event), + #[cfg(lsps1)] + LSPS1(lsps1::event::Event), } diff --git a/src/lib.rs b/src/lib.rs index 37cc9dd..9d5df54 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,14 +18,11 @@ #![allow(clippy::drop_non_drop)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] -mod channel_request; pub mod events; -pub mod jit_channel; -mod transport; +mod lsps0; +#[cfg(lsps1)] +mod lsps1; +pub mod lsps2; mod utils; -pub use channel_request::event::Event as LSPS1Event; -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 76% rename from src/transport/message_handler.rs rename to src/lsps0/message_handler.rs index 066ec9b..efd75d9 100644 --- a/src/transport/message_handler.rs +++ b/src/lsps0/message_handler.rs @@ -1,36 +1,37 @@ #![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::lsps1::channel_manager::CRManager, + crate::lsps1::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}; -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 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; @@ -57,10 +58,11 @@ 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. - pub jit_channels: Option, + pub lsps2_config: Option, } /// Configuration options for JIT channels. @@ -75,6 +77,7 @@ pub struct JITChannelsConfig { pub max_payment_size_msat: u64, } +#[cfg(lsps1)] pub struct CRChannelConfig { pub token: Option, pub max_fees: Option, @@ -103,87 +106,43 @@ 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>>, pending_events: Arc, request_id_to_method_map: Mutex>, lsps0_message_handler: LSPS0MessageHandler, - lsps1_message_handler: - Option>, - lsps2_message_handler: - Option>, + #[cfg(lsps1)] + 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![])); @@ -196,17 +155,18 @@ 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), + channel_manager.clone(), ) }) }); + #[cfg(lsps1)] let lsps1_message_handler = provider_config.as_ref().and_then(|config| { config.lsps1_config.as_ref().map(|lsps1_config| { CRManager::new( @@ -214,7 +174,8 @@ where { lsps1_config, Arc::clone(&pending_messages), Arc::clone(&pending_events), - Arc::clone(&channel_manager), + channel_manager.clone(), + chain_source.clone(), ) }) }); @@ -224,6 +185,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, @@ -258,9 +220,9 @@ 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()); } @@ -269,6 +231,7 @@ where { } } + #[cfg(lsps1)] pub fn request_for_info( &self, counterparty_node_id: PublicKey, channel_id: u128, ) -> Result<(), APIError> { @@ -278,6 +241,7 @@ where { Ok(()) } + #[cfg(lsps1)] pub fn place_order( &self, channel_id: u128, counterparty_node_id: &PublicKey, order: Order, ) -> Result<(), APIError> { @@ -287,6 +251,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 +268,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 +278,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, @@ -341,7 +308,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> { @@ -365,7 +332,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> { @@ -383,7 +350,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, @@ -408,7 +375,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, @@ -431,7 +398,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, @@ -463,7 +430,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> { @@ -508,6 +475,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)?; @@ -534,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; @@ -578,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( @@ -666,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( @@ -730,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/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 98% rename from src/transport/msgs.rs rename to src/lsps0/msgs.rs index bf89249..baddeb0 100644 --- a/src/transport/msgs.rs +++ b/src/lsps0/msgs.rs @@ -1,8 +1,9 @@ -use crate::channel_request::msgs::{ +#[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::jit_channel::msgs::{ +use crate::lsps2::msgs::{ LSPS2Message, LSPS2Request, LSPS2Response, LSPS2_BUY_METHOD_NAME, LSPS2_GET_INFO_METHOD_NAME, LSPS2_GET_VERSIONS_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( 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/channel_request/channel_manager.rs b/src/lsps1/channel_manager.rs similarity index 90% rename from src/channel_request/channel_manager.rs rename to src/lsps1/channel_manager.rs index 4ec4535..2d0d09b 100644 --- a/src/channel_request/channel_manager.rs +++ b/src/lsps1/channel_manager.rs @@ -13,23 +13,19 @@ 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::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, @@ -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/channel_request/event.rs b/src/lsps1/event.rs similarity index 96% rename from src/channel_request/event.rs rename to src/lsps1/event.rs index 9942e82..946979f 100644 --- a/src/channel_request/event.rs +++ b/src/lsps1/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/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 98% rename from src/channel_request/msgs.rs rename to src/lsps1/msgs.rs index 2d8dd0e..3248789 100644 --- a/src/channel_request/msgs.rs +++ b/src/lsps1/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/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 diff --git a/src/jit_channel/channel_manager.rs b/src/lsps2/channel_manager.rs similarity index 92% rename from src/jit_channel/channel_manager.rs rename to src/lsps2/channel_manager.rs index 0bee08f..059bdce 100644 --- a/src/jit_channel/channel_manager.rs +++ b/src/lsps2/channel_manager.rs @@ -13,28 +13,23 @@ 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::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::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, @@ -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(); } } @@ -859,7 +808,7 @@ where .ok_or(LightningError { err: format!( "Received get_versions response for an unknown channel: {:?}", - jit_channel_id + jit_channel_id, ), action: ErrorAction::IgnoreAndLog(Level::Info), })?; @@ -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 => { @@ -982,7 +931,7 @@ 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, + jit_channel_id, user_channel_id: jit_channel.config.user_id, })); } @@ -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); 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 1216de8..40082ea 100644 --- a/src/jit_channel/event.rs +++ b/src/lsps2/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)] @@ -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 98% rename from src/jit_channel/msgs.rs rename to src/lsps2/msgs.rs index f984a1b..5867df2 100644 --- a/src/jit_channel/msgs.rs +++ b/src/lsps2/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"; @@ -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. 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.