CW-1615: Harden walletconnect auth (#3547)

* fix android CI

* fix: harden walletconnect auth so a connected session won't transfer on dApp when wallet is switched within the app

* refactor: improve session mgmt and better error handling, also added a loader to the listing page

* feat: switch to newer id for solana dapps connections and fix requests not triggering
This commit is contained in:
David Adegoke
2026-08-26 11:45:03 +08:00
committed by GitHub
parent bd36227974
commit 06e75551a7
39 changed files with 495 additions and 114 deletions
+19 -3
View File
@@ -1,5 +1,3 @@
import "dart:async";
import "package:cake_wallet/core/amount_parsing_proxy.dart";
import "package:cake_wallet/di.dart";
import "package:cake_wallet/entities/preferences_key.dart";
@@ -60,13 +58,17 @@ abstract class AppStoreBase with Store {
Future<void> changeCurrentWallet(
WalletBase<Balance, TransactionHistoryBase<TransactionInfo>, TransactionInfo> wallet) async {
final changingToSameWalletType = this.wallet?.type == wallet.type;
final previousWalletType = this.wallet?.type;
await this.wallet?.close(shouldCleanup: !changingToSameWalletType);
this.wallet = wallet;
this.wallet!.setExceptionHandler(ExceptionHandler.onError);
if (isWalletConnectCompatibleChain(wallet.type)) {
unawaited(_setupWalletConnect());
getIt.get<WalletKitService>().resetConnectionsState();
_queueWalletConnectAction(_setupWalletConnect);
} else if (previousWalletType != null && isWalletConnectCompatibleChain(previousWalletType)) {
_queueWalletConnectAction(_disposeWalletConnect);
}
await getIt.get<SharedPreferences>().setString(PreferencesKey.currentWalletName, wallet.name);
await getIt
@@ -74,6 +76,12 @@ abstract class AppStoreBase with Store {
.setInt(PreferencesKey.currentWalletType, serializeToInt(wallet.type));
}
Future<void> _lastWalletConnectAction = Future.value();
void _queueWalletConnectAction(Future<void> Function() action) {
_lastWalletConnectAction = _lastWalletConnectAction.then((_) => action());
}
Future<void> _setupWalletConnect() async {
try {
final wcService = getIt.get<WalletKitService>();
@@ -84,4 +92,12 @@ abstract class AppStoreBase with Store {
printV("WalletConnect setup failed: $e\n$s");
}
}
Future<void> _disposeWalletConnect() async {
try {
await getIt.get<WalletKitService>().onDispose();
} catch (e) {
printV("WalletConnect teardown failed: $e");
}
}
}