UNPKG

@trezor/connect

Version:

High-level javascript interface for Trezor hardware wallet.

75 lines 3.27 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.checkFirmwareRevision = void 0; const utils_1 = require("@trezor/utils"); const calculateRevisionForDevice_1 = require("./calculateRevisionForDevice"); const firmwareInfo_1 = require("../data/firmwareInfo"); const assets_browser_1 = require("../utils/assets-browser"); const isNotFoundError = (e) => e instanceof assets_browser_1.HttpRequestError && e.response.status === 404; const isNodeJSOfflineError = (e) => ['FetchError', 'AbortError'].includes(e.name); const isReactNativeOfflineError = (e) => e.name === 'TypeError' && e.message.includes('Network request failed'); const isOfflineError = (e) => { if (!(e instanceof Error)) return false; return isNodeJSOfflineError(e) || isReactNativeOfflineError(e); }; const getOnlineReleaseMetadata = async ({ firmwareVersion, internalModel, }) => { const onlineReleases = await (0, firmwareInfo_1.getOnlineReleases)(internalModel); return onlineReleases.find(onlineRelease => utils_1.versionUtils.isEqual(onlineRelease.version, firmwareVersion)); }; const failFirmwareRevisionCheck = (error, errorPayload) => ({ success: false, error, ...(errorPayload ? { errorPayload } : null), }); const doRevisionsMatch = ({ deviceRevision, expectedCommitRevision, firmwareVersion, }) => { if (deviceRevision === null) { return false; } const adjustedExpected = (0, calculateRevisionForDevice_1.calculateRevisionForDevice)({ commitRevision: expectedCommitRevision, version: firmwareVersion, }); return adjustedExpected === deviceRevision; }; const checkFirmwareRevision = async ({ firmwareVersion, internalModel, deviceRevision, expectedRevision, }) => { if (expectedRevision === undefined) { if (firmwareVersion.length !== 3) { return failFirmwareRevisionCheck('firmware-version-unknown'); } try { const onlineRelease = await getOnlineReleaseMetadata({ firmwareVersion, internalModel, }); if (onlineRelease?.firmware_revision === undefined) { return failFirmwareRevisionCheck('firmware-version-unknown'); } if (!doRevisionsMatch({ deviceRevision, expectedCommitRevision: onlineRelease.firmware_revision, firmwareVersion, })) { return failFirmwareRevisionCheck('revision-mismatch'); } return { success: true }; } catch (e) { if (isNotFoundError(e)) return failFirmwareRevisionCheck('firmware-version-unknown'); return isOfflineError(e) ? failFirmwareRevisionCheck('cannot-perform-check-offline') : failFirmwareRevisionCheck('other-error', (0, utils_1.serializeError)(e)); } } if (!doRevisionsMatch({ deviceRevision, expectedCommitRevision: expectedRevision, firmwareVersion, })) { return failFirmwareRevisionCheck('revision-mismatch'); } return { success: true }; }; exports.checkFirmwareRevision = checkFirmwareRevision; //# sourceMappingURL=checkFirmwareRevision.js.map