UNPKG

@trezor/connect

Version:

High-level javascript interface for Trezor hardware wallet.

170 lines 6.86 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getRelease = exports.getReleaseInfo = exports.getFirmwareStatus = exports.getInfo = exports.getOnlineReleases = exports.getReleases = exports.parseFirmwareReleases = void 0; const device_utils_1 = require("@trezor/device-utils"); const utils_1 = require("@trezor/utils"); const assets_1 = require("../utils/assets"); const firmwareUtils_1 = require("../utils/firmwareUtils"); const releases = Object.values(device_utils_1.DeviceModelInternal).reduce((acc, key) => ({ ...acc, [key]: [] }), {}); const bundledReleases = {}; const parseFirmwareReleases = (modelReleases, deviceModel) => { const [latestRelease] = modelReleases; bundledReleases[deviceModel] = latestRelease; modelReleases.forEach(release => { releases[deviceModel]?.push({ ...release, }); }); }; exports.parseFirmwareReleases = parseFirmwareReleases; const getReleases = (deviceModel) => releases[deviceModel] || []; exports.getReleases = getReleases; const getOnlineReleases = async (internalModel) => { const url = `https://data.trezor.io/firmware/${internalModel.toLowerCase()}/releases.json`; const response = await (0, assets_1.httpRequest)(url, 'json', { signal: AbortSignal.timeout(10000), skipLocalForceDownload: true, }); if ((0, firmwareUtils_1.isValidReleases)(response)) { return response; } return []; }; exports.getOnlineReleases = getOnlineReleases; const getChangelog = (releases2, features) => { if (features.bootloader_mode) { if (features.firmware_present && features.major_version === 1) { return null; } if (features.firmware_present && features.major_version === 2) { return releases2.filter(r => utils_1.versionUtils.isNewer(r.version, [ features.fw_major, features.fw_minor, features.fw_patch, ])); } return releases2; } return releases2.filter(r => utils_1.versionUtils.isNewer(r.version, [ features.major_version, features.minor_version, features.patch_version, ])); }; const isNewer = (release, features) => { if (features.major_version === 1 && features.bootloader_mode) { return null; } return utils_1.versionUtils.isNewer(release.version, [ features.major_version, features.minor_version, features.patch_version, ]); }; const isRequired = (changelog) => { if (!changelog || !changelog.length) return null; return changelog.some(item => item.required); }; const isEqual = (release, latest) => utils_1.versionUtils.isEqual(release.version, latest.version); const getT1BootloaderVersion = (releases2, features) => { const { bootloader_mode, major_version, minor_version, patch_version } = features; const versionArray = [major_version, minor_version, patch_version]; if (bootloader_mode) { return versionArray; } const release = releases2.find(({ version }) => utils_1.versionUtils.isEqual(version, versionArray)); return release?.bootloader_version || [1, 0, 0]; }; const getIntermediaryVersion = (releases2, features, offerLatest) => { if (features.major_version !== 1 || offerLatest) { return; } const bootloaderVersion = getT1BootloaderVersion(releases2, features); if (utils_1.versionUtils.isNewerOrEqual(bootloaderVersion, [1, 12, 0])) { return 3; } if (utils_1.versionUtils.isNewerOrEqual(bootloaderVersion, [1, 8, 0])) { return 2; } return 1; }; const getSafeReleases = ({ features, releases }) => { const { bootloader_mode, major_version, minor_version, patch_version, fw_major, fw_minor, fw_patch, } = features; const firmwareVersion = [major_version, minor_version, patch_version]; if (!utils_1.versionUtils.isVersionArray(firmwareVersion)) { return []; } if (major_version === 2 && bootloader_mode) { const fwVersion = [fw_major, fw_minor, fw_patch]; if (utils_1.versionUtils.isVersionArray(fwVersion)) { return (0, firmwareUtils_1.filterSafeListByFirmware)(releases, fwVersion); } return (0, firmwareUtils_1.filterSafeListByBootloader)(releases, firmwareVersion); } if (major_version === 1 && bootloader_mode) { return (0, firmwareUtils_1.filterSafeListByBootloader)(releases, firmwareVersion); } return (0, firmwareUtils_1.filterSafeListByFirmware)(releases, firmwareVersion); }; const getInfo = ({ features, releases }) => { if (!Array.isArray(releases) || releases.length < 1) { return null; } if (!(0, firmwareUtils_1.isStrictFeatures)(features)) { throw new Error('Features of unexpected shape provided.'); } if (!(0, firmwareUtils_1.isValidReleases)(releases)) { throw new Error(`Release object in unexpected shape.`); } const latest = releases[0]; const releasesSafe = getSafeReleases({ features, releases }); if (!releasesSafe.length) { return null; } const releasesParsed = features.major_version === 1 ? releases : releasesSafe; const changelog = getChangelog(releasesParsed, features); const release = releasesParsed[0]; const prevRelease = releasesParsed[1]; const intermediaryVersion = getIntermediaryVersion(releases, features, isEqual(releasesSafe[0], latest)); const isNewerResult = isNewer(latest, features); return { changelog, release, isRequired: isRequired(changelog), isNewer: isNewerResult, intermediaryVersion, translations: isNewerResult ? prevRelease?.translations : release?.translations, }; }; exports.getInfo = getInfo; const getFirmwareStatus = (features) => { if (features.firmware_present === false) { return 'none'; } if (features.major_version === 1 && features.bootloader_mode) { return 'unknown'; } const info = (0, exports.getInfo)({ features, releases: (0, exports.getReleases)(features?.internal_model), }); if (!info) return 'custom'; if (info.isRequired) return 'required'; if (info.isNewer) return 'outdated'; return 'valid'; }; exports.getFirmwareStatus = getFirmwareStatus; const getReleaseInfo = (features) => (0, exports.getInfo)({ features, releases: (0, exports.getReleases)(features?.internal_model), }); exports.getReleaseInfo = getReleaseInfo; const getRelease = (internalModel, firmwareVersion) => (0, exports.getReleases)(internalModel).find(r => firmwareVersion && utils_1.versionUtils.isVersionArray(firmwareVersion) && utils_1.versionUtils.isEqual(r.version, firmwareVersion)); exports.getRelease = getRelease; //# sourceMappingURL=firmwareInfo.js.map