fix: add reconnection logic to hardware wallet flow to handle tap-backs (#3458)
Konstantin Ullrich committed
Jul 31, 2026 at 00:05 UTC
22015eb1e19e314c35c5d5c2ee83be8507a17c66
4 files changed
+56
-25
lib/buy/dfx/dfx_buy_provider.dart
+17
-8
@@ -336,14 +336,23 @@ class DFXBuyProvider extends BuyProvider {
336
String? countryCode}) async {
337
if (wallet.isHardwareWallet) {
338
if (!hardwareWalletVM!.isConnected(wallet.walletInfo.type)) {
339
- await Navigator.of(context).pushNamed(Routes.connectDevices,
340
- arguments: ConnectDevicePageParams(
341
- walletType: wallet.walletInfo.type,
342
- hardwareWalletType: wallet.walletInfo.hardwareWalletType!,
343
- onConnectDevice: (context, hwwVM) {
344
- hwwVM.initWallet(wallet);
345
- Navigator.of(context).pop();
346
- }));
339
+ await Navigator.of(context).pushNamed(
340
+ Routes.connectDevices,
341
+ arguments: ConnectDevicePageParams(
342
+ walletType: wallet.walletInfo.type,
343
+ hardwareWalletType: wallet.walletInfo.hardwareWalletType!,
344
+ onConnectDevice: (context, hwwVM) {
345
+ hwwVM.initWallet(wallet);
346
+ Navigator.of(context).pop();
347
+ },
348
+ isReconnect: false,
349
+ ),
350
+ );
351
+
352
+ // Recheck to handle tap-backs
353
+ if (!hardwareWalletVM!.isConnected(wallet.walletInfo.type)) {
354
+ return;
355
+ }
356
} else {
357
hardwareWalletVM!.initWallet(wallet);
358
}
lib/buy/robinhood/robinhood_buy_provider.dart
+15
-8
@@ -174,14 +174,21 @@ class RobinhoodBuyProvider extends BuyProvider {
174
String? countryCode}) async {
175
if (wallet.isHardwareWallet) {
176
if (!hardwareWalletVM!.isConnected(wallet.walletInfo.type)) {
177
- await Navigator.of(context).pushNamed(Routes.connectDevices,
178
- arguments: ConnectDevicePageParams(
179
- walletType: wallet.walletInfo.type,
180
- hardwareWalletType: wallet.walletInfo.hardwareWalletType!,
181
- onConnectDevice: (context, hwwVM) {
182
- hwwVM.initWallet(wallet);
183
- Navigator.of(context).pop();
184
- }));
177
+ await Navigator.of(context).pushNamed(
178
+ Routes.connectDevices,
179
+ arguments: ConnectDevicePageParams(
180
+ walletType: wallet.walletInfo.type,
181
+ hardwareWalletType: wallet.walletInfo.hardwareWalletType!,
182
+ onConnectDevice: (context, hwwVM) {
183
+ hwwVM.initWallet(wallet);
184
+ Navigator.of(context).pop();
185
+ },
186
+ isReconnect: false,
187
+ ),
188
+ );
189
+ if (!hardwareWalletVM!.isConnected(wallet.walletInfo.type)) {
190
+ return;
191
+ }
192
} else {
193
hardwareWalletVM!.initWallet(wallet);
194
}
lib/new-ui/pages/send_page.dart
+7
@@ -823,8 +823,15 @@ class _NewSendPageState extends State<NewSendPage> {
823
widget.sendViewModel.hardwareWalletViewModel!.initWallet(widget.sendViewModel.wallet);
824
Navigator.of(context).pop();
825
},
826
+ isReconnect: false,
827
),
828
);
829
+
830
+ // Recheck to handle tap-backs
831
+ if (!widget.sendViewModel.hardwareWalletViewModel!
832
+ .isConnected(widget.sendViewModel.walletType)) {
833
+ return;
834
+ }
835
} else {
836
await widget.sendViewModel.hardwareWalletViewModel!.initWallet(widget.sendViewModel.wallet);
837
}
lib/new-ui/widgets/swap_page/swap_confirm_sheet.dart
+17
-9
@@ -47,15 +47,23 @@ class _SwapConfirmSheetState extends State<SwapConfirmSheet> {
47
48
if (sendVM.wallet.isHardwareWallet) {
49
if (!sendVM.hardwareWalletViewModel!.isConnected(sendVM.walletType)) {
50
- await Navigator.of(context).pushNamed(Routes.connectDevices,
51
- arguments: ConnectDevicePageParams(
52
- walletType: sendVM.walletType,
53
- hardwareWalletType: sendVM.wallet.walletInfo.hardwareWalletType!,
54
- onConnectDevice: (context, _) {
55
- sendVM.hardwareWalletViewModel!.initWallet(sendVM.wallet);
56
- Navigator.of(context).pop();
57
- },
58
- ));
50
+ await Navigator.of(context).pushNamed(
51
+ Routes.connectDevices,
52
+ arguments: ConnectDevicePageParams(
53
+ walletType: sendVM.walletType,
54
+ hardwareWalletType: sendVM.wallet.walletInfo.hardwareWalletType!,
55
+ onConnectDevice: (context, _) {
56
+ sendVM.hardwareWalletViewModel!.initWallet(sendVM.wallet);
57
+ Navigator.of(context).pop();
58
+ },
59
+ isReconnect: false,
60
+ ),
61
+ );
62
+
63
+ // Recheck to handle tap-backs
64
+ if (!sendVM.hardwareWalletViewModel!.isConnected(sendVM.walletType)) {
65
+ return;
66
+ }
67
} else {
68
sendVM.hardwareWalletViewModel!.initWallet(sendVM.wallet);
69
}