chore(suite): bitcoin-only fw util

This commit is contained in:
tomasklim
2023-08-14 08:32:52 +02:00
committed by Tomáš Klíma
parent b7162aea15
commit 0e26840d8f
14 changed files with 68 additions and 35 deletions

View File

@@ -18,9 +18,15 @@ export const getFirmwareVersion = (device?: PartialDevice) => {
return `${features.major_version}.${features.minor_version}.${features.patch_version}`;
};
export const hasBitcoinOnlyFirmware = (device?: PartialDevice) =>
device?.firmwareType === FirmwareType.BitcoinOnly;
/**
* @deprecated This method should not be part of device-utils
*/
export const getFirmwareType = (device?: PartialDevice) => {
if (isDeviceInBootloaderMode(device)) {
return '';
}
return device?.firmwareType === 'bitcoin-only' ? 'Bitcoin-only' : 'Universal';
return isBitcoinOnlyFirmware(device) ? 'Bitcoin-only' : 'Universal';
};

View File

@@ -1,4 +1,8 @@
// TODO: ⬇️ comment does not apply anymore
// define required device attributes here to avoid dependencies
import { FirmwareType } from '@trezor/connect';
// can be replaced in the future when we create a device types package
export type PartialDevice = Partial<{
features: {
@@ -16,5 +20,5 @@ export type PartialDevice = Partial<{
model: string | null;
internal_model: string | null;
};
firmwareType: string | null;
firmwareType?: FirmwareType;
}>;

View File

@@ -1,4 +1,8 @@
import { getBootloaderVersion, getFirmwareVersion } from '@trezor/device-utils';
import {
getBootloaderVersion,
getFirmwareVersion,
hasBitcoinOnlyFirmware,
} from '@trezor/device-utils';
import { Await } from '@trezor/type-utils';
import { isDesktop } from '@trezor/env-utils';
import { resolveStaticPath } from '@suite-common/suite-utils';
@@ -84,9 +88,7 @@ const firmwareInstallThunk =
// unless the user wants to switch firmware type
let toBitcoinOnlyFirmware = firmwareType === FirmwareType.BitcoinOnly;
if (!firmwareType) {
toBitcoinOnlyFirmware = !prevDevice
? false
: prevDevice.firmwareType === 'bitcoin-only';
toBitcoinOnlyFirmware = !prevDevice ? false : hasBitcoinOnlyFirmware(prevDevice);
}
const targetFirmwareVersion = release.version.join('.');

View File

@@ -12,7 +12,8 @@ import { useDevice, useFirmware, useOnboarding, useSelector } from 'src/hooks/su
import { ReconnectDevicePrompt, InstallButton, FirmwareOffer } from 'src/components/firmware';
import { FirmwareType, TrezorDevice } from 'src/types/suite';
import { getFwUpdateVersion } from 'src/utils/suite/device';
import { getFirmwareVersion } from '@trezor/device-utils';
import { getFirmwareVersion, hasBitcoinOnlyFirmware } from '@trezor/device-utils';
import { FirmwareType } from '@trezor/connect';
const Description = styled.div`
align-items: center;
@@ -133,7 +134,7 @@ export const FirmwareInitial = ({
currentFwVersion &&
availableFwVersion === currentFwVersion
);
const isCurrentlyBitcoinOnly = device.firmwareType === 'bitcoin-only';
const isCurrentlyBitcoinOnly = hasBitcoinOnlyFirmware(device);
const targetFirmwareType =
// switching to Universal
(isCurrentlyBitcoinOnly && shouldSwitchFirmwareType) ||

View File

@@ -1,7 +1,7 @@
import React, { useCallback, useEffect } from 'react';
import styled, { css } from 'styled-components';
import { analytics, EventType } from '@trezor/suite-analytics';
import { getFirmwareType, getFirmwareVersion } from '@trezor/device-utils';
import { getFirmwareVersion } from '@trezor/device-utils';
import { CharacterCount, Translation } from 'src/components/suite';
import { Textarea, Select, variables, Button, CollapsibleBox } from '@trezor/components';
@@ -174,11 +174,6 @@ export const Feedback = ({ type }: FeedbackProps) => {
}
}, [description]);
let firmwareType = '';
if (device?.features) {
firmwareType = getFirmwareType(device);
}
const goBack = () => dispatch(setView('SUPPORT_FEEDBACK_SELECTION'));
const onSubmit = useCallback(() => {
const userData: UserData = {
@@ -191,7 +186,7 @@ export const Feedback = ({ type }: FeedbackProps) => {
device_model: device?.features?.internal_model,
firmware_version: device?.features ? getFirmwareVersion(device) : '',
firmware_revision: device?.features?.revision || '',
firmware_type: firmwareType,
firmware_type: device?.firmwareType || '',
};
if (type === 'BUG') {
dispatch(
@@ -223,7 +218,7 @@ export const Feedback = ({ type }: FeedbackProps) => {
type: EventType.GuideFeedbackSubmit,
payload: { type: type === 'BUG' ? 'bug' : 'suggestion' },
});
}, [device, dispatch, firmwareType, type, description, category, rating?.id]);
}, [device, dispatch, type, description, category, rating?.id]);
return (
<ViewWrapper>

View File

@@ -9,6 +9,7 @@ import {
getBootloaderVersion,
getFirmwareRevision,
getFirmwareVersion,
hasBitcoinOnlyFirmware,
isDeviceInBootloaderMode,
} from '@trezor/device-utils';
import { analyticsActions } from '@suite-common/analytics';
@@ -82,7 +83,7 @@ const analyticsMiddleware =
pin_protection: features.pin_protection,
passphrase_protection: features.passphrase_protection,
totalInstances: state.devices.length,
isBitcoinOnly: action.payload.firmwareType === 'bitcoin-only',
isBitcoinOnly: hasBitcoinOnlyFirmware(action.payload),
totalDevices: getPhysicalDeviceCount(state.devices),
language: features.language,
model: features.internal_model,

View File

@@ -1,7 +1,11 @@
import { MiddlewareAPI } from 'redux';
import { discoveryActions, accountsActions, blockchainActions } from '@suite-common/wallet-core';
import { getBootloaderVersion, getFirmwareVersion } from '@trezor/device-utils';
import {
getBootloaderVersion,
getFirmwareVersion,
hasBitcoinOnlyFirmware,
} from '@trezor/device-utils';
import { DEVICE, TRANSPORT } from '@trezor/connect';
import { analyticsActions } from '@suite-common/analytics';
@@ -87,7 +91,7 @@ const sentryMiddleware =
setSentryContext(deviceContextName, {
mode,
firmware: getFirmwareVersion(action.payload),
isBitcoinOnly: action.payload.firmwareType === 'bitcoin-only',
isBitcoinOnly: hasBitcoinOnlyFirmware(action.payload),
bootloader: getBootloaderVersion(action.payload),
model: state.suite.device?.features?.internal_model,
});

View File

@@ -1,4 +1,4 @@
import { getFirmwareType, getFirmwareVersion } from '@trezor/device-utils';
import { getFirmwareVersion } from '@trezor/device-utils';
import {
getCommitHash,
@@ -21,9 +21,9 @@ const getDeviceInfo = (device?: TrezorDevice) => {
if (!device?.features) {
return '';
}
return `Trezor ${device.features.internal_model} ${getFirmwareVersion(
device,
)} ${getFirmwareType(device)} (revision ${device.features.revision})`;
return `Trezor ${device.features.internal_model} ${getFirmwareVersion(device)} ${
device.firmwareType
} (revision ${device.features.revision})`;
};
const getSuiteInfo = () =>

View File

@@ -1,5 +1,9 @@
import { valid, satisfies } from 'semver';
import { getFirmwareVersion } from '@trezor/device-utils';
import {
getFirmwareVersion,
hasBitcoinOnlyFirmware,
isDeviceInBootloaderMode,
} from '@trezor/device-utils';
import type { AppState, TrezorDevice, ExtendedMessageDescriptor } from 'src/types/suite';
import { DeviceModelInternal } from '@trezor/connect';
@@ -109,3 +113,18 @@ export const validateFirmware = (
return 'TR_FIRMWARE_VALIDATION_T1_V2';
}
};
export const getSuiteFwTypeFromDevice = (device?: TrezorDevice) => {
if (isDeviceInBootloaderMode(device)) {
return '';
}
return hasBitcoinOnlyFirmware(device)
? SuiteFirmwareType.BitcoinOnly
: SuiteFirmwareType.Universal;
};
export const getSuiteFwType = (firmwareType?: FirmwareType) =>
firmwareType === FirmwareType.BitcoinOnly
? SuiteFirmwareType.BitcoinOnly
: SuiteFirmwareType.Universal;

View File

@@ -20,7 +20,6 @@ import {
getBootloaderHash,
getBootloaderVersion,
getFirmwareRevision,
getFirmwareType,
getFirmwareVersion,
} from '@trezor/device-utils';
import { DeepPartial } from '@trezor/type-utils';
@@ -222,7 +221,7 @@ export const getApplicationInfo = (state: AppState, hideSensitiveInfo: boolean)
model: device.features?.internal_model,
firmware: device.features ? getFirmwareVersion(device) : '',
firmwareRevision: device.features ? getFirmwareRevision(device) : '',
firmwareType: device.features ? getFirmwareType(device) : '',
firmwareType: device.firmwareType || '',
bootloader: device.features ? getBootloaderVersion(device) : '',
bootloaderHash: device.features ? getBootloaderHash(device) : '',
numberOfWallets:

View File

@@ -8,6 +8,7 @@ import { TextColumn } from 'src/components/suite/Settings';
import { SettingsAnchor } from 'src/constants/suite/anchors';
import { useDevice, useDispatch } from 'src/hooks/suite';
import { Button, Card } from '@trezor/components';
import { hasBitcoinOnlyFirmware } from '@trezor/device-utils';
const StyledCard = styled(Card)`
align-items: flex-start;
@@ -25,8 +26,7 @@ export const FirmwareTypeSuggestion = () => {
const dispatch = useDispatch();
const { device } = useDevice();
const bitcoinOnlyFirmware = device?.firmwareType === 'bitcoin-only';
const translationId = bitcoinOnlyFirmware
const translationId = hasBitcoinOnlyFirmware(device)
? 'TR_SETTINGS_COINS_UNIVERSAL_FIRMWARE_SUGGESTION'
: 'TR_SETTINGS_COINS_BITCOIN_FIRMWARE_SUGGESTION';

View File

@@ -9,6 +9,7 @@ import { useAnchor } from 'src/hooks/suite/useAnchor';
import { SettingsAnchor } from 'src/constants/suite/anchors';
import { useDevice, useSelector } from 'src/hooks/suite';
import { FirmwareTypeSuggestion } from './FirmwareTypeSuggestion';
import { hasBitcoinOnlyFirmware } from '@trezor/device-utils';
const StyledSettingsLayout = styled(SettingsLayout)`
& > * + * {
@@ -29,7 +30,7 @@ export const SettingsCoins = () => {
const { device } = useDevice();
const bitcoinOnlyFirmware = device?.firmwareType === 'bitcoin-only';
const bitcoinOnlyFirmware = hasBitcoinOnlyFirmware(device);
const onlyBitcoinEnabled =
!!enabledNetworks.length &&
enabledNetworks.every(coin => ['btc', 'regtest', 'test'].includes(coin));

View File

@@ -8,7 +8,7 @@ import { goto } from 'src/actions/suite/routerActions';
import { Button } from '@trezor/components';
import { useAnchor } from 'src/hooks/suite/useAnchor';
import { SettingsAnchor } from 'src/constants/suite/anchors';
import { getFirmwareType, getFirmwareVersion } from '@trezor/device-utils';
import { getFirmwareVersion, hasBitcoinOnlyFirmware } from '@trezor/device-utils';
import { HELP_FIRMWARE_TYPE } from '@trezor/urls';
const Version = styled.div`
@@ -36,9 +36,10 @@ export const FirmwareTypeChange = ({ isDeviceLocked }: FirmwareTypeProps) => {
}
const currentFwVersion = getFirmwareVersion(device);
const currentFwType = getFirmwareType(device);
const actionButtonId =
device.firmwareType === 'bitcoin-only' ? 'TR_SWITCH_TO_UNIVERSAL' : 'TR_SWITCH_TO_BITCOIN';
const currentFwType = getSuiteFwTypeFromDevice(device);
const actionButtonId = hasBitcoinOnlyFirmware(device)
? 'TR_SWITCH_TO_UNIVERSAL'
: 'TR_SWITCH_TO_BITCOIN';
const handleAction = () => dispatch(goto('firmware-type', { params: { cancelable: true } }));

View File

@@ -167,7 +167,7 @@ export const validateDeviceCompatibility = (
const deviceFwVersion = getFirmwareVersion(device);
const deviceBootloaderVersion = getBootloaderVersion(device);
const deviceFwRevision = getFirmwareRevision(device);
const deviceFwVariant = device.firmwareType === 'bitcoin-only' ? 'bitcoin-only' : 'regular';
const deviceFwType = device.firmwareType;
const deviceInternalModel = device.features.internal_model.toLowerCase();
const deviceVendor = device.features.vendor.toLowerCase();
@@ -184,7 +184,7 @@ export const validateDeviceCompatibility = (
return (
modelCondition.toLowerCase() === deviceInternalModel &&
(vendorCondition.toLowerCase() === deviceVendor || vendorCondition === '*') &&
(variantCondition.toLowerCase() === deviceFwVariant || variantCondition === '*') &&
(variantCondition.toLowerCase() === deviceFwType || variantCondition === '*') &&
(firmwareRevisionCondition.toLowerCase() === deviceFwRevision.toLowerCase() ||
firmwareRevisionCondition === '*') &&
(semver.satisfies(deviceFwVersion, createVersionRange(firmwareCondition)!) ||