1use std::fmt;
9use std::sync::{Arc, Mutex};
10
11use bitcoin::secp256k1::PublicKey;
12use bitcoin::OutPoint;
13use lightning::chain::chainmonitor;
14use lightning::impl_writeable_tlv_based;
15use lightning::ln::channel_state::ChannelDetails as LdkChannelDetails;
16use lightning::ln::msgs::{RoutingMessageHandler, SocketAddress};
17use lightning::ln::peer_handler::IgnoringMessageHandler;
18use lightning::ln::types::ChannelId;
19use lightning::routing::gossip;
20use lightning::routing::router::DefaultRouter;
21use lightning::routing::scoring::{CombinedScorer, ProbabilisticScoringFeeParameters};
22use lightning::sign::InMemorySigner;
23use lightning::util::persist::{KVStore, KVStoreSync, MonitorUpdatingPersister};
24use lightning::util::ser::{Readable, Writeable, Writer};
25use lightning::util::sweep::OutputSweeper;
26use lightning_block_sync::gossip::{GossipVerifier, UtxoSource};
27use lightning_liquidity::utils::time::DefaultTimeProvider;
28use lightning_net_tokio::SocketDescriptor;
29
30use crate::chain::ChainSource;
31use crate::config::ChannelConfig;
32use crate::data_store::DataStore;
33use crate::fee_estimator::OnchainFeeEstimator;
34use crate::gossip::RuntimeSpawner;
35use crate::logger::Logger;
36use crate::message_handler::NodeCustomMessageHandler;
37use crate::payment::PaymentDetails;
38
39#[derive(Debug, Clone, Copy, PartialEq, Eq)]
41pub enum WordCount {
42 Words12,
44 Words15,
46 Words18,
48 Words21,
50 Words24,
52}
53
54impl WordCount {
55 pub fn word_count(&self) -> usize {
57 match self {
58 WordCount::Words12 => 12,
59 WordCount::Words15 => 15,
60 WordCount::Words18 => 18,
61 WordCount::Words21 => 21,
62 WordCount::Words24 => 24,
63 }
64 }
65}
66
67pub trait SyncAndAsyncKVStore: KVStore + KVStoreSync {}
70
71impl<T> SyncAndAsyncKVStore for T
72where
73 T: KVStore,
74 T: KVStoreSync,
75{
76}
77
78pub type DynStore = dyn SyncAndAsyncKVStore + Sync + Send;
80
81pub type Persister = MonitorUpdatingPersister<
82 Arc<DynStore>,
83 Arc<Logger>,
84 Arc<KeysManager>,
85 Arc<KeysManager>,
86 Arc<Broadcaster>,
87 Arc<OnchainFeeEstimator>,
88>;
89
90pub(crate) type ChainMonitor = chainmonitor::ChainMonitor<
91 InMemorySigner,
92 Arc<ChainSource>,
93 Arc<Broadcaster>,
94 Arc<OnchainFeeEstimator>,
95 Arc<Logger>,
96 Arc<Persister>,
97 Arc<KeysManager>,
98>;
99
100pub(crate) type PeerManager = lightning::ln::peer_handler::PeerManager<
101 SocketDescriptor,
102 Arc<ChannelManager>,
103 Arc<dyn RoutingMessageHandler + Send + Sync>,
104 Arc<OnionMessenger>,
105 Arc<Logger>,
106 Arc<NodeCustomMessageHandler<Arc<Logger>>>,
107 Arc<KeysManager>,
108 Arc<ChainMonitor>,
109>;
110
111pub(crate) type LiquidityManager = lightning_liquidity::LiquidityManager<
112 Arc<KeysManager>,
113 Arc<KeysManager>,
114 Arc<ChannelManager>,
115 Arc<ChainSource>,
116 Arc<DynStore>,
117 DefaultTimeProvider,
118 Arc<Broadcaster>,
119>;
120
121pub(crate) type ChannelManager = lightning::ln::channelmanager::ChannelManager<
122 Arc<ChainMonitor>,
123 Arc<Broadcaster>,
124 Arc<KeysManager>,
125 Arc<KeysManager>,
126 Arc<KeysManager>,
127 Arc<OnchainFeeEstimator>,
128 Arc<Router>,
129 Arc<MessageRouter>,
130 Arc<Logger>,
131>;
132
133pub(crate) type Broadcaster = crate::tx_broadcaster::TransactionBroadcaster<Arc<Logger>>;
134
135pub(crate) type Wallet = crate::wallet::Wallet;
136pub(crate) type KeysManager = crate::wallet::WalletKeysManager;
137
138pub(crate) type Router = DefaultRouter<
139 Arc<Graph>,
140 Arc<Logger>,
141 Arc<KeysManager>,
142 Arc<Mutex<Scorer>>,
143 ProbabilisticScoringFeeParameters,
144 Scorer,
145>;
146pub(crate) type Scorer = CombinedScorer<Arc<Graph>, Arc<Logger>>;
147
148pub(crate) type Graph = gossip::NetworkGraph<Arc<Logger>>;
149
150pub(crate) type UtxoLookup = GossipVerifier<RuntimeSpawner, Arc<dyn UtxoSource>, Arc<Logger>>;
151
152pub(crate) type P2PGossipSync =
153 lightning::routing::gossip::P2PGossipSync<Arc<Graph>, Arc<UtxoLookup>, Arc<Logger>>;
154pub(crate) type RapidGossipSync =
155 lightning_rapid_gossip_sync::RapidGossipSync<Arc<Graph>, Arc<Logger>>;
156
157pub(crate) type GossipSync = lightning_background_processor::GossipSync<
158 Arc<P2PGossipSync>,
159 Arc<RapidGossipSync>,
160 Arc<Graph>,
161 Arc<UtxoLookup>,
162 Arc<Logger>,
163>;
164
165pub(crate) type OnionMessenger = lightning::onion_message::messenger::OnionMessenger<
166 Arc<KeysManager>,
167 Arc<KeysManager>,
168 Arc<Logger>,
169 Arc<ChannelManager>,
170 Arc<MessageRouter>,
171 Arc<ChannelManager>,
172 Arc<ChannelManager>,
173 IgnoringMessageHandler,
174 IgnoringMessageHandler,
175>;
176
177pub(crate) type MessageRouter = lightning::onion_message::messenger::DefaultMessageRouter<
178 Arc<Graph>,
179 Arc<Logger>,
180 Arc<KeysManager>,
181>;
182
183pub(crate) type Sweeper = OutputSweeper<
184 Arc<Broadcaster>,
185 Arc<KeysManager>,
186 Arc<OnchainFeeEstimator>,
187 Arc<ChainSource>,
188 Arc<DynStore>,
189 Arc<Logger>,
190 Arc<KeysManager>,
191>;
192
193pub(crate) type BumpTransactionEventHandler =
194 lightning::events::bump_transaction::BumpTransactionEventHandler<
195 Arc<Broadcaster>,
196 Arc<lightning::events::bump_transaction::Wallet<Arc<Wallet>, Arc<Logger>>>,
197 Arc<KeysManager>,
198 Arc<Logger>,
199 >;
200
201pub(crate) type PaymentStore = DataStore<PaymentDetails, Arc<Logger>>;
202
203#[derive(Debug, Copy, Clone, PartialEq, Eq)]
207pub struct UserChannelId(pub u128);
208
209impl Writeable for UserChannelId {
210 fn write<W: Writer>(&self, writer: &mut W) -> Result<(), lightning::io::Error> {
211 Ok(self.0.write(writer)?)
212 }
213}
214
215impl Readable for UserChannelId {
216 fn read<R: lightning::io::Read>(
217 reader: &mut R,
218 ) -> Result<Self, lightning::ln::msgs::DecodeError> {
219 Ok(Self(Readable::read(reader)?))
220 }
221}
222
223impl fmt::Display for UserChannelId {
224 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
225 write!(f, "UserChannelId({})", self.0)
226 }
227}
228
229#[derive(Debug, Clone)]
233pub struct ChannelDetails {
234 pub channel_id: ChannelId,
241 pub counterparty_node_id: PublicKey,
243 pub funding_txo: Option<OutPoint>,
246 pub short_channel_id: Option<u64>,
259 pub outbound_scid_alias: Option<u64>,
269 pub inbound_scid_alias: Option<u64>,
279 pub channel_value_sats: u64,
281 pub unspendable_punishment_reserve: Option<u64>,
291 pub user_channel_id: UserChannelId,
293 pub feerate_sat_per_1000_weight: u32,
296 pub outbound_capacity_msat: u64,
302 pub inbound_capacity_msat: u64,
309 pub confirmations_required: Option<u32>,
314 pub confirmations: Option<u32>,
316 pub is_outbound: bool,
318 pub is_channel_ready: bool,
323 pub is_usable: bool,
328 pub is_announced: bool,
330 pub cltv_expiry_delta: Option<u16>,
333 pub counterparty_unspendable_punishment_reserve: u64,
341 pub counterparty_outbound_htlc_minimum_msat: Option<u64>,
346 pub counterparty_outbound_htlc_maximum_msat: Option<u64>,
348 pub counterparty_forwarding_info_fee_base_msat: Option<u32>,
350 pub counterparty_forwarding_info_fee_proportional_millionths: Option<u32>,
352 pub counterparty_forwarding_info_cltv_expiry_delta: Option<u16>,
355 pub next_outbound_htlc_limit_msat: u64,
363 pub next_outbound_htlc_minimum_msat: u64,
368 pub force_close_spend_delay: Option<u16>,
376 pub inbound_htlc_minimum_msat: u64,
378 pub inbound_htlc_maximum_msat: Option<u64>,
380 pub config: ChannelConfig,
382}
383
384impl From<LdkChannelDetails> for ChannelDetails {
385 fn from(value: LdkChannelDetails) -> Self {
386 ChannelDetails {
387 channel_id: value.channel_id,
388 counterparty_node_id: value.counterparty.node_id,
389 funding_txo: value.funding_txo.map(|o| o.into_bitcoin_outpoint()),
390 short_channel_id: value.short_channel_id,
391 outbound_scid_alias: value.outbound_scid_alias,
392 inbound_scid_alias: value.inbound_scid_alias,
393 channel_value_sats: value.channel_value_satoshis,
394 unspendable_punishment_reserve: value.unspendable_punishment_reserve,
395 user_channel_id: UserChannelId(value.user_channel_id),
396 feerate_sat_per_1000_weight: value.feerate_sat_per_1000_weight.unwrap(),
399 outbound_capacity_msat: value.outbound_capacity_msat,
400 inbound_capacity_msat: value.inbound_capacity_msat,
401 confirmations_required: value.confirmations_required,
402 confirmations: value.confirmations,
403 is_outbound: value.is_outbound,
404 is_channel_ready: value.is_channel_ready,
405 is_usable: value.is_usable,
406 is_announced: value.is_announced,
407 cltv_expiry_delta: value.config.map(|c| c.cltv_expiry_delta),
408 counterparty_unspendable_punishment_reserve: value
409 .counterparty
410 .unspendable_punishment_reserve,
411 counterparty_outbound_htlc_minimum_msat: value.counterparty.outbound_htlc_minimum_msat,
412 counterparty_outbound_htlc_maximum_msat: value.counterparty.outbound_htlc_maximum_msat,
413 counterparty_forwarding_info_fee_base_msat: value
414 .counterparty
415 .forwarding_info
416 .as_ref()
417 .map(|f| f.fee_base_msat),
418 counterparty_forwarding_info_fee_proportional_millionths: value
419 .counterparty
420 .forwarding_info
421 .as_ref()
422 .map(|f| f.fee_proportional_millionths),
423 counterparty_forwarding_info_cltv_expiry_delta: value
424 .counterparty
425 .forwarding_info
426 .as_ref()
427 .map(|f| f.cltv_expiry_delta),
428 next_outbound_htlc_limit_msat: value.next_outbound_htlc_limit_msat,
429 next_outbound_htlc_minimum_msat: value.next_outbound_htlc_minimum_msat,
430 force_close_spend_delay: value.force_close_spend_delay,
431 inbound_htlc_minimum_msat: value.inbound_htlc_minimum_msat.unwrap_or(0),
433 inbound_htlc_maximum_msat: value.inbound_htlc_maximum_msat,
434 config: value.config.map(|c| c.into()).unwrap(),
436 }
437 }
438}
439
440#[derive(Debug, Clone, PartialEq, Eq)]
444pub struct PeerDetails {
445 pub node_id: PublicKey,
447 pub address: SocketAddress,
449 pub is_persisted: bool,
451 pub is_connected: bool,
453}
454
455#[derive(Debug, Clone, PartialEq, Eq)]
457pub struct CustomTlvRecord {
458 pub type_num: u64,
460 pub value: Vec<u8>,
462}
463
464impl_writeable_tlv_based!(CustomTlvRecord, {
465 (0, type_num, required),
466 (2, value, required),
467});
468
469impl From<&(u64, Vec<u8>)> for CustomTlvRecord {
470 fn from(tlv: &(u64, Vec<u8>)) -> Self {
471 CustomTlvRecord { type_num: tlv.0, value: tlv.1.clone() }
472 }
473}