Skip to content

Commit 17a8f9c

Browse files
committed
Return BestBlock when deserializing chain-synced structs
The deserialization of `ChannelMonitor`, `ChannelManager`, and `OutputSweeper` is implemented for a `(BlockHash, ...)` pair rather than on the object itself. This ensures developers are pushed to think about initial chain sync after deserialization and provides the latest chain sync state conviniently at deserialization-time. In the previous commit we started storing additional recent block hashes in `BestBlock` for use during initial sync to ensure we can handle reorgs while offline if the chain source loses the reorged-out blocks. Here, we move the deserialization routines to be on a `(BestBlock, ...)` pair instead of `(BlockHash, ...)`, providing access to those recent block hashes at deserialization-time.
1 parent e461ac1 commit 17a8f9c

9 files changed

Lines changed: 66 additions & 67 deletions

File tree

lightning-block-sync/src/init.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,10 @@ where
4040
/// switching to [`SpvClient`]. For example:
4141
///
4242
/// ```
43-
/// use bitcoin::hash_types::BlockHash;
4443
/// use bitcoin::network::Network;
4544
///
4645
/// use lightning::chain;
47-
/// use lightning::chain::Watch;
46+
/// use lightning::chain::{BestBlock, Watch};
4847
/// use lightning::chain::chainmonitor;
4948
/// use lightning::chain::chainmonitor::ChainMonitor;
5049
/// use lightning::chain::channelmonitor::ChannelMonitor;
@@ -89,14 +88,14 @@ where
8988
/// logger: &L,
9089
/// persister: &P,
9190
/// ) {
92-
/// // Read a serialized channel monitor paired with the block hash when it was persisted.
91+
/// // Read a serialized channel monitor paired with the best block when it was persisted.
9392
/// let serialized_monitor = "...";
94-
/// let (monitor_block_hash, mut monitor) = <(BlockHash, ChannelMonitor<SP::EcdsaSigner>)>::read(
93+
/// let (monitor_best_block, mut monitor) = <(BestBlock, ChannelMonitor<SP::EcdsaSigner>)>::read(
9594
/// &mut Cursor::new(&serialized_monitor), (entropy_source, signer_provider)).unwrap();
9695
///
97-
/// // Read the channel manager paired with the block hash when it was persisted.
96+
/// // Read the channel manager paired with the best block when it was persisted.
9897
/// let serialized_manager = "...";
99-
/// let (manager_block_hash, mut manager) = {
98+
/// let (manager_best_block, mut manager) = {
10099
/// let read_args = ChannelManagerReadArgs::new(
101100
/// entropy_source,
102101
/// node_signer,
@@ -110,16 +109,16 @@ where
110109
/// config,
111110
/// vec![&mut monitor],
112111
/// );
113-
/// <(BlockHash, ChannelManager<&ChainMonitor<SP::EcdsaSigner, &C, &T, &F, &L, &P, &ES>, &T, &ES, &NS, &SP, &F, &R, &MR, &L>)>::read(
112+
/// <(BestBlock, ChannelManager<&ChainMonitor<SP::EcdsaSigner, &C, &T, &F, &L, &P, &ES>, &T, &ES, &NS, &SP, &F, &R, &MR, &L>)>::read(
114113
/// &mut Cursor::new(&serialized_manager), read_args).unwrap()
115114
/// };
116115
///
117116
/// // Synchronize any channel monitors and the channel manager to be on the best block.
118117
/// let mut cache = UnboundedCache::new();
119118
/// let mut monitor_listener = (monitor, &*tx_broadcaster, &*fee_estimator, &*logger);
120119
/// let listeners = vec![
121-
/// (monitor_block_hash, &monitor_listener as &dyn chain::Listen),
122-
/// (manager_block_hash, &manager as &dyn chain::Listen),
120+
/// (monitor_best_block.block_hash, &monitor_listener as &dyn chain::Listen),
121+
/// (manager_best_block.block_hash, &manager as &dyn chain::Listen),
123122
/// ];
124123
/// let chain_tip = init::synchronize_listeners(
125124
/// block_source, Network::Bitcoin, &mut cache, listeners).await.unwrap();

