From b7cfe3c3a1cbdf51c447709f306de6605a51e0f0 Mon Sep 17 00:00:00 2001 From: Usman Umar Garba Date: Thu, 9 Jul 2026 18:59:39 +0100 Subject: [PATCH 1/2] fix(demo): dispose sqlite persister before folder rename in wallet service --- bdk_demo/lib/services/wallet_service.dart | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/bdk_demo/lib/services/wallet_service.dart b/bdk_demo/lib/services/wallet_service.dart index c006ed7..d35f55d 100644 --- a/bdk_demo/lib/services/wallet_service.dart +++ b/bdk_demo/lib/services/wallet_service.dart @@ -539,6 +539,7 @@ class WalletService { ); } catch (_) { _walletDisposer(wallet); + persister.dispose(); await WalletStoragePaths.deleteWalletData(walletId); rethrow; } @@ -610,10 +611,20 @@ class WalletService { changeDescriptor, fallbackDbPath, ); + _walletDisposer(wallet); + fallbackPersister.dispose(); await WalletStoragePaths.replaceWalletDataWithFallback(walletId); - return wallet; + final dbPath = await WalletStoragePaths.sqlitePathForWallet(walletId); + final persister = Persister.newSqlite(path: dbPath); + return _walletLoadRunner( + descriptor: descriptor, + changeDescriptor: changeDescriptor, + persister: persister, + lookahead: AppConstants.walletLookahead, + ); } catch (_) { _walletDisposer(wallet); + fallbackPersister.dispose(); await WalletStoragePaths.deleteFallbackWalletData(walletId); rethrow; } From 9f95b60de8e6fedf85143df1c9e56fd2b286aa9b Mon Sep 17 00:00:00 2001 From: Usman Umar Garba Date: Fri, 17 Jul 2026 10:56:56 +0100 Subject: [PATCH 2/2] fix(demo): explicitly dispose persister handles and split reseeding into two phases --- bdk_demo/lib/services/wallet_service.dart | 46 ++++++++++++------- .../test/services/wallet_sync_job_test.dart | 3 ++ 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/bdk_demo/lib/services/wallet_service.dart b/bdk_demo/lib/services/wallet_service.dart index d35f55d..97b0ca1 100644 --- a/bdk_demo/lib/services/wallet_service.dart +++ b/bdk_demo/lib/services/wallet_service.dart @@ -340,13 +340,16 @@ class WalletService { try { final persister = Persister.newSqlite(path: dbPath); - final wallet = _walletLoadRunner( - descriptor: descriptor, - changeDescriptor: changeDescriptor, - persister: persister, - lookahead: AppConstants.walletLookahead, - ); - return wallet; + try { + return _walletLoadRunner( + descriptor: descriptor, + changeDescriptor: changeDescriptor, + persister: persister, + lookahead: AppConstants.walletLookahead, + ); + } finally { + persister.dispose(); + } } catch (error) { throw StateError( 'Failed to load existing SQLite wallet at "$dbPath". ' @@ -543,6 +546,7 @@ class WalletService { await WalletStoragePaths.deleteWalletData(walletId); rethrow; } + persister.dispose(); return wallet; } @@ -611,22 +615,27 @@ class WalletService { changeDescriptor, fallbackDbPath, ); + } catch (_) { _walletDisposer(wallet); fallbackPersister.dispose(); - await WalletStoragePaths.replaceWalletDataWithFallback(walletId); - final dbPath = await WalletStoragePaths.sqlitePathForWallet(walletId); - final persister = Persister.newSqlite(path: dbPath); + await WalletStoragePaths.deleteFallbackWalletData(walletId); + rethrow; + } + + _walletDisposer(wallet); + fallbackPersister.dispose(); + await WalletStoragePaths.replaceWalletDataWithFallback(walletId); + final dbPath = await WalletStoragePaths.sqlitePathForWallet(walletId); + final persister = Persister.newSqlite(path: dbPath); + try { return _walletLoadRunner( descriptor: descriptor, changeDescriptor: changeDescriptor, persister: persister, lookahead: AppConstants.walletLookahead, ); - } catch (_) { - _walletDisposer(wallet); - fallbackPersister.dispose(); - await WalletStoragePaths.deleteFallbackWalletData(walletId); - rethrow; + } finally { + persister.dispose(); } } @@ -681,9 +690,10 @@ class WalletService { ); Wallet? wallet; + Persister? persister; try { final dbPath = await WalletStoragePaths.sqlitePathForWallet(record.id); - final persister = Persister.newSqlite(path: dbPath); + persister = Persister.newSqlite(path: dbPath); wallet = Wallet( descriptor: descriptor, changeDescriptor: changeDescriptor, @@ -705,8 +715,12 @@ class WalletService { if (wallet != null) { _walletDisposer(wallet); } + persister?.dispose(); + persister = null; await WalletStoragePaths.deleteWalletData(record.id); rethrow; + } finally { + persister?.dispose(); } return (record, wallet); diff --git a/bdk_demo/test/services/wallet_sync_job_test.dart b/bdk_demo/test/services/wallet_sync_job_test.dart index d83729a..4e42c83 100644 --- a/bdk_demo/test/services/wallet_sync_job_test.dart +++ b/bdk_demo/test/services/wallet_sync_job_test.dart @@ -51,6 +51,7 @@ _createSqliteWalletFixture(WalletNetwork walletNetwork) async { dbPath: dbPath, ); wallet.dispose(); + persister.dispose(); return ( dbPath: dbPath, @@ -294,6 +295,7 @@ void main() { lookahead: AppConstants.walletLookahead, ); addTearDown(wallet.dispose); + addTearDown(persister.dispose); expect( () => persistWalletSqliteWithReopenVerify( @@ -341,6 +343,7 @@ void main() { lookahead: AppConstants.walletLookahead, ); addTearDown(wallet.dispose); + addTearDown(persister.dispose); await persistWalletSqliteWithReopenVerify( wallet: wallet,