Skip to content

Commit d70d15c

Browse files
authored
Merge pull request #2325 from anipy1/orphan-seed-fix
fix(wallet): clean up orphan seed in secure storage on wallet deletion
2 parents 5d62909 + 72e36aa commit d70d15c

2 files changed

Lines changed: 26 additions & 0 deletions

File tree

lib/core/wallet/domain/usecases/delete_wallet_usecase.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
1+
import 'package:bb_mobile/core/seed/data/repository/seed_repository.dart';
12
import 'package:bb_mobile/core/swaps/data/repository/boltz_swap_repository.dart';
3+
import 'package:bb_mobile/core/utils/logger.dart';
24
import 'package:bb_mobile/core/wallet/data/repositories/wallet_repository.dart';
35
import 'package:bb_mobile/core/wallet/domain/wallet_error.dart';
46

57
class DeleteWalletUsecase {
68
final WalletRepository _walletRepository;
79
final BoltzSwapRepository _swapRepository;
10+
final SeedRepository _seedRepository;
811

912
DeleteWalletUsecase({
1013
required this._walletRepository,
1114
required this._swapRepository,
15+
required this._seedRepository,
1216
});
1317

1418
Future<void> execute({required String walletId}) async {
@@ -30,6 +34,27 @@ class DeleteWalletUsecase {
3034
}
3135

3236
await _walletRepository.deleteWallet(walletId: walletId);
37+
38+
// Clean up the seed in secure storage once no remaining wallet
39+
// still references it. Bitcoin and Liquid default wallets share a
40+
// master fingerprint, so the seed is only deleted when the last
41+
// wallet derived from it is gone. Watch-only wallets have an empty
42+
// master fingerprint and never own a seed entry. Issue #2324.
43+
if (wallet.masterFingerprint.isNotEmpty) {
44+
final remaining = await _walletRepository.getWallets();
45+
final stillUsed = remaining.any(
46+
(w) => w.masterFingerprint == wallet.masterFingerprint,
47+
);
48+
if (!stillUsed) {
49+
try {
50+
await _seedRepository.delete(wallet.masterFingerprint);
51+
} catch (e) {
52+
log.warning(
53+
'DeleteWalletUsecase: failed to clean up seed for $walletId: $e',
54+
);
55+
}
56+
}
57+
}
3358
} on WalletError {
3459
rethrow;
3560
} catch (e) {

lib/core/wallet/wallet_locator.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ class WalletLocator {
166166
instanceName:
167167
LocatorInstanceNameConstants.boltzSwapRepositoryInstanceName,
168168
),
169+
seedRepository: locator<SeedRepository>(),
169170
),
170171
);
171172
locator.registerFactory<GetAddressAtIndexUsecase>(

0 commit comments

Comments
 (0)