Skip to content

Commit e3317e5

Browse files
lukaw3dlukaw3d
authored andcommitted
Detect faulty Ledger firmware
1 parent e7fd691 commit e3317e5

5 files changed

Lines changed: 39 additions & 2 deletions

File tree

.changelog/2205.bugfix.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Detect faulty ledger firmware

src/app/components/ErrorFormatter/index.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,23 @@ export function ErrorFormatter(props: Props) {
9393
'errors.LedgerDerivedDifferentAccount',
9494
'This account does not belong to the currently connected Ledger.',
9595
),
96+
[WalletErrors.LedgerLikelyFaultyFirmware]: (
97+
<Trans
98+
i18nKey="errors.LedgerLikelyFaultyFirmware"
99+
t={t}
100+
defaults="Connecting to Ledger timed out. This is likely due to faulty Ledger firmware: Nano X 2.5.0, Nano S Plus 1.4.0, Stax 1.8.0, Flex 1.4.0. We suggest <WorkaroundsHelp>some workarounds here</WorkaroundsHelp>."
101+
components={{
102+
WorkaroundsHelp: (
103+
<Anchor
104+
href="https://github.com/oasisprotocol/wallet/issues/2198#issuecomment-3177012146"
105+
target="_blank"
106+
rel="noopener"
107+
style={{ display: 'inline' }}
108+
/>
109+
),
110+
}}
111+
/>
112+
),
96113
[WalletErrors.LedgerUnknownError]: t('errors.unknownLedgerError', 'Unknown ledger error: {{message}}', {
97114
message,
98115
}),

src/app/state/importaccounts/saga.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,18 @@ import BleTransport from '@oasisprotocol/ionic-ledger-hw-transport-ble/lib'
2323
import { ScanResult } from '@capacitor-community/bluetooth-le'
2424
import { getChainContext } from '../network/saga'
2525

26+
class TransportWebUSBDetectLedgerLikelyFaultyFirmware extends TransportWebUSB {
27+
static async open(a: any) {
28+
const response = await Promise.race([
29+
super.open(a),
30+
new Promise<never>((resolve, reject) =>
31+
setTimeout(() => reject(new WalletError(WalletErrors.LedgerLikelyFaultyFirmware, 'timeout')), 8_000),
32+
),
33+
])
34+
return response
35+
}
36+
}
37+
2638
function* setStep(step: ImportAccountsStep) {
2739
yield* put(importAccountsActions.setStep(step))
2840
}
@@ -65,9 +77,14 @@ export function* getUSBTransport() {
6577
throw new WalletError(WalletErrors.USBTransportNotSupported, 'TransportWebUSB unsupported')
6678
}
6779
try {
68-
return yield* call([TransportWebUSB, TransportWebUSB.create])
80+
return yield* call([
81+
TransportWebUSBDetectLedgerLikelyFaultyFirmware,
82+
TransportWebUSBDetectLedgerLikelyFaultyFirmware.create,
83+
])
6984
} catch (e: any) {
70-
if (e.message.match(/No device selected/)) {
85+
if (e instanceof WalletError) {
86+
throw e
87+
} else if (e.message.match(/No device selected/)) {
7188
throw new WalletError(WalletErrors.LedgerNoDeviceSelected, e.message)
7289
} else {
7390
throw new WalletError(WalletErrors.USBTransportError, e.message)

src/locales/en/translation.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@
152152
},
153153
"errors": {
154154
"LedgerDerivedDifferentAccount": "This account does not belong to the currently connected Ledger.",
155+
"LedgerLikelyFaultyFirmware": "Connecting to Ledger timed out. This is likely due to faulty Ledger firmware: Nano X 2.5.0, Nano S Plus 1.4.0, Stax 1.8.0, Flex 1.4.0. We suggest <WorkaroundsHelp>some workarounds here</WorkaroundsHelp>.",
155156
"LedgerOasisAppIsNotOpen": "Oasis App on Ledger is closed.",
156157
"bluetoothTransportNotSupported": "Bluetooth may be turned off or your current platform does not support Bluetooth capability.",
157158
"cannotSendToSelf": "Cannot send to yourself",

src/types/errors.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export enum WalletErrors {
2828
LedgerTransactionRejected = 'transaction_rejected',
2929
LedgerAppVersionNotSupported = 'ledger_version_not_supported',
3030
LedgerDerivedDifferentAccount = 'ledger_derived_different_account',
31+
LedgerLikelyFaultyFirmware = 'ledger_likely_faulty_firmware',
3132
IndexerAPIError = 'indexer_api_error',
3233
DisconnectedError = 'disconnected_error',
3334
ParaTimesUnknownError = 'para_times_unknown_error',

0 commit comments

Comments
 (0)