@@ -52,8 +52,8 @@ use crate::config::{
5252 default_user_config, may_announce_channel, AddressType , AddressTypeRuntimeConfig ,
5353 AnnounceError , AsyncPaymentsRole , BitcoindRestClientConfig , Config , ElectrumSyncConfig ,
5454 EsploraSyncConfig , OnchainWalletAccount , RuntimeSyncIntervals , ScoringDecayParameters ,
55- ScoringFeeParameters , DEFAULT_ESPLORA_SERVER_URL , DEFAULT_LOG_FILENAME , DEFAULT_LOG_LEVEL ,
56- MAX_ONCHAIN_WALLET_ACCOUNT_INDEX , WALLET_KEYS_SEED_LEN ,
55+ ScoringFeeParameters , BDK_CLIENT_STOP_GAP , DEFAULT_ESPLORA_SERVER_URL , DEFAULT_LOG_FILENAME ,
56+ DEFAULT_LOG_LEVEL , MAX_ONCHAIN_WALLET_ACCOUNT_INDEX , WALLET_KEYS_SEED_LEN ,
5757} ;
5858use crate :: connection:: ConnectionManager ;
5959use crate :: event:: EventQueue ;
@@ -115,6 +115,18 @@ enum ChainDataSourceConfig {
115115 } ,
116116}
117117
118+ fn derived_account_lookahead ( chain_data_source_config : Option < & ChainDataSourceConfig > ) -> u32 {
119+ match chain_data_source_config {
120+ Some ( ChainDataSourceConfig :: Electrum { sync_config, .. } ) => {
121+ sync_config. unwrap_or_default ( ) . additional_wallet_full_scan_stop_gap . max ( 1 )
122+ } ,
123+ Some ( ChainDataSourceConfig :: Bitcoind { .. } ) => {
124+ bdk_chain:: keychain_txout:: DEFAULT_LOOKAHEAD
125+ } ,
126+ Some ( ChainDataSourceConfig :: Esplora { .. } ) | None => BDK_CLIENT_STOP_GAP as u32 ,
127+ }
128+ }
129+
118130#[ derive( Debug , Clone ) ]
119131enum EntropySourceConfig {
120132 SeedFile ( String ) ,
@@ -1350,42 +1362,49 @@ fn account_keychain_derivation_path(
13501362/// persisted wallet was restored.
13511363pub ( crate ) fn get_or_create_wallet_for_account (
13521364 wallet_account : OnchainWalletAccount , master_xprv : Xpriv , network : Network ,
1353- persister : & mut KVStoreWalletPersister ,
1365+ persister : & mut KVStoreWalletPersister , lookahead : Option < u32 > ,
13541366) -> Result < ( PersistedWallet < KVStoreWalletPersister > , bool ) , BuildError > {
13551367 macro_rules! load_or_create {
13561368 ( $ext: expr, $int: expr) => { {
1357- let wallet_opt = BdkWallet :: load( )
1369+ let mut load_params = BdkWallet :: load( )
13581370 . descriptor( KeychainKind :: External , Some ( $ext) )
13591371 . descriptor( KeychainKind :: Internal , Some ( $int) )
13601372 . extract_keys( )
1361- . check_network( network)
1362- . load_wallet( persister)
1363- . map_err( |e| match e {
1364- bdk_wallet:: LoadWithPersistError :: InvalidChangeSet (
1365- bdk_wallet:: LoadError :: Mismatch ( bdk_wallet:: LoadMismatch :: Network {
1366- loaded,
1367- expected,
1368- } ) ,
1369- ) => {
1370- log:: error!(
1371- "Failed to setup wallet: Networks do not match. Expected {} but got {}" ,
1372- expected,
1373- loaded
1374- ) ;
1375- BuildError :: NetworkMismatch
1376- } ,
1377- _ => {
1378- log:: error!( "Failed to set up wallet: {}" , e) ;
1379- BuildError :: WalletSetupFailed
1380- } ,
1381- } ) ?;
1373+ . check_network( network) ;
1374+ if let Some ( lookahead) = lookahead {
1375+ load_params = load_params. lookahead( lookahead) ;
1376+ }
1377+ let wallet_opt = load_params. load_wallet( persister) . map_err( |e| match e {
1378+ bdk_wallet:: LoadWithPersistError :: InvalidChangeSet (
1379+ bdk_wallet:: LoadError :: Mismatch ( bdk_wallet:: LoadMismatch :: Network {
1380+ loaded,
1381+ expected,
1382+ } ) ,
1383+ ) => {
1384+ log:: error!(
1385+ "Failed to setup wallet: Networks do not match. Expected {} but got {}" ,
1386+ expected,
1387+ loaded
1388+ ) ;
1389+ BuildError :: NetworkMismatch
1390+ } ,
1391+ _ => {
1392+ log:: error!( "Failed to set up wallet: {}" , e) ;
1393+ BuildError :: WalletSetupFailed
1394+ } ,
1395+ } ) ?;
13821396 match wallet_opt {
13831397 Some ( w) => Ok ( ( w, true ) ) ,
1384- None => BdkWallet :: create( $ext, $int)
1385- . network( network)
1386- . create_wallet( persister)
1387- . map( |w| ( w, false ) )
1388- . map_err( |_| BuildError :: WalletSetupFailed ) ,
1398+ None => {
1399+ let mut create_params = BdkWallet :: create( $ext, $int) . network( network) ;
1400+ if let Some ( lookahead) = lookahead {
1401+ create_params = create_params. lookahead( lookahead) ;
1402+ }
1403+ create_params
1404+ . create_wallet( persister)
1405+ . map( |w| ( w, false ) )
1406+ . map_err( |_| BuildError :: WalletSetupFailed )
1407+ } ,
13891408 }
13901409 } } ;
13911410 }
@@ -1484,20 +1503,25 @@ fn validate_configured_onchain_wallet_accounts(
14841503
14851504fn build_wallet_for_account (
14861505 config : & Config , wallet_account : OnchainWalletAccount , xprv : Xpriv , kv_store : Arc < DynStore > ,
1487- logger : Arc < Logger > , chain_tip_opt : Option < & BestBlock > ,
1506+ logger : Arc < Logger > , chain_tip_opt : Option < & BestBlock > , lookahead : Option < u32 > ,
14881507) -> Result <
14891508 ( OnchainWalletAccount , PersistedWallet < KVStoreWalletPersister > , KVStoreWalletPersister ) ,
14901509 BuildError ,
14911510> {
14921511 let mut persister =
14931512 KVStoreWalletPersister :: new ( Arc :: clone ( & kv_store) , Arc :: clone ( & logger) , wallet_account) ;
14941513
1495- let ( mut wallet, loaded_from_store) =
1496- get_or_create_wallet_for_account ( wallet_account, xprv, config. network , & mut persister)
1497- . map_err ( |e| {
1498- log_error ! ( logger, "Failed to setup wallet for {:?}: {}" , wallet_account, e) ;
1499- e
1500- } ) ?;
1514+ let ( mut wallet, loaded_from_store) = get_or_create_wallet_for_account (
1515+ wallet_account,
1516+ xprv,
1517+ config. network ,
1518+ & mut persister,
1519+ lookahead,
1520+ )
1521+ . map_err ( |e| {
1522+ log_error ! ( logger, "Failed to setup wallet for {:?}: {}" , wallet_account, e) ;
1523+ e
1524+ } ) ?;
15011525
15021526 // Re-loaded wallets keep their persisted tip so chain backends can catch up. New wallets start
15031527 // at the known tip; Esplora and Electrum recover history independently with a full scan, while
@@ -1522,6 +1546,7 @@ fn build_wallet_for_account(
15221546fn build_additional_wallets (
15231547 config : & Config , configured_accounts : & [ OnchainWalletAccount ] , xprv : Xpriv ,
15241548 kv_store : Arc < DynStore > , logger : Arc < Logger > , chain_tip_opt : Option < & BestBlock > ,
1549+ derived_account_lookahead : u32 ,
15251550) -> Result <
15261551 Vec < ( OnchainWalletAccount , PersistedWallet < KVStoreWalletPersister > , KVStoreWalletPersister ) > ,
15271552 BuildError ,
@@ -1537,6 +1562,7 @@ fn build_additional_wallets(
15371562 Arc :: clone ( & kv_store) ,
15381563 Arc :: clone ( & logger) ,
15391564 chain_tip_opt,
1565+ None ,
15401566 ) {
15411567 Ok ( tuple) => {
15421568 log_info ! ( logger, "Created additional wallet for {:?}" , tuple. 0 ) ;
@@ -1561,6 +1587,7 @@ fn build_additional_wallets(
15611587 Arc :: clone ( & kv_store) ,
15621588 Arc :: clone ( & logger) ,
15631589 chain_tip_opt,
1590+ Some ( derived_account_lookahead) ,
15641591 ) ?;
15651592 log_info ! ( logger, "Loaded configured wallet for {:?}" , wallet_account) ;
15661593 additional_wallets. push ( wallet) ;
@@ -1755,6 +1782,7 @@ fn build_with_store_internal(
17551782 BuildError :: InvalidSeedBytes
17561783 } ) ?;
17571784 let configured_accounts = validate_configured_onchain_wallet_accounts ( & config, xprv) ?;
1785+ let derived_account_lookahead = derived_account_lookahead ( chain_data_source_config) ;
17581786
17591787 let tx_broadcaster = Arc :: new ( TransactionBroadcaster :: new ( Arc :: clone ( & logger) ) ) ;
17601788 let fee_estimator = Arc :: new ( OnchainFeeEstimator :: new ( ) ) ;
@@ -1785,6 +1813,7 @@ fn build_with_store_internal(
17851813 xprv,
17861814 network,
17871815 & mut persister,
1816+ None ,
17881817 )
17891818 . map( |( wallet, _loaded) | wallet) ;
17901819 ( result, persister)
@@ -1951,6 +1980,7 @@ fn build_with_store_internal(
19511980 Arc :: clone ( & kv_store) ,
19521981 Arc :: clone ( & logger) ,
19531982 chain_tip_opt. as_ref ( ) ,
1983+ derived_account_lookahead,
19541984 ) ?;
19551985
19561986 let wallet = Arc :: new ( Wallet :: new (
@@ -1966,6 +1996,7 @@ fn build_with_store_internal(
19661996 Arc :: clone ( & address_type_runtime_config) ,
19671997 Arc :: clone ( & node_metrics) ,
19681998 Arc :: clone ( & logger) ,
1999+ derived_account_lookahead,
19692000 ) ) ;
19702001
19712002 // Initialize the KeysManager
@@ -3291,7 +3322,8 @@ mod tests {
32913322 let mut persister =
32923323 KVStoreWalletPersister :: new ( Arc :: clone ( & store) , Arc :: clone ( & logger) , account) ;
32933324 let ( wallet, loaded) =
3294- get_or_create_wallet_for_account ( account, master, network, & mut persister) . unwrap ( ) ;
3325+ get_or_create_wallet_for_account ( account, master, network, & mut persister, None )
3326+ . unwrap ( ) ;
32953327 assert ! ( !loaded) ;
32963328
32973329 let descriptor = wallet. public_descriptor ( KeychainKind :: External ) . to_string ( ) ;
0 commit comments