@@ -86,7 +86,7 @@ use crate::types::{
8686 GossipSync , Graph , HRNResolver , KeysManager , MessageRouter , OnionMessenger , PaymentStore ,
8787 PeerManager , PendingPaymentStore ,
8888} ;
89- use crate :: wallet:: persist:: KVStoreWalletPersister ;
89+ use crate :: wallet:: persist:: { read_address_pool , KVStoreWalletPersister } ;
9090use crate :: wallet:: Wallet ;
9191use crate :: { Node , NodeMetrics , PersistedNodeMetrics } ;
9292
@@ -1455,8 +1455,8 @@ fn build_with_store_internal(
14551455
14561456 let kv_store_ref = Arc :: clone ( & kv_store) ;
14571457 let logger_ref = Arc :: clone ( & logger) ;
1458- let ( payment_store_res, node_metris_res, pending_payment_store_res) =
1459- runtime . block_on ( async move {
1458+ let ( payment_store_res, node_metris_res, pending_payment_store_res, address_pool_res ) = runtime
1459+ . block_on ( async move {
14601460 tokio:: join!(
14611461 read_all_objects(
14621462 & * kv_store_ref,
@@ -1470,7 +1470,8 @@ fn build_with_store_internal(
14701470 PENDING_PAYMENT_INFO_PERSISTENCE_PRIMARY_NAMESPACE ,
14711471 PENDING_PAYMENT_INFO_PERSISTENCE_SECONDARY_NAMESPACE ,
14721472 Arc :: clone( & logger_ref) ,
1473- )
1473+ ) ,
1474+ read_address_pool( & * kv_store_ref, & * logger_ref)
14741475 )
14751476 } ) ;
14761477
@@ -1757,9 +1758,18 @@ fn build_with_store_internal(
17571758 } ,
17581759 } ;
17591760
1761+ let persisted_pool_indices = match address_pool_res {
1762+ Ok ( indices) => indices,
1763+ Err ( e) => {
1764+ log_error ! ( logger, "Failed to read address pool data from store: {}" , e) ;
1765+ return Err ( BuildError :: ReadFailed ) ;
1766+ } ,
1767+ } ;
1768+
17601769 let wallet = Arc :: new ( Wallet :: new (
17611770 bdk_wallet,
17621771 wallet_persister,
1772+ persisted_pool_indices,
17631773 Arc :: clone ( & tx_broadcaster) ,
17641774 Arc :: clone ( & fee_estimator) ,
17651775 Arc :: clone ( & chain_source) ,
@@ -1770,6 +1780,13 @@ fn build_with_store_internal(
17701780 Arc :: clone ( & pending_payment_store) ,
17711781 ) ) ;
17721782
1783+ // Fill the address pool up front so LDK's sync `SignerProvider` callbacks can hand out
1784+ // pre-persisted addresses without waiting on wallet persistence.
1785+ runtime. block_on ( wallet. refill_address_pool ( ) ) . map_err ( |e| {
1786+ log_error ! ( logger, "Failed to fill the wallet's address pool: {}" , e) ;
1787+ BuildError :: WalletSetupFailed
1788+ } ) ?;
1789+
17731790 tx_broadcaster. set_wallet ( Arc :: downgrade ( & wallet) ) ;
17741791
17751792 // Initialize the KeysManager
0 commit comments