Skip to content

Commit 4a45da7

Browse files
f: have lsps2 have a reference to transaction broadcaster
1 parent 6412945 commit 4a45da7

File tree

7 files changed

+81
-36
lines changed

7 files changed

+81
-36
lines changed

lightning-background-processor/src/lib.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,8 @@ impl<
259259
G,
260260
&'a (dyn UtxoLookup + Send + Sync),
261261
L,
262-
> where
262+
>
263+
where
263264
L::Target: Logger,
264265
{
265266
/// Initializes a new [`GossipSync::Rapid`] variant.
@@ -276,7 +277,8 @@ impl<'a, L: Deref>
276277
&'a NetworkGraph<L>,
277278
&'a (dyn UtxoLookup + Send + Sync),
278279
L,
279-
> where
280+
>
281+
where
280282
L::Target: Logger,
281283
{
282284
/// Initializes a new [`GossipSync::None`] variant.
@@ -631,7 +633,7 @@ use futures_util::{dummy_waker, Joiner, OptionalSelector, Selector, SelectorOutp
631633
/// # type P2PGossipSync<UL> = lightning::routing::gossip::P2PGossipSync<Arc<NetworkGraph>, Arc<UL>, Arc<Logger>>;
632634
/// # type ChannelManager<B, F, FE> = lightning::ln::channelmanager::SimpleArcChannelManager<ChainMonitor<B, F, FE>, B, FE, Logger>;
633635
/// # type OnionMessenger<B, F, FE> = lightning::onion_message::messenger::OnionMessenger<Arc<lightning::sign::KeysManager>, Arc<lightning::sign::KeysManager>, Arc<Logger>, Arc<ChannelManager<B, F, FE>>, Arc<lightning::onion_message::messenger::DefaultMessageRouter<Arc<NetworkGraph>, Arc<Logger>, Arc<lightning::sign::KeysManager>>>, Arc<ChannelManager<B, F, FE>>, lightning::ln::peer_handler::IgnoringMessageHandler, lightning::ln::peer_handler::IgnoringMessageHandler, lightning::ln::peer_handler::IgnoringMessageHandler>;
634-
/// # type LiquidityManager<B, F, FE> = lightning_liquidity::LiquidityManager<Arc<lightning::sign::KeysManager>, Arc<lightning::sign::KeysManager>, Arc<ChannelManager<B, F, FE>>, Arc<F>, Arc<DefaultTimeProvider>>;
636+
/// # type LiquidityManager<B, F, FE> = lightning_liquidity::LiquidityManager<Arc<lightning::sign::KeysManager>, Arc<lightning::sign::KeysManager>, Arc<ChannelManager<B, F, FE>>, Arc<F>, Arc<DefaultTimeProvider>, Arc<lightning::chain::chaininterface::BroadcasterInterface>>;
635637
/// # type Scorer = RwLock<lightning::routing::scoring::ProbabilisticScorer<Arc<NetworkGraph>, Arc<Logger>>>;
636638
/// # type PeerManager<B, F, FE, UL> = lightning::ln::peer_handler::SimpleArcPeerManager<SocketDescriptor, ChainMonitor<B, F, FE>, B, FE, Arc<UL>, Logger, F, StoreSync>;
637639
/// # type OutputSweeper<B, D, FE, F, O> = lightning::util::sweep::OutputSweeper<Arc<B>, Arc<D>, Arc<FE>, Arc<F>, Arc<Store>, Arc<Logger>, Arc<O>>;
@@ -1796,6 +1798,7 @@ mod tests {
17961798
Arc<ChannelManager>,
17971799
Arc<dyn Filter + Sync + Send>,
17981800
Arc<DefaultTimeProvider>,
1801+
Arc<test_utils::TestBroadcaster>,
17991802
>;
18001803

18011804
struct Node {
@@ -2247,6 +2250,7 @@ mod tests {
22472250
Arc::clone(&keys_manager),
22482251
Arc::clone(&manager),
22492252
None,
2253+
Arc::clone(&tx_broadcaster),
22502254
None,
22512255
None,
22522256
None,

lightning-liquidity/src/lsps2/event.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,12 +165,12 @@ pub enum LSPS2ServiceEvent {
165165
/// This event is emitted once both [`Event::FundingTxBroadcastSafe`] and the
166166
/// corresponding payment has been successfully claimed.
167167
///
168-
/// Call [`ChannelManager::broadcast_transaction`] with the funding
168+
/// Call [`LSPS2ServiceHandler::broadcast_transaction`] with the funding
169169
/// transaction to publish it on-chain.
170170
///
171171
/// [`Event::FundingTxBroadcastSafe`]: lightning::events::Event::FundingTxBroadcastSafe
172172
/// [`Event::PaymentClaimed`]: lightning::events::Event::PaymentClaimed
173-
/// [`ChannelManager::broadcast_transaction`]: lightning::ln::channelmanager::ChannelManager::broadcast_transaction
173+
/// [`LSPS2ServiceHandler::broadcast_transaction`]: crate::lsps2::service::LSPS2ServiceHandler::broadcast_transaction
174174
BroadcastFundingTransaction {
175175
/// The node id of the counterparty.
176176
counterparty_node_id: PublicKey,

lightning-liquidity/src/lsps2/service.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ use crate::prelude::hash_map::Entry;
3232
use crate::prelude::{new_hash_map, HashMap};
3333
use crate::sync::{Arc, Mutex, MutexGuard, RwLock};
3434

35+
use lightning::chain::chaininterface::BroadcasterInterface;
3536
use lightning::events::HTLCHandlingFailureType;
3637
use lightning::ln::channelmanager::{AChannelManager, FailureCode, InterceptId};
3738
use lightning::ln::msgs::{ErrorAction, LightningError};
@@ -635,11 +636,13 @@ macro_rules! get_or_insert_peer_state_entry {
635636
}
636637

637638
/// The main object allowing to send and receive bLIP-52 / LSPS2 messages.
638-
pub struct LSPS2ServiceHandler<CM: Deref>
639+
pub struct LSPS2ServiceHandler<CM: Deref, T: Deref>
639640
where
640641
CM::Target: AChannelManager,
642+
T::Target: BroadcasterInterface,
641643
{
642644
channel_manager: CM,
645+
tx_broadcaster: T,
643646
pending_messages: Arc<MessageQueue>,
644647
pending_events: Arc<EventQueue>,
645648
per_peer_state: RwLock<HashMap<PublicKey, Mutex<PeerState>>>,
@@ -649,14 +652,15 @@ where
649652
config: LSPS2ServiceConfig,
650653
}
651654

652-
impl<CM: Deref> LSPS2ServiceHandler<CM>
655+
impl<CM: Deref, T: Deref> LSPS2ServiceHandler<CM, T>
653656
where
654657
CM::Target: AChannelManager,
658+
T::Target: BroadcasterInterface,
655659
{
656660
/// Constructs a `LSPS2ServiceHandler`.
657661
pub(crate) fn new(
658662
pending_messages: Arc<MessageQueue>, pending_events: Arc<EventQueue>, channel_manager: CM,
659-
config: LSPS2ServiceConfig,
663+
tx_broadcaster: T, config: LSPS2ServiceConfig,
660664
) -> Self {
661665
Self {
662666
pending_messages,
@@ -666,6 +670,7 @@ where
666670
peer_by_channel_id: RwLock::new(new_hash_map()),
667671
total_pending_requests: AtomicUsize::new(0),
668672
channel_manager,
673+
tx_broadcaster,
669674
config,
670675
}
671676
}
@@ -1657,11 +1662,20 @@ where
16571662
}
16581663
}
16591664
}
1665+
1666+
/// Manually broadcast a transaction.
1667+
///
1668+
/// This method should only be used when manual control over transaction
1669+
/// broadcast timing is required (e.g. client_trusts_lsp=true)
1670+
pub fn broadcast_transaction(&self, tx: &Transaction) {
1671+
self.tx_broadcaster.broadcast_transactions(&[tx]);
1672+
}
16601673
}
16611674

1662-
impl<CM: Deref> LSPSProtocolMessageHandler for LSPS2ServiceHandler<CM>
1675+
impl<CM: Deref, T: Deref> LSPSProtocolMessageHandler for LSPS2ServiceHandler<CM, T>
16631676
where
16641677
CM::Target: AChannelManager,
1678+
T::Target: BroadcasterInterface,
16651679
{
16661680
type ProtocolMessage = LSPS2Message;
16671681
const PROTOCOL_NUMBER: Option<u16> = Some(2);

lightning-liquidity/src/manager.rs

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ use crate::sync::{Arc, Mutex, RwLock};
3838
use crate::utils::time::DefaultTimeProvider;
3939
use crate::utils::time::TimeProvider;
4040

41+
use lightning::chain::chaininterface::BroadcasterInterface;
4142
use lightning::chain::{self, BestBlock, Confirm, Filter, Listen};
4243
use lightning::ln::channelmanager::{AChannelManager, ChainParameters};
4344
use lightning::ln::msgs::{ErrorAction, LightningError};
@@ -112,8 +113,13 @@ pub trait ALiquidityManager {
112113
type TimeProvider: TimeProvider + ?Sized;
113114
/// A type that may be dereferenced to [`Self::TimeProvider`].
114115
type TP: Deref<Target = Self::TimeProvider> + Clone;
116+
/// A type implementing [`BroadcasterInterface`].
117+
type BroadcasterInterface: BroadcasterInterface + ?Sized;
118+
/// A type that may be dereferenced to [`Self::BroadcasterInterface`].
119+
type T: Deref<Target = Self::BroadcasterInterface> + Clone;
115120
/// Returns a reference to the actual [`LiquidityManager`] object.
116-
fn get_lm(&self) -> &LiquidityManager<Self::ES, Self::NS, Self::CM, Self::C, Self::TP>;
121+
fn get_lm(&self)
122+
-> &LiquidityManager<Self::ES, Self::NS, Self::CM, Self::C, Self::TP, Self::T>;
117123
}
118124

119125
impl<
@@ -122,13 +128,15 @@ impl<
122128
CM: Deref + Clone,
123129
C: Deref + Clone,
124130
TP: Deref + Clone,
125-
> ALiquidityManager for LiquidityManager<ES, NS, CM, C, TP>
131+
T: Deref + Clone,
132+
> ALiquidityManager for LiquidityManager<ES, NS, CM, C, TP, T>
126133
where
127134
ES::Target: EntropySource,
128135
NS::Target: NodeSigner,
129136
CM::Target: AChannelManager,
130137
C::Target: Filter,
131138
TP::Target: TimeProvider,
139+
T::Target: BroadcasterInterface,
132140
{
133141
type EntropySource = ES::Target;
134142
type ES = ES;
@@ -140,7 +148,9 @@ where
140148
type C = C;
141149
type TimeProvider = TP::Target;
142150
type TP = TP;
143-
fn get_lm(&self) -> &LiquidityManager<ES, NS, CM, C, TP> {
151+
type BroadcasterInterface = T::Target;
152+
type T = T;
153+
fn get_lm(&self) -> &LiquidityManager<ES, NS, CM, C, TP, T> {
144154
self
145155
}
146156
}
@@ -170,12 +180,14 @@ pub struct LiquidityManager<
170180
CM: Deref + Clone,
171181
C: Deref + Clone,
172182
TP: Deref + Clone,
183+
T: Deref + Clone,
173184
> where
174185
ES::Target: EntropySource,
175186
NS::Target: NodeSigner,
176187
CM::Target: AChannelManager,
177188
C::Target: Filter,
178189
TP::Target: TimeProvider,
190+
T::Target: BroadcasterInterface,
179191
{
180192
pending_messages: Arc<MessageQueue>,
181193
pending_events: Arc<EventQueue>,
@@ -187,7 +199,7 @@ pub struct LiquidityManager<
187199
#[cfg(lsps1_service)]
188200
lsps1_service_handler: Option<LSPS1ServiceHandler<ES, CM, C>>,
189201
lsps1_client_handler: Option<LSPS1ClientHandler<ES>>,
190-
lsps2_service_handler: Option<LSPS2ServiceHandler<CM>>,
202+
lsps2_service_handler: Option<LSPS2ServiceHandler<CM, T>>,
191203
lsps2_client_handler: Option<LSPS2ClientHandler<ES>>,
192204
lsps5_service_handler: Option<LSPS5ServiceHandler<CM, NS, TP>>,
193205
lsps5_client_handler: Option<LSPS5ClientHandler<ES>>,
@@ -198,25 +210,33 @@ pub struct LiquidityManager<
198210
}
199211

200212
#[cfg(feature = "time")]
201-
impl<ES: Deref + Clone, NS: Deref + Clone, CM: Deref + Clone, C: Deref + Clone>
202-
LiquidityManager<ES, NS, CM, C, Arc<DefaultTimeProvider>>
213+
impl<
214+
ES: Deref + Clone,
215+
NS: Deref + Clone,
216+
CM: Deref + Clone,
217+
C: Deref + Clone,
218+
T: Deref + Clone,
219+
> LiquidityManager<ES, NS, CM, C, Arc<DefaultTimeProvider>, T>
203220
where
204221
ES::Target: EntropySource,
205222
NS::Target: NodeSigner,
206223
CM::Target: AChannelManager,
207224
C::Target: Filter,
225+
T::Target: BroadcasterInterface,
208226
{
209227
/// Constructor for the [`LiquidityManager`] using the default system clock
210228
pub fn new(
211229
entropy_source: ES, node_signer: NS, channel_manager: CM, chain_source: Option<C>,
212-
chain_params: Option<ChainParameters>, service_config: Option<LiquidityServiceConfig>,
230+
transaction_broadcaster: T, chain_params: Option<ChainParameters>,
231+
service_config: Option<LiquidityServiceConfig>,
213232
client_config: Option<LiquidityClientConfig>,
214233
) -> Self {
215234
let time_provider = Arc::new(DefaultTimeProvider);
216235
Self::new_with_custom_time_provider(
217236
entropy_source,
218237
node_signer,
219238
channel_manager,
239+
transaction_broadcaster,
220240
chain_source,
221241
chain_params,
222242
service_config,
@@ -232,13 +252,15 @@ impl<
232252
CM: Deref + Clone,
233253
C: Deref + Clone,
234254
TP: Deref + Clone,
235-
> LiquidityManager<ES, NS, CM, C, TP>
255+
T: Deref + Clone,
256+
> LiquidityManager<ES, NS, CM, C, TP, T>
236257
where
237258
ES::Target: EntropySource,
238259
NS::Target: NodeSigner,
239260
CM::Target: AChannelManager,
240261
C::Target: Filter,
241262
TP::Target: TimeProvider,
263+
T::Target: BroadcasterInterface,
242264
{
243265
/// Constructor for the [`LiquidityManager`] with a custom time provider.
244266
///
@@ -247,8 +269,9 @@ where
247269
/// Sets up the required protocol message handlers based on the given
248270
/// [`LiquidityClientConfig`] and [`LiquidityServiceConfig`].
249271
pub fn new_with_custom_time_provider(
250-
entropy_source: ES, node_signer: NS, channel_manager: CM, chain_source: Option<C>,
251-
chain_params: Option<ChainParameters>, service_config: Option<LiquidityServiceConfig>,
272+
entropy_source: ES, node_signer: NS, channel_manager: CM, transaction_broadcaster: T,
273+
chain_source: Option<C>, chain_params: Option<ChainParameters>,
274+
service_config: Option<LiquidityServiceConfig>,
252275
client_config: Option<LiquidityClientConfig>, time_provider: TP,
253276
) -> Self {
254277
let pending_messages = Arc::new(MessageQueue::new());
@@ -270,14 +293,15 @@ where
270293
let lsps2_service_handler = service_config.as_ref().and_then(|config| {
271294
config.lsps2_service_config.as_ref().map(|config| {
272295
if let Some(number) =
273-
<LSPS2ServiceHandler<CM> as LSPSProtocolMessageHandler>::PROTOCOL_NUMBER
296+
<LSPS2ServiceHandler<CM, T> as LSPSProtocolMessageHandler>::PROTOCOL_NUMBER
274297
{
275298
supported_protocols.push(number);
276299
}
277300
LSPS2ServiceHandler::new(
278301
Arc::clone(&pending_messages),
279302
Arc::clone(&pending_events),
280303
channel_manager.clone(),
304+
transaction_broadcaster,
281305
config.clone(),
282306
)
283307
})
@@ -412,7 +436,7 @@ where
412436
/// Returns a reference to the LSPS2 server-side handler.
413437
///
414438
/// The returned hendler allows to initiate the LSPS2 service-side flow.
415-
pub fn lsps2_service_handler(&self) -> Option<&LSPS2ServiceHandler<CM>> {
439+
pub fn lsps2_service_handler(&self) -> Option<&LSPS2ServiceHandler<CM, T>> {
416440
self.lsps2_service_handler.as_ref()
417441
}
418442

@@ -586,13 +610,15 @@ impl<
586610
CM: Deref + Clone,
587611
C: Deref + Clone,
588612
TP: Deref + Clone,
589-
> CustomMessageReader for LiquidityManager<ES, NS, CM, C, TP>
613+
T: Deref + Clone,
614+
> CustomMessageReader for LiquidityManager<ES, NS, CM, C, TP, T>
590615
where
591616
ES::Target: EntropySource,
592617
NS::Target: NodeSigner,
593618
CM::Target: AChannelManager,
594619
C::Target: Filter,
595620
TP::Target: TimeProvider,
621+
T::Target: BroadcasterInterface,
596622
{
597623
type CustomMessage = RawLSPSMessage;
598624

@@ -614,13 +640,15 @@ impl<
614640
CM: Deref + Clone,
615641
C: Deref + Clone,
616642
TP: Deref + Clone,
617-
> CustomMessageHandler for LiquidityManager<ES, NS, CM, C, TP>
643+
T: Deref + Clone,
644+
> CustomMessageHandler for LiquidityManager<ES, NS, CM, C, TP, T>
618645
where
619646
ES::Target: EntropySource,
620647
NS::Target: NodeSigner,
621648
CM::Target: AChannelManager,
622649
C::Target: Filter,
623650
TP::Target: TimeProvider,
651+
T::Target: BroadcasterInterface,
624652
{
625653
fn handle_custom_message(
626654
&self, msg: Self::CustomMessage, sender_node_id: PublicKey,
@@ -744,13 +772,15 @@ impl<
744772
CM: Deref + Clone,
745773
C: Deref + Clone,
746774
TP: Deref + Clone,
747-
> Listen for LiquidityManager<ES, NS, CM, C, TP>
775+
T: Deref + Clone,
776+
> Listen for LiquidityManager<ES, NS, CM, C, TP, T>
748777
where
749778
ES::Target: EntropySource,
750779
NS::Target: NodeSigner,
751780
CM::Target: AChannelManager,
752781
C::Target: Filter,
753782
TP::Target: TimeProvider,
783+
T::Target: BroadcasterInterface,
754784
{
755785
fn filtered_block_connected(
756786
&self, header: &bitcoin::block::Header, txdata: &chain::transaction::TransactionData,
@@ -789,13 +819,15 @@ impl<
789819
CM: Deref + Clone,
790820
C: Deref + Clone,
791821
TP: Deref + Clone,
792-
> Confirm for LiquidityManager<ES, NS, CM, C, TP>
822+
T: Deref + Clone,
823+
> Confirm for LiquidityManager<ES, NS, CM, C, TP, T>
793824
where
794825
ES::Target: EntropySource,
795826
NS::Target: NodeSigner,
796827
CM::Target: AChannelManager,
797828
C::Target: Filter,
798829
TP::Target: TimeProvider,
830+
T::Target: BroadcasterInterface,
799831
{
800832
fn transactions_confirmed(
801833
&self, _header: &bitcoin::block::Header, _txdata: &chain::transaction::TransactionData,

0 commit comments

Comments
 (0)