Skip to content

Commit

Permalink
Lift default transport detection to wallet logic
Browse files Browse the repository at this point in the history
  • Loading branch information
DavidTranDucVL committed Jun 8, 2021
1 parent a654c31 commit 531e7c4
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 28 deletions.
10 changes: 8 additions & 2 deletions app/frontend/actions/wallet.ts
Expand Up @@ -17,6 +17,8 @@ import loadingActions from './loading'
import {saveAs} from '../libs/file-saver'
import {exportWalletSecretDef} from '../wallet/keypass-json'

import {getDefaultTransport} from '../../frontend/helpers/transports'

// TODO: (refactor), this should not call "setState" as it is not action
const fetchConversionRates = async (conversionRates, setState) => {
try {
Expand Down Expand Up @@ -60,18 +62,22 @@ export default (store: Store) => {
{
cryptoProviderType,
walletSecretDef,
ledgerTransportType,
selectedLedgerTransportType,
shouldExportPubKeyBulk,
}: {
cryptoProviderType: CryptoProviderType
walletSecretDef?: any // TODO: until now, arguments came in freestyle combinations, refactor
ledgerTransportType?: LedgerTransportType
selectedLedgerTransportType?: LedgerTransportType
shouldExportPubKeyBulk: boolean
}
) => {
loadingAction(state, 'Loading wallet data...')
setState({walletLoadingError: undefined})
const isShelleyCompatible = !(walletSecretDef && walletSecretDef.derivationScheme.type === 'v1')
const ledgerTransportType =
selectedLedgerTransportType === LedgerTransportType.DEFAULT
? await getDefaultTransport()
: selectedLedgerTransportType
const config = {
...ADALITE_CONFIG,
isShelleyCompatible,
Expand Down
8 changes: 5 additions & 3 deletions app/frontend/components/pages/login/hardwareAuth.tsx
Expand Up @@ -17,7 +17,9 @@ const LoadByHardwareWalletSection = () => {
const [enableBulkExport, setBulkExport] = useState(
window.localStorage.getItem(localStorageVars.BULK_EXPORT) !== 'true'
)
const [ledgerTransportType, setLedgerTransportType] = useState(LedgerTransportType.DEFAULT)
const [selectedLedgerTransportType, setSelectedLedgerTransportType] = useState(
LedgerTransportType.DEFAULT
)
const toggleBulkExport = useCallback(() => {
window.localStorage.setItem(localStorageVars.BULK_EXPORT, `${enableBulkExport}`)
setBulkExport(!enableBulkExport)
Expand Down Expand Up @@ -85,7 +87,7 @@ const LoadByHardwareWalletSection = () => {
{LedgerAffiliateLink('Support us by buying one')}
</div>
<div>
<LedgerTransportSelect onSelect={setLedgerTransportType} />
<LedgerTransportSelect onSelect={setSelectedLedgerTransportType} />
<button
{...tooltip(
'Support for Ledger is temporarily disabled',
Expand All @@ -97,7 +99,7 @@ const LoadByHardwareWalletSection = () => {
loadWallet({
cryptoProviderType: CryptoProviderType.LEDGER,
shouldExportPubKeyBulk: enableBulkExport,
ledgerTransportType,
selectedLedgerTransportType,
})
}
>
Expand Down
32 changes: 32 additions & 0 deletions app/frontend/helpers/transports.ts
@@ -0,0 +1,32 @@
import {isWindows, isOpera} from 'react-device-detect'

import LedgerTransportWebUsb from '@ledgerhq/hw-transport-webusb'
import LedgerTransportWebHid from '@ledgerhq/hw-transport-webhid'
import {LedgerTransportType} from '../types'

const isWebUsbSupported = async (): Promise<boolean> => {
const isSupported = await LedgerTransportWebUsb.isSupported()
return isSupported && !isWindows && !isOpera
}

const isWebHidSupported = async (): Promise<boolean> => {
// On Opera the device-selection pop-up appears but there's no apparent way to
// select the device, resulting in an "Operation rejected by user" error
const isSupported = await LedgerTransportWebHid.isSupported()
return isSupported && !isOpera
}

const getDefaultTransport = async (): Promise<LedgerTransportType> => {
const supportWebHid = await isWebHidSupported()
const supportWebUsb = await isWebUsbSupported()

if (supportWebHid) {
return LedgerTransportType.WEB_HID
} else if (supportWebUsb) {
return LedgerTransportType.WEB_USB
} else {
return LedgerTransportType.U2F
}
}

export {getDefaultTransport}
24 changes: 1 addition & 23 deletions app/frontend/wallet/shelley/shelley-ledger-crypto-provider.ts
Expand Up @@ -12,7 +12,6 @@ import {
cborizeTxAuxiliaryVotingData,
ShelleyTxAux,
} from './shelley-transaction'
import {isWindows, isOpera} from 'react-device-detect'
import {hasRequiredVersion} from './helpers/version-check'
import {LEDGER_VERSIONS, LEDGER_ERRORS} from '../constants'
import {bech32} from 'cardano-crypto.js'
Expand Down Expand Up @@ -64,18 +63,6 @@ import {
import {TxRelayType, TxStakepoolOwner, TxStakepoolRelay} from './helpers/poolCertificateUtils'
import assertUnreachable from '../../helpers/assertUnreachable'

const isWebUsbSupported = async (): Promise<boolean> => {
const isSupported = await LedgerTransportWebUsb.isSupported()
return isSupported && !isWindows && !isOpera
}

const isWebHidSupported = async (): Promise<boolean> => {
// On Opera the device-selection pop-up appears but there's no apparent way to
// select the device, resulting in an "Operation rejected by user" error
const isSupported = await LedgerTransportWebHid.isSupported()
return isSupported && !isOpera
}

let _activeTransport: Transport | null = null
const getLedgerTransport = async (ledgerTransportType: LedgerTransportType): Promise<Transport> => {
if (_activeTransport != null) {
Expand All @@ -91,9 +78,6 @@ const getLedgerTransport = async (ledgerTransportType: LedgerTransportType): Pro
}
}

const supportWebHid = await isWebHidSupported()
const supportWebUsb = await isWebUsbSupported()

switch (ledgerTransportType) {
case LedgerTransportType.WEB_HID:
_activeTransport = await LedgerTransportWebHid.create()
Expand All @@ -105,13 +89,7 @@ const getLedgerTransport = async (ledgerTransportType: LedgerTransportType): Pro
_activeTransport = await LedgerTransportWebUsb.create()
break
default:
if (supportWebHid) {
_activeTransport = await LedgerTransportWebHid.create()
} else if (supportWebUsb) {
_activeTransport = await LedgerTransportWebUsb.create()
} else {
_activeTransport = await LedgerTransportU2F.create()
}
break
}

return _activeTransport
Expand Down

0 comments on commit 531e7c4

Please sign in to comment.