Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/connect-examples/electron-example/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "hardware-example",
"productName": "HardwareExample",
"executableName": "onekey-hardware-example",
"version": "1.1.20",
"version": "1.1.21-alpha.1",
"author": "OneKey",
"description": "End-to-end encrypted workspaces for teams",
"main": "dist/index.js",
Expand All @@ -22,7 +22,7 @@
"ts:check": "yarn tsc --noEmit"
},
"dependencies": {
"@onekeyfe/hd-transport-electron": "1.1.20",
"@onekeyfe/hd-transport-electron": "1.1.21-alpha.1",
"@stoprocent/noble": "2.3.4",
"debug": "4.3.4",
"electron-is-dev": "^3.0.1",
Expand Down
10 changes: 5 additions & 5 deletions packages/connect-examples/expo-example/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "expo-example",
"version": "1.1.20",
"version": "1.1.21-alpha.1",
"scripts": {
"start": "cross-env CONNECT_SRC=https://localhost:8087/ yarn expo start --dev-client",
"android": "yarn expo run:android",
Expand All @@ -19,10 +19,10 @@
"@noble/ed25519": "^2.1.0",
"@noble/hashes": "^1.3.3",
"@noble/secp256k1": "^1.7.1",
"@onekeyfe/hd-ble-sdk": "1.1.20",
"@onekeyfe/hd-common-connect-sdk": "1.1.20",
"@onekeyfe/hd-core": "1.1.20",
"@onekeyfe/hd-web-sdk": "1.1.20",
"@onekeyfe/hd-ble-sdk": "1.1.21-alpha.1",
"@onekeyfe/hd-common-connect-sdk": "1.1.21-alpha.1",
"@onekeyfe/hd-core": "1.1.21-alpha.1",
"@onekeyfe/hd-web-sdk": "1.1.21-alpha.1",
"@onekeyfe/react-native-ble-utils": "^0.1.3",
"@polkadot/util-crypto": "13.1.1",
"@react-native-async-storage/async-storage": "1.21.0",
Expand Down
8 changes: 4 additions & 4 deletions packages/connect-examples/expo-playground/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "onekey-hardware-playground",
"version": "1.1.20",
"version": "1.1.21-alpha.1",
"private": true,
"sideEffects": [
"app/utils/shim.js",
Expand All @@ -17,9 +17,9 @@
},
"dependencies": {
"@noble/hashes": "^1.8.0",
"@onekeyfe/hd-common-connect-sdk": "1.1.20",
"@onekeyfe/hd-core": "1.1.20",
"@onekeyfe/hd-shared": "1.1.20",
"@onekeyfe/hd-common-connect-sdk": "1.1.21-alpha.1",
"@onekeyfe/hd-core": "1.1.21-alpha.1",
"@onekeyfe/hd-shared": "1.1.21-alpha.1",
"@radix-ui/react-checkbox": "^1.3.2",
"@radix-ui/react-dialog": "^1.1.14",
"@radix-ui/react-dropdown-menu": "^2.1.15",
Expand Down

Large diffs are not rendered by default.

5,458 changes: 2,729 additions & 2,729 deletions packages/connect-examples/native-ios-example/web/web_dist/index.e70e0048.js

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions packages/core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@onekeyfe/hd-core",
"version": "1.1.20",
"version": "1.1.21-alpha.1",
"description": "Core processes and APIs for communicating with OneKey hardware devices.",
"author": "OneKey",
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
Expand All @@ -25,8 +25,8 @@
"url": "https://github.com/OneKeyHQ/hardware-js-sdk/issues"
},
"dependencies": {
"@onekeyfe/hd-shared": "1.1.20",
"@onekeyfe/hd-transport": "1.1.20",
"@onekeyfe/hd-shared": "1.1.21-alpha.1",
"@onekeyfe/hd-transport": "1.1.21-alpha.1",
"axios": "1.12.2",
"bignumber.js": "^9.0.2",
"bytebuffer": "^5.0.1",
Expand Down
64 changes: 51 additions & 13 deletions packages/core/src/api/FirmwareUpdateV3.ts
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
}

this.postTipMessage(FirmwareUpdateTipMessage.StartTransferData);
// 处理资源文件
// Process resource zip contents
if (resourceBinary) {
const file = await JSZip.loadAsync(resourceBinary);
const files = Object.entries(file.files);
Expand Down Expand Up @@ -358,19 +358,21 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
const bootloaderVersion = getDeviceBootloaderVersion(features).join('.');
const bleVersion = getDeviceBLEFirmwareVersion(features).join('.');
const firmwareVersion = getDeviceFirmwareVersion(features).join('.');
this.postTipMessage(FirmwareUpdateTipMessage.FirmwareUpdateCompleted);
DevicePool.resetState();
return {
bootloaderVersion,
bleVersion,
firmwareVersion,
};
// Treat update as complete once firmware version becomes non-zero
if (firmwareVersion !== '0.0.0') {
this.postTipMessage(FirmwareUpdateTipMessage.FirmwareUpdateCompleted);
DevicePool.resetState();
return {
bootloaderVersion,
bleVersion,
firmwareVersion,
};
}
// Still in update mode; continue polling (e.g., iOS may return firmwareVersion 0.0.0 during switches)
await wait(1000);
} catch (error) {
// Hardware install firmware progress message
if (error.message && error.message.includes('Update mode')) {
const updateParts = error.message.split('Update mode ');
const progressValue = updateParts[1] ?? '0';
const progress = parseInt(progressValue, 10) || 0;
const progress = this.extractUpdateModeProgress(error);
if (progress !== null) {
this.postProgressMessage(progress, 'installingFirmware');
await wait(1000);
} else {
Expand All @@ -385,12 +387,48 @@ export default class FirmwareUpdateV3 extends FirmwareUpdateBaseMethod<FirmwareU
? 3 * 60 * 1000 // 3 minutes for BLE reconnect
: 60 * 1000; // 1 minute for normal reconnect

await this.ensureWebUsbBootloaderReauthPrompt();
await this.waitForDeviceReconnect(reconnectTimeout);
}
}
}
}

/**
* Parse “Update mode XX” progress value from device errors to avoid hardcoded message.includes.
*/
private extractUpdateModeProgress(error: unknown): number | null {
const message = this.normalizeErrorMessage(error);
if (!message) {
return null;
}
const match = message.match(/Update mode\s*(\d+)/i);
if (!match) {
return null;
}
const progress = parseInt(match[1], 10);
return Number.isNaN(progress) ? null : progress;
}

private normalizeErrorMessage(error: unknown): string {
if (!error) {
return '';
}
if (typeof error === 'string') {
return error;
}
if (typeof error === 'object') {
const { message } = error as { message?: unknown };
if (typeof message === 'string') {
return message;
}
if (message !== undefined && message !== null) {
return String(message);
}
}
return '';
}

/**
* @description Reconnect device - While update with bootloader, it will reconnect device
* @param {number} timeout - The timeout for the reconnection
Expand Down
31 changes: 28 additions & 3 deletions packages/core/src/api/firmware/FirmwareUpdateBaseMethod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ const isDeviceDisconnectedError = (error: unknown) => {
export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
checkPromise: Deferred<any> | null = null;

protected hasPromptedWebUsbBootloaderReauth = false;

init(): void {}

run(): Promise<any> {
Expand Down Expand Up @@ -153,7 +155,7 @@ export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
}
} catch (e) {
Log.log(
'FirmwareUpdateBaseMethod [checkDeviceToBootloader] promptDeviceInBootloaderForWebDevice failed: ',
'FirmwareUpdateBaseMethod [checkDeviceToBootloader] _promptDeviceInBootloaderForWebDevice failed: ',
e
);
this.checkPromise?.reject(e);
Expand Down Expand Up @@ -193,6 +195,29 @@ export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
}, 30000);
}

/**
* Only prompt WebUSB in bootloader scenarios that require re-authorization
* (e.g., switching between BTC-only and general firmware is treated as a new device).
*/
protected async ensureWebUsbBootloaderReauthPrompt() {
if (
this.hasPromptedWebUsbBootloaderReauth ||
!DataManager.isBrowserWebUsb(DataManager.getSettings('env')) ||
this.device.listenerCount(DEVICE.SELECT_DEVICE_IN_BOOTLOADER_FOR_WEB_DEVICE) === 0
) {
return;
}

this.hasPromptedWebUsbBootloaderReauth = true;
this.postTipMessage(FirmwareUpdateTipMessage.SelectDeviceInBootloaderForWebDevice);

try {
await this._promptDeviceInBootloaderForWebDevice();
} catch (error) {
Log.log('WebUSB re-authorization failed: ', error);
}
}

private async _checkDeviceInBootloaderMode(
connectId: string | undefined,
intervalTimer?: ReturnType<typeof setInterval>,
Expand Down Expand Up @@ -430,8 +455,8 @@ export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
}

/**
* @description 设备重启(Bootloader 侧可用)
* @param rebootType 重启类型,参考 RebootType 枚举
* @description Device reboot (available in bootloader mode)
* @param rebootType Reboot type, see the RebootType enum
*/
async reboot(rebootType: RebootType) {
const typedCall = this.device.getCommands().typedCall.bind(this.device.getCommands());
Expand Down
8 changes: 4 additions & 4 deletions packages/core/src/data-manager/DataManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ const Log = getLogger(LoggerNames.Core);
export const FIRMWARE_FIELDS = [
'firmware',
'firmware-v2',
'firmware-v7',
'firmware-btc-v7',
'firmware-v8',
'firmware-btc-v8',
] as const;

export type IFirmwareField = (typeof FIRMWARE_FIELDS)[number];
Expand All @@ -45,8 +45,8 @@ export type MessageVersion = 'latest' | 'v1';
const FIRMWARE_FIELD_TYPE_MAP: Readonly<Record<IFirmwareField, EFirmwareType>> = {
firmware: EFirmwareType.Universal,
'firmware-v2': EFirmwareType.Universal,
'firmware-v7': EFirmwareType.Universal,
'firmware-btc-v7': EFirmwareType.BitcoinOnly,
'firmware-v8': EFirmwareType.Universal,
'firmware-btc-v8': EFirmwareType.BitcoinOnly,
} as const;

function getFirmwareTypeFromField(firmwareField: IFirmwareField): EFirmwareType {
Expand Down
8 changes: 4 additions & 4 deletions packages/core/src/types/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,9 @@ type IKnownDevice = Exclude<IDeviceType, 'unknown'>;
* // {
* // firmware: IFirmwareReleaseInfo[];
* // 'firmware-v2'?: IFirmwareReleaseInfo[];
* // 'firmware-v7'?: IFirmwareReleaseInfo[];
* // 'firmware-v8'?: IFirmwareReleaseInfo[];
* // 'firmware-v8'?: IFirmwareReleaseInfo[]; // New
* // 'firmware-btc-v7'?: IFirmwareReleaseInfo[];
* // 'firmware-btc-v8'?: IFirmwareReleaseInfo[];
* // 'firmware-btc-v8'?: IFirmwareReleaseInfo[]; // New
* // ble: IBLEFirmwareReleaseInfo[];
* // }
Expand All @@ -112,9 +112,9 @@ export type DeviceTypeMap = {
/** Firmware v2 (Touch/Pro specific) */
'firmware-v2'?: IFirmwareReleaseInfo[];
/** Universal firmware v7 */
'firmware-v7'?: IFirmwareReleaseInfo[];
'firmware-v8'?: IFirmwareReleaseInfo[];
/** Bitcoin-only firmware v7 */
'firmware-btc-v7'?: IFirmwareReleaseInfo[];
'firmware-btc-v8'?: IFirmwareReleaseInfo[];
// Future firmware versions should be added here as optional fields:
// 'firmware-v8'?: IFirmwareReleaseInfo[];
// 'firmware-btc-v8'?: IFirmwareReleaseInfo[];
Expand Down
12 changes: 6 additions & 6 deletions packages/core/src/utils/deviceFeaturesUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -235,9 +235,9 @@ export const supportModifyHomescreen = (features?: Features): SupportFeatureType

export const getLatestFirmwareField = (firmwareType?: EFirmwareType): IFirmwareField => {
if (firmwareType === 'bitcoinonly') {
return `firmware-btc-v7`;
return `firmware-btc-v8`;
}
return `firmware-v7`;
return `firmware-v8`;
};

/**
Expand Down Expand Up @@ -300,25 +300,25 @@ export const getFirmwareUpdateFieldArray = (
deviceType === 'mini' ||
deviceType === 'classicpure'
) {
return ['firmware-v7'];
return ['firmware-v8'];
}

if (deviceType === 'touch') {
const currentVersion = getDeviceFirmwareVersion(features).join('.');
if (semver.gt(currentVersion, '4.0.0')) {
return ['firmware-v7', 'firmware'];
return ['firmware-v8', 'firmware'];
}
if (semver.gte(currentVersion, '4.0.0')) {
return ['firmware-v2', 'firmware'];
}
if (!currentVersion || semver.lt(currentVersion, '3.0.0')) {
return ['firmware-v7', 'firmware-v2', 'firmware'];
return ['firmware-v8', 'firmware-v2', 'firmware'];
}
return ['firmware'];
}

if (deviceType === 'pro') {
return ['firmware-v7'];
return ['firmware-v8'];
}

return ['firmware'];
Expand Down
8 changes: 4 additions & 4 deletions packages/hd-ble-sdk/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@onekeyfe/hd-ble-sdk",
"version": "1.1.20",
"version": "1.1.21-alpha.1",
"author": "OneKey",
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
"license": "ISC",
Expand All @@ -20,8 +20,8 @@
"lint:fix": "eslint . --fix"
},
"dependencies": {
"@onekeyfe/hd-core": "1.1.20",
"@onekeyfe/hd-shared": "1.1.20",
"@onekeyfe/hd-transport-react-native": "1.1.20"
"@onekeyfe/hd-core": "1.1.21-alpha.1",
"@onekeyfe/hd-shared": "1.1.21-alpha.1",
"@onekeyfe/hd-transport-react-native": "1.1.21-alpha.1"
}
}
14 changes: 7 additions & 7 deletions packages/hd-common-connect-sdk/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@onekeyfe/hd-common-connect-sdk",
"version": "1.1.20",
"version": "1.1.21-alpha.1",
"author": "OneKey",
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
"license": "ISC",
Expand All @@ -20,11 +20,11 @@
"lint:fix": "eslint . --fix"
},
"dependencies": {
"@onekeyfe/hd-core": "1.1.20",
"@onekeyfe/hd-shared": "1.1.20",
"@onekeyfe/hd-transport-emulator": "1.1.20",
"@onekeyfe/hd-transport-http": "1.1.20",
"@onekeyfe/hd-transport-lowlevel": "1.1.20",
"@onekeyfe/hd-transport-web-device": "1.1.20"
"@onekeyfe/hd-core": "1.1.21-alpha.1",
"@onekeyfe/hd-shared": "1.1.21-alpha.1",
"@onekeyfe/hd-transport-emulator": "1.1.21-alpha.1",
"@onekeyfe/hd-transport-http": "1.1.21-alpha.1",
"@onekeyfe/hd-transport-lowlevel": "1.1.21-alpha.1",
"@onekeyfe/hd-transport-web-device": "1.1.21-alpha.1"
}
}
8 changes: 4 additions & 4 deletions packages/hd-transport-electron/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@onekeyfe/hd-transport-electron",
"version": "1.1.20",
"version": "1.1.21-alpha.1",
"author": "OneKey",
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
"license": "MIT",
Expand All @@ -25,9 +25,9 @@
"electron-log": ">=4.0.0"
},
"dependencies": {
"@onekeyfe/hd-core": "1.1.20",
"@onekeyfe/hd-shared": "1.1.20",
"@onekeyfe/hd-transport": "1.1.20",
"@onekeyfe/hd-core": "1.1.21-alpha.1",
"@onekeyfe/hd-shared": "1.1.21-alpha.1",
"@onekeyfe/hd-transport": "1.1.21-alpha.1",
"@stoprocent/noble": "2.3.4",
"p-retry": "^4.6.2"
},
Expand Down
Loading
Loading