lightning/src/chain/channelmonitor.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,15 +1058,15 @@ impl Readable for IrrevocablyResolvedHTLC {
10581058
/// You MUST ensure that no ChannelMonitors for a given channel anywhere contain out-of-date
10591059
/// information and are actively monitoring the chain.
10601060
///
1061-
/// Like the [`ChannelManager`], deserialization is implemented for `(BlockHash, ChannelMonitor)`,
1061+
/// Like the [`ChannelManager`], deserialization is implemented for `(BestBlock, ChannelMonitor)`,
10621062
/// providing you with the last block hash which was connected before shutting down. You must begin
10631063
/// syncing the chain from that point, disconnecting and connecting blocks as required to get to
10641064
/// the best chain on startup. Note that all [`ChannelMonitor`]s passed to a [`ChainMonitor`] must
10651065
/// by synced as of the same block, so syncing must happen prior to [`ChainMonitor`]
10661066
/// initialization.
10671067
///
10681068
/// For those loading potentially-ancient [`ChannelMonitor`]s, deserialization is also implemented
1069-
/// for `Option<(BlockHash, ChannelMonitor)>`. LDK can no longer deserialize a [`ChannelMonitor`]
1069+
/// for `Option<(BestBlock, ChannelMonitor)>`. LDK can no longer deserialize a [`ChannelMonitor`]
10701070
/// that was first created in LDK prior to 0.0.110 and last updated prior to LDK 0.0.119. In such
10711071
/// cases, the `Option<(..)>` deserialization option may return `Ok(None)` rather than failing to
10721072
/// deserialize, allowing you to differentiate between the two cases.
@@ -6295,7 +6295,7 @@ where
62956295
const MAX_ALLOC_SIZE: usize = 64 * 1024;
62966296

62976297
impl<'a, 'b, ES: EntropySource, SP: SignerProvider> ReadableArgs<(&'a ES, &'b SP)>
6298-
for (BlockHash, ChannelMonitor<SP::EcdsaSigner>)
6298+
for (BestBlock, ChannelMonitor<SP::EcdsaSigner>)
62996299
{
63006300
fn read<R: io::Read>(reader: &mut R, args: (&'a ES, &'b SP)) -> Result<Self, DecodeError> {
63016301
match <Option<Self>>::read(reader, args) {
@@ -6307,7 +6307,7 @@ impl<'a, 'b, ES: EntropySource, SP: SignerProvider> ReadableArgs<(&'a ES, &'b SP
63076307
}
63086308

63096309
impl<'a, 'b, ES: EntropySource, SP: SignerProvider> ReadableArgs<(&'a ES, &'b SP)>
6310-
for Option<(BlockHash, ChannelMonitor<SP::EcdsaSigner>)>
6310+
for Option<(BestBlock, ChannelMonitor<SP::EcdsaSigner>)>
63116311
{
63126312
#[rustfmt::skip]
63136313
fn read<R: io::Read>(reader: &mut R, args: (&'a ES, &'b SP)) -> Result<Self, DecodeError> {
@@ -6735,14 +6735,14 @@ impl<'a, 'b, ES: EntropySource, SP: SignerProvider> ReadableArgs<(&'a ES, &'b SP
67356735
To continue, run a v0.1 release, send/route a payment over the channel or close it.");
67366736
}
67376737
}
6738-
Ok(Some((best_block.block_hash, monitor)))
6738+
Ok(Some((best_block, monitor)))
67396739
}
67406740
}
67416741

67426742
#[cfg(test)]
67436743
mod tests {
67446744
use bitcoin::amount::Amount;
6745-
use bitcoin::hash_types::{BlockHash, Txid};
6745+
use bitcoin::hash_types::Txid;
67466746
use bitcoin::hashes::sha256::Hash as Sha256;
67476747
use bitcoin::hashes::Hash;
67486748
use bitcoin::hex::FromHex;
@@ -6841,7 +6841,7 @@ mod tests {
68416841
nodes[1].chain_monitor.chain_monitor.transactions_confirmed(&new_header,
68426842
&[(0, broadcast_tx)], conf_height);
68436843

6844-
let (_, pre_update_monitor) = <(BlockHash, ChannelMonitor<_>)>::read(
6844+
let (_, pre_update_monitor) = <(BestBlock, ChannelMonitor<_>)>::read(
68456845
&mut io::Cursor::new(&get_monitor!(nodes[1], channel.2).encode()),
68466846
(&nodes[1].keys_manager.backing, &nodes[1].keys_manager.backing)).unwrap();
68476847

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use crate::chain::chaininterface::LowerBoundedFeeEstimator;
1616
use crate::chain::chainmonitor::ChainMonitor;
1717
use crate::chain::channelmonitor::{ChannelMonitor, MonitorEvent, ANTI_REORG_DELAY};
1818
use crate::chain::transaction::OutPoint;
19-
use crate::chain::{ChannelMonitorUpdateStatus, Listen, Watch};
19+
use crate::chain::{BestBlock, ChannelMonitorUpdateStatus, Listen, Watch};
2020
use crate::events::{ClosureReason, Event, HTLCHandlingFailureType, PaymentPurpose};
2121
use crate::ln::channel::AnnouncementSigsState;
2222
use crate::ln::channelmanager::{PaymentId, RAACommitmentOrder};
@@ -89,7 +89,7 @@ fn test_monitor_and_persister_update_fail() {
8989
let chain_mon = {
9090
let new_monitor = {
9191
let monitor = nodes[0].chain_monitor.chain_monitor.get_monitor(chan.2).unwrap();
92-
let (_, new_monitor) = <(BlockHash, ChannelMonitor<TestChannelSigner>)>::read(
92+
let (_, new_monitor) = <(BestBlock, ChannelMonitor<TestChannelSigner>)>::read(
9393
&mut &monitor.encode()[..],
9494
(nodes[0].keys_manager, nodes[0].keys_manager),
9595
)

lightning/src/ln/channelmanager.rs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1922,7 +1922,6 @@ impl<
19221922
/// detailed in the [`ChannelManagerReadArgs`] documentation.
19231923
///
19241924
/// ```
1925-
/// use bitcoin::BlockHash;
19261925
/// use bitcoin::network::Network;
19271926
/// use lightning::chain::BestBlock;
19281927
/// # use lightning::chain::channelmonitor::ChannelMonitor;
@@ -1971,8 +1970,8 @@ impl<
19711970
/// entropy_source, node_signer, signer_provider, fee_estimator, chain_monitor, tx_broadcaster,
19721971
/// router, message_router, logger, config, channel_monitors.iter().collect(),
19731972
/// );
1974-
/// let (block_hash, channel_manager) =
1975-
/// <(BlockHash, ChannelManager<_, _, _, _, _, _, _, _, _>)>::read(&mut reader, args)?;
1973+
/// let (best_block, channel_manager) =
1974+
/// <(BestBlock, ChannelManager<_, _, _, _, _, _, _, _, _>)>::read(&mut reader, args)?;
19761975
///
19771976
/// // Update the ChannelManager and ChannelMonitors with the latest chain data
19781977
/// // ...
@@ -2539,7 +2538,7 @@ impl<
25392538
/// [`read`], those channels will be force-closed based on the `ChannelMonitor` state and no funds
25402539
/// will be lost (modulo on-chain transaction fees).
25412540
///
2542-
/// Note that the deserializer is only implemented for `(`[`BlockHash`]`, `[`ChannelManager`]`)`, which
2541+
/// Note that the deserializer is only implemented for `(`[`BestBlock`]`, `[`ChannelManager`]`)`, which
25432542
/// tells you the last block hash which was connected. You should get the best block tip before using the manager.
25442543
/// See [`chain::Listen`] and [`chain::Confirm`] for more details.
25452544
///
@@ -2606,7 +2605,6 @@ impl<
26062605
/// [`peer_disconnected`]: msgs::BaseMessageHandler::peer_disconnected
26072606
/// [`funding_created`]: msgs::FundingCreated
26082607
/// [`funding_transaction_generated`]: Self::funding_transaction_generated
2609-
/// [`BlockHash`]: bitcoin::hash_types::BlockHash
26102608
/// [`update_channel`]: chain::Watch::update_channel
26112609
/// [`ChannelUpdate`]: msgs::ChannelUpdate
26122610
/// [`read`]: ReadableArgs::read
@@ -17617,7 +17615,7 @@ impl<'a, ES: EntropySource, NS: NodeSigner, SP: SignerProvider, L: Logger>
1761717615
/// is:
1761817616
/// 1) Deserialize all stored [`ChannelMonitor`]s.
1761917617
/// 2) Deserialize the [`ChannelManager`] by filling in this struct and calling:
17620-
/// `<(BlockHash, ChannelManager)>::read(reader, args)`
17618+
/// `<(BestBlock, ChannelManager)>::read(reader, args)`
1762117619
/// This may result in closing some channels if the [`ChannelMonitor`] is newer than the stored
1762217620
/// [`ChannelManager`] state to ensure no loss of funds. Thus, transactions may be broadcasted.
1762317621
/// 3) If you are not fetching full blocks, register all relevant [`ChannelMonitor`] outpoints the
@@ -17807,14 +17805,14 @@ impl<
1780717805
MR: MessageRouter,
1780817806
L: Logger + Clone,
1780917807
> ReadableArgs<ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L>>
17810-
for (BlockHash, Arc<ChannelManager<M, T, ES, NS, SP, F, R, MR, L>>)
17808+
for (BestBlock, Arc<ChannelManager<M, T, ES, NS, SP, F, R, MR, L>>)
1781117809
{
1781217810
fn read<Reader: io::Read>(
1781317811
reader: &mut Reader, args: ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L>,
1781417812
) -> Result<Self, DecodeError> {
17815-
let (blockhash, chan_manager) =
17816-
<(BlockHash, ChannelManager<M, T, ES, NS, SP, F, R, MR, L>)>::read(reader, args)?;
17817-
Ok((blockhash, Arc::new(chan_manager)))
17813+
let (best_block, chan_manager) =
17814+
<(BestBlock, ChannelManager<M, T, ES, NS, SP, F, R, MR, L>)>::read(reader, args)?;
17815+
Ok((best_block, Arc::new(chan_manager)))
1781817816
}
1781917817
}
1782017818

@@ -17830,7 +17828,7 @@ impl<
1783017828
MR: MessageRouter,
1783117829
L: Logger + Clone,
1783217830
> ReadableArgs<ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L>>
17833-
for (BlockHash, ChannelManager<M, T, ES, NS, SP, F, R, MR, L>)
17831+
for (BestBlock, ChannelManager<M, T, ES, NS, SP, F, R, MR, L>)
1783417832
{
1783517833
fn read<Reader: io::Read>(
1783617834
reader: &mut Reader, args: ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L>,
@@ -17875,7 +17873,7 @@ impl<
1787517873
pub(super) fn from_channel_manager_data(
1787617874
data: ChannelManagerData<SP>,
1787717875
mut args: ChannelManagerReadArgs<'_, M, T, ES, NS, SP, F, R, MR, L>,
17878-
) -> Result<(BlockHash, Self), DecodeError> {
17876+
) -> Result<(BestBlock, Self), DecodeError> {
1787917877
let ChannelManagerData {
1788017878
chain_hash,
1788117879
best_block_height,
@@ -19459,7 +19457,7 @@ impl<
1945919457
//TODO: Broadcast channel update for closed channels, but only after we've made a
1946019458
//connection or two.
1946119459

19462-
Ok((best_block_hash, channel_manager))
19460+
Ok((best_block, channel_manager))
1946319461
}
1946419462
}
1946519463

lightning/src/ln/functional_test_utils.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -849,7 +849,7 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
849849
let mon = self.chain_monitor.chain_monitor.get_monitor(channel_id).unwrap();
850850
mon.write(&mut w).unwrap();
851851
let (_, deserialized_monitor) =
852-
<(BlockHash, ChannelMonitor<TestChannelSigner>)>::read(
852+
<(BestBlock, ChannelMonitor<TestChannelSigner>)>::read(
853853
&mut io::Cursor::new(&w.0),
854854
(self.keys_manager, self.keys_manager),
855855
)
@@ -878,7 +878,7 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
878878
let mut w = test_utils::TestVecWriter(Vec::new());
879879
self.node.write(&mut w).unwrap();
880880
<(
881-
BlockHash,
881+
BestBlock,
882882
ChannelManager<
883883
&test_utils::TestChainMonitor,
884884
&test_utils::TestBroadcaster,
@@ -1307,7 +1307,7 @@ pub fn _reload_node<'a, 'b, 'c>(
13071307
let mut monitors_read = Vec::with_capacity(monitors_encoded.len());
13081308
for encoded in monitors_encoded {
13091309
let mut monitor_read = &encoded[..];
1310-
let (_, monitor) = <(BlockHash, ChannelMonitor<TestChannelSigner>)>::read(
1310+
let (_, monitor) = <(BestBlock, ChannelMonitor<TestChannelSigner>)>::read(
13111311
&mut monitor_read,
13121312
(node.keys_manager, node.keys_manager),
13131313
)
@@ -1322,7 +1322,7 @@ pub fn _reload_node<'a, 'b, 'c>(
13221322
for monitor in monitors_read.iter() {
13231323
assert!(channel_monitors.insert(monitor.channel_id(), monitor).is_none());
13241324
}
1325-
<(BlockHash, TestChannelManager<'b, 'c>)>::read(
1325+
<(BestBlock, TestChannelManager<'b, 'c>)>::read(
13261326
&mut node_read,
13271327
ChannelManagerReadArgs {
13281328
config,

lightning/src/ln/functional_tests.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use crate::chain::channelmonitor::{
1919
LATENCY_GRACE_PERIOD_BLOCKS,
2020
};
2121
use crate::chain::transaction::OutPoint;
22+
use crate::chain::BestBlock;
2223
use crate::chain::{ChannelMonitorUpdateStatus, Confirm, Listen, Watch};
2324
use crate::events::{
2425
ClosureReason, Event, HTLCHandlingFailureType, PathFailure, PaymentFailureReason,
@@ -7382,7 +7383,7 @@ pub fn test_update_err_monitor_lockdown() {
73827383
let new_monitor = {
73837384
let monitor = nodes[0].chain_monitor.chain_monitor.get_monitor(chan_1.2).unwrap();
73847385
let new_monitor =
7385-
<(BlockHash, channelmonitor::ChannelMonitor<TestChannelSigner>)>::read(
7386+
<(BestBlock, channelmonitor::ChannelMonitor<TestChannelSigner>)>::read(
73867387
&mut io::Cursor::new(&monitor.encode()),
73877388
(nodes[0].keys_manager, nodes[0].keys_manager),
73887389
)
@@ -7490,7 +7491,7 @@ pub fn test_concurrent_monitor_claim() {
74907491
let new_monitor = {
74917492
let monitor = nodes[0].chain_monitor.chain_monitor.get_monitor(chan_1.2).unwrap();
74927493
let new_monitor =
7493-
<(BlockHash, channelmonitor::ChannelMonitor<TestChannelSigner>)>::read(
7494+
<(BestBlock, channelmonitor::ChannelMonitor<TestChannelSigner>)>::read(
74947495
&mut io::Cursor::new(&monitor.encode()),
74957496
(nodes[0].keys_manager, nodes[0].keys_manager),
74967497
)
@@ -7540,7 +7541,7 @@ pub fn test_concurrent_monitor_claim() {
75407541
let new_monitor = {
75417542
let monitor = nodes[0].chain_monitor.chain_monitor.get_monitor(chan_1.2).unwrap();
75427543
let new_monitor =
7543-
<(BlockHash, channelmonitor::ChannelMonitor<TestChannelSigner>)>::read(
7544+
<(BestBlock, channelmonitor::ChannelMonitor<TestChannelSigner>)>::read(
75447545
&mut io::Cursor::new(&monitor.encode()),
75457546
(nodes[0].keys_manager, nodes[0].keys_manager),
75467547
)

lightning/src/ln/reload_tests.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
//! Functional tests which test for correct behavior across node restarts.
1313
14-
use crate::chain::{ChannelMonitorUpdateStatus, Watch};
14+
use crate::chain::{BestBlock, ChannelMonitorUpdateStatus, Watch};
1515
use crate::chain::chaininterface::LowerBoundedFeeEstimator;
1616
use crate::chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdateStep};
1717
use crate::routing::router::{PaymentParameters, RouteParameters};
@@ -30,7 +30,6 @@ use crate::util::ser::{Writeable, ReadableArgs};
3030
use crate::util::config::{HTLCInterceptionFlags, UserConfig};
3131

3232
use bitcoin::hashes::Hash;
33-
use bitcoin::hash_types::BlockHash;
3433
use types::payment::{PaymentHash, PaymentPreimage};
3534

3635
use crate::prelude::*;
@@ -412,22 +411,22 @@ fn test_manager_serialize_deserialize_inconsistent_monitor() {
412411
let mut node_0_stale_monitors = Vec::new();
413412
for serialized in node_0_stale_monitors_serialized.iter() {
414413
let mut read = &serialized[..];
415-
let (_, monitor) = <(BlockHash, ChannelMonitor<TestChannelSigner>)>::read(&mut read, (keys_manager, keys_manager)).unwrap();
414+
let (_, monitor) = <(BestBlock, ChannelMonitor<TestChannelSigner>)>::read(&mut read, (keys_manager, keys_manager)).unwrap();
416415
assert!(read.is_empty());
417416
node_0_stale_monitors.push(monitor);
418417
}
419418

420419
let mut node_0_monitors = Vec::new();
421420
for serialized in node_0_monitors_serialized.iter() {
422421
let mut read = &serialized[..];
423-
let (_, monitor) = <(BlockHash, ChannelMonitor<TestChannelSigner>)>::read(&mut read, (keys_manager, keys_manager)).unwrap();
422+
let (_, monitor) = <(BestBlock, ChannelMonitor<TestChannelSigner>)>::read(&mut read, (keys_manager, keys_manager)).unwrap();
424423
assert!(read.is_empty());
425424
node_0_monitors.push(monitor);
426425
}
427426

428427
let mut nodes_0_read = &nodes_0_serialized[..];
429428
if let Err(msgs::DecodeError::DangerousValue) =
430-
<(BlockHash, ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestKeysInterface, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestMessageRouter, &test_utils::TestLogger>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
429+
<(BestBlock, ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestKeysInterface, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestMessageRouter, &test_utils::TestLogger>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
431430
config: UserConfig::default(),
432431
entropy_source: keys_manager,
433432
node_signer: keys_manager,
@@ -445,7 +444,7 @@ fn test_manager_serialize_deserialize_inconsistent_monitor() {
445444

446445
let mut nodes_0_read = &nodes_0_serialized[..];
447446
let (_, nodes_0_deserialized_tmp) =
448-
<(BlockHash, ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestKeysInterface, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestMessageRouter, &test_utils::TestLogger>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
447+
<(BestBlock, ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestKeysInterface, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestMessageRouter, &test_utils::TestLogger>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
449448
config: UserConfig::default(),
450449
entropy_source: keys_manager,
451450
node_signer: keys_manager,

0 commit comments

Comments
 (0)