@onekeyfe/hd-core 1.2.0-alpha.2 → 1.2.0-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__tests__/AllNetworkGetAddressBase.tracing.test.ts +75 -0
- package/__tests__/DeviceCommands.test.ts +285 -0
- package/__tests__/DeviceEventRegistration.test.ts +43 -0
- package/__tests__/connectSettings.test.ts +19 -0
- package/__tests__/core-dispose.test.ts +34 -0
- package/__tests__/core-error-output.test.ts +39 -0
- package/__tests__/device-features-state.test.ts +78 -0
- package/__tests__/device-identity.test.ts +30 -0
- package/__tests__/device-lifecycle-events.test.ts +117 -0
- package/__tests__/device-pool-state.test.ts +132 -0
- package/__tests__/device-settings.test.ts +391 -0
- package/__tests__/device-state-contract.test.ts +27 -0
- package/__tests__/device-state-events.test.ts +162 -0
- package/__tests__/device-state-mapper.test.ts +241 -0
- package/__tests__/device-state-projector.test.ts +94 -0
- package/__tests__/device-state-store.test.ts +82 -0
- package/__tests__/device-utils.test.ts +106 -0
- package/__tests__/device-wallet-session-store.test.ts +213 -0
- package/__tests__/deviceFeaturesUtils.test.ts +39 -0
- package/__tests__/deviceSettings.test.ts +103 -0
- package/__tests__/evmLedgerLegacySafety.test.ts +10 -6
- package/__tests__/evmSignTypedData.test.ts +80 -0
- package/__tests__/filesystemValidation.test.ts +53 -0
- package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +402 -0
- package/__tests__/get-device-state.test.ts +410 -0
- package/__tests__/homescreen.test.ts +24 -0
- package/__tests__/kaspaSignTransaction.test.ts +591 -0
- package/__tests__/logBlockEvent.test.ts +26 -0
- package/__tests__/networkUtils.test.ts +386 -0
- package/__tests__/open-wallet-session-error-response.test.ts +43 -0
- package/__tests__/open-wallet-session.test.ts +559 -0
- package/__tests__/preInitialize.test.ts +33 -0
- package/__tests__/pro2Wallpaper.test.ts +50 -0
- package/__tests__/protocol-v2-bootloader-mode.test.ts +37 -0
- package/__tests__/protocol-v2-firmware-targets.test.ts +19 -0
- package/__tests__/protocol-v2.test.ts +3954 -1191
- package/__tests__/protocolV2FileWrite.test.ts +92 -0
- package/__tests__/protocolV2UiInteraction.test.ts +266 -0
- package/__tests__/public-device-state-api.test.ts +257 -0
- package/__tests__/public-pro2-api-boundary.test.ts +110 -0
- package/__tests__/refresh-device-state.test.ts +101 -0
- package/__tests__/request-context-logging.test.ts +16 -0
- package/__tests__/search-devices.test.ts +136 -0
- package/dist/api/BaseMethod.d.ts +8 -0
- package/dist/api/BaseMethod.d.ts.map +1 -1
- package/dist/api/CheckBootloaderRelease.d.ts.map +1 -1
- package/dist/api/CheckFirmwareRelease.d.ts.map +1 -1
- package/dist/api/ClearSessionCache.d.ts +9 -0
- package/dist/api/ClearSessionCache.d.ts.map +1 -0
- package/dist/api/DirList.d.ts.map +1 -1
- package/dist/api/FileRead.d.ts.map +1 -1
- package/dist/api/FileWrite.d.ts +1 -0
- package/dist/api/FileWrite.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV2.d.ts +2 -2
- package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV4.d.ts +25 -5
- package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
- package/dist/api/GetDeviceState.d.ts +7 -0
- package/dist/api/GetDeviceState.d.ts.map +1 -0
- package/dist/api/GetFeatures.d.ts +1 -1
- package/dist/api/GetFeatures.d.ts.map +1 -1
- package/dist/api/GetOnekeyFeatures.d.ts.map +1 -1
- package/dist/api/GetPassphraseState.d.ts +1 -6
- package/dist/api/GetPassphraseState.d.ts.map +1 -1
- package/dist/api/OpenWalletSession.d.ts +14 -0
- package/dist/api/OpenWalletSession.d.ts.map +1 -0
- package/dist/api/PathInfo.d.ts.map +1 -1
- package/dist/api/PromptWebDeviceAccess.d.ts.map +1 -1
- package/dist/api/SearchDevices.d.ts +3 -0
- package/dist/api/SearchDevices.d.ts.map +1 -1
- package/dist/api/UploadPortfolio.d.ts +17 -0
- package/dist/api/UploadPortfolio.d.ts.map +1 -0
- package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
- package/dist/api/device/DeviceCancel.d.ts.map +1 -1
- package/dist/api/device/DeviceChangePin.d.ts.map +1 -1
- package/dist/api/device/DeviceFullyUploadResource.d.ts +1 -2
- package/dist/api/device/DeviceFullyUploadResource.d.ts.map +1 -1
- package/dist/api/device/DeviceLock.d.ts.map +1 -1
- package/dist/api/device/DeviceRebootToBoardloader.d.ts.map +1 -1
- package/dist/api/device/DeviceRebootToBootloader.d.ts.map +1 -1
- package/dist/api/device/DeviceSettings.d.ts.map +1 -1
- package/dist/api/device/DeviceUnlock.d.ts +1 -1
- package/dist/api/device/DeviceUnlock.d.ts.map +1 -1
- package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
- package/dist/api/device/DeviceWipe.d.ts.map +1 -1
- package/dist/api/evm/EVMSignTypedData.d.ts.map +1 -1
- package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +1 -0
- package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
- package/dist/api/firmware/getBinary.d.ts +11 -3
- package/dist/api/firmware/getBinary.d.ts.map +1 -1
- package/dist/api/firmware/progressThrottle.d.ts +3 -0
- package/dist/api/firmware/progressThrottle.d.ts.map +1 -0
- package/dist/api/helpers/filesystemValidation.d.ts +3 -0
- package/dist/api/helpers/filesystemValidation.d.ts.map +1 -1
- package/dist/api/helpers/paramsValidator.d.ts +1 -0
- package/dist/api/helpers/paramsValidator.d.ts.map +1 -1
- package/dist/api/helpers/protocolV2FileWrite.d.ts +33 -0
- package/dist/api/helpers/protocolV2FileWrite.d.ts.map +1 -0
- package/dist/api/index.d.ts +12 -19
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/kaspa/KaspaSignTransaction.d.ts +5 -1
- package/dist/api/kaspa/KaspaSignTransaction.d.ts.map +1 -1
- package/dist/api/kaspa/helpers/TransferSerialize.d.ts.map +1 -1
- package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts +6 -0
- package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts.map +1 -0
- package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts +7 -0
- package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts.map +1 -0
- package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts +1 -1
- package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts.map +1 -1
- package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts +3 -2
- package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts.map +1 -1
- package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts +1 -1
- package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts.map +1 -1
- package/dist/api/protocol-v2/DeviceInfoGet.d.ts +28 -0
- package/dist/api/protocol-v2/DeviceInfoGet.d.ts.map +1 -0
- package/dist/api/protocol-v2/DeviceReboot.d.ts.map +1 -1
- package/dist/api/protocol-v2/DeviceStatusGet.d.ts +6 -0
- package/dist/api/protocol-v2/DeviceStatusGet.d.ts.map +1 -0
- package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts +26 -0
- package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts.map +1 -0
- package/dist/api/protocol-v2/FilesystemFormat.d.ts.map +1 -1
- package/dist/api/protocol-v2/{FilesystemFixPermission.d.ts → FilesystemPermissionFix.d.ts} +2 -2
- package/dist/api/protocol-v2/FilesystemPermissionFix.d.ts.map +1 -0
- package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts +6 -0
- package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -0
- package/dist/api/protocol-v2/helpers.d.ts +27 -19
- package/dist/api/protocol-v2/helpers.d.ts.map +1 -1
- package/dist/api/ton/TonSignData.d.ts +1 -5
- package/dist/api/ton/TonSignData.d.ts.map +1 -1
- package/dist/api/utils.d.ts +2 -1
- package/dist/api/utils.d.ts.map +1 -1
- package/dist/constants/index.d.ts +2 -1
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/core/RequestQueue.d.ts.map +1 -1
- package/dist/core/deviceEventRegistration.d.ts +11 -0
- package/dist/core/deviceEventRegistration.d.ts.map +1 -0
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/data-manager/DataManager.d.ts +1 -1
- package/dist/data-manager/DataManager.d.ts.map +1 -1
- package/dist/data-manager/connectSettings.d.ts.map +1 -1
- package/dist/device/Device.d.ts +35 -11
- package/dist/device/Device.d.ts.map +1 -1
- package/dist/device/DeviceCommands.d.ts +8 -6
- package/dist/device/DeviceCommands.d.ts.map +1 -1
- package/dist/device/DeviceFeaturesState.d.ts +3 -0
- package/dist/device/DeviceFeaturesState.d.ts.map +1 -0
- package/dist/device/DevicePool.d.ts +4 -2
- package/dist/device/DevicePool.d.ts.map +1 -1
- package/dist/device/DeviceStateMapper.d.ts +13 -0
- package/dist/device/DeviceStateMapper.d.ts.map +1 -0
- package/dist/device/DeviceStateProjector.d.ts +7 -0
- package/dist/device/DeviceStateProjector.d.ts.map +1 -0
- package/dist/device/DeviceStateStore.d.ts +21 -0
- package/dist/device/DeviceStateStore.d.ts.map +1 -0
- package/dist/device/DeviceWalletSessionStore.d.ts +20 -0
- package/dist/device/DeviceWalletSessionStore.d.ts.map +1 -0
- package/dist/device/cloneDeviceState.d.ts +2 -0
- package/dist/device/cloneDeviceState.d.ts.map +1 -0
- package/dist/device/deviceIdentity.d.ts +5 -0
- package/dist/device/deviceIdentity.d.ts.map +1 -0
- package/dist/deviceProfile/buildDeviceFeatures.d.ts +9 -3
- package/dist/deviceProfile/buildDeviceFeatures.d.ts.map +1 -1
- package/dist/deviceProfile/index.d.ts +0 -1
- package/dist/deviceProfile/index.d.ts.map +1 -1
- package/dist/events/device.d.ts +11 -2
- package/dist/events/device.d.ts.map +1 -1
- package/dist/events/logBlockEvent.d.ts.map +1 -1
- package/dist/events/ui-request.d.ts +18 -2
- package/dist/events/ui-request.d.ts.map +1 -1
- package/dist/index.d.ts +1361 -609
- package/dist/index.js +5898 -2860
- package/dist/inject.d.ts.map +1 -1
- package/dist/protocols/protocol-v2/deviceSession.d.ts +7 -0
- package/dist/protocols/protocol-v2/deviceSession.d.ts.map +1 -0
- package/dist/protocols/protocol-v2/features.d.ts +23 -28
- package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
- package/dist/protocols/protocol-v2/firmware.d.ts +11 -9
- package/dist/protocols/protocol-v2/firmware.d.ts.map +1 -1
- package/dist/protocols/protocol-v2/index.d.ts +3 -2
- package/dist/protocols/protocol-v2/index.d.ts.map +1 -1
- package/dist/protocols/protocol-v2/lockedError.d.ts +2 -0
- package/dist/protocols/protocol-v2/lockedError.d.ts.map +1 -0
- package/dist/protocols/protocol-v2/settingsUnlockPolicy.d.ts +16 -0
- package/dist/protocols/protocol-v2/settingsUnlockPolicy.d.ts.map +1 -0
- package/dist/protocols/protocol-v2/uiInteraction.d.ts +39 -0
- package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -0
- package/dist/protocols/protocol-v2/unlockRetry.d.ts +11 -0
- package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +1 -0
- package/dist/protocols/protocol-v2/walletSession.d.ts +19 -0
- package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -0
- package/dist/types/api/checkAllFirmwareRelease.d.ts +1 -2
- package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
- package/dist/types/api/deviceSettings.d.ts +11 -2
- package/dist/types/api/deviceSettings.d.ts.map +1 -1
- package/dist/types/api/deviceUnlock.d.ts +2 -2
- package/dist/types/api/deviceUnlock.d.ts.map +1 -1
- package/dist/types/api/firmwareUpdate.d.ts +6 -6
- package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
- package/dist/types/api/getDeviceState.d.ts +12 -0
- package/dist/types/api/getDeviceState.d.ts.map +1 -0
- package/dist/types/api/getFeatures.d.ts.map +1 -1
- package/dist/types/api/getOnekeyFeatures.d.ts.map +1 -1
- package/dist/types/api/getPassphraseState.d.ts +2 -10
- package/dist/types/api/getPassphraseState.d.ts.map +1 -1
- package/dist/types/api/index.d.ts +22 -25
- package/dist/types/api/index.d.ts.map +1 -1
- package/dist/types/api/kaspaSignTransaction.d.ts +27 -2
- package/dist/types/api/kaspaSignTransaction.d.ts.map +1 -1
- package/dist/types/api/openWalletSession.d.ts +41 -0
- package/dist/types/api/openWalletSession.d.ts.map +1 -0
- package/dist/types/api/protocolV2.d.ts +23 -28
- package/dist/types/api/protocolV2.d.ts.map +1 -1
- package/dist/types/api/sessionCache.d.ts +10 -0
- package/dist/types/api/sessionCache.d.ts.map +1 -0
- package/dist/types/device.d.ts +121 -5
- package/dist/types/device.d.ts.map +1 -1
- package/dist/types/params.d.ts +1 -0
- package/dist/types/params.d.ts.map +1 -1
- package/dist/types/settings.d.ts +21 -1
- package/dist/types/settings.d.ts.map +1 -1
- package/dist/utils/assets.d.ts +2 -1
- package/dist/utils/assets.d.ts.map +1 -1
- package/dist/utils/deviceFeaturesCompat.d.ts +13 -0
- package/dist/utils/deviceFeaturesCompat.d.ts.map +1 -0
- package/dist/utils/deviceFeaturesUtils.d.ts +13 -3
- package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
- package/dist/utils/deviceInfoUtils.d.ts +9 -8
- package/dist/utils/deviceInfoUtils.d.ts.map +1 -1
- package/dist/utils/deviceSettings.d.ts +38 -7
- package/dist/utils/deviceSettings.d.ts.map +1 -1
- package/dist/utils/deviceVersionUtils.d.ts +6 -5
- package/dist/utils/deviceVersionUtils.d.ts.map +1 -1
- package/dist/utils/homescreen.d.ts.map +1 -1
- package/dist/utils/index.d.ts +5 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/networkUtils.d.ts +9 -1
- package/dist/utils/networkUtils.d.ts.map +1 -1
- package/dist/utils/patch.d.ts +1 -1
- package/dist/utils/patch.d.ts.map +1 -1
- package/dist/utils/pro2Wallpaper.d.ts +12 -0
- package/dist/utils/pro2Wallpaper.d.ts.map +1 -0
- package/dist/utils/tracing.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/api/BaseMethod.ts +36 -9
- package/src/api/CheckBootloaderRelease.ts +1 -2
- package/src/api/CheckFirmwareRelease.ts +1 -2
- package/src/api/ClearSessionCache.ts +28 -0
- package/src/api/DirList.ts +5 -3
- package/src/api/DirMake.ts +3 -3
- package/src/api/DirRemove.ts +3 -3
- package/src/api/FileDelete.ts +3 -3
- package/src/api/FileRead.ts +23 -7
- package/src/api/FileWrite.ts +23 -168
- package/src/api/FirmwareUpdate.ts +4 -4
- package/src/api/FirmwareUpdateV2.ts +133 -45
- package/src/api/FirmwareUpdateV3.ts +3 -5
- package/src/api/FirmwareUpdateV4.ts +1138 -357
- package/src/api/GetDeviceState.ts +55 -0
- package/src/api/GetFeatures.ts +8 -3
- package/src/api/GetOnekeyFeatures.ts +3 -72
- package/src/api/GetPassphraseState.ts +11 -18
- package/src/api/OpenWalletSession.ts +221 -0
- package/src/api/PathInfo.ts +5 -3
- package/src/api/PromptWebDeviceAccess.ts +2 -3
- package/src/api/SearchDevices.ts +29 -4
- package/src/api/UploadPortfolio.ts +40 -0
- package/src/api/alephium/AlephiumSignTransaction.ts +2 -2
- package/src/api/allnetwork/AllNetworkGetAddressBase.ts +4 -8
- package/src/api/benfen/BenfenGetAddress.ts +1 -1
- package/src/api/btc/BTCGetPublicKey.ts +1 -1
- package/src/api/cardano/CardanoSignMessage.ts +1 -1
- package/src/api/cardano/CardanoSignTransaction.ts +1 -1
- package/src/api/device/DeviceCancel.ts +1 -0
- package/src/api/device/DeviceChangePin.ts +24 -0
- package/src/api/device/DeviceFullyUploadResource.ts +4 -5
- package/src/api/device/DeviceLock.ts +1 -0
- package/src/api/device/DeviceRebootToBoardloader.ts +5 -4
- package/src/api/device/DeviceRebootToBootloader.ts +5 -4
- package/src/api/device/DeviceSettings.ts +183 -1
- package/src/api/device/DeviceUnlock.ts +11 -1
- package/src/api/device/DeviceUpdateBootloader.ts +1 -2
- package/src/api/device/DeviceWipe.ts +19 -0
- package/src/api/evm/EVMSignTypedData.ts +3 -5
- package/src/api/evm/legacyV1/getAddress.ts +2 -2
- package/src/api/evm/legacyV1/getPublicKey.ts +2 -2
- package/src/api/evm/legacyV1/signMessage.ts +2 -2
- package/src/api/evm/legacyV1/signTypedData.ts +2 -2
- package/src/api/evm/legacyV1/signTypedHash.ts +2 -2
- package/src/api/evm/legacyV1/verifyMessage.ts +2 -2
- package/src/api/firmware/FirmwareUpdateBaseMethod.ts +21 -7
- package/src/api/firmware/getBinary.ts +8 -3
- package/src/api/firmware/progressThrottle.ts +44 -0
- package/src/api/helpers/batchGetPublickeys.ts +2 -2
- package/src/api/helpers/filesystemValidation.ts +61 -0
- package/src/api/helpers/paramsValidator.ts +1 -1
- package/src/api/helpers/protocolV2FileWrite.ts +193 -0
- package/src/api/index.ts +14 -20
- package/src/api/kaspa/KaspaSignTransaction.ts +341 -22
- package/src/api/kaspa/helpers/TransferSerialize.ts +14 -0
- package/src/api/nervos/NervosSignTransaction.ts +2 -2
- package/src/api/nexa/NexaSignTransaction.ts +1 -1
- package/src/api/protocol-v2/{FactoryGetDeviceInfo.ts → DeviceFactoryInfoGet.ts} +4 -4
- package/src/api/protocol-v2/DeviceFactoryInfoSet.ts +32 -0
- package/src/api/protocol-v2/DeviceFirmwareUpdate.ts +7 -9
- package/src/api/protocol-v2/DeviceGetFirmwareUpdateStatus.ts +41 -6
- package/src/api/protocol-v2/DeviceGetOnboardingStatus.ts +6 -4
- package/src/api/protocol-v2/DeviceInfoGet.ts +145 -0
- package/src/api/protocol-v2/DeviceReboot.ts +5 -3
- package/src/api/protocol-v2/DeviceStatusGet.ts +16 -0
- package/src/api/protocol-v2/DeviceUploadWallpaper.ts +131 -0
- package/src/api/protocol-v2/FilesystemFormat.ts +5 -2
- package/src/api/protocol-v2/{FilesystemFixPermission.ts → FilesystemPermissionFix.ts} +3 -3
- package/src/api/protocol-v2/Ping.ts +1 -1
- package/src/api/protocol-v2/{GetProtoVersion.ts → ProtocolInfoRequest.ts} +3 -3
- package/src/api/protocol-v2/helpers.ts +58 -62
- package/src/api/ton/TonSignData.ts +1 -5
- package/src/api/utils.ts +7 -3
- package/src/constants/index.ts +7 -1
- package/src/core/RequestQueue.ts +1 -0
- package/src/core/deviceEventRegistration.ts +23 -0
- package/src/core/index.ts +140 -35
- package/src/data/messages/messages-protocol-v2.json +825 -709
- package/src/data/messages/messages.json +286 -1
- package/src/data-manager/DataManager.ts +13 -6
- package/src/data-manager/connectSettings.ts +4 -0
- package/src/device/Device.ts +480 -192
- package/src/device/DeviceCommands.ts +81 -25
- package/src/device/DeviceFeaturesState.ts +25 -0
- package/src/device/DevicePool.ts +67 -19
- package/src/device/DeviceStateMapper.ts +349 -0
- package/src/device/DeviceStateProjector.ts +95 -0
- package/src/device/DeviceStateStore.ts +201 -0
- package/src/device/DeviceWalletSessionStore.ts +105 -0
- package/src/device/cloneDeviceState.ts +39 -0
- package/src/device/deviceIdentity.ts +18 -0
- package/src/deviceProfile/buildDeviceFeatures.ts +235 -210
- package/src/deviceProfile/index.ts +0 -1
- package/src/events/device.ts +17 -1
- package/src/events/logBlockEvent.ts +8 -1
- package/src/events/ui-request.ts +24 -2
- package/src/inject.ts +23 -34
- package/src/protocols/protocol-v2/deviceSession.ts +24 -0
- package/src/protocols/protocol-v2/features.ts +68 -82
- package/src/protocols/protocol-v2/firmware.ts +12 -36
- package/src/protocols/protocol-v2/index.ts +3 -1
- package/src/protocols/protocol-v2/lockedError.ts +10 -0
- package/src/protocols/protocol-v2/settingsUnlockPolicy.ts +61 -0
- package/src/protocols/protocol-v2/uiInteraction.ts +210 -0
- package/src/protocols/protocol-v2/unlockRetry.ts +76 -0
- package/src/protocols/protocol-v2/walletSession.ts +107 -0
- package/src/types/api/checkAllFirmwareRelease.ts +1 -2
- package/src/types/api/deviceSettings.ts +26 -2
- package/src/types/api/deviceUnlock.ts +5 -2
- package/src/types/api/firmwareUpdate.ts +28 -20
- package/src/types/api/getDeviceState.ts +19 -0
- package/src/types/api/getFeatures.ts +3 -0
- package/src/types/api/getOnekeyFeatures.ts +3 -0
- package/src/types/api/getPassphraseState.ts +8 -11
- package/src/types/api/index.ts +30 -53
- package/src/types/api/kaspaSignTransaction.ts +40 -2
- package/src/types/api/openWalletSession.ts +64 -0
- package/src/types/api/protocolV2.ts +58 -55
- package/src/types/api/sessionCache.ts +14 -0
- package/src/types/device.ts +170 -4
- package/src/types/params.ts +4 -0
- package/src/types/settings.ts +42 -30
- package/src/utils/assets.ts +4 -1
- package/src/utils/deviceFeaturesCompat.ts +173 -0
- package/src/utils/deviceFeaturesUtils.ts +68 -24
- package/src/utils/deviceInfoUtils.ts +26 -64
- package/src/utils/deviceSettings.ts +161 -39
- package/src/utils/deviceVersionUtils.ts +25 -44
- package/src/utils/findDefectiveBatchDevice.ts +3 -3
- package/src/utils/homescreen.ts +10 -0
- package/src/utils/index.ts +21 -1
- package/src/utils/networkUtils.ts +270 -14
- package/src/utils/pro2Wallpaper.ts +109 -0
- package/src/utils/tracing.ts +3 -1
- package/dist/api/GetDeviceInfo.d.ts +0 -9
- package/dist/api/GetDeviceInfo.d.ts.map +0 -1
- package/dist/api/protocol-v2/DevReboot.d.ts +0 -7
- package/dist/api/protocol-v2/DevReboot.d.ts.map +0 -1
- package/dist/api/protocol-v2/DeviceGetDeviceInfo.d.ts +0 -29
- package/dist/api/protocol-v2/DeviceGetDeviceInfo.d.ts.map +0 -1
- package/dist/api/protocol-v2/FactoryDeviceInfoSettings.d.ts +0 -7
- package/dist/api/protocol-v2/FactoryDeviceInfoSettings.d.ts.map +0 -1
- package/dist/api/protocol-v2/FactoryGetDeviceInfo.d.ts +0 -6
- package/dist/api/protocol-v2/FactoryGetDeviceInfo.d.ts.map +0 -1
- package/dist/api/protocol-v2/FilesystemDiskControl.d.ts +0 -13
- package/dist/api/protocol-v2/FilesystemDiskControl.d.ts.map +0 -1
- package/dist/api/protocol-v2/FilesystemFixPermission.d.ts.map +0 -1
- package/dist/api/protocol-v2/GetProtoVersion.d.ts +0 -6
- package/dist/api/protocol-v2/GetProtoVersion.d.ts.map +0 -1
- package/dist/deviceProfile/buildDeviceProfile.d.ts +0 -21
- package/dist/deviceProfile/buildDeviceProfile.d.ts.map +0 -1
- package/dist/types/api/getDeviceInfo.d.ts +0 -85
- package/dist/types/api/getDeviceInfo.d.ts.map +0 -1
- package/src/api/GetDeviceInfo.ts +0 -145
- package/src/api/protocol-v2/DevReboot.ts +0 -24
- package/src/api/protocol-v2/DeviceGetDeviceInfo.ts +0 -118
- package/src/api/protocol-v2/FactoryDeviceInfoSettings.ts +0 -29
- package/src/api/protocol-v2/FilesystemDiskControl.ts +0 -50
- package/src/deviceProfile/buildDeviceProfile.ts +0 -334
- package/src/types/api/getDeviceInfo.ts +0 -99
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ERRORS, HardwareErrorCode, createDeviceNotSupportMethodError } from '@onekeyfe/hd-shared';
|
|
2
|
+
|
|
3
|
+
import { UI_REQUEST } from '../constants/ui-request';
|
|
4
|
+
import { BaseMethod } from './BaseMethod';
|
|
5
|
+
|
|
6
|
+
import type { DeviceStateSection } from '../types';
|
|
7
|
+
import type { DeviceStateScope, GetDeviceStateParams } from '../types/api/getDeviceState';
|
|
8
|
+
|
|
9
|
+
const SCOPE_SECTIONS: Record<DeviceStateScope, DeviceStateSection[]> = {
|
|
10
|
+
runtime: ['status'],
|
|
11
|
+
settings: ['status', 'settings'],
|
|
12
|
+
firmware: ['status', 'identity', 'versions', 'verification'],
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const isLoaderMode = (mode: string) => mode === 'bootloader' || mode === 'romloader';
|
|
16
|
+
|
|
17
|
+
export default class GetDeviceState extends BaseMethod<
|
|
18
|
+
Required<Pick<GetDeviceStateParams, 'scope'>>
|
|
19
|
+
> {
|
|
20
|
+
init() {
|
|
21
|
+
const scope = (this.payload.scope ?? 'runtime') as DeviceStateScope;
|
|
22
|
+
if (!Object.prototype.hasOwnProperty.call(SCOPE_SECTIONS, scope)) {
|
|
23
|
+
throw ERRORS.TypedError(
|
|
24
|
+
HardwareErrorCode.CallMethodInvalidParameter,
|
|
25
|
+
`Unsupported device state scope: ${String(scope)}`
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
this.allowDeviceMode = [
|
|
29
|
+
...this.allowDeviceMode,
|
|
30
|
+
UI_REQUEST.NOT_INITIALIZE,
|
|
31
|
+
UI_REQUEST.BOOTLOADER,
|
|
32
|
+
];
|
|
33
|
+
this.unlockPolicy = 'none';
|
|
34
|
+
this.useDevicePassphraseState = false;
|
|
35
|
+
this.skipForceUpdateCheck = true;
|
|
36
|
+
this.params = { scope };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async run() {
|
|
40
|
+
const state = await this.device.getDeviceState({
|
|
41
|
+
refreshSections: SCOPE_SECTIONS[this.params.scope],
|
|
42
|
+
});
|
|
43
|
+
if (
|
|
44
|
+
this.params.scope === 'settings' &&
|
|
45
|
+
this.device.isProtocolV2() &&
|
|
46
|
+
isLoaderMode(state.status.mode)
|
|
47
|
+
) {
|
|
48
|
+
throw createDeviceNotSupportMethodError(
|
|
49
|
+
`${this.name}:${this.params.scope}`,
|
|
50
|
+
this.device.getCurrentFirmwareType()
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
return state;
|
|
54
|
+
}
|
|
55
|
+
}
|
package/src/api/GetFeatures.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
|
|
1
|
+
import { ERRORS, HardwareErrorCode, createDeviceNotSupportMethodError } from '@onekeyfe/hd-shared';
|
|
2
2
|
|
|
3
3
|
import { UI_REQUEST } from '../constants/ui-request';
|
|
4
|
+
import { projectFeatures } from '../device/DeviceStateProjector';
|
|
4
5
|
import { BaseMethod } from './BaseMethod';
|
|
5
6
|
|
|
6
7
|
export default class GetFeatures extends BaseMethod {
|
|
7
8
|
init() {
|
|
9
|
+
this.unlockPolicy = 'none';
|
|
8
10
|
this.allowDeviceMode = [
|
|
9
11
|
...this.allowDeviceMode,
|
|
10
12
|
UI_REQUEST.NOT_INITIALIZE,
|
|
@@ -19,8 +21,11 @@ export default class GetFeatures extends BaseMethod {
|
|
|
19
21
|
return Promise.reject(ERRORS.TypedError(HardwareErrorCode.DeviceDetectInBootloaderMode));
|
|
20
22
|
}
|
|
21
23
|
if (this.device.isProtocolV2()) {
|
|
22
|
-
|
|
24
|
+
throw createDeviceNotSupportMethodError(this.name, this.device.getCurrentFirmwareType());
|
|
23
25
|
}
|
|
24
|
-
|
|
26
|
+
const state = await this.device.getDeviceState({
|
|
27
|
+
includeRaw: true,
|
|
28
|
+
});
|
|
29
|
+
return projectFeatures(state);
|
|
25
30
|
}
|
|
26
31
|
}
|
|
@@ -1,83 +1,21 @@
|
|
|
1
1
|
import semver from 'semver';
|
|
2
|
+
import { createDeviceNotSupportMethodError } from '@onekeyfe/hd-shared';
|
|
2
3
|
|
|
3
4
|
import { UI_REQUEST } from '../constants/ui-request';
|
|
4
5
|
import { fixVersion } from '../utils/deviceFeaturesUtils';
|
|
5
|
-
import { PROTOCOL_V2_DEVICE_INFO_REQUEST } from '../protocols/protocol-v2';
|
|
6
|
-
import { requestProtocolV2DeviceInfo } from '../protocols/protocol-v2/features';
|
|
7
6
|
import { BaseMethod } from './BaseMethod';
|
|
8
7
|
|
|
9
8
|
import type { OnekeyFeatures } from '../types';
|
|
10
9
|
|
|
11
|
-
const ONEKEY_FEATURE_KEYS: Array<keyof OnekeyFeatures> = [
|
|
12
|
-
'onekey_device_type',
|
|
13
|
-
'onekey_board_version',
|
|
14
|
-
'onekey_boot_version',
|
|
15
|
-
'onekey_firmware_version',
|
|
16
|
-
'onekey_board_hash',
|
|
17
|
-
'onekey_boot_hash',
|
|
18
|
-
'onekey_firmware_hash',
|
|
19
|
-
'onekey_board_build_id',
|
|
20
|
-
'onekey_boot_build_id',
|
|
21
|
-
'onekey_firmware_build_id',
|
|
22
|
-
'onekey_serial_no',
|
|
23
|
-
'onekey_ble_name',
|
|
24
|
-
'onekey_ble_version',
|
|
25
|
-
'onekey_ble_build_id',
|
|
26
|
-
'onekey_ble_hash',
|
|
27
|
-
'onekey_se_type',
|
|
28
|
-
'onekey_se01_state',
|
|
29
|
-
'onekey_se02_state',
|
|
30
|
-
'onekey_se03_state',
|
|
31
|
-
'onekey_se04_state',
|
|
32
|
-
'onekey_se01_version',
|
|
33
|
-
'onekey_se02_version',
|
|
34
|
-
'onekey_se03_version',
|
|
35
|
-
'onekey_se04_version',
|
|
36
|
-
'onekey_se01_hash',
|
|
37
|
-
'onekey_se02_hash',
|
|
38
|
-
'onekey_se03_hash',
|
|
39
|
-
'onekey_se04_hash',
|
|
40
|
-
'onekey_se01_build_id',
|
|
41
|
-
'onekey_se02_build_id',
|
|
42
|
-
'onekey_se03_build_id',
|
|
43
|
-
'onekey_se04_build_id',
|
|
44
|
-
'onekey_se01_boot_version',
|
|
45
|
-
'onekey_se02_boot_version',
|
|
46
|
-
'onekey_se03_boot_version',
|
|
47
|
-
'onekey_se04_boot_version',
|
|
48
|
-
'onekey_se01_boot_hash',
|
|
49
|
-
'onekey_se02_boot_hash',
|
|
50
|
-
'onekey_se03_boot_hash',
|
|
51
|
-
'onekey_se04_boot_hash',
|
|
52
|
-
'onekey_se01_boot_build_id',
|
|
53
|
-
'onekey_se02_boot_build_id',
|
|
54
|
-
'onekey_se03_boot_build_id',
|
|
55
|
-
'onekey_se04_boot_build_id',
|
|
56
|
-
];
|
|
57
|
-
|
|
58
10
|
function normalizeOnekeyFirmwareVersion(message: OnekeyFeatures) {
|
|
59
11
|
if (message.onekey_firmware_version && !semver.valid(message.onekey_firmware_version)) {
|
|
60
12
|
message.onekey_firmware_version = fixVersion(message.onekey_firmware_version);
|
|
61
13
|
}
|
|
62
14
|
}
|
|
63
15
|
|
|
64
|
-
function pickOnekeyFeatures(features?: OnekeyFeatures | null): OnekeyFeatures {
|
|
65
|
-
const message: OnekeyFeatures = {};
|
|
66
|
-
if (!features) return message;
|
|
67
|
-
|
|
68
|
-
for (const key of ONEKEY_FEATURE_KEYS) {
|
|
69
|
-
const value = features[key];
|
|
70
|
-
if (value !== undefined && value !== null) {
|
|
71
|
-
(message as Record<string, unknown>)[key] = value;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
normalizeOnekeyFirmwareVersion(message);
|
|
76
|
-
return message;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
16
|
export default class GetOnekeyFeatures extends BaseMethod {
|
|
80
17
|
init() {
|
|
18
|
+
this.unlockPolicy = 'none';
|
|
81
19
|
this.allowDeviceMode = [
|
|
82
20
|
...this.allowDeviceMode,
|
|
83
21
|
UI_REQUEST.NOT_INITIALIZE,
|
|
@@ -89,14 +27,7 @@ export default class GetOnekeyFeatures extends BaseMethod {
|
|
|
89
27
|
|
|
90
28
|
async run() {
|
|
91
29
|
if (this.device.isProtocolV2()) {
|
|
92
|
-
|
|
93
|
-
// 取完整 DevGetDeviceInfo(含 SE/hash/build_id)后刷新结构化 features 缓存。
|
|
94
|
-
const deviceInfo = await requestProtocolV2DeviceInfo({
|
|
95
|
-
commands: this.device.commands,
|
|
96
|
-
request: PROTOCOL_V2_DEVICE_INFO_REQUEST,
|
|
97
|
-
});
|
|
98
|
-
const features = this.device.updateProtocolV2Features(deviceInfo);
|
|
99
|
-
return pickOnekeyFeatures(features as OnekeyFeatures);
|
|
30
|
+
throw createDeviceNotSupportMethodError(this.name, this.device.getCurrentFirmwareType());
|
|
100
31
|
}
|
|
101
32
|
|
|
102
33
|
const { message } = await this.device.commands.typedCall('OnekeyGetFeatures', 'OnekeyFeatures');
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ERRORS, HardwareErrorCode, createDeviceNotSupportMethodError } from '@onekeyfe/hd-shared';
|
|
2
2
|
|
|
3
3
|
import { UI_REQUEST } from '../constants/ui-request';
|
|
4
4
|
import { getPassphraseStateWithRefreshDeviceInfo } from '../utils/deviceFeaturesUtils';
|
|
@@ -11,24 +11,17 @@ export default class GetPassphraseState extends BaseMethod {
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
async run() {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
if (this.device.isProtocolV2()) {
|
|
15
|
+
throw createDeviceNotSupportMethodError(this.name, this.device.getCurrentFirmwareType());
|
|
16
|
+
}
|
|
17
|
+
if (!this.device.features) {
|
|
18
|
+
throw ERRORS.TypedError(HardwareErrorCode.DeviceInitializeFailed);
|
|
19
|
+
}
|
|
20
20
|
|
|
21
|
-
const {
|
|
22
|
-
const passphraseProtection = this.device.getCurrentPassphraseProtection() ?? null;
|
|
23
|
-
const deviceType = this.device.getCurrentDeviceType();
|
|
24
|
-
const isProSeries = deviceType === EDeviceType.Pro || deviceType === EDeviceType.Pro2;
|
|
21
|
+
const { passphraseState } = await getPassphraseStateWithRefreshDeviceInfo(this.device);
|
|
25
22
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
session_id: newSession ?? features?.sessionId ?? undefined,
|
|
30
|
-
unlocked_attach_pin: unlockedAttachPin ?? features?.unlockedAttachPin,
|
|
31
|
-
passphrase_protection: passphraseProtection,
|
|
32
|
-
});
|
|
23
|
+
const passphraseProtection = this.device.getCurrentPassphraseProtection();
|
|
24
|
+
|
|
25
|
+
return Promise.resolve(passphraseProtection === true ? passphraseState : undefined);
|
|
33
26
|
}
|
|
34
27
|
}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
|
|
2
|
+
|
|
3
|
+
import { deviceWalletSessionStore } from '../device/DeviceWalletSessionStore';
|
|
4
|
+
import { getProtocolV2WalletSession } from '../protocols/protocol-v2/walletSession';
|
|
5
|
+
import { getPassphraseStateWithRefreshDeviceInfo } from '../utils/deviceFeaturesUtils';
|
|
6
|
+
import { BaseMethod } from './BaseMethod';
|
|
7
|
+
import { invalidParameter } from './helpers/paramsValidator';
|
|
8
|
+
|
|
9
|
+
import type {
|
|
10
|
+
OpenWalletSessionParams,
|
|
11
|
+
OpenWalletSessionPayload,
|
|
12
|
+
} from '../types/api/openWalletSession';
|
|
13
|
+
|
|
14
|
+
const requiredString = (value: unknown, name: string) => {
|
|
15
|
+
if (value === undefined || value === null) {
|
|
16
|
+
throw invalidParameter(`Missing required parameter: ${name}`);
|
|
17
|
+
}
|
|
18
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
19
|
+
throw invalidParameter(`Parameter [${name}] must be a non-empty string.`);
|
|
20
|
+
}
|
|
21
|
+
return value.trim();
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const optionalBoolean = (value: unknown, name: string) => {
|
|
25
|
+
if (value !== undefined && typeof value !== 'boolean') {
|
|
26
|
+
throw invalidParameter(`Parameter [${name}] must be a boolean.`);
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const wasResumed = (session: unknown) =>
|
|
32
|
+
!!session &&
|
|
33
|
+
typeof session === 'object' &&
|
|
34
|
+
'resumed' in session &&
|
|
35
|
+
(session as { resumed?: unknown }).resumed === true;
|
|
36
|
+
|
|
37
|
+
type NormalizedOpenWalletSessionParams = OpenWalletSessionParams & {
|
|
38
|
+
legacySessionToClear?: {
|
|
39
|
+
deviceId?: string;
|
|
40
|
+
passphraseState: string;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const normalizeParams = (payload: Record<string, unknown>): NormalizedOpenWalletSessionParams => {
|
|
45
|
+
if (payload.mode !== undefined) {
|
|
46
|
+
if (
|
|
47
|
+
payload.mode !== 'standard' &&
|
|
48
|
+
payload.mode !== 'select-hidden' &&
|
|
49
|
+
payload.mode !== 'resume-hidden'
|
|
50
|
+
) {
|
|
51
|
+
throw invalidParameter(
|
|
52
|
+
'Parameter [mode] must be one of standard, select-hidden, or resume-hidden.'
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
if (payload.useEmptyPassphrase !== undefined || payload.initSession !== undefined) {
|
|
56
|
+
throw invalidParameter(
|
|
57
|
+
'Parameters [useEmptyPassphrase] and [initSession] cannot be used with [mode].'
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
if (payload.mode === 'standard' || payload.mode === 'select-hidden') {
|
|
61
|
+
if (payload.deviceId !== undefined || payload.passphraseState !== undefined) {
|
|
62
|
+
throw invalidParameter(
|
|
63
|
+
'Parameters [deviceId] and [passphraseState] are only allowed with mode [resume-hidden].'
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
return { mode: payload.mode };
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
mode: 'resume-hidden',
|
|
70
|
+
deviceId: requiredString(payload.deviceId, 'deviceId'),
|
|
71
|
+
passphraseState: requiredString(payload.passphraseState, 'passphraseState'),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const useEmptyPassphrase = optionalBoolean(payload.useEmptyPassphrase, 'useEmptyPassphrase');
|
|
76
|
+
const initSession = optionalBoolean(payload.initSession, 'initSession');
|
|
77
|
+
if (useEmptyPassphrase === true) {
|
|
78
|
+
return { mode: 'standard' };
|
|
79
|
+
}
|
|
80
|
+
if (initSession === true) {
|
|
81
|
+
const deviceId =
|
|
82
|
+
payload.deviceId === undefined ? undefined : requiredString(payload.deviceId, 'deviceId');
|
|
83
|
+
const passphraseState =
|
|
84
|
+
payload.passphraseState === undefined
|
|
85
|
+
? undefined
|
|
86
|
+
: requiredString(payload.passphraseState, 'passphraseState');
|
|
87
|
+
return {
|
|
88
|
+
mode: 'select-hidden',
|
|
89
|
+
...(passphraseState
|
|
90
|
+
? {
|
|
91
|
+
legacySessionToClear: {
|
|
92
|
+
deviceId,
|
|
93
|
+
passphraseState,
|
|
94
|
+
},
|
|
95
|
+
}
|
|
96
|
+
: {}),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const hasWalletBinding = payload.deviceId !== undefined || payload.passphraseState !== undefined;
|
|
101
|
+
if (!hasWalletBinding) {
|
|
102
|
+
return { mode: 'select-hidden' };
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
mode: 'resume-hidden',
|
|
106
|
+
deviceId: requiredString(payload.deviceId, 'deviceId'),
|
|
107
|
+
passphraseState: requiredString(payload.passphraseState, 'passphraseState'),
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
export default class OpenWalletSession extends BaseMethod<NormalizedOpenWalletSessionParams> {
|
|
112
|
+
init() {
|
|
113
|
+
this.useDevicePassphraseState = false;
|
|
114
|
+
this.skipForceUpdateCheck = true;
|
|
115
|
+
this.params = normalizeParams(this.payload as unknown as Record<string, unknown>);
|
|
116
|
+
this.payload.useEmptyPassphrase = this.params.mode === 'standard';
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async run(): Promise<OpenWalletSessionPayload> {
|
|
120
|
+
const state = await this.device.getDeviceState({ refreshSections: ['status'] });
|
|
121
|
+
const currentDeviceId = state.identity.deviceId;
|
|
122
|
+
if (!currentDeviceId) {
|
|
123
|
+
throw ERRORS.TypedError(HardwareErrorCode.DeviceInitializeFailed);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const { legacySessionToClear } = this.params;
|
|
127
|
+
if (
|
|
128
|
+
legacySessionToClear &&
|
|
129
|
+
(!legacySessionToClear.deviceId || legacySessionToClear.deviceId === currentDeviceId)
|
|
130
|
+
) {
|
|
131
|
+
deviceWalletSessionStore.delete(currentDeviceId, legacySessionToClear.passphraseState);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const protocol = this.device.isProtocolV2() ? 'V2' : 'V1';
|
|
135
|
+
|
|
136
|
+
if (this.params.mode === 'standard') {
|
|
137
|
+
this.device.passphraseState = undefined;
|
|
138
|
+
const session = this.device.isProtocolV2()
|
|
139
|
+
? await getProtocolV2WalletSession(this.device, { onlyMainPin: true })
|
|
140
|
+
: await getPassphraseStateWithRefreshDeviceInfo(this.device, {
|
|
141
|
+
onlyMainPin: true,
|
|
142
|
+
initSession: this.payload.initSession,
|
|
143
|
+
});
|
|
144
|
+
if (session.unlockedAttachPin) {
|
|
145
|
+
try {
|
|
146
|
+
await this.device.lockDevice();
|
|
147
|
+
} catch {
|
|
148
|
+
// The wallet context is rejected even when an older device cannot be locked.
|
|
149
|
+
}
|
|
150
|
+
this.device.clearInternalState();
|
|
151
|
+
throw ERRORS.TypedError(HardwareErrorCode.DeviceCheckUnlockTypeError);
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
protocol,
|
|
155
|
+
walletType: 'standard',
|
|
156
|
+
deviceId: currentDeviceId,
|
|
157
|
+
passphraseState: null,
|
|
158
|
+
resumed: wasResumed(session),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (this.params.mode === 'resume-hidden') {
|
|
163
|
+
if (currentDeviceId !== this.params.deviceId) {
|
|
164
|
+
throw ERRORS.TypedError(HardwareErrorCode.DeviceCheckDeviceIdError);
|
|
165
|
+
}
|
|
166
|
+
this.device.passphraseState = this.params.passphraseState;
|
|
167
|
+
const cachedSessionId = deviceWalletSessionStore.get(
|
|
168
|
+
this.params.deviceId,
|
|
169
|
+
this.params.passphraseState
|
|
170
|
+
);
|
|
171
|
+
if (!cachedSessionId) {
|
|
172
|
+
throw ERRORS.TypedError(HardwareErrorCode.WalletSessionInvalid);
|
|
173
|
+
}
|
|
174
|
+
if (!this.device.isProtocolV2()) {
|
|
175
|
+
await this.device.initialize({
|
|
176
|
+
deviceId: this.params.deviceId,
|
|
177
|
+
passphraseState: this.params.passphraseState,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
const session = this.device.isProtocolV2()
|
|
181
|
+
? await getProtocolV2WalletSession(this.device, {
|
|
182
|
+
expectedPassphraseState: this.params.passphraseState,
|
|
183
|
+
})
|
|
184
|
+
: await getPassphraseStateWithRefreshDeviceInfo(this.device, {
|
|
185
|
+
expectPassphraseState: this.params.passphraseState,
|
|
186
|
+
});
|
|
187
|
+
if (!session.passphraseState) {
|
|
188
|
+
this.device.clearInternalState();
|
|
189
|
+
throw ERRORS.TypedError(HardwareErrorCode.DeviceCheckPassphraseStateError);
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
protocol,
|
|
193
|
+
walletType: 'hidden',
|
|
194
|
+
deviceId: currentDeviceId,
|
|
195
|
+
passphraseState: session.passphraseState ?? null,
|
|
196
|
+
resumed: wasResumed(session) || session.newSession === cachedSessionId,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
this.device.passphraseState = undefined;
|
|
201
|
+
const session = this.device.isProtocolV2()
|
|
202
|
+
? await getProtocolV2WalletSession(this.device, { initSession: true })
|
|
203
|
+
: await getPassphraseStateWithRefreshDeviceInfo(this.device, { initSession: true });
|
|
204
|
+
const responseBase = {
|
|
205
|
+
protocol,
|
|
206
|
+
deviceId: currentDeviceId,
|
|
207
|
+
resumed: wasResumed(session),
|
|
208
|
+
} as const;
|
|
209
|
+
return session.passphraseState
|
|
210
|
+
? {
|
|
211
|
+
...responseBase,
|
|
212
|
+
walletType: 'hidden',
|
|
213
|
+
passphraseState: session.passphraseState,
|
|
214
|
+
}
|
|
215
|
+
: {
|
|
216
|
+
...responseBase,
|
|
217
|
+
walletType: 'standard',
|
|
218
|
+
passphraseState: null,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
}
|
package/src/api/PathInfo.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BaseMethod } from './BaseMethod';
|
|
2
2
|
import {
|
|
3
|
-
validateNonEmptyString,
|
|
4
3
|
validateOptionalNonNegativeInteger,
|
|
4
|
+
validateProtocolV2FilesystemPath,
|
|
5
5
|
} from './helpers/filesystemValidation';
|
|
6
6
|
|
|
7
7
|
export type PathInfoParams = {
|
|
@@ -11,12 +11,14 @@ export type PathInfoParams = {
|
|
|
11
11
|
|
|
12
12
|
export default class PathInfo extends BaseMethod<PathInfoParams> {
|
|
13
13
|
init() {
|
|
14
|
-
// Protocol V2 (Pro2)
|
|
14
|
+
// Protocol V2 (Pro2) only; Core rejects non-V2 devices.
|
|
15
15
|
this.requireProtocolV2 = true;
|
|
16
16
|
this.skipForceUpdateCheck = true;
|
|
17
17
|
this.useDevicePassphraseState = false;
|
|
18
18
|
this.params = {
|
|
19
|
-
path:
|
|
19
|
+
path: validateProtocolV2FilesystemPath(this.payload.path, 'path', {
|
|
20
|
+
allowVolumeRoot: true,
|
|
21
|
+
}),
|
|
20
22
|
timeoutMs: validateOptionalNonNegativeInteger(this.payload.timeoutMs, 'timeoutMs'),
|
|
21
23
|
};
|
|
22
24
|
}
|
|
@@ -54,9 +54,8 @@ export default class PromptWebDeviceAccess extends BaseMethod {
|
|
|
54
54
|
const usbDevice = device as USBDevice;
|
|
55
55
|
let path = usbDevice.serialNumber ?? '';
|
|
56
56
|
if (!path) {
|
|
57
|
-
//
|
|
58
|
-
//
|
|
59
|
-
// 这里按 USBDevice 对象身份找回该 path,保证后续 acquire 能匹配。
|
|
57
|
+
// Early Pro2 boards have no USB serial number. Re-enumeration assigns a
|
|
58
|
+
// session-stable mock path, which is recovered by USBDevice identity here.
|
|
60
59
|
const diff = await this.connector?.enumerate();
|
|
61
60
|
const matched = diff?.descriptors?.find(d => (d as any).device === usbDevice);
|
|
62
61
|
path = matched?.path ?? '';
|
package/src/api/SearchDevices.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { BaseMethod } from './BaseMethod';
|
|
2
2
|
import TransportManager from '../data-manager/TransportManager';
|
|
3
3
|
import { DataManager } from '../data-manager';
|
|
4
|
-
import { getDeviceTypeByBleName } from '../utils';
|
|
4
|
+
import { LoggerNames, getDeviceTypeByBleName, getLogger } from '../utils';
|
|
5
5
|
import { DevicePool } from '../device/DevicePool';
|
|
6
6
|
|
|
7
7
|
import type DeviceConnector from '../device/DeviceConnector';
|
|
8
8
|
|
|
9
|
+
const Log = getLogger(LoggerNames.DevicePool);
|
|
10
|
+
|
|
9
11
|
export default class SearchDevices extends BaseMethod {
|
|
10
12
|
connector?: DeviceConnector;
|
|
11
13
|
|
|
@@ -39,6 +41,10 @@ export default class SearchDevices extends BaseMethod {
|
|
|
39
41
|
devices.push({
|
|
40
42
|
...device,
|
|
41
43
|
connectId: device.id,
|
|
44
|
+
serialNo: null,
|
|
45
|
+
// Legacy BLE discovery identifier. The physical serial number is unavailable here.
|
|
46
|
+
uuid: device.id,
|
|
47
|
+
deviceId: null,
|
|
42
48
|
name: bleName || device.name,
|
|
43
49
|
deviceType: getDeviceTypeByBleName(bleName),
|
|
44
50
|
});
|
|
@@ -47,9 +53,28 @@ export default class SearchDevices extends BaseMethod {
|
|
|
47
53
|
return devices;
|
|
48
54
|
}
|
|
49
55
|
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
56
|
+
const deviceList = [];
|
|
57
|
+
for (const descriptor of devicesDescriptor) {
|
|
58
|
+
try {
|
|
59
|
+
// Discovery is best effort. Browsers may retain WebUSB grants for devices that
|
|
60
|
+
// are offline, busy, or not ready, so one descriptor must not abort the scan.
|
|
61
|
+
const result = await DevicePool.getDevices([descriptor], descriptor.path, {
|
|
62
|
+
connectProtocol: this.payload.connectProtocol,
|
|
63
|
+
refreshRuntimeState: true,
|
|
64
|
+
});
|
|
65
|
+
deviceList.push(...result.deviceList);
|
|
66
|
+
} catch (error) {
|
|
67
|
+
const errorCode =
|
|
68
|
+
error && typeof error === 'object' && 'errorCode' in error
|
|
69
|
+
? (error as { errorCode?: unknown }).errorCode
|
|
70
|
+
: undefined;
|
|
71
|
+
Log.debug('Skip unavailable device during search', {
|
|
72
|
+
path: descriptor.path,
|
|
73
|
+
...(errorCode !== undefined ? { errorCode } : {}),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
53
78
|
return deviceList.map(device => device.toMessageObject());
|
|
54
79
|
}
|
|
55
80
|
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import FileWrite from './FileWrite';
|
|
2
|
+
|
|
3
|
+
export type UploadPortfolioParams = {
|
|
4
|
+
packageBytes: ArrayBuffer | Uint8Array | Blob;
|
|
5
|
+
timeoutMs?: number | string;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
const PORTFOLIO_PENDING_PATH = 'vol1:/portfolio/portfolio.okpkg.pending';
|
|
9
|
+
const PORTFOLIO_CHUNK_SIZE = 2048;
|
|
10
|
+
|
|
11
|
+
export default class UploadPortfolio extends FileWrite {
|
|
12
|
+
init() {
|
|
13
|
+
const { packageBytes, timeoutMs } = this.payload as UploadPortfolioParams;
|
|
14
|
+
this.payload = {
|
|
15
|
+
...this.payload,
|
|
16
|
+
path: PORTFOLIO_PENDING_PATH,
|
|
17
|
+
offset: 0,
|
|
18
|
+
data: packageBytes,
|
|
19
|
+
chunkSize: PORTFOLIO_CHUNK_SIZE,
|
|
20
|
+
overwrite: true,
|
|
21
|
+
append: false,
|
|
22
|
+
emitProgress: false,
|
|
23
|
+
timeoutMs,
|
|
24
|
+
};
|
|
25
|
+
super.init();
|
|
26
|
+
this.unlockPolicy = 'retry-on-locked';
|
|
27
|
+
// Portfolio is a background write/apply flow and never synthesizes UI events.
|
|
28
|
+
this.protocolV2UiMode = 'none';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async run() {
|
|
32
|
+
const stagedFile = await super.run();
|
|
33
|
+
this.throwIfAborted();
|
|
34
|
+
await this.device.commands.typedCall('PortfolioUpdate', 'Success', {});
|
|
35
|
+
return {
|
|
36
|
+
...stagedFile,
|
|
37
|
+
portfolioUpdated: true,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -63,8 +63,8 @@ export default class AlephiumSignTransaction extends BaseMethod<HardwareAlephium
|
|
|
63
63
|
data: Buffer,
|
|
64
64
|
scriptOpt?: Buffer,
|
|
65
65
|
dataOffset = 0
|
|
66
|
-
//
|
|
67
|
-
//
|
|
66
|
+
// The final AlephiumTxRequest may return a signature without data_length or address,
|
|
67
|
+
// so the result accurately uses a union type.
|
|
68
68
|
): Promise<AlephiumSignedTx | AlephiumTxRequest> => {
|
|
69
69
|
const responseType = res.type;
|
|
70
70
|
if (res.type === 'AlephiumSignedTx') {
|
|
@@ -352,6 +352,7 @@ export default abstract class AllNetworkGetAddressBase extends BaseMethod<
|
|
|
352
352
|
};
|
|
353
353
|
|
|
354
354
|
let result: AllNetworkAddress[];
|
|
355
|
+
let requestError: Error | undefined;
|
|
355
356
|
try {
|
|
356
357
|
method.init();
|
|
357
358
|
method.setDevice?.(this.device);
|
|
@@ -394,10 +395,8 @@ export default abstract class AllNetworkGetAddressBase extends BaseMethod<
|
|
|
394
395
|
rootFingerprint,
|
|
395
396
|
},
|
|
396
397
|
}));
|
|
397
|
-
if (method.requestContext) {
|
|
398
|
-
completeRequestContext(method.requestContext.responseID);
|
|
399
|
-
}
|
|
400
398
|
} catch (e: any) {
|
|
399
|
+
requestError = e instanceof Error ? e : new Error(String(e));
|
|
401
400
|
const error = handleSkippableHardwareError(e, this.device, method);
|
|
402
401
|
|
|
403
402
|
if (error) {
|
|
@@ -415,13 +414,10 @@ export default abstract class AllNetworkGetAddressBase extends BaseMethod<
|
|
|
415
414
|
} else {
|
|
416
415
|
throw e;
|
|
417
416
|
}
|
|
417
|
+
} finally {
|
|
418
418
|
if (method.requestContext) {
|
|
419
|
-
completeRequestContext(
|
|
420
|
-
method.requestContext.responseID,
|
|
421
|
-
e instanceof Error ? e : new Error(String(e))
|
|
422
|
-
);
|
|
419
|
+
completeRequestContext(method.requestContext.responseID, requestError);
|
|
423
420
|
}
|
|
424
|
-
} finally {
|
|
425
421
|
this.device.off(DEVICE.BUTTON, buttonListener);
|
|
426
422
|
this.device.off(DEVICE.PIN, onSignalAbort);
|
|
427
423
|
this.device.off(DEVICE.PASSPHRASE, onSignalAbort);
|
|
@@ -78,7 +78,7 @@ export default class BenfenGetAddress extends BaseMethod<HardwareBenfenGetAddres
|
|
|
78
78
|
'BenfenAddress',
|
|
79
79
|
param
|
|
80
80
|
);
|
|
81
|
-
//
|
|
81
|
+
// BenfenAddress.address is optional in proto but always present on success.
|
|
82
82
|
address = addressRes.message.address ?? '';
|
|
83
83
|
} else {
|
|
84
84
|
address = publicKeyToAddress(publicKey);
|
|
@@ -78,7 +78,7 @@ export default class BTCGetPublicKey extends BaseMethod<GetPublicKey[]> {
|
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
for (const param of this.params) {
|
|
81
|
-
// init()
|
|
81
|
+
// init() sets coin_name; keep an empty fallback for the generated optional type.
|
|
82
82
|
const versionBytes = getVersionBytes(param.coin_name ?? '', param.script_type);
|
|
83
83
|
if (!versionBytes) {
|
|
84
84
|
throw new Error(
|
|
@@ -14,7 +14,7 @@ export default class CardanoSignMessage extends BaseMethod<CardanoSignMessagePar
|
|
|
14
14
|
init() {
|
|
15
15
|
this.checkDeviceId = true;
|
|
16
16
|
this.allowDeviceMode = [...this.allowDeviceMode, UI_REQUEST.NOT_INITIALIZE];
|
|
17
|
-
this.allowUsePreInitialize =
|
|
17
|
+
this.allowUsePreInitialize = false;
|
|
18
18
|
|
|
19
19
|
const { payload } = this;
|
|
20
20
|
validateParams(payload, [
|
|
@@ -48,7 +48,7 @@ export default class CardanoSignTransaction extends BaseMethod<any> {
|
|
|
48
48
|
init() {
|
|
49
49
|
this.checkDeviceId = true;
|
|
50
50
|
this.allowDeviceMode = [...this.allowDeviceMode, UI_REQUEST.NOT_INITIALIZE];
|
|
51
|
-
this.allowUsePreInitialize =
|
|
51
|
+
this.allowUsePreInitialize = false;
|
|
52
52
|
|
|
53
53
|
this.hasBundle = !!this.payload?.bundle;
|
|
54
54
|
|