@@ -228,10 +228,71 @@ impl ChainSource {
228
228
} ) ?;
229
229
}
230
230
231
- let res =
232
- {
233
- let full_scan_request = onchain_wallet. get_full_scan_request ( ) ;
231
+ let res = {
232
+ // If this is our first sync, do a full scan with the configured gap limit.
233
+ // Otherwise just do an incremental sync.
234
+ let incremental_sync =
235
+ latest_onchain_wallet_sync_timestamp. read ( ) . unwrap ( ) . is_some ( ) ;
236
+
237
+ macro_rules! get_and_apply_wallet_update {
238
+ ( $sync_future: expr) => { {
239
+ let now = Instant :: now( ) ;
240
+ match $sync_future. await {
241
+ Ok ( res) => match res {
242
+ Ok ( update) => match onchain_wallet. apply_update( update) {
243
+ Ok ( ( ) ) => {
244
+ log_info!(
245
+ logger,
246
+ "{} of on-chain wallet finished in {}ms." ,
247
+ if incremental_sync { "Incremental sync" } else { "Sync" } ,
248
+ now. elapsed( ) . as_millis( )
249
+ ) ;
250
+ let unix_time_secs_opt = SystemTime :: now( )
251
+ . duration_since( UNIX_EPOCH )
252
+ . ok( )
253
+ . map( |d| d. as_secs( ) ) ;
254
+ * latest_onchain_wallet_sync_timestamp. write( ) . unwrap( ) =
255
+ unix_time_secs_opt;
256
+ Ok ( ( ) )
257
+ } ,
258
+ Err ( e) => Err ( e) ,
259
+ } ,
260
+ Err ( e) => match * e {
261
+ esplora_client:: Error :: Reqwest ( he) => {
262
+ log_error!(
263
+ logger,
264
+ "{} of on-chain wallet failed due to HTTP connection error: {}" ,
265
+ if incremental_sync { "Incremental sync" } else { "Sync" } ,
266
+ he
267
+ ) ;
268
+ Err ( Error :: WalletOperationFailed )
269
+ } ,
270
+ _ => {
271
+ log_error!(
272
+ logger,
273
+ "{} of on-chain wallet failed due to Esplora error: {}" ,
274
+ if incremental_sync { "Incremental sync" } else { "Sync" } ,
275
+ e
276
+ ) ;
277
+ Err ( Error :: WalletOperationFailed )
278
+ } ,
279
+ } ,
280
+ } ,
281
+ Err ( e) => {
282
+ log_error!(
283
+ logger,
284
+ "{} of on-chain wallet timed out: {}" ,
285
+ if incremental_sync { "Incremental sync" } else { "Sync" } ,
286
+ e
287
+ ) ;
288
+ Err ( Error :: WalletOperationTimeout )
289
+ } ,
290
+ }
291
+ } }
292
+ }
234
293
294
+ if incremental_sync {
295
+ let full_scan_request = onchain_wallet. get_full_scan_request ( ) ;
235
296
let wallet_sync_timeout_fut = tokio:: time:: timeout (
236
297
Duration :: from_secs ( BDK_WALLET_SYNC_TIMEOUT_SECS ) ,
237
298
esplora_client. full_scan (
@@ -240,48 +301,16 @@ impl ChainSource {
240
301
BDK_CLIENT_CONCURRENCY ,
241
302
) ,
242
303
) ;
243
-
244
- let now = Instant :: now ( ) ;
245
- match wallet_sync_timeout_fut. await {
246
- Ok ( res) => match res {
247
- Ok ( update) => match onchain_wallet. apply_update ( update) {
248
- Ok ( ( ) ) => {
249
- log_info ! (
250
- logger,
251
- "Sync of on-chain wallet finished in {}ms." ,
252
- now. elapsed( ) . as_millis( )
253
- ) ;
254
- let unix_time_secs_opt = SystemTime :: now ( )
255
- . duration_since ( UNIX_EPOCH )
256
- . ok ( )
257
- . map ( |d| d. as_secs ( ) ) ;
258
- * latest_onchain_wallet_sync_timestamp. write ( ) . unwrap ( ) =
259
- unix_time_secs_opt;
260
- Ok ( ( ) )
261
- } ,
262
- Err ( e) => Err ( e) ,
263
- } ,
264
- Err ( e) => match * e {
265
- esplora_client:: Error :: Reqwest ( he) => {
266
- log_error ! (
267
- logger,
268
- "Sync failed due to HTTP connection error: {}" ,
269
- he
270
- ) ;
271
- Err ( Error :: WalletOperationFailed )
272
- } ,
273
- _ => {
274
- log_error ! ( logger, "Sync of on-chain wallet failed due to Esplora error: {}" , e) ;
275
- Err ( Error :: WalletOperationFailed )
276
- } ,
277
- } ,
278
- } ,
279
- Err ( e) => {
280
- log_error ! ( logger, "On-chain wallet sync timed out: {}" , e) ;
281
- Err ( Error :: WalletOperationTimeout )
282
- } ,
283
- }
284
- } ;
304
+ get_and_apply_wallet_update ! ( wallet_sync_timeout_fut)
305
+ } else {
306
+ let sync_request = onchain_wallet. get_incremental_sync_request ( ) ;
307
+ let wallet_sync_timeout_fut = tokio:: time:: timeout (
308
+ Duration :: from_secs ( BDK_WALLET_SYNC_TIMEOUT_SECS ) ,
309
+ esplora_client. sync ( sync_request, BDK_CLIENT_CONCURRENCY ) ,
310
+ ) ;
311
+ get_and_apply_wallet_update ! ( wallet_sync_timeout_fut)
312
+ }
313
+ } ;
285
314
286
315
onchain_wallet_sync_status. lock ( ) . unwrap ( ) . propagate_result_to_subscribers ( res) ;
287
316
0 commit comments