@onekeyfe/hd-core 1.2.0-alpha.4 → 1.2.0-alpha.41
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 +77 -0
- package/__tests__/DeviceCommands.test.ts +517 -0
- package/__tests__/DeviceEventRegistration.test.ts +43 -0
- package/__tests__/chain-params-onekey-compatibility.test.ts +229 -0
- package/__tests__/check-all-firmware-release-protocol-v2.test.ts +282 -0
- package/__tests__/connectSettings.test.ts +61 -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 +52 -0
- package/__tests__/device-lifecycle-events.test.ts +249 -0
- package/__tests__/device-pool-state.test.ts +144 -0
- package/__tests__/device-settings.test.ts +416 -0
- package/__tests__/device-state-contract.test.ts +27 -0
- package/__tests__/device-state-events.test.ts +286 -0
- package/__tests__/device-state-mapper.test.ts +261 -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 +107 -0
- package/__tests__/device-wallet-session-store.test.ts +478 -0
- package/__tests__/deviceFeaturesUtils.test.ts +39 -0
- package/__tests__/deviceSettings.test.ts +103 -0
- package/__tests__/evmLedgerLegacySafety.test.ts +12 -6
- package/__tests__/evmSignTransaction.test.ts +69 -0
- package/__tests__/evmSignTypedData.test.ts +80 -0
- package/__tests__/filesystemValidation.test.ts +53 -0
- package/__tests__/firmware-update/check-all-firmware-release.test.ts +175 -0
- package/__tests__/firmware-update/firmware-artifact-source.test.ts +119 -0
- package/__tests__/firmware-update/firmware-host-binding.test.ts +70 -0
- package/__tests__/firmware-update/firmware-preparation-error.test.ts +27 -0
- package/__tests__/firmware-update/firmware-update-capabilities.test.ts +13 -0
- package/__tests__/firmware-update/firmware-update-plan.test.ts +593 -0
- package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +213 -0
- package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +430 -0
- package/__tests__/firmware-update/firmware-update-v3-reconnect.test.ts +58 -0
- package/__tests__/firmware-update/firmware-upload-source.test.ts +70 -0
- package/__tests__/get-device-state.test.ts +458 -0
- package/__tests__/homescreen.test.ts +24 -0
- package/__tests__/kaspa-public-types.type-test.ts +16 -0
- package/__tests__/kaspa-use-tweak-pro2.test.ts +20 -0
- package/__tests__/kaspaSignTransaction.test.ts +601 -0
- package/__tests__/known-device-public-types.type-test.ts +3 -0
- package/__tests__/logBlockEvent.test.ts +128 -1
- package/__tests__/method-protocol-support.test.ts +113 -0
- package/__tests__/networkUtils.test.ts +406 -0
- package/__tests__/open-wallet-session-error-response.test.ts +43 -0
- package/__tests__/open-wallet-session.test.ts +1368 -0
- package/__tests__/pro2Wallpaper.test.ts +39 -0
- package/__tests__/protocol-v2-bootloader-mode.test.ts +37 -0
- package/__tests__/protocol-v2-firmware-targets.test.ts +37 -0
- package/__tests__/protocol-v2-ping.test.ts +28 -0
- package/__tests__/protocol-v2-unlock-policy.test.ts +45 -0
- package/__tests__/protocol-v2.test.ts +6082 -2422
- package/__tests__/protocolV2FileWrite.test.ts +92 -0
- package/__tests__/protocolV2UiInteraction.test.ts +266 -0
- package/__tests__/public-device-state-api.test.ts +275 -0
- package/__tests__/public-pro2-api-boundary.test.ts +106 -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/__tests__/tron-sign-message-init.test.ts +74 -0
- package/dist/api/BaseMethod.d.ts +14 -1
- package/dist/api/BaseMethod.d.ts.map +1 -1
- package/dist/api/CheckAllFirmwareRelease.d.ts +24 -1
- package/dist/api/CheckAllFirmwareRelease.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/CipherKeyValue.d.ts +1 -0
- package/dist/api/CipherKeyValue.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 +1 -0
- package/dist/api/DirList.d.ts.map +1 -1
- package/dist/api/DirMake.d.ts +1 -0
- package/dist/api/DirMake.d.ts.map +1 -1
- package/dist/api/DirRemove.d.ts +1 -0
- package/dist/api/DirRemove.d.ts.map +1 -1
- package/dist/api/FileDelete.d.ts +1 -0
- package/dist/api/FileDelete.d.ts.map +1 -1
- package/dist/api/FileRead.d.ts +1 -0
- package/dist/api/FileRead.d.ts.map +1 -1
- package/dist/api/FileWrite.d.ts +2 -0
- package/dist/api/FileWrite.d.ts.map +1 -1
- package/dist/api/FirmwareUpdate.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV2.d.ts +13 -2
- package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV3.d.ts +7 -3
- package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV4.d.ts +42 -16
- package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
- package/dist/api/GetDeviceState.d.ts +8 -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 +2 -6
- package/dist/api/GetPassphraseState.d.ts.map +1 -1
- package/dist/api/OpenWalletSession.d.ts +8 -0
- package/dist/api/OpenWalletSession.d.ts.map +1 -0
- package/dist/api/PathInfo.d.ts +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/alephium/AlephiumGetAddress.d.ts.map +1 -1
- package/dist/api/alephium/AlephiumSignMessage.d.ts.map +1 -1
- package/dist/api/alephium/AlephiumSignTransaction.d.ts.map +1 -1
- package/dist/api/algo/AlgoGetAddress.d.ts +1 -0
- package/dist/api/algo/AlgoGetAddress.d.ts.map +1 -1
- package/dist/api/algo/AlgoSignTransaction.d.ts +1 -0
- package/dist/api/algo/AlgoSignTransaction.d.ts.map +1 -1
- package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts +1 -0
- package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
- package/dist/api/aptos/AptosGetAddress.d.ts +1 -0
- package/dist/api/aptos/AptosGetAddress.d.ts.map +1 -1
- package/dist/api/aptos/AptosGetPublicKey.d.ts +1 -0
- package/dist/api/aptos/AptosGetPublicKey.d.ts.map +1 -1
- package/dist/api/aptos/AptosSignInMessage.d.ts +1 -0
- package/dist/api/aptos/AptosSignInMessage.d.ts.map +1 -1
- package/dist/api/aptos/AptosSignMessage.d.ts +1 -0
- package/dist/api/aptos/AptosSignMessage.d.ts.map +1 -1
- package/dist/api/aptos/AptosSignTransaction.d.ts +1 -0
- package/dist/api/aptos/AptosSignTransaction.d.ts.map +1 -1
- package/dist/api/benfen/BenfenGetAddress.d.ts.map +1 -1
- package/dist/api/benfen/BenfenGetPublicKey.d.ts.map +1 -1
- package/dist/api/benfen/BenfenSignMessage.d.ts.map +1 -1
- package/dist/api/benfen/BenfenSignTransaction.d.ts.map +1 -1
- package/dist/api/btc/BTCGetAddress.d.ts +1 -0
- package/dist/api/btc/BTCGetAddress.d.ts.map +1 -1
- package/dist/api/btc/BTCGetPublicKey.d.ts +1 -0
- package/dist/api/btc/BTCGetPublicKey.d.ts.map +1 -1
- package/dist/api/btc/BTCSignMessage.d.ts +1 -0
- package/dist/api/btc/BTCSignMessage.d.ts.map +1 -1
- package/dist/api/btc/BTCSignPsbt.d.ts +1 -0
- package/dist/api/btc/BTCSignPsbt.d.ts.map +1 -1
- package/dist/api/btc/BTCSignTransaction.d.ts +1 -0
- package/dist/api/btc/BTCSignTransaction.d.ts.map +1 -1
- package/dist/api/btc/BTCVerifyMessage.d.ts +1 -0
- package/dist/api/btc/BTCVerifyMessage.d.ts.map +1 -1
- package/dist/api/btc/helpers/versionLimit.d.ts +2 -0
- package/dist/api/btc/helpers/versionLimit.d.ts.map +1 -1
- package/dist/api/cardano/CardanoGetAddress.d.ts +1 -0
- package/dist/api/cardano/CardanoGetAddress.d.ts.map +1 -1
- package/dist/api/cardano/CardanoGetPublicKey.d.ts +1 -0
- package/dist/api/cardano/CardanoGetPublicKey.d.ts.map +1 -1
- package/dist/api/cardano/CardanoSignMessage.d.ts +1 -0
- package/dist/api/cardano/CardanoSignMessage.d.ts.map +1 -1
- package/dist/api/cardano/CardanoSignTransaction.d.ts +1 -0
- package/dist/api/cardano/CardanoSignTransaction.d.ts.map +1 -1
- package/dist/api/conflux/ConfluxGetAddress.d.ts +2 -0
- package/dist/api/conflux/ConfluxGetAddress.d.ts.map +1 -1
- package/dist/api/conflux/ConfluxSignMessage.d.ts +2 -0
- package/dist/api/conflux/ConfluxSignMessage.d.ts.map +1 -1
- package/dist/api/conflux/ConfluxSignMessageCIP23.d.ts +2 -0
- package/dist/api/conflux/ConfluxSignMessageCIP23.d.ts.map +1 -1
- package/dist/api/conflux/ConfluxSignTransaction.d.ts +2 -0
- package/dist/api/conflux/ConfluxSignTransaction.d.ts.map +1 -1
- package/dist/api/cosmos/CosmosGetAddress.d.ts +1 -0
- package/dist/api/cosmos/CosmosGetAddress.d.ts.map +1 -1
- package/dist/api/cosmos/CosmosGetPublicKey.d.ts +1 -0
- package/dist/api/cosmos/CosmosGetPublicKey.d.ts.map +1 -1
- package/dist/api/cosmos/CosmosSignTransaction.d.ts +1 -0
- package/dist/api/cosmos/CosmosSignTransaction.d.ts.map +1 -1
- package/dist/api/device/DeviceCancel.d.ts +1 -0
- package/dist/api/device/DeviceCancel.d.ts.map +1 -1
- package/dist/api/device/DeviceChangePin.d.ts +1 -0
- 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 +1 -0
- package/dist/api/device/DeviceLock.d.ts.map +1 -1
- package/dist/api/device/DeviceRebootToBoardloader.d.ts +1 -0
- package/dist/api/device/DeviceRebootToBoardloader.d.ts.map +1 -1
- package/dist/api/device/DeviceRebootToBootloader.d.ts +1 -0
- package/dist/api/device/DeviceRebootToBootloader.d.ts.map +1 -1
- package/dist/api/device/DeviceSettings.d.ts +1 -0
- package/dist/api/device/DeviceSettings.d.ts.map +1 -1
- package/dist/api/device/DeviceSupportFeatures.d.ts +1 -0
- package/dist/api/device/DeviceSupportFeatures.d.ts.map +1 -1
- package/dist/api/device/DeviceUnlock.d.ts +1 -0
- package/dist/api/device/DeviceUnlock.d.ts.map +1 -1
- package/dist/api/device/DeviceUpdateBootloader.d.ts +5 -1
- package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
- package/dist/api/device/DeviceWipe.d.ts +1 -0
- package/dist/api/device/DeviceWipe.d.ts.map +1 -1
- package/dist/api/device/PreInitialize.d.ts +1 -0
- package/dist/api/device/PreInitialize.d.ts.map +1 -1
- package/dist/api/dynex/DnxGetAddress.d.ts.map +1 -1
- package/dist/api/dynex/DnxSignTransaction.d.ts.map +1 -1
- package/dist/api/evm/EVMGetAddress.d.ts +1 -0
- package/dist/api/evm/EVMGetAddress.d.ts.map +1 -1
- package/dist/api/evm/EVMGetPublicKey.d.ts +1 -0
- package/dist/api/evm/EVMGetPublicKey.d.ts.map +1 -1
- package/dist/api/evm/EVMSignMessage.d.ts +1 -0
- package/dist/api/evm/EVMSignMessage.d.ts.map +1 -1
- package/dist/api/evm/EVMSignMessageEIP712.d.ts.map +1 -1
- package/dist/api/evm/EVMSignTransaction.d.ts +1 -0
- package/dist/api/evm/EVMSignTransaction.d.ts.map +1 -1
- package/dist/api/evm/EVMSignTypedData.d.ts +1 -0
- package/dist/api/evm/EVMSignTypedData.d.ts.map +1 -1
- package/dist/api/evm/EVMVerifyMessage.d.ts +1 -0
- package/dist/api/evm/EVMVerifyMessage.d.ts.map +1 -1
- package/dist/api/evm/protocol.d.ts +3 -0
- package/dist/api/evm/protocol.d.ts.map +1 -0
- package/dist/api/filecoin/FilecoinGetAddress.d.ts +1 -0
- package/dist/api/filecoin/FilecoinGetAddress.d.ts.map +1 -1
- package/dist/api/filecoin/FilecoinSignTransaction.d.ts +1 -0
- package/dist/api/filecoin/FilecoinSignTransaction.d.ts.map +1 -1
- package/dist/api/firmware/FirmwareArtifactSource.d.ts +25 -0
- package/dist/api/firmware/FirmwareArtifactSource.d.ts.map +1 -0
- package/dist/api/firmware/FirmwareHostBinding.d.ts +6 -0
- package/dist/api/firmware/FirmwareHostBinding.d.ts.map +1 -0
- package/dist/api/firmware/FirmwarePreparationError.d.ts +3 -0
- package/dist/api/firmware/FirmwarePreparationError.d.ts.map +1 -0
- package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +8 -0
- package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
- package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts +3 -0
- package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts.map +1 -0
- package/dist/api/firmware/FirmwareUpdatePlan.d.ts +25 -0
- package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +1 -0
- package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +30 -0
- package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +1 -0
- package/dist/api/firmware/getBinary.d.ts +15 -4
- 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/firmware/updateBootloader.d.ts +2 -0
- package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
- package/dist/api/firmware/uploadFirmware.d.ts +9 -1
- package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
- 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 +7 -25
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/kaspa/KaspaGetAddress.d.ts +4 -0
- package/dist/api/kaspa/KaspaGetAddress.d.ts.map +1 -1
- package/dist/api/kaspa/KaspaSignTransaction.d.ts +9 -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/lightning/LnurlAuth.d.ts +0 -4
- package/dist/api/lightning/LnurlAuth.d.ts.map +1 -1
- package/dist/api/near/NearGetAddress.d.ts +1 -0
- package/dist/api/near/NearGetAddress.d.ts.map +1 -1
- package/dist/api/near/NearSignTransaction.d.ts +1 -0
- package/dist/api/near/NearSignTransaction.d.ts.map +1 -1
- package/dist/api/nem/NEMGetAddress.d.ts +1 -0
- package/dist/api/nem/NEMGetAddress.d.ts.map +1 -1
- package/dist/api/nem/NEMSignTransaction.d.ts +1 -0
- package/dist/api/nem/NEMSignTransaction.d.ts.map +1 -1
- package/dist/api/neo/NeoGetAddress.d.ts.map +1 -1
- package/dist/api/neo/NeoSignTransaction.d.ts.map +1 -1
- package/dist/api/nervos/NervosGetAddress.d.ts.map +1 -1
- package/dist/api/nervos/NervosSignTransaction.d.ts.map +1 -1
- package/dist/api/nexa/NexaGetAddress.d.ts.map +1 -1
- package/dist/api/nexa/NexaSignTransaction.d.ts +1 -0
- package/dist/api/nexa/NexaSignTransaction.d.ts.map +1 -1
- package/dist/api/nostr/NostrDecryptMessage.d.ts +1 -0
- package/dist/api/nostr/NostrDecryptMessage.d.ts.map +1 -1
- package/dist/api/nostr/NostrEncryptMessage.d.ts +1 -0
- package/dist/api/nostr/NostrEncryptMessage.d.ts.map +1 -1
- package/dist/api/nostr/NostrGetPublicKey.d.ts +1 -0
- package/dist/api/nostr/NostrGetPublicKey.d.ts.map +1 -1
- package/dist/api/nostr/NostrSignEvent.d.ts +1 -0
- package/dist/api/nostr/NostrSignEvent.d.ts.map +1 -1
- package/dist/api/nostr/NostrSignSchnorr.d.ts +1 -0
- package/dist/api/nostr/NostrSignSchnorr.d.ts.map +1 -1
- package/dist/api/polkadot/PolkadotGetAddress.d.ts +1 -0
- package/dist/api/polkadot/PolkadotGetAddress.d.ts.map +1 -1
- package/dist/api/polkadot/PolkadotSignTransaction.d.ts +1 -0
- package/dist/api/polkadot/PolkadotSignTransaction.d.ts.map +1 -1
- package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts +1 -0
- package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts.map +1 -1
- package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts +1 -0
- package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts.map +1 -1
- package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts +1 -0
- package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts.map +1 -1
- package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts +4 -2
- package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts.map +1 -1
- package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts +7 -0
- package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts.map +1 -0
- package/dist/api/protocol-v2/DeviceInfoGet.d.ts +1 -1
- package/dist/api/protocol-v2/DeviceInfoGet.d.ts.map +1 -1
- package/dist/api/protocol-v2/DeviceReboot.d.ts +1 -0
- package/dist/api/protocol-v2/DeviceReboot.d.ts.map +1 -1
- package/dist/api/protocol-v2/DeviceStatusGet.d.ts +7 -0
- package/dist/api/protocol-v2/DeviceStatusGet.d.ts.map +1 -0
- package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts +27 -0
- package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts.map +1 -0
- package/dist/api/protocol-v2/FilesystemFormat.d.ts +1 -0
- package/dist/api/protocol-v2/FilesystemFormat.d.ts.map +1 -1
- package/dist/api/protocol-v2/FilesystemPermissionFix.d.ts +1 -0
- package/dist/api/protocol-v2/FilesystemPermissionFix.d.ts.map +1 -1
- package/dist/api/protocol-v2/Ping.d.ts +3 -0
- package/dist/api/protocol-v2/Ping.d.ts.map +1 -1
- package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts +1 -0
- package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -1
- package/dist/api/protocol-v2/helpers.d.ts +4 -1
- package/dist/api/protocol-v2/helpers.d.ts.map +1 -1
- package/dist/api/scdo/ScdoGetAddress.d.ts.map +1 -1
- package/dist/api/scdo/ScdoSignMessage.d.ts.map +1 -1
- package/dist/api/scdo/ScdoSignTransaction.d.ts.map +1 -1
- package/dist/api/solana/SolGetAddress.d.ts +1 -0
- package/dist/api/solana/SolGetAddress.d.ts.map +1 -1
- package/dist/api/solana/SolSignMessage.d.ts +1 -0
- package/dist/api/solana/SolSignMessage.d.ts.map +1 -1
- package/dist/api/solana/SolSignOffchainMessage.d.ts +1 -0
- package/dist/api/solana/SolSignOffchainMessage.d.ts.map +1 -1
- package/dist/api/solana/SolSignTransaction.d.ts +1 -0
- package/dist/api/solana/SolSignTransaction.d.ts.map +1 -1
- package/dist/api/starcoin/StarcoinGetAddress.d.ts +1 -0
- package/dist/api/starcoin/StarcoinGetAddress.d.ts.map +1 -1
- package/dist/api/starcoin/StarcoinGetPublicKey.d.ts +1 -0
- package/dist/api/starcoin/StarcoinGetPublicKey.d.ts.map +1 -1
- package/dist/api/starcoin/StarcoinSignMessage.d.ts +1 -0
- package/dist/api/starcoin/StarcoinSignMessage.d.ts.map +1 -1
- package/dist/api/starcoin/StarcoinSignTransaction.d.ts +1 -0
- package/dist/api/starcoin/StarcoinSignTransaction.d.ts.map +1 -1
- package/dist/api/starcoin/StarcoinVerifyMessage.d.ts +1 -0
- package/dist/api/starcoin/StarcoinVerifyMessage.d.ts.map +1 -1
- package/dist/api/stellar/StellarGetAddress.d.ts +1 -2
- package/dist/api/stellar/StellarGetAddress.d.ts.map +1 -1
- package/dist/api/stellar/StellarSignTransaction.d.ts +2 -3
- package/dist/api/stellar/StellarSignTransaction.d.ts.map +1 -1
- package/dist/api/sui/SuiGetAddress.d.ts +1 -0
- package/dist/api/sui/SuiGetAddress.d.ts.map +1 -1
- package/dist/api/sui/SuiGetPublicKey.d.ts +1 -0
- package/dist/api/sui/SuiGetPublicKey.d.ts.map +1 -1
- package/dist/api/sui/SuiSignMessage.d.ts +1 -0
- package/dist/api/sui/SuiSignMessage.d.ts.map +1 -1
- package/dist/api/sui/SuiSignTransaction.d.ts +1 -0
- package/dist/api/sui/SuiSignTransaction.d.ts.map +1 -1
- package/dist/api/ton/TonGetAddress.d.ts +1 -0
- package/dist/api/ton/TonGetAddress.d.ts.map +1 -1
- package/dist/api/ton/TonSignData.d.ts +1 -0
- package/dist/api/ton/TonSignData.d.ts.map +1 -1
- package/dist/api/ton/TonSignMessage.d.ts +1 -0
- package/dist/api/ton/TonSignMessage.d.ts.map +1 -1
- package/dist/api/ton/TonSignProof.d.ts +1 -0
- package/dist/api/ton/TonSignProof.d.ts.map +1 -1
- package/dist/api/tron/TronGetAddress.d.ts +1 -0
- package/dist/api/tron/TronGetAddress.d.ts.map +1 -1
- package/dist/api/tron/TronSignMessage.d.ts +5 -0
- package/dist/api/tron/TronSignMessage.d.ts.map +1 -1
- package/dist/api/tron/TronSignTransaction.d.ts +1 -0
- package/dist/api/tron/TronSignTransaction.d.ts.map +1 -1
- package/dist/api/utils.d.ts +2 -1
- package/dist/api/utils.d.ts.map +1 -1
- package/dist/api/xrp/XrpGetAddress.d.ts +1 -0
- package/dist/api/xrp/XrpGetAddress.d.ts.map +1 -1
- package/dist/api/xrp/XrpSignTransaction.d.ts +1 -0
- package/dist/api/xrp/XrpSignTransaction.d.ts.map +1 -1
- package/dist/constants/index.d.ts +1 -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 -0
- 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 +44 -14
- 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/DeviceConnector.d.ts +1 -1
- package/dist/device/DeviceConnector.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 +5 -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 +27 -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/deviceProfile/protocolV2DeviceIdentity.d.ts +7 -0
- package/dist/deviceProfile/protocolV2DeviceIdentity.d.ts.map +1 -0
- package/dist/events/device.d.ts +12 -2
- package/dist/events/device.d.ts.map +1 -1
- package/dist/events/logBlockEvent.d.ts +2 -0
- package/dist/events/logBlockEvent.d.ts.map +1 -1
- package/dist/events/ui-request.d.ts +19 -2
- package/dist/events/ui-request.d.ts.map +1 -1
- package/dist/index.d.ts +1559 -736
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9238 -3898
- package/dist/inject.d.ts.map +1 -1
- package/dist/lowLevelInject.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 +25 -17
- package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
- package/dist/protocols/protocol-v2/firmware.d.ts +1 -0
- 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 +17 -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/unlockPolicy.d.ts +4 -0
- package/dist/protocols/protocol-v2/unlockPolicy.d.ts.map +1 -0
- package/dist/protocols/protocol-v2/unlockRetry.d.ts +10 -0
- package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +1 -0
- package/dist/protocols/protocol-v2/walletSession.d.ts +22 -0
- package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -0
- package/dist/topLevelInject.d.ts.map +1 -1
- package/dist/types/api/checkAllFirmwareRelease.d.ts +29 -4
- 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 +1 -1
- package/dist/types/api/deviceUnlock.d.ts.map +1 -1
- package/dist/types/api/deviceUpdateBootloader.d.ts +6 -0
- package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
- package/dist/types/api/export.d.ts +6 -2
- package/dist/types/api/export.d.ts.map +1 -1
- package/dist/types/api/firmwareUpdate.d.ts +75 -1
- package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
- package/dist/types/api/firmwareUpdateCapabilities.d.ts +9 -0
- package/dist/types/api/firmwareUpdateCapabilities.d.ts.map +1 -0
- package/dist/types/api/firmwareUpdatePlan.d.ts +28 -0
- package/dist/types/api/firmwareUpdatePlan.d.ts.map +1 -0
- package/dist/types/api/firmwareUpdatePreparedPlan.d.ts +42 -0
- package/dist/types/api/firmwareUpdatePreparedPlan.d.ts.map +1 -0
- 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 +27 -31
- package/dist/types/api/index.d.ts.map +1 -1
- package/dist/types/api/kaspaSignTransaction.d.ts +42 -4
- package/dist/types/api/kaspaSignTransaction.d.ts.map +1 -1
- package/dist/types/api/openWalletSession.d.ts +35 -0
- package/dist/types/api/openWalletSession.d.ts.map +1 -0
- package/dist/types/api/protocolV2.d.ts +15 -84
- package/dist/types/api/protocolV2.d.ts.map +1 -1
- package/dist/types/api/sessionCache.d.ts +13 -0
- package/dist/types/api/sessionCache.d.ts.map +1 -0
- package/dist/types/device.d.ts +132 -8
- package/dist/types/device.d.ts.map +1 -1
- package/dist/types/params.d.ts.map +1 -1
- package/dist/types/settings.d.ts +20 -14
- 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 +6 -3
- package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
- package/dist/utils/deviceInfoUtils.d.ts +9 -9
- 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 +7 -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 +10 -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 +52 -17
- package/src/api/CheckAllFirmwareRelease.ts +344 -4
- package/src/api/CheckBootloaderRelease.ts +1 -2
- package/src/api/CheckFirmwareRelease.ts +1 -2
- package/src/api/CipherKeyValue.ts +4 -0
- package/src/api/ClearSessionCache.ts +32 -0
- package/src/api/DirList.ts +9 -4
- package/src/api/DirMake.ts +7 -4
- package/src/api/DirRemove.ts +7 -4
- package/src/api/FileDelete.ts +7 -4
- package/src/api/FileRead.ts +15 -9
- package/src/api/FileWrite.ts +26 -181
- package/src/api/FirmwareUpdate.ts +11 -12
- package/src/api/FirmwareUpdateV2.ts +370 -112
- package/src/api/FirmwareUpdateV3.ts +266 -68
- package/src/api/FirmwareUpdateV4.ts +1276 -651
- package/src/api/GetDeviceState.ts +59 -0
- package/src/api/GetFeatures.ts +6 -4
- package/src/api/GetOnekeyFeatures.ts +1 -75
- package/src/api/GetPassphraseState.ts +30 -21
- package/src/api/OpenWalletSession.ts +214 -0
- package/src/api/PathInfo.ts +9 -4
- package/src/api/PromptWebDeviceAccess.ts +2 -7
- package/src/api/SearchDevices.ts +29 -4
- package/src/api/UploadPortfolio.ts +40 -0
- package/src/api/alephium/AlephiumGetAddress.ts +0 -4
- package/src/api/alephium/AlephiumSignMessage.ts +0 -4
- package/src/api/alephium/AlephiumSignTransaction.ts +2 -6
- package/src/api/algo/AlgoGetAddress.ts +4 -0
- package/src/api/algo/AlgoSignTransaction.ts +4 -0
- package/src/api/allnetwork/AllNetworkGetAddressBase.ts +9 -21
- package/src/api/aptos/AptosGetAddress.ts +4 -0
- package/src/api/aptos/AptosGetPublicKey.ts +4 -0
- package/src/api/aptos/AptosSignInMessage.ts +4 -0
- package/src/api/aptos/AptosSignMessage.ts +4 -0
- package/src/api/aptos/AptosSignTransaction.ts +4 -0
- package/src/api/benfen/BenfenGetAddress.ts +11 -7
- package/src/api/benfen/BenfenGetPublicKey.ts +0 -4
- package/src/api/benfen/BenfenSignMessage.ts +0 -4
- package/src/api/benfen/BenfenSignTransaction.ts +0 -4
- package/src/api/btc/BTCGetAddress.ts +8 -1
- package/src/api/btc/BTCGetPublicKey.ts +9 -2
- package/src/api/btc/BTCSignMessage.ts +8 -1
- package/src/api/btc/BTCSignPsbt.ts +4 -0
- package/src/api/btc/BTCSignTransaction.ts +8 -1
- package/src/api/btc/BTCVerifyMessage.ts +8 -1
- package/src/api/btc/helpers/versionLimit.ts +7 -4
- package/src/api/cardano/CardanoGetAddress.ts +4 -0
- package/src/api/cardano/CardanoGetPublicKey.ts +4 -0
- package/src/api/cardano/CardanoSignMessage.ts +5 -1
- package/src/api/cardano/CardanoSignTransaction.ts +5 -1
- package/src/api/conflux/ConfluxGetAddress.ts +6 -0
- package/src/api/conflux/ConfluxSignMessage.ts +6 -0
- package/src/api/conflux/ConfluxSignMessageCIP23.ts +6 -0
- package/src/api/conflux/ConfluxSignTransaction.ts +8 -5
- package/src/api/cosmos/CosmosGetAddress.ts +4 -0
- package/src/api/cosmos/CosmosGetPublicKey.ts +4 -0
- package/src/api/cosmos/CosmosSignTransaction.ts +4 -0
- package/src/api/device/DeviceCancel.ts +5 -0
- package/src/api/device/DeviceChangePin.ts +28 -0
- package/src/api/device/DeviceFullyUploadResource.ts +4 -5
- package/src/api/device/DeviceLock.ts +5 -0
- package/src/api/device/DeviceRebootToBoardloader.ts +5 -0
- package/src/api/device/DeviceRebootToBootloader.ts +5 -0
- package/src/api/device/DeviceSettings.ts +194 -1
- package/src/api/device/DeviceSupportFeatures.ts +4 -0
- package/src/api/device/DeviceUnlock.ts +13 -0
- package/src/api/device/DeviceUpdateBootloader.ts +123 -8
- package/src/api/device/DeviceWipe.ts +25 -0
- package/src/api/device/PreInitialize.ts +4 -0
- package/src/api/dynex/DnxGetAddress.ts +0 -6
- package/src/api/dynex/DnxSignTransaction.ts +0 -6
- package/src/api/evm/EVMGetAddress.ts +6 -2
- package/src/api/evm/EVMGetPublicKey.ts +6 -2
- package/src/api/evm/EVMSignMessage.ts +6 -2
- package/src/api/evm/EVMSignMessageEIP712.ts +1 -11
- package/src/api/evm/EVMSignTransaction.ts +6 -2
- package/src/api/evm/EVMSignTypedData.ts +42 -50
- package/src/api/evm/EVMVerifyMessage.ts +6 -2
- 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/evm/protocol.ts +6 -0
- package/src/api/filecoin/FilecoinGetAddress.ts +4 -0
- package/src/api/filecoin/FilecoinSignTransaction.ts +4 -0
- package/src/api/firmware/FirmwareArtifactSource.ts +278 -0
- package/src/api/firmware/FirmwareHostBinding.ts +100 -0
- package/src/api/firmware/FirmwarePreparationError.ts +12 -0
- package/src/api/firmware/FirmwareUpdateBaseMethod.ts +60 -3
- package/src/api/firmware/FirmwareUpdateCapabilities.ts +9 -0
- package/src/api/firmware/FirmwareUpdatePlan.ts +745 -0
- package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +392 -0
- package/src/api/firmware/getBinary.ts +8 -3
- package/src/api/firmware/progressThrottle.ts +44 -0
- package/src/api/firmware/updateBootloader.ts +19 -4
- package/src/api/firmware/uploadFirmware.ts +140 -22
- 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 +199 -0
- package/src/api/index.ts +8 -26
- package/src/api/kaspa/KaspaGetAddress.ts +7 -0
- package/src/api/kaspa/KaspaSignTransaction.ts +380 -29
- package/src/api/kaspa/helpers/TransferSerialize.ts +17 -7
- package/src/api/lightning/LnurlAuth.ts +0 -4
- package/src/api/near/NearGetAddress.ts +4 -0
- package/src/api/near/NearSignTransaction.ts +4 -0
- package/src/api/nem/NEMGetAddress.ts +4 -0
- package/src/api/nem/NEMSignTransaction.ts +4 -0
- package/src/api/neo/NeoGetAddress.ts +0 -4
- package/src/api/neo/NeoSignTransaction.ts +0 -4
- package/src/api/nervos/NervosGetAddress.ts +0 -4
- package/src/api/nervos/NervosSignTransaction.ts +2 -6
- package/src/api/nexa/NexaGetAddress.ts +0 -4
- package/src/api/nexa/NexaSignTransaction.ts +3 -5
- package/src/api/nostr/NostrDecryptMessage.ts +4 -0
- package/src/api/nostr/NostrEncryptMessage.ts +4 -0
- package/src/api/nostr/NostrGetPublicKey.ts +4 -0
- package/src/api/nostr/NostrSignEvent.ts +4 -0
- package/src/api/nostr/NostrSignSchnorr.ts +4 -0
- package/src/api/polkadot/PolkadotGetAddress.ts +4 -0
- package/src/api/polkadot/PolkadotSignTransaction.ts +4 -0
- package/src/api/protocol-v2/DeviceFactoryInfoGet.ts +5 -2
- package/src/api/protocol-v2/DeviceFactoryInfoSet.ts +5 -2
- package/src/api/protocol-v2/DeviceFirmwareUpdate.ts +8 -5
- package/src/api/protocol-v2/DeviceGetFirmwareUpdateStatus.ts +43 -5
- package/src/api/protocol-v2/DeviceGetOnboardingStatus.ts +21 -0
- package/src/api/protocol-v2/DeviceInfoGet.ts +8 -15
- package/src/api/protocol-v2/DeviceReboot.ts +7 -3
- package/src/api/protocol-v2/DeviceStatusGet.ts +19 -0
- package/src/api/protocol-v2/DeviceUploadWallpaper.ts +134 -0
- package/src/api/protocol-v2/FilesystemFormat.ts +9 -3
- package/src/api/protocol-v2/FilesystemPermissionFix.ts +5 -2
- package/src/api/protocol-v2/Ping.ts +37 -3
- package/src/api/protocol-v2/ProtocolInfoRequest.ts +5 -2
- package/src/api/protocol-v2/helpers.ts +21 -16
- package/src/api/scdo/ScdoGetAddress.ts +0 -4
- package/src/api/scdo/ScdoSignMessage.ts +0 -4
- package/src/api/scdo/ScdoSignTransaction.ts +0 -4
- package/src/api/solana/SolGetAddress.ts +4 -0
- package/src/api/solana/SolSignMessage.ts +4 -0
- package/src/api/solana/SolSignOffchainMessage.ts +4 -0
- package/src/api/solana/SolSignTransaction.ts +4 -0
- package/src/api/starcoin/StarcoinGetAddress.ts +4 -0
- package/src/api/starcoin/StarcoinGetPublicKey.ts +4 -0
- package/src/api/starcoin/StarcoinSignMessage.ts +4 -0
- package/src/api/starcoin/StarcoinSignTransaction.ts +4 -0
- package/src/api/starcoin/StarcoinVerifyMessage.ts +4 -0
- package/src/api/stellar/StellarGetAddress.ts +1 -10
- package/src/api/stellar/StellarSignTransaction.ts +1 -14
- package/src/api/sui/SuiGetAddress.ts +4 -0
- package/src/api/sui/SuiGetPublicKey.ts +4 -0
- package/src/api/sui/SuiSignMessage.ts +4 -0
- package/src/api/sui/SuiSignTransaction.ts +4 -0
- package/src/api/ton/TonGetAddress.ts +4 -0
- package/src/api/ton/TonSignData.ts +5 -1
- package/src/api/ton/TonSignMessage.ts +4 -0
- package/src/api/ton/TonSignProof.ts +4 -0
- package/src/api/tron/TronGetAddress.ts +4 -0
- package/src/api/tron/TronSignMessage.ts +18 -7
- package/src/api/tron/TronSignTransaction.ts +4 -0
- package/src/api/utils.ts +7 -3
- package/src/api/xrp/XrpGetAddress.ts +4 -0
- package/src/api/xrp/XrpSignTransaction.ts +5 -1
- package/src/constants/index.ts +1 -4
- package/src/core/RequestQueue.ts +1 -0
- package/src/core/deviceEventRegistration.ts +23 -0
- package/src/core/index.ts +164 -53
- package/src/data/messages/messages-protocol-v2.json +1155 -481
- package/src/data/messages/messages.json +286 -1
- package/src/data-manager/DataManager.ts +39 -39
- package/src/data-manager/TransportManager.ts +1 -1
- package/src/data-manager/connectSettings.ts +15 -0
- package/src/device/Device.ts +647 -281
- package/src/device/DeviceCommands.ts +166 -158
- package/src/device/DeviceConnector.ts +10 -7
- package/src/device/DeviceFeaturesState.ts +25 -0
- package/src/device/DevicePool.ts +66 -16
- package/src/device/DeviceStateMapper.ts +374 -0
- package/src/device/DeviceStateProjector.ts +94 -0
- package/src/device/DeviceStateStore.ts +201 -0
- package/src/device/DeviceWalletSessionStore.ts +144 -0
- package/src/device/cloneDeviceState.ts +39 -0
- package/src/device/deviceIdentity.ts +18 -0
- package/src/deviceProfile/buildDeviceFeatures.ts +224 -190
- package/src/deviceProfile/index.ts +0 -1
- package/src/deviceProfile/protocolV2DeviceIdentity.ts +32 -0
- package/src/events/device.ts +18 -1
- package/src/events/logBlockEvent.ts +79 -2
- package/src/events/ui-request.ts +25 -2
- package/src/index.ts +5 -0
- package/src/inject.ts +37 -43
- package/src/lowLevelInject.ts +5 -1
- package/src/protocols/protocol-v2/deviceSession.ts +24 -0
- package/src/protocols/protocol-v2/features.ts +96 -32
- package/src/protocols/protocol-v2/firmware.ts +2 -1
- package/src/protocols/protocol-v2/index.ts +8 -1
- package/src/protocols/protocol-v2/lockedError.ts +10 -0
- package/src/protocols/protocol-v2/settingsUnlockPolicy.ts +65 -0
- package/src/protocols/protocol-v2/uiInteraction.ts +210 -0
- package/src/protocols/protocol-v2/unlockPolicy.ts +105 -0
- package/src/protocols/protocol-v2/unlockRetry.ts +109 -0
- package/src/protocols/protocol-v2/walletSession.ts +285 -0
- package/src/topLevelInject.ts +5 -1
- package/src/types/api/checkAllFirmwareRelease.ts +50 -4
- package/src/types/api/deviceSettings.ts +26 -2
- package/src/types/api/deviceUnlock.ts +1 -1
- package/src/types/api/deviceUpdateBootloader.ts +6 -0
- package/src/types/api/export.ts +26 -0
- package/src/types/api/firmwareUpdate.ts +99 -5
- package/src/types/api/firmwareUpdateCapabilities.ts +9 -0
- package/src/types/api/firmwareUpdatePlan.ts +38 -0
- package/src/types/api/firmwareUpdatePreparedPlan.ts +53 -0
- 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 +9 -11
- package/src/types/api/index.ts +39 -64
- package/src/types/api/kaspaSignTransaction.ts +60 -4
- package/src/types/api/openWalletSession.ts +54 -0
- package/src/types/api/protocolV2.ts +24 -143
- package/src/types/api/sessionCache.ts +19 -0
- package/src/types/device.ts +185 -7
- package/src/types/params.ts +3 -2
- package/src/types/settings.ts +30 -16
- package/src/utils/assets.ts +4 -1
- package/src/utils/deviceFeaturesCompat.ts +180 -0
- package/src/utils/deviceFeaturesUtils.ts +52 -45
- package/src/utils/deviceInfoUtils.ts +27 -69
- package/src/utils/deviceSettings.ts +171 -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 -2
- package/src/utils/networkUtils.ts +274 -16
- package/src/utils/pro2Wallpaper.ts +103 -0
- package/src/utils/tracing.ts +3 -1
- package/tsconfig.type-tests.json +12 -0
- package/dist/api/GetDeviceInfo.d.ts +0 -9
- package/dist/api/GetDeviceInfo.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/deviceProfile/buildDeviceProfile.d.ts +0 -21
- package/dist/deviceProfile/buildDeviceProfile.d.ts.map +0 -1
- package/dist/types/api/getDeviceInfo.d.ts +0 -87
- package/dist/types/api/getDeviceInfo.d.ts.map +0 -1
- package/src/api/GetDeviceInfo.ts +0 -145
- package/src/api/protocol-v2/FilesystemDiskControl.ts +0 -50
- package/src/deviceProfile/buildDeviceProfile.ts +0 -352
- package/src/types/api/getDeviceInfo.ts +0 -101
package/src/device/Device.ts
CHANGED
|
@@ -1,39 +1,45 @@
|
|
|
1
1
|
import EventEmitter from 'events';
|
|
2
2
|
import semver from 'semver';
|
|
3
|
-
import { Enum_Capability } from '@onekeyfe/hd-transport';
|
|
3
|
+
import { DeviceRebootType, DeviceSessionPinType, Enum_Capability } from '@onekeyfe/hd-transport';
|
|
4
4
|
import {
|
|
5
5
|
EDeviceType,
|
|
6
|
+
EFirmwareType,
|
|
6
7
|
ERRORS,
|
|
7
8
|
ERROR_CODES_REQUIRE_DISCONNECT,
|
|
8
9
|
ERROR_CODES_REQUIRE_RELEASE,
|
|
9
10
|
HardwareError,
|
|
10
11
|
HardwareErrorCode,
|
|
11
12
|
createDeferred,
|
|
13
|
+
createDeviceNotSupportMethodError,
|
|
12
14
|
} from '@onekeyfe/hd-shared';
|
|
13
15
|
|
|
14
|
-
import {
|
|
15
|
-
LoggerNames,
|
|
16
|
-
getDeviceBLEFirmwareVersion,
|
|
17
|
-
getDeviceBleName,
|
|
18
|
-
getDeviceFirmwareVersion,
|
|
19
|
-
getDeviceLabel,
|
|
20
|
-
getDeviceType,
|
|
21
|
-
getDeviceUUID,
|
|
22
|
-
getFirmwareType,
|
|
23
|
-
getLogger,
|
|
24
|
-
} from '../utils';
|
|
16
|
+
import { LoggerNames, getLogger } from '../utils';
|
|
25
17
|
import {
|
|
26
18
|
fixFeaturesFirmwareVersion,
|
|
27
19
|
getPassphraseStateWithRefreshDeviceInfo,
|
|
28
|
-
supportInputPinOnSoftware,
|
|
29
|
-
supportModifyHomescreen,
|
|
30
20
|
} from '../utils/deviceFeaturesUtils';
|
|
21
|
+
import { parseDeviceVersion } from '../utils/deviceVersionUtils';
|
|
31
22
|
import { generateInstanceId } from '../utils/tracing';
|
|
32
23
|
// eslint-disable-next-line import/no-cycle
|
|
33
24
|
import { DeviceCommands } from './DeviceCommands';
|
|
25
|
+
import { mergeDeviceFeaturesPatch } from './DeviceFeaturesState';
|
|
26
|
+
import {
|
|
27
|
+
mapDeviceSettingsToState,
|
|
28
|
+
mapFeaturesToState,
|
|
29
|
+
mapProtocolV1OnekeyFeaturesToState,
|
|
30
|
+
mapProtocolV2DeviceInfoToState,
|
|
31
|
+
mapProtocolV2DeviceStatusToState,
|
|
32
|
+
} from './DeviceStateMapper';
|
|
33
|
+
import { projectFeatures } from './DeviceStateProjector';
|
|
34
|
+
import { DeviceStateStore, createPublicDeviceState } from './DeviceStateStore';
|
|
35
|
+
import { cloneDeviceState } from './cloneDeviceState';
|
|
36
|
+
import { deviceWalletSessionStore } from './DeviceWalletSessionStore';
|
|
34
37
|
import {
|
|
35
38
|
type DeviceFirmwareRange,
|
|
36
39
|
DeviceModelToTypes,
|
|
40
|
+
type DeviceStateEvent,
|
|
41
|
+
type DeviceStatePatch,
|
|
42
|
+
type DeviceStateUpdateSource,
|
|
37
43
|
DeviceTypeToModels,
|
|
38
44
|
type Device as DeviceTyped,
|
|
39
45
|
EOneKeyDeviceMode,
|
|
@@ -48,14 +54,23 @@ import { DEVICE, UI_REQUEST } from '../events';
|
|
|
48
54
|
import { DataManager } from '../data-manager';
|
|
49
55
|
import TransportManager from '../data-manager/TransportManager';
|
|
50
56
|
import { toHardened } from '../api/helpers/pathUtils';
|
|
51
|
-
import { existCapability } from '../utils/capabilitieUtils';
|
|
52
57
|
import {
|
|
53
|
-
|
|
58
|
+
PROTOCOL_V2_DEVICE_STATUS_GET_MESSAGE_TYPE,
|
|
59
|
+
PROTOCOL_V2_FEATURES_DEVICE_INFO_REQUEST,
|
|
60
|
+
PROTOCOL_V2_FULL_DEVICE_INFO_REQUEST,
|
|
61
|
+
PROTOCOL_V2_VERSIONS_DEVICE_INFO_REQUEST,
|
|
62
|
+
type ProtocolV2RuntimeMode,
|
|
63
|
+
getProtocolV2RuntimeMode,
|
|
54
64
|
requestProtocolV2DeviceInfo,
|
|
65
|
+
requestProtocolV2DeviceStatus,
|
|
66
|
+
requestProtocolV2ProtocolInfo,
|
|
67
|
+
supportsProtocolV2Message,
|
|
55
68
|
} from '../protocols/protocol-v2/features';
|
|
56
|
-
import { buildProtocolV1FeaturesPayload
|
|
69
|
+
import { buildProtocolV1FeaturesPayload } from '../deviceProfile';
|
|
70
|
+
import { resolveProtocolV2DeviceIdentity } from '../deviceProfile/protocolV2DeviceIdentity';
|
|
57
71
|
|
|
58
72
|
import type { PROTO } from '../constants';
|
|
73
|
+
import type { DeviceStateReadOptions } from '../types/api/getDeviceState';
|
|
59
74
|
import type {
|
|
60
75
|
DeviceButtonRequestPayload,
|
|
61
76
|
DeviceFeaturesPayload,
|
|
@@ -65,6 +80,8 @@ import type { PassphrasePromptResponse } from './DeviceCommands';
|
|
|
65
80
|
import type { Deferred, HardwareConnectProtocol } from '@onekeyfe/hd-shared';
|
|
66
81
|
import type {
|
|
67
82
|
OneKeyDeviceInfo as DeviceDescriptor,
|
|
83
|
+
DeviceStatus,
|
|
84
|
+
ProtocolInfo,
|
|
68
85
|
ProtocolV2DeviceInfo,
|
|
69
86
|
Success,
|
|
70
87
|
} from '@onekeyfe/hd-transport';
|
|
@@ -77,6 +94,8 @@ export type InitOptions = {
|
|
|
77
94
|
deriveCardano?: boolean;
|
|
78
95
|
connectProtocol?: HardwareConnectProtocol;
|
|
79
96
|
protocolV2DeviceInfoTimeoutMs?: number;
|
|
97
|
+
/** Refresh Protocol V2 runtime state before returning discovery results. */
|
|
98
|
+
refreshRuntimeState?: boolean;
|
|
80
99
|
};
|
|
81
100
|
|
|
82
101
|
export type RunOptions = {
|
|
@@ -91,11 +110,33 @@ const parseRunOptions = (options?: RunOptions): RunOptions => {
|
|
|
91
110
|
|
|
92
111
|
const Log = getLogger(LoggerNames.Device);
|
|
93
112
|
|
|
113
|
+
const isProtocolV2DeviceStatusUnsupportedError = (error: unknown) => {
|
|
114
|
+
if (error instanceof HardwareError) {
|
|
115
|
+
if (error.errorCode === HardwareErrorCode.DeviceNotSupportMethod) {
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
if (error.params?.failureCode === 'Failure_UnexpectedMessage') {
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const message =
|
|
124
|
+
error instanceof Error
|
|
125
|
+
? error.message
|
|
126
|
+
: String((error as { message?: unknown } | null)?.message ?? error ?? '');
|
|
127
|
+
return (
|
|
128
|
+
/^Failure_UnexpectedMessage(?:,|\b)/i.test(message) ||
|
|
129
|
+
/\b(?:unsupported message|handler not registered|message handler not found)\b/i.test(message)
|
|
130
|
+
);
|
|
131
|
+
};
|
|
132
|
+
|
|
94
133
|
export interface DeviceEvents {
|
|
95
134
|
[DEVICE.PIN]: [Device, PROTO.PinMatrixRequestType | undefined, (err: any, pin: string) => void];
|
|
96
|
-
[DEVICE.PASSPHRASE_ON_DEVICE]: [Device,
|
|
135
|
+
[DEVICE.PASSPHRASE_ON_DEVICE]: [Device, PassphraseRequestPayload?];
|
|
136
|
+
[DEVICE.ATTACH_PIN_ON_DEVICE]: [Device, PassphraseRequestPayload?];
|
|
97
137
|
[DEVICE.BUTTON]: [Device, DeviceButtonRequestPayload];
|
|
98
138
|
[DEVICE.FEATURES]: [Device, DeviceFeaturesPayload];
|
|
139
|
+
[DEVICE.STATE]: [Device, DeviceStateEvent];
|
|
99
140
|
[DEVICE.PASSPHRASE]: [
|
|
100
141
|
Device,
|
|
101
142
|
PassphraseRequestPayload,
|
|
@@ -119,15 +160,14 @@ export interface Device {
|
|
|
119
160
|
emit<K extends keyof DeviceEvents>(type: K, ...args: DeviceEvents[K]): boolean;
|
|
120
161
|
}
|
|
121
162
|
|
|
122
|
-
const deviceSessionCache: Record<string, string> = {};
|
|
123
|
-
|
|
124
163
|
/**
|
|
125
164
|
* Pre-populate the device session cache with a known session ID.
|
|
126
165
|
*
|
|
127
166
|
* This allows short-lived processes (e.g. CLI) to restore a previously
|
|
128
167
|
* obtained session, avoiding the need to re-enter passphrase on every
|
|
129
168
|
* invocation. The session must have been obtained from a prior
|
|
130
|
-
*
|
|
169
|
+
* wallet-session call on the same device. This compatibility hook is intended
|
|
170
|
+
* for a trusted CLI process restoring its own OS-keychain entry.
|
|
131
171
|
*
|
|
132
172
|
* @param deviceId - The device's device_id (from features)
|
|
133
173
|
* @param passphraseState - The passphrase state token
|
|
@@ -138,8 +178,7 @@ export function preloadSessionCache(
|
|
|
138
178
|
passphraseState: string,
|
|
139
179
|
sessionId: string
|
|
140
180
|
): void {
|
|
141
|
-
|
|
142
|
-
deviceSessionCache[key] = sessionId;
|
|
181
|
+
deviceWalletSessionStore.set(deviceId, passphraseState, sessionId);
|
|
143
182
|
}
|
|
144
183
|
|
|
145
184
|
export class Device extends EventEmitter {
|
|
@@ -185,22 +224,34 @@ export class Device extends EventEmitter {
|
|
|
185
224
|
*/
|
|
186
225
|
private deviceAcquired = false;
|
|
187
226
|
|
|
188
|
-
/**
|
|
189
|
-
|
|
190
|
-
*
|
|
191
|
-
* V1 直接保存原生 Features;V2 保存由 DeviceInfoGet 映射出的
|
|
192
|
-
* Features 视图。Device 不再保存 profile,结构化 DeviceProfile 只作为
|
|
193
|
-
* getDeviceInfo() 的 API 返回值存在。
|
|
194
|
-
*/
|
|
195
|
-
features: Features | undefined = undefined;
|
|
227
|
+
/** Canonical device-state cache; legacy Features is a compatibility projection. */
|
|
228
|
+
private stateStore = new DeviceStateStore();
|
|
196
229
|
|
|
197
|
-
/**
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
230
|
+
/** Force the next initialization to reload DeviceInfo after reconnect or reboot. */
|
|
231
|
+
private protocolV2StateNeedsReload = false;
|
|
232
|
+
|
|
233
|
+
get state() {
|
|
234
|
+
return this.stateStore.getState();
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
get features(): Features | undefined {
|
|
238
|
+
if (!this.state) return undefined;
|
|
239
|
+
return projectFeatures(this.state);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
set features(features: Features | undefined) {
|
|
243
|
+
this.stateStore = new DeviceStateStore();
|
|
244
|
+
if (features) {
|
|
245
|
+
this.stateStore.update(mapFeaturesToState(features), 'compatibility');
|
|
246
|
+
const { passphraseState } = features;
|
|
247
|
+
const sessionId = features.sessionId ?? features.session_id;
|
|
248
|
+
const deviceKey = this.getSessionCacheDeviceKey(features.deviceId ?? undefined);
|
|
249
|
+
if (passphraseState && sessionId && deviceKey) {
|
|
250
|
+
this.passphraseState = passphraseState;
|
|
251
|
+
deviceWalletSessionStore.set(deviceKey, passphraseState, sessionId);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
204
255
|
|
|
205
256
|
runPromise?: Deferred<void> | null;
|
|
206
257
|
|
|
@@ -254,38 +305,46 @@ export class Device extends EventEmitter {
|
|
|
254
305
|
|
|
255
306
|
// simplified object to pass via postMessage
|
|
256
307
|
toMessageObject(): DeviceTyped | null {
|
|
257
|
-
if (this.isUnacquired()) return null;
|
|
308
|
+
if (this.isUnacquired() || !this.features) return null;
|
|
258
309
|
|
|
259
310
|
const env = DataManager.getSettings('env');
|
|
260
311
|
const deviceType = this.getCurrentDeviceType();
|
|
261
312
|
|
|
262
313
|
const bleName = this.getCurrentBleName();
|
|
263
|
-
const
|
|
314
|
+
const displayName = this.getCurrentDisplayName();
|
|
264
315
|
const serialNo = this.getCurrentSerialNo();
|
|
265
316
|
const connectId = this.getConnectId();
|
|
266
317
|
const deviceId = this.getCurrentDeviceId() || null;
|
|
267
318
|
|
|
268
|
-
const features = this
|
|
319
|
+
const { features } = this;
|
|
320
|
+
const state = this.state ? createPublicDeviceState(this.state) : undefined;
|
|
269
321
|
|
|
270
322
|
return {
|
|
271
|
-
/** Android uses
|
|
323
|
+
/** Android uses a MAC address, while iOS and USB use transport-specific identifiers. */
|
|
272
324
|
connectId: DataManager.isBleConnect(env) ? this.mainId || null : connectId,
|
|
273
|
-
/**
|
|
325
|
+
/** Persist this after the first active probe so later calls do not need to guess. */
|
|
326
|
+
connectProtocol: this.originalDescriptor.protocolType,
|
|
327
|
+
/** Stable physical-device identity. */
|
|
328
|
+
serialNo,
|
|
329
|
+
/** @deprecated Use serialNo instead. */
|
|
274
330
|
uuid: serialNo,
|
|
275
331
|
commType: this.originalDescriptor.commType,
|
|
276
332
|
sdkInstanceId: this.sdkInstanceId,
|
|
277
333
|
instanceId: this.instanceId,
|
|
278
334
|
createdAt: this.createdAt,
|
|
279
335
|
deviceType,
|
|
280
|
-
/** ID
|
|
336
|
+
/** Wallet-lifecycle ID; changes after the device is wiped or reinitialized. */
|
|
281
337
|
deviceId,
|
|
282
338
|
path: this.originalDescriptor?.path,
|
|
283
339
|
bleName,
|
|
284
|
-
name:
|
|
285
|
-
|
|
340
|
+
name: displayName || bleName || `OneKey ${deviceType?.toUpperCase()}`,
|
|
341
|
+
// Keep the legacy top-level field string-compatible while preserving
|
|
342
|
+
// the canonical nullable value at state.identity.label.
|
|
343
|
+
label: displayName ?? '',
|
|
344
|
+
status: this.getStatus(),
|
|
286
345
|
mode: this.getMode(),
|
|
287
346
|
features,
|
|
288
|
-
|
|
347
|
+
state,
|
|
289
348
|
firmwareVersion: this.getFirmwareVersion(),
|
|
290
349
|
bleFirmwareVersion: this.getBLEFirmwareVersion(),
|
|
291
350
|
unavailableCapabilities: this.unavailableCapabilities,
|
|
@@ -301,6 +360,10 @@ export class Device extends EventEmitter {
|
|
|
301
360
|
// eslint-disable-next-line no-async-promise-executor
|
|
302
361
|
return new Promise<boolean>(async (resolve, reject) => {
|
|
303
362
|
if (DataManager.isBleConnect(env)) {
|
|
363
|
+
if (this.hasDeviceAcquire() && this.commands && !this.commands.disposed) {
|
|
364
|
+
resolve(true);
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
304
367
|
try {
|
|
305
368
|
await this.acquire(connectProtocol);
|
|
306
369
|
resolve(true);
|
|
@@ -328,25 +391,25 @@ export class Device extends EventEmitter {
|
|
|
328
391
|
}
|
|
329
392
|
|
|
330
393
|
async acquire(
|
|
331
|
-
|
|
394
|
+
expectedProtocol?: HardwareConnectProtocol,
|
|
332
395
|
options?: { throwOnRunPromiseError?: boolean }
|
|
333
396
|
) {
|
|
334
397
|
const env = DataManager.getSettings('env');
|
|
335
398
|
const mainIdKey = DataManager.isBleConnect(env) ? 'id' : 'session';
|
|
336
|
-
const
|
|
399
|
+
const protocolHint = expectedProtocol ? undefined : this.originalDescriptor.protocolType;
|
|
337
400
|
try {
|
|
338
401
|
let acquireResult: unknown;
|
|
339
402
|
if (DataManager.isBleConnect(env)) {
|
|
340
|
-
//
|
|
341
|
-
//
|
|
342
|
-
//
|
|
343
|
-
//
|
|
344
|
-
// 因此对 BLE acquire 恒清理是有意为之。
|
|
403
|
+
// acquire starts a new BLE session. Any previous runPromise belongs to a dead
|
|
404
|
+
// session, such as an interrupted probe or firmware-update reboot, and would
|
|
405
|
+
// otherwise block the new session. Device cannot distinguish recovery from a
|
|
406
|
+
// regular acquire, so BLE always clears it intentionally.
|
|
345
407
|
acquireResult = await this.deviceConnector?.acquire(
|
|
346
408
|
this.originalDescriptor.id,
|
|
347
409
|
undefined,
|
|
348
410
|
true,
|
|
349
|
-
expectedProtocol
|
|
411
|
+
expectedProtocol,
|
|
412
|
+
protocolHint
|
|
350
413
|
);
|
|
351
414
|
this.mainId = (acquireResult as any)?.uuid ?? '';
|
|
352
415
|
Log.debug('Expected uuid:', this.mainId);
|
|
@@ -355,7 +418,8 @@ export class Device extends EventEmitter {
|
|
|
355
418
|
this.originalDescriptor.path,
|
|
356
419
|
this.originalDescriptor.session,
|
|
357
420
|
undefined,
|
|
358
|
-
expectedProtocol
|
|
421
|
+
expectedProtocol,
|
|
422
|
+
protocolHint
|
|
359
423
|
);
|
|
360
424
|
this.mainId = acquireResult as string | undefined;
|
|
361
425
|
Log.debug('Expected session id:', this.mainId);
|
|
@@ -482,12 +546,11 @@ export class Device extends EventEmitter {
|
|
|
482
546
|
}
|
|
483
547
|
|
|
484
548
|
/**
|
|
485
|
-
*
|
|
549
|
+
* Canonical protocol discriminator.
|
|
486
550
|
*
|
|
487
|
-
* descriptor.protocolType
|
|
488
|
-
*
|
|
489
|
-
*
|
|
490
|
-
* 或从 features 反推。
|
|
551
|
+
* descriptor.protocolType is established by active probing; V2 features are mapped
|
|
552
|
+
* from DeviceInfoGet. All protocol branches must use this method instead of reading
|
|
553
|
+
* originalDescriptor.protocolType directly or inferring a protocol from features.
|
|
491
554
|
*/
|
|
492
555
|
getProtocol(): 'V1' | 'V2' {
|
|
493
556
|
return this.originalDescriptor.protocolType === 'V2' ? 'V2' : 'V1';
|
|
@@ -498,53 +561,75 @@ export class Device extends EventEmitter {
|
|
|
498
561
|
}
|
|
499
562
|
|
|
500
563
|
getCurrentDeviceType() {
|
|
501
|
-
return
|
|
564
|
+
return this.state?.identity.deviceType ?? EDeviceType.Unknown;
|
|
502
565
|
}
|
|
503
566
|
|
|
504
567
|
getCurrentDeviceId() {
|
|
505
|
-
return this.
|
|
568
|
+
return this.state?.identity.deviceId || undefined;
|
|
506
569
|
}
|
|
507
570
|
|
|
508
571
|
getCurrentSerialNo() {
|
|
509
|
-
return this.
|
|
572
|
+
return this.state?.identity.serialNo ?? '';
|
|
510
573
|
}
|
|
511
574
|
|
|
512
575
|
getConnectId() {
|
|
513
576
|
const serialNo = this.getCurrentSerialNo();
|
|
514
577
|
if (serialNo) return serialNo;
|
|
515
578
|
|
|
516
|
-
// connectId
|
|
517
|
-
//
|
|
579
|
+
// connectId is an internal routing key. Falling back to the transport descriptor
|
|
580
|
+
// does not change the business meaning of features.serialNo or deviceId.
|
|
518
581
|
return this.originalDescriptor.path || this.originalDescriptor.id || '';
|
|
519
582
|
}
|
|
520
583
|
|
|
521
584
|
getCurrentBleName() {
|
|
522
|
-
return
|
|
585
|
+
return this.state?.identity.bleName ?? null;
|
|
523
586
|
}
|
|
524
587
|
|
|
525
588
|
getCurrentLabel() {
|
|
526
|
-
return
|
|
589
|
+
return this.state?.identity.label ?? null;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
getCurrentDisplayName() {
|
|
593
|
+
if (!this.state) return null;
|
|
594
|
+
|
|
595
|
+
const label = this.getCurrentLabel();
|
|
596
|
+
if (label) return label;
|
|
597
|
+
|
|
598
|
+
const bleName = this.getCurrentBleName();
|
|
599
|
+
if (bleName) return bleName;
|
|
600
|
+
|
|
601
|
+
const deviceType = this.getCurrentDeviceType();
|
|
602
|
+
if (deviceType === EDeviceType.ClassicPure) {
|
|
603
|
+
return 'OneKey Classic 1S';
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
return `OneKey ${deviceType.charAt(0).toUpperCase() + deviceType.slice(1)}`;
|
|
527
607
|
}
|
|
528
608
|
|
|
529
609
|
getCurrentPassphraseProtection() {
|
|
530
|
-
return this.
|
|
610
|
+
return this.state?.status.passphraseProtection;
|
|
531
611
|
}
|
|
532
612
|
|
|
533
613
|
getCurrentFirmwareType() {
|
|
534
|
-
return
|
|
614
|
+
return this.state?.identity.firmwareType ?? EFirmwareType.Universal;
|
|
535
615
|
}
|
|
536
616
|
|
|
537
617
|
getCurrentFirmwareVersionString() {
|
|
538
|
-
return
|
|
618
|
+
return parseDeviceVersion(this.state?.versions.firmware).join('.');
|
|
539
619
|
}
|
|
540
620
|
|
|
541
621
|
getCurrentBLEFirmwareVersionString() {
|
|
542
|
-
if (!this.
|
|
543
|
-
return
|
|
622
|
+
if (!this.state) return undefined;
|
|
623
|
+
return parseDeviceVersion(this.state.versions.ble).join('.');
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
getCurrentBootloaderVersionString() {
|
|
627
|
+
if (!this.state) return undefined;
|
|
628
|
+
return parseDeviceVersion(this.state.versions.bootloader).join('.');
|
|
544
629
|
}
|
|
545
630
|
|
|
546
631
|
getCurrentSafetyChecks() {
|
|
547
|
-
return this.
|
|
632
|
+
return this.state?.settings.safetyChecks;
|
|
548
633
|
}
|
|
549
634
|
|
|
550
635
|
getCurrentMethodVersionRange(
|
|
@@ -589,8 +674,6 @@ export class Device extends EventEmitter {
|
|
|
589
674
|
}
|
|
590
675
|
|
|
591
676
|
supportInputPinOnSoftware(): SupportFeatureType {
|
|
592
|
-
if (this.features) return supportInputPinOnSoftware(this.features);
|
|
593
|
-
|
|
594
677
|
const deviceType = this.getCurrentDeviceType();
|
|
595
678
|
if (
|
|
596
679
|
deviceType === EDeviceType.Touch ||
|
|
@@ -608,15 +691,12 @@ export class Device extends EventEmitter {
|
|
|
608
691
|
}
|
|
609
692
|
|
|
610
693
|
supportModifyHomescreen(): SupportFeatureType {
|
|
611
|
-
// Pro2
|
|
612
|
-
//
|
|
613
|
-
// 包含 homescreen 字段,V2 固件从首个版本即支持修改主屏。
|
|
694
|
+
// Pro2 has an independent 1.x version line and must not use the Touch/Pro 3.4.0
|
|
695
|
+
// threshold. ApplySettings includes homescreen from the first V2 firmware version.
|
|
614
696
|
if (this.isProtocolV2()) {
|
|
615
697
|
return { support: true };
|
|
616
698
|
}
|
|
617
699
|
|
|
618
|
-
if (this.features) return supportModifyHomescreen(this.features);
|
|
619
|
-
|
|
620
700
|
const deviceType = this.getCurrentDeviceType();
|
|
621
701
|
if (DeviceModelToTypes.model_mini.includes(deviceType)) {
|
|
622
702
|
return { support: true };
|
|
@@ -628,29 +708,29 @@ export class Device extends EventEmitter {
|
|
|
628
708
|
};
|
|
629
709
|
}
|
|
630
710
|
|
|
631
|
-
private generateStateKey(deviceId: string, passphraseState?: string) {
|
|
632
|
-
if (passphraseState) {
|
|
633
|
-
return `${deviceId}@${passphraseState}`;
|
|
634
|
-
}
|
|
635
|
-
return deviceId;
|
|
636
|
-
}
|
|
637
|
-
|
|
638
711
|
private getSessionCacheDeviceKey(_deviceId?: string) {
|
|
639
712
|
const deviceId = _deviceId || this.getCurrentDeviceId();
|
|
640
713
|
if (deviceId) return deviceId;
|
|
641
714
|
if (this.isProtocolV2()) {
|
|
642
|
-
return this.originalDescriptor.path
|
|
715
|
+
return this.originalDescriptor.path;
|
|
643
716
|
}
|
|
644
717
|
return undefined;
|
|
645
718
|
}
|
|
646
719
|
|
|
720
|
+
private reconcileSessionCacheDeviceIdentity(previousDeviceId?: string) {
|
|
721
|
+
deviceWalletSessionStore.reconcileDeviceIdentity({
|
|
722
|
+
temporaryKey: this.isProtocolV2() ? this.originalDescriptor.path : undefined,
|
|
723
|
+
previousDeviceId,
|
|
724
|
+
nextDeviceId: this.getCurrentDeviceId(),
|
|
725
|
+
});
|
|
726
|
+
}
|
|
727
|
+
|
|
647
728
|
getInternalState(_deviceId?: string) {
|
|
648
|
-
Log.debug('getInternalState session cache: ', deviceSessionCache);
|
|
649
729
|
Log.debug(
|
|
650
730
|
'getInternalState session param: ',
|
|
651
731
|
`device_id: ${_deviceId}`,
|
|
652
|
-
`
|
|
653
|
-
`
|
|
732
|
+
`currentDeviceId: ${this.getCurrentDeviceId()}`,
|
|
733
|
+
`hasPassphraseState: ${Boolean(this.passphraseState)}`
|
|
654
734
|
);
|
|
655
735
|
|
|
656
736
|
const deviceId = this.getSessionCacheDeviceKey(_deviceId);
|
|
@@ -663,8 +743,13 @@ export class Device extends EventEmitter {
|
|
|
663
743
|
// downstream call carries it and hits the primary lookup below.
|
|
664
744
|
if (!this.passphraseState) return undefined;
|
|
665
745
|
|
|
666
|
-
|
|
667
|
-
|
|
746
|
+
return deviceWalletSessionStore.get(deviceId, this.passphraseState);
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
getStandardInternalState(_deviceId?: string) {
|
|
750
|
+
const deviceId = this.getSessionCacheDeviceKey(_deviceId);
|
|
751
|
+
if (!deviceId) return undefined;
|
|
752
|
+
return deviceWalletSessionStore.getStandard(deviceId);
|
|
668
753
|
}
|
|
669
754
|
|
|
670
755
|
// attach to pin to fix internal state
|
|
@@ -673,46 +758,45 @@ export class Device extends EventEmitter {
|
|
|
673
758
|
passphraseState: string | undefined,
|
|
674
759
|
deviceId: string | undefined,
|
|
675
760
|
sessionId: string | null = null,
|
|
676
|
-
featuresSessionId: string | null = null
|
|
761
|
+
featuresSessionId: string | null = null,
|
|
762
|
+
walletType: 'standard' | 'hidden' = 'hidden'
|
|
677
763
|
) {
|
|
678
764
|
Log.debug(
|
|
679
765
|
'updateInternalState session param: ',
|
|
680
766
|
`device_id: ${deviceId}`,
|
|
681
767
|
`enablePassphrase: ${enablePassphrase}`,
|
|
682
|
-
`
|
|
683
|
-
`
|
|
684
|
-
`
|
|
768
|
+
`hasPassphraseState: ${Boolean(passphraseState)}`,
|
|
769
|
+
`hasSessionId: ${Boolean(sessionId)}`,
|
|
770
|
+
`hasFeaturesSessionId: ${Boolean(featuresSessionId)}`
|
|
685
771
|
);
|
|
686
772
|
|
|
687
773
|
const cacheDeviceKey = this.getSessionCacheDeviceKey(deviceId);
|
|
688
774
|
if (!cacheDeviceKey) return;
|
|
689
775
|
|
|
690
776
|
if (enablePassphrase) {
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
777
|
+
const walletSessionId =
|
|
778
|
+
sessionId || featuresSessionId || deviceWalletSessionStore.getPending(cacheDeviceKey);
|
|
779
|
+
if (walletType === 'standard') {
|
|
780
|
+
deviceWalletSessionStore.setStandard(
|
|
781
|
+
cacheDeviceKey,
|
|
782
|
+
passphraseState,
|
|
783
|
+
walletSessionId ?? undefined
|
|
784
|
+
);
|
|
785
|
+
} else {
|
|
786
|
+
deviceWalletSessionStore.set(cacheDeviceKey, passphraseState, walletSessionId ?? undefined);
|
|
697
787
|
}
|
|
698
788
|
}
|
|
699
789
|
|
|
700
|
-
|
|
701
|
-
const oldKey = `${cacheDeviceKey}`;
|
|
702
|
-
if (deviceSessionCache[oldKey]) {
|
|
703
|
-
delete deviceSessionCache[oldKey];
|
|
704
|
-
}
|
|
705
|
-
|
|
706
|
-
Log.debug('updateInternalState session cache: ', deviceSessionCache);
|
|
790
|
+
deviceWalletSessionStore.deletePending(cacheDeviceKey);
|
|
707
791
|
}
|
|
708
792
|
|
|
709
793
|
private setInternalState(state: string, initSession?: boolean) {
|
|
710
794
|
Log.debug(
|
|
711
795
|
'setInternalState session param: ',
|
|
712
|
-
`
|
|
796
|
+
`hasState: ${Boolean(state)}`,
|
|
713
797
|
`initSession: ${initSession}`,
|
|
714
|
-
`deviceId: ${this.
|
|
715
|
-
`
|
|
798
|
+
`deviceId: ${this.getCurrentDeviceId()}`,
|
|
799
|
+
`hasPassphraseState: ${Boolean(this.passphraseState)}`
|
|
716
800
|
);
|
|
717
801
|
|
|
718
802
|
if (!this.passphraseState && !initSession) return;
|
|
@@ -720,12 +804,11 @@ export class Device extends EventEmitter {
|
|
|
720
804
|
const deviceId = this.getSessionCacheDeviceKey();
|
|
721
805
|
if (!deviceId) return;
|
|
722
806
|
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
if (
|
|
726
|
-
|
|
807
|
+
if (this.passphraseState) {
|
|
808
|
+
deviceWalletSessionStore.set(deviceId, this.passphraseState, state);
|
|
809
|
+
} else if (initSession) {
|
|
810
|
+
deviceWalletSessionStore.setPending(deviceId, state);
|
|
727
811
|
}
|
|
728
|
-
Log.debug('setInternalState done session cache: ', deviceSessionCache);
|
|
729
812
|
}
|
|
730
813
|
|
|
731
814
|
clearInternalState(_deviceId?: string) {
|
|
@@ -733,70 +816,80 @@ export class Device extends EventEmitter {
|
|
|
733
816
|
|
|
734
817
|
const deviceId = this.getSessionCacheDeviceKey(_deviceId);
|
|
735
818
|
if (!deviceId) return;
|
|
736
|
-
|
|
737
|
-
delete deviceSessionCache[key];
|
|
819
|
+
deviceWalletSessionStore.deletePending(deviceId);
|
|
738
820
|
|
|
739
821
|
if (this.passphraseState) {
|
|
740
|
-
|
|
741
|
-
delete deviceSessionCache[usePassKey];
|
|
822
|
+
deviceWalletSessionStore.delete(deviceId, this.passphraseState);
|
|
742
823
|
}
|
|
743
824
|
}
|
|
744
825
|
|
|
826
|
+
clearStandardInternalState(_deviceId?: string) {
|
|
827
|
+
const deviceId = this.getSessionCacheDeviceKey(_deviceId);
|
|
828
|
+
if (!deviceId) return;
|
|
829
|
+
deviceWalletSessionStore.deleteStandard(deviceId);
|
|
830
|
+
}
|
|
831
|
+
|
|
745
832
|
async initialize(options?: InitOptions) {
|
|
746
|
-
// Protocol V2
|
|
833
|
+
// Protocol V2 does not support legacy Initialize; use its dedicated flow.
|
|
747
834
|
if (this.isProtocolV2()) {
|
|
748
835
|
this.passphraseState = options?.passphraseState;
|
|
749
|
-
if (this.
|
|
750
|
-
if (this.
|
|
836
|
+
if (this.state && !options?.initSession && !this.protocolV2StateNeedsReload) {
|
|
837
|
+
if (this.state.status.mode === 'bootloader' || this.state.status.mode === 'romloader') {
|
|
751
838
|
return;
|
|
752
839
|
}
|
|
753
|
-
//
|
|
754
|
-
//
|
|
755
|
-
// 用字段级合并保留已有版本和 SE 信息。
|
|
756
|
-
await this._refreshProtocolV2Status(options);
|
|
840
|
+
// Normal calls reuse the cache. Explicit getDeviceState refreshes, unlock flow,
|
|
841
|
+
// and device events update dynamic state without polling on every SDK call.
|
|
757
842
|
return;
|
|
758
843
|
}
|
|
759
844
|
await this._initializeProtocolV2(options);
|
|
845
|
+
this.protocolV2StateNeedsReload = false;
|
|
760
846
|
return;
|
|
761
847
|
}
|
|
762
848
|
|
|
763
|
-
|
|
849
|
+
try {
|
|
850
|
+
const callInitialize = async (payload: Record<string, unknown>, initSession?: boolean) => {
|
|
851
|
+
const initStartAt = Date.now();
|
|
852
|
+
const { message } = await this.commands.typedCall('Initialize', 'Features', payload, {
|
|
853
|
+
// iOS BLE bound devices can need close to 20 seconds.
|
|
854
|
+
timeoutMs: 25 * 1000,
|
|
855
|
+
});
|
|
856
|
+
this.setLastInitializeDuration(Date.now() - initStartAt);
|
|
857
|
+
this._updateFeatures(message, initSession);
|
|
858
|
+
await TransportManager.reconfigure(this.features);
|
|
859
|
+
};
|
|
764
860
|
|
|
765
|
-
|
|
861
|
+
const expectedDeviceId = options?.deviceId;
|
|
862
|
+
if (expectedDeviceId) {
|
|
863
|
+
// 先只读校验物理设备身份;钱包上下文仍由下方携带完整参数的
|
|
864
|
+
// Initialize 选择,避免标准钱包请求复用此前的隐藏钱包上下文。
|
|
865
|
+
this.passphraseState = undefined;
|
|
866
|
+
const { message } = await this.commands.typedCall('GetFeatures', 'Features', {});
|
|
867
|
+
this._updateFeatures(message);
|
|
868
|
+
await TransportManager.reconfigure(this.features);
|
|
869
|
+
if (!this.checkDeviceId(expectedDeviceId)) {
|
|
870
|
+
throw ERRORS.TypedError(HardwareErrorCode.DeviceCheckDeviceIdError);
|
|
871
|
+
}
|
|
872
|
+
}
|
|
766
873
|
|
|
767
|
-
|
|
768
|
-
this.clearInternalState(options?.deviceId);
|
|
769
|
-
}
|
|
874
|
+
this.passphraseState = options?.passphraseState;
|
|
770
875
|
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
payload.session_id = internalState;
|
|
775
|
-
}
|
|
876
|
+
if (options?.initSession) {
|
|
877
|
+
this.clearInternalState(options?.deviceId);
|
|
878
|
+
}
|
|
776
879
|
|
|
777
|
-
|
|
778
|
-
payload
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
880
|
+
const internalState = this.getInternalState(options?.deviceId);
|
|
881
|
+
const payload: Record<string, unknown> = {
|
|
882
|
+
passphrase_state: options?.passphraseState,
|
|
883
|
+
is_contains_attach: true,
|
|
884
|
+
};
|
|
885
|
+
if (internalState) {
|
|
886
|
+
payload.session_id = internalState;
|
|
887
|
+
}
|
|
888
|
+
if (options?.deriveCardano) {
|
|
889
|
+
payload.derive_cardano = true;
|
|
890
|
+
}
|
|
782
891
|
|
|
783
|
-
|
|
784
|
-
try {
|
|
785
|
-
// @ts-expect-error
|
|
786
|
-
const { message } = await Promise.race([
|
|
787
|
-
this.commands.typedCall('Initialize', 'Features', payload),
|
|
788
|
-
new Promise((_, reject) => {
|
|
789
|
-
setTimeout(() => {
|
|
790
|
-
reject(ERRORS.TypedError(HardwareErrorCode.DeviceInitializeFailed));
|
|
791
|
-
// iOS ble bound device timeout 20s
|
|
792
|
-
}, 25 * 1000);
|
|
793
|
-
}),
|
|
794
|
-
]);
|
|
795
|
-
|
|
796
|
-
const initCostMs = Date.now() - initStartAt;
|
|
797
|
-
this.setLastInitializeDuration(initCostMs);
|
|
798
|
-
this._updateFeatures(message, options?.initSession);
|
|
799
|
-
await TransportManager.reconfigure(this.features);
|
|
892
|
+
await callInitialize(payload, options?.initSession);
|
|
800
893
|
} catch (error) {
|
|
801
894
|
Log.error('Initialization failed:', error);
|
|
802
895
|
throw error;
|
|
@@ -806,59 +899,38 @@ export class Device extends EventEmitter {
|
|
|
806
899
|
/**
|
|
807
900
|
* Device initialization over Protocol V2.
|
|
808
901
|
*
|
|
809
|
-
* Protocol V2
|
|
810
|
-
*
|
|
902
|
+
* Protocol V2 bypasses legacy Initialize/GetFeatures and builds its canonical
|
|
903
|
+
* features state directly from DeviceInfoGet.
|
|
811
904
|
*/
|
|
812
905
|
private async _initializeProtocolV2(options?: InitOptions) {
|
|
813
906
|
Log.debug('Initialize device via Protocol V2 features adapter');
|
|
814
907
|
|
|
815
908
|
try {
|
|
816
|
-
//
|
|
817
|
-
//
|
|
818
|
-
// 且 reject 后底层调用仍会残留。
|
|
909
|
+
// typedCall applies the request timeout. An outer Promise.race would leak its
|
|
910
|
+
// timer and leave the underlying call active after rejection.
|
|
819
911
|
const deviceInfo = await requestProtocolV2DeviceInfo({
|
|
820
912
|
commands: this.commands,
|
|
821
913
|
timeoutMs: options?.protocolV2DeviceInfoTimeoutMs,
|
|
822
914
|
});
|
|
823
|
-
//
|
|
824
|
-
//
|
|
825
|
-
const features = this.
|
|
915
|
+
// The default request excludes SE/hash data and therefore uses basic scope.
|
|
916
|
+
// Full version and verification data require getDeviceState({ scope: 'firmware' }).
|
|
917
|
+
const features = await this.probeProtocolV2RuntimeState(
|
|
918
|
+
deviceInfo,
|
|
919
|
+
options?.protocolV2DeviceInfoTimeoutMs
|
|
920
|
+
);
|
|
826
921
|
Log.debug('Protocol V2 features:', features);
|
|
827
|
-
this.featuresNeedsReload = false;
|
|
828
922
|
} catch (error) {
|
|
829
923
|
Log.error('Protocol V2 initialization failed:', error);
|
|
830
924
|
throw error;
|
|
831
925
|
}
|
|
832
926
|
}
|
|
833
927
|
|
|
834
|
-
/**
|
|
835
|
-
* Protocol V2 的轻量状态刷新(每次 run 前调用)。
|
|
836
|
-
*
|
|
837
|
-
* 请求 hw + coprocessor + status(不含 fw/SE target):status 提供 init_states / label /
|
|
838
|
-
* passphrase_enabled 等会在设备端变化的字段;hw/coprocessor 提供 serialNo / bleName。
|
|
839
|
-
* versions 为空时按字段级合并保留旧值,verify 数据不会被降级。
|
|
840
|
-
*/
|
|
841
|
-
private async _refreshProtocolV2Status(options?: InitOptions) {
|
|
842
|
-
try {
|
|
843
|
-
const deviceInfo = await requestProtocolV2DeviceInfo({
|
|
844
|
-
commands: this.commands,
|
|
845
|
-
request: PROTOCOL_V2_STATUS_DEVICE_INFO_REQUEST,
|
|
846
|
-
timeoutMs: options?.protocolV2DeviceInfoTimeoutMs,
|
|
847
|
-
});
|
|
848
|
-
const features = this.updateProtocolV2Features(deviceInfo);
|
|
849
|
-
Log.debug('Protocol V2 features (status refresh):', features);
|
|
850
|
-
} catch (error) {
|
|
851
|
-
Log.error('Protocol V2 status refresh failed:', error);
|
|
852
|
-
throw error;
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
|
|
856
928
|
async getFeatures() {
|
|
857
929
|
if (this.isProtocolV2()) {
|
|
858
930
|
const deviceInfo = await requestProtocolV2DeviceInfo({
|
|
859
931
|
commands: this.commands,
|
|
860
932
|
});
|
|
861
|
-
return this.
|
|
933
|
+
return this.probeProtocolV2RuntimeState(deviceInfo);
|
|
862
934
|
}
|
|
863
935
|
|
|
864
936
|
const { message } = await this.commands.typedCall('GetFeatures', 'Features', {});
|
|
@@ -866,36 +938,277 @@ export class Device extends EventEmitter {
|
|
|
866
938
|
return this.features;
|
|
867
939
|
}
|
|
868
940
|
|
|
941
|
+
async getDeviceState(params: DeviceStateReadOptions = {}) {
|
|
942
|
+
const refresh = new Set(params.refreshSections ?? []);
|
|
943
|
+
const getProtocolV2DeviceInfoRequest = () => {
|
|
944
|
+
if (refresh.has('verification')) return PROTOCOL_V2_FULL_DEVICE_INFO_REQUEST;
|
|
945
|
+
if (refresh.has('versions')) return PROTOCOL_V2_VERSIONS_DEVICE_INFO_REQUEST;
|
|
946
|
+
return PROTOCOL_V2_FEATURES_DEVICE_INFO_REQUEST;
|
|
947
|
+
};
|
|
948
|
+
let initializedWithDeviceInfo = false;
|
|
949
|
+
let refreshedDeviceInfo: ProtocolV2DeviceInfo | undefined;
|
|
950
|
+
|
|
951
|
+
if (!this.state) {
|
|
952
|
+
if (this.isProtocolV2()) {
|
|
953
|
+
const deviceInfo = await requestProtocolV2DeviceInfo({
|
|
954
|
+
commands: this.commands,
|
|
955
|
+
request: getProtocolV2DeviceInfoRequest(),
|
|
956
|
+
});
|
|
957
|
+
await this.probeProtocolV2RuntimeState(deviceInfo);
|
|
958
|
+
refreshedDeviceInfo = deviceInfo;
|
|
959
|
+
initializedWithDeviceInfo = true;
|
|
960
|
+
} else {
|
|
961
|
+
await this.getFeatures();
|
|
962
|
+
}
|
|
963
|
+
} else if (!this.isProtocolV2() && refresh.size > 0) {
|
|
964
|
+
await this.getFeatures();
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
if (!this.isProtocolV2() && refresh.has('verification')) {
|
|
968
|
+
const { message } = await this.commands.typedCall('OnekeyGetFeatures', 'OnekeyFeatures');
|
|
969
|
+
this.updateState(mapProtocolV1OnekeyFeaturesToState(message), 'device-info');
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
if (this.isProtocolV2()) {
|
|
973
|
+
const refreshDeviceInfo =
|
|
974
|
+
refresh.has('identity') || refresh.has('versions') || refresh.has('verification');
|
|
975
|
+
if (refreshDeviceInfo && !initializedWithDeviceInfo) {
|
|
976
|
+
const deviceInfo = await requestProtocolV2DeviceInfo({
|
|
977
|
+
commands: this.commands,
|
|
978
|
+
request: getProtocolV2DeviceInfoRequest(),
|
|
979
|
+
});
|
|
980
|
+
refreshedDeviceInfo = deviceInfo;
|
|
981
|
+
if (!refresh.has('status')) {
|
|
982
|
+
this.updateState(
|
|
983
|
+
mapProtocolV2DeviceInfoToState(deviceInfo, this.state?.status.mode),
|
|
984
|
+
'device-info'
|
|
985
|
+
);
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
if (refresh.has('status') && !initializedWithDeviceInfo) {
|
|
990
|
+
const deviceInfo =
|
|
991
|
+
refreshedDeviceInfo ??
|
|
992
|
+
(await requestProtocolV2DeviceInfo({
|
|
993
|
+
commands: this.commands,
|
|
994
|
+
request: getProtocolV2DeviceInfoRequest(),
|
|
995
|
+
}));
|
|
996
|
+
await this.probeProtocolV2RuntimeState(deviceInfo);
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
if (refresh.has('settings') && this.state?.status.mode === 'normal') {
|
|
1000
|
+
const { message } = await this.commands.typedCall(
|
|
1001
|
+
'DeviceSettingsGet',
|
|
1002
|
+
'DeviceSettings',
|
|
1003
|
+
{}
|
|
1004
|
+
);
|
|
1005
|
+
this.updateState(mapDeviceSettingsToState(message), 'settings-read');
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
if (!this.state) {
|
|
1010
|
+
throw ERRORS.TypedError(HardwareErrorCode.DeviceInitializeFailed);
|
|
1011
|
+
}
|
|
1012
|
+
return params.includeRaw ? cloneDeviceState(this.state) : createPublicDeviceState(this.state);
|
|
1013
|
+
}
|
|
1014
|
+
|
|
869
1015
|
_updateFeatures(protoFeatures: PROTO.Features | Features, initSession?: boolean) {
|
|
1016
|
+
const previousDeviceId = this.getCurrentDeviceId();
|
|
870
1017
|
let feat =
|
|
871
1018
|
'protocol' in protoFeatures
|
|
872
1019
|
? protoFeatures
|
|
873
1020
|
: buildProtocolV1FeaturesPayload(protoFeatures, this.features);
|
|
874
1021
|
|
|
875
|
-
// GetFeatures doesn't return 'session_id'
|
|
876
|
-
if (this.features?.sessionId && !feat.sessionId) {
|
|
877
|
-
feat.sessionId = this.features.sessionId;
|
|
878
|
-
}
|
|
879
|
-
if (this.getCurrentDeviceId() && feat.sessionId) {
|
|
880
|
-
this.setInternalState(feat.sessionId, initSession);
|
|
881
|
-
}
|
|
882
1022
|
feat.unlocked = feat.unlocked ?? true;
|
|
883
1023
|
|
|
884
1024
|
feat = fixFeaturesFirmwareVersion(feat);
|
|
885
1025
|
|
|
886
|
-
this.
|
|
887
|
-
this.
|
|
888
|
-
|
|
1026
|
+
this.updateState(mapFeaturesToState(feat), 'initialize');
|
|
1027
|
+
this.reconcileSessionCacheDeviceIdentity(previousDeviceId);
|
|
1028
|
+
if (feat.deviceId && feat.sessionId) {
|
|
1029
|
+
this.setInternalState(feat.sessionId, initSession);
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
updateState(patch: DeviceStatePatch, source: DeviceStateUpdateSource) {
|
|
1034
|
+
const result = this.stateStore.update(patch, source);
|
|
1035
|
+
if (result.changedKeys.length === 0) return result.state;
|
|
1036
|
+
|
|
1037
|
+
const event: DeviceStateEvent = {
|
|
1038
|
+
connectId: this.getConnectId() ?? null,
|
|
1039
|
+
state: createPublicDeviceState(result.state),
|
|
1040
|
+
revision: result.revision,
|
|
1041
|
+
source,
|
|
1042
|
+
changedKeys: result.changedKeys,
|
|
1043
|
+
};
|
|
1044
|
+
Log.debug('Device state patch committed', {
|
|
1045
|
+
source,
|
|
1046
|
+
keys: result.changedKeys,
|
|
1047
|
+
});
|
|
1048
|
+
this.emit(DEVICE.STATE, this, event);
|
|
1049
|
+
if (result.state.protocol === 'V1') {
|
|
1050
|
+
this.emit(DEVICE.FEATURES, this, projectFeatures(result.state));
|
|
1051
|
+
}
|
|
1052
|
+
return result.state;
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
updateFeaturesPatch(patch: Partial<Features>, source: DeviceStateUpdateSource) {
|
|
1056
|
+
const currentFeatures = this.features;
|
|
1057
|
+
if (!currentFeatures) return undefined;
|
|
1058
|
+
|
|
1059
|
+
const features = mergeDeviceFeaturesPatch(currentFeatures, patch);
|
|
1060
|
+
if (features === currentFeatures) return currentFeatures;
|
|
1061
|
+
|
|
1062
|
+
const normalized = fixFeaturesFirmwareVersion(features);
|
|
1063
|
+
this.updateState(mapFeaturesToState(normalized), source);
|
|
1064
|
+
return this.features;
|
|
889
1065
|
}
|
|
890
1066
|
|
|
891
|
-
|
|
892
|
-
const
|
|
893
|
-
|
|
1067
|
+
async probeProtocolV2RuntimeState(deviceInfo: ProtocolV2DeviceInfo, timeoutMs?: number) {
|
|
1068
|
+
const protocolInfo = await requestProtocolV2ProtocolInfo({
|
|
1069
|
+
commands: this.commands,
|
|
1070
|
+
timeoutMs,
|
|
1071
|
+
});
|
|
1072
|
+
const runtimeMode = getProtocolV2RuntimeMode(protocolInfo);
|
|
1073
|
+
const protocolV2DeviceType = resolveProtocolV2DeviceIdentity(
|
|
1074
|
+
deviceInfo.hw?.Device_type
|
|
1075
|
+
).deviceType;
|
|
1076
|
+
if (runtimeMode === 'romloader' && protocolV2DeviceType !== EDeviceType.Pro2) {
|
|
1077
|
+
throw ERRORS.TypedError(
|
|
1078
|
+
HardwareErrorCode.DeviceInitializeFailed,
|
|
1079
|
+
'Protocol V2 romloader mode is only supported for Pro2.'
|
|
1080
|
+
);
|
|
1081
|
+
}
|
|
1082
|
+
const deviceStatusSupported = supportsProtocolV2Message(
|
|
1083
|
+
protocolInfo,
|
|
1084
|
+
PROTOCOL_V2_DEVICE_STATUS_GET_MESSAGE_TYPE
|
|
1085
|
+
);
|
|
1086
|
+
|
|
1087
|
+
if (runtimeMode === 'bootloader' || runtimeMode === 'romloader') {
|
|
1088
|
+
return this.updateProtocolV2Features(deviceInfo, null, runtimeMode, protocolInfo);
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
if (!deviceStatusSupported) {
|
|
1092
|
+
if (runtimeMode === 'normal') {
|
|
1093
|
+
return this.updateProtocolV2Features(deviceInfo, null, runtimeMode, protocolInfo);
|
|
1094
|
+
}
|
|
1095
|
+
throw ERRORS.TypedError(
|
|
1096
|
+
HardwareErrorCode.DeviceInitializeFailed,
|
|
1097
|
+
`Unknown Protocol V2 build fingerprint without DeviceStatusGet capability: ${protocolInfo.build_fingerprint}`
|
|
1098
|
+
);
|
|
1099
|
+
}
|
|
1100
|
+
|
|
1101
|
+
let deviceStatus: DeviceStatus;
|
|
1102
|
+
try {
|
|
1103
|
+
deviceStatus = await requestProtocolV2DeviceStatus({
|
|
1104
|
+
commands: this.commands,
|
|
1105
|
+
timeoutMs,
|
|
1106
|
+
});
|
|
1107
|
+
} catch (error) {
|
|
1108
|
+
if (runtimeMode === undefined && isProtocolV2DeviceStatusUnsupportedError(error)) {
|
|
1109
|
+
return this.updateProtocolV2Features(deviceInfo, null, 'bootloader', protocolInfo);
|
|
1110
|
+
}
|
|
1111
|
+
throw error;
|
|
1112
|
+
}
|
|
1113
|
+
return this.updateProtocolV2Features(deviceInfo, deviceStatus, 'normal', protocolInfo);
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
updateProtocolV2Features(
|
|
1117
|
+
deviceInfo?: ProtocolV2DeviceInfo,
|
|
1118
|
+
deviceStatus?: DeviceStatus | null,
|
|
1119
|
+
runtimeMode?: ProtocolV2RuntimeMode,
|
|
1120
|
+
protocolInfo?: ProtocolInfo
|
|
1121
|
+
) {
|
|
1122
|
+
const previousDeviceId = this.getCurrentDeviceId();
|
|
1123
|
+
const resolvedMode = runtimeMode ?? (deviceStatus ? 'normal' : this.state?.status.mode);
|
|
1124
|
+
if (deviceInfo) {
|
|
1125
|
+
this.updateState(mapProtocolV2DeviceInfoToState(deviceInfo, resolvedMode), 'device-info');
|
|
1126
|
+
}
|
|
1127
|
+
if (protocolInfo) {
|
|
1128
|
+
this.updateState({ raw: { protocolV2ProtocolInfo: protocolInfo } }, 'device-info');
|
|
1129
|
+
}
|
|
1130
|
+
if (deviceStatus) {
|
|
1131
|
+
this.updateState(mapProtocolV2DeviceStatusToState(deviceStatus), 'device-status');
|
|
1132
|
+
}
|
|
1133
|
+
this.reconcileSessionCacheDeviceIdentity(previousDeviceId);
|
|
1134
|
+
return this.features as Features;
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
updateProtocolV2Status(status: DeviceStatus) {
|
|
1138
|
+
const previousDeviceInfo = this.state?.raw?.protocolV2DeviceInfo;
|
|
1139
|
+
const previousStatus = this.state?.raw?.protocolV2DeviceStatus;
|
|
1140
|
+
return this.updateProtocolV2Features(previousDeviceInfo, {
|
|
1141
|
+
...previousStatus,
|
|
1142
|
+
...status,
|
|
1143
|
+
});
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
markTransportDisconnected() {
|
|
1147
|
+
this.deviceAcquired = false;
|
|
1148
|
+
if (!this.isProtocolV2()) return;
|
|
1149
|
+
this.protocolV2StateNeedsReload = true;
|
|
1150
|
+
this.clearPreInitialized();
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
invalidateAfterWipe() {
|
|
1154
|
+
const deviceId = this.getCurrentDeviceId();
|
|
1155
|
+
if (deviceId) {
|
|
1156
|
+
deviceWalletSessionStore.deleteDevice(deviceId);
|
|
1157
|
+
}
|
|
1158
|
+
if (this.isProtocolV2() && this.originalDescriptor.path !== deviceId) {
|
|
1159
|
+
deviceWalletSessionStore.deleteDevice(this.originalDescriptor.path);
|
|
1160
|
+
this.protocolV2StateNeedsReload = true;
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
this.passphraseState = undefined;
|
|
1164
|
+
this.stateStore = new DeviceStateStore();
|
|
1165
|
+
this.clearPreInitialized();
|
|
1166
|
+
this.needReloadDevice = true;
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
markProtocolV2Reboot(rebootType: DeviceRebootType) {
|
|
1170
|
+
if (!this.isProtocolV2()) return;
|
|
1171
|
+
|
|
1172
|
+
this.protocolV2StateNeedsReload = true;
|
|
1173
|
+
this.clearPreInitialized();
|
|
1174
|
+
let loaderMode: 'bootloader' | 'romloader' | undefined;
|
|
1175
|
+
if (rebootType === DeviceRebootType.Bootloader) {
|
|
1176
|
+
loaderMode = 'bootloader';
|
|
1177
|
+
} else if (rebootType === DeviceRebootType.Romloader) {
|
|
1178
|
+
loaderMode = 'romloader';
|
|
1179
|
+
}
|
|
1180
|
+
if (loaderMode) {
|
|
1181
|
+
this.updateState(
|
|
1182
|
+
{
|
|
1183
|
+
identity: { deviceId: null },
|
|
1184
|
+
status: {
|
|
1185
|
+
mode: loaderMode,
|
|
1186
|
+
initialized: null,
|
|
1187
|
+
unlocked: null,
|
|
1188
|
+
firmwarePresent: null,
|
|
1189
|
+
backupRequired: null,
|
|
1190
|
+
noBackup: null,
|
|
1191
|
+
unfinishedBackup: null,
|
|
1192
|
+
recoveryMode: null,
|
|
1193
|
+
passphraseProtection: null,
|
|
1194
|
+
pinProtection: null,
|
|
1195
|
+
attachToPinEnabled: null,
|
|
1196
|
+
unlockedAttachPin: null,
|
|
1197
|
+
},
|
|
1198
|
+
raw: { protocolV2ProtocolInfo: null, protocolV2DeviceStatus: null },
|
|
1199
|
+
},
|
|
1200
|
+
'transport-reconnect'
|
|
1201
|
+
);
|
|
1202
|
+
return;
|
|
1203
|
+
}
|
|
1204
|
+
|
|
1205
|
+
this.updateState(
|
|
1206
|
+
{
|
|
1207
|
+
status: { mode: 'normal', unlocked: null },
|
|
1208
|
+
raw: { protocolV2ProtocolInfo: null, protocolV2DeviceStatus: null },
|
|
1209
|
+
},
|
|
1210
|
+
'transport-reconnect'
|
|
894
1211
|
);
|
|
895
|
-
this.features = features;
|
|
896
|
-
this.featuresNeedsReload = false;
|
|
897
|
-
this.emit(DEVICE.FEATURES, this, features);
|
|
898
|
-
return features;
|
|
899
1212
|
}
|
|
900
1213
|
|
|
901
1214
|
/**
|
|
@@ -916,8 +1229,7 @@ export class Device extends EventEmitter {
|
|
|
916
1229
|
}
|
|
917
1230
|
|
|
918
1231
|
if (forceUpdate) {
|
|
919
|
-
//
|
|
920
|
-
// 不能让覆盖丢掉已探测的协议结果。
|
|
1232
|
+
// Enumerated descriptors may omit protocolType, so preserve an actively probed value.
|
|
921
1233
|
this.originalDescriptor = {
|
|
922
1234
|
...descriptor,
|
|
923
1235
|
protocolType: descriptor.protocolType ?? this.originalDescriptor.protocolType,
|
|
@@ -942,19 +1254,37 @@ export class Device extends EventEmitter {
|
|
|
942
1254
|
|
|
943
1255
|
options = parseRunOptions(options);
|
|
944
1256
|
|
|
945
|
-
|
|
946
|
-
|
|
1257
|
+
const runPromise = createDeferred<void>();
|
|
1258
|
+
this.runPromise = runPromise;
|
|
1259
|
+
this._runInner(fn, options, runPromise).catch(error => {
|
|
1260
|
+
if (this.runPromise === runPromise) {
|
|
1261
|
+
this.runPromise = null;
|
|
1262
|
+
}
|
|
1263
|
+
runPromise.reject(error);
|
|
1264
|
+
});
|
|
1265
|
+
return runPromise.promise;
|
|
947
1266
|
}
|
|
948
1267
|
|
|
949
|
-
async _runInner<T>(
|
|
1268
|
+
async _runInner<T>(
|
|
1269
|
+
fn: (() => Promise<T>) | undefined,
|
|
1270
|
+
options: RunOptions,
|
|
1271
|
+
runPromise: Deferred<void>
|
|
1272
|
+
) {
|
|
1273
|
+
const clearRunPromise = () => {
|
|
1274
|
+
if (this.runPromise === runPromise) {
|
|
1275
|
+
this.runPromise = null;
|
|
1276
|
+
}
|
|
1277
|
+
};
|
|
1278
|
+
|
|
950
1279
|
if (!this.isUsedHere() || this.commands.disposed) {
|
|
951
1280
|
const env = DataManager.getSettings('env');
|
|
952
1281
|
if (env !== 'react-native') {
|
|
953
1282
|
try {
|
|
954
1283
|
await this.acquire(options.connectProtocol);
|
|
955
1284
|
} catch (error) {
|
|
956
|
-
|
|
957
|
-
|
|
1285
|
+
clearRunPromise();
|
|
1286
|
+
runPromise.reject(error);
|
|
1287
|
+
return;
|
|
958
1288
|
}
|
|
959
1289
|
|
|
960
1290
|
try {
|
|
@@ -964,16 +1294,19 @@ export class Device extends EventEmitter {
|
|
|
964
1294
|
}
|
|
965
1295
|
}
|
|
966
1296
|
} catch (error) {
|
|
967
|
-
this.
|
|
1297
|
+
await this.release();
|
|
1298
|
+
clearRunPromise();
|
|
968
1299
|
if (error instanceof HardwareError) {
|
|
969
|
-
|
|
1300
|
+
runPromise.reject(error);
|
|
1301
|
+
return;
|
|
970
1302
|
}
|
|
971
|
-
|
|
1303
|
+
runPromise.reject(
|
|
972
1304
|
ERRORS.TypedError(
|
|
973
1305
|
HardwareErrorCode.DeviceInitializeFailed,
|
|
974
1306
|
`Initialize failed: ${error.message as string}, code: ${error.code as string}`
|
|
975
1307
|
)
|
|
976
1308
|
);
|
|
1309
|
+
return;
|
|
977
1310
|
}
|
|
978
1311
|
} else if (env === 'react-native') {
|
|
979
1312
|
// TODO: implement react-native acquire
|
|
@@ -992,9 +1325,7 @@ export class Device extends EventEmitter {
|
|
|
992
1325
|
try {
|
|
993
1326
|
await fn();
|
|
994
1327
|
} catch (e) {
|
|
995
|
-
|
|
996
|
-
this.runPromise.reject(e);
|
|
997
|
-
}
|
|
1328
|
+
runPromise.reject(e);
|
|
998
1329
|
|
|
999
1330
|
if (
|
|
1000
1331
|
e instanceof HardwareError &&
|
|
@@ -1007,7 +1338,7 @@ export class Device extends EventEmitter {
|
|
|
1007
1338
|
Log.debug(`error code ${e.errorCode} release device, mainId: ${this.mainId}`);
|
|
1008
1339
|
}
|
|
1009
1340
|
|
|
1010
|
-
|
|
1341
|
+
clearRunPromise();
|
|
1011
1342
|
return;
|
|
1012
1343
|
}
|
|
1013
1344
|
}
|
|
@@ -1021,11 +1352,8 @@ export class Device extends EventEmitter {
|
|
|
1021
1352
|
Log.debug('release device, mainId: ', this.mainId);
|
|
1022
1353
|
}
|
|
1023
1354
|
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
}
|
|
1027
|
-
|
|
1028
|
-
this.runPromise = null;
|
|
1355
|
+
runPromise.resolve();
|
|
1356
|
+
clearRunPromise();
|
|
1029
1357
|
}
|
|
1030
1358
|
|
|
1031
1359
|
async interruptionFromOutside() {
|
|
@@ -1064,33 +1392,37 @@ export class Device extends EventEmitter {
|
|
|
1064
1392
|
}
|
|
1065
1393
|
|
|
1066
1394
|
getMode() {
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1395
|
+
switch (this.state?.status.mode) {
|
|
1396
|
+
case 'bootloader':
|
|
1397
|
+
case 'romloader':
|
|
1398
|
+
return EOneKeyDeviceMode.bootloader;
|
|
1399
|
+
case 'notInitialized':
|
|
1400
|
+
return EOneKeyDeviceMode.notInitialized;
|
|
1401
|
+
case 'backupMode':
|
|
1402
|
+
return EOneKeyDeviceMode.backupMode;
|
|
1403
|
+
case 'normal':
|
|
1404
|
+
return EOneKeyDeviceMode.normal;
|
|
1405
|
+
default:
|
|
1406
|
+
break;
|
|
1075
1407
|
}
|
|
1076
1408
|
|
|
1077
|
-
if (this.features?.noBackup) {
|
|
1078
|
-
// backup mode
|
|
1079
|
-
return EOneKeyDeviceMode.backupMode;
|
|
1080
|
-
}
|
|
1081
|
-
|
|
1082
|
-
// normal mode
|
|
1083
1409
|
return EOneKeyDeviceMode.normal;
|
|
1084
1410
|
}
|
|
1085
1411
|
|
|
1412
|
+
getStatus() {
|
|
1413
|
+
if (this.isUsedElsewhere()) return 'occupied' as const;
|
|
1414
|
+
if (this.isUsedHere()) return 'used' as const;
|
|
1415
|
+
return 'available' as const;
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1086
1418
|
getFirmwareVersion() {
|
|
1087
|
-
if (!this.
|
|
1088
|
-
return
|
|
1419
|
+
if (!this.state) return null;
|
|
1420
|
+
return parseDeviceVersion(this.state.versions.firmware);
|
|
1089
1421
|
}
|
|
1090
1422
|
|
|
1091
1423
|
getBLEFirmwareVersion() {
|
|
1092
|
-
if (!this.
|
|
1093
|
-
return
|
|
1424
|
+
if (!this.state) return null;
|
|
1425
|
+
return parseDeviceVersion(this.state.versions.ble);
|
|
1094
1426
|
}
|
|
1095
1427
|
|
|
1096
1428
|
isUsed() {
|
|
@@ -1108,7 +1440,7 @@ export class Device extends EventEmitter {
|
|
|
1108
1440
|
isUsedHere() {
|
|
1109
1441
|
const env = DataManager.getSettings('env');
|
|
1110
1442
|
if (DataManager.isBleConnect(env)) {
|
|
1111
|
-
return
|
|
1443
|
+
return this.deviceAcquired;
|
|
1112
1444
|
}
|
|
1113
1445
|
return this.isUsed() && this.originalDescriptor.session === this.mainId;
|
|
1114
1446
|
}
|
|
@@ -1118,26 +1450,38 @@ export class Device extends EventEmitter {
|
|
|
1118
1450
|
}
|
|
1119
1451
|
|
|
1120
1452
|
isBootloader() {
|
|
1121
|
-
|
|
1453
|
+
if (!this.state) return undefined;
|
|
1454
|
+
return this.state.status.mode === 'bootloader';
|
|
1455
|
+
}
|
|
1456
|
+
|
|
1457
|
+
isRomloader() {
|
|
1458
|
+
if (!this.state) return undefined;
|
|
1459
|
+
return (
|
|
1460
|
+
this.isProtocolV2() &&
|
|
1461
|
+
this.getCurrentDeviceType() === EDeviceType.Pro2 &&
|
|
1462
|
+
this.state.status.mode === 'romloader'
|
|
1463
|
+
);
|
|
1122
1464
|
}
|
|
1123
1465
|
|
|
1124
1466
|
isInitialized() {
|
|
1125
|
-
|
|
1467
|
+
if (!this.state) return undefined;
|
|
1468
|
+
return this.state.status.initialized === true;
|
|
1126
1469
|
}
|
|
1127
1470
|
|
|
1128
1471
|
isSeedless() {
|
|
1129
|
-
|
|
1472
|
+
if (!this.state) return undefined;
|
|
1473
|
+
return this.state.status.noBackup === true;
|
|
1130
1474
|
}
|
|
1131
1475
|
|
|
1132
1476
|
isUnacquired(): boolean {
|
|
1133
|
-
return this.
|
|
1477
|
+
return this.state === undefined;
|
|
1134
1478
|
}
|
|
1135
1479
|
|
|
1136
1480
|
hasUnexpectedMode(allow: string[], require: string[]) {
|
|
1137
1481
|
// both allow and require cases might generate single unexpected mode
|
|
1138
1482
|
if (!this.isUnacquired()) {
|
|
1139
1483
|
// allow cases
|
|
1140
|
-
if (this.isBootloader() && !allow.includes(UI_REQUEST.BOOTLOADER)) {
|
|
1484
|
+
if (this.isBootloader() && !this.isProtocolV2() && !allow.includes(UI_REQUEST.BOOTLOADER)) {
|
|
1141
1485
|
return UI_REQUEST.BOOTLOADER;
|
|
1142
1486
|
}
|
|
1143
1487
|
if (!this.isInitialized() && !allow.includes(UI_REQUEST.NOT_INITIALIZE)) {
|
|
@@ -1161,7 +1505,7 @@ export class Device extends EventEmitter {
|
|
|
1161
1505
|
deviceType === EDeviceType.Touch ||
|
|
1162
1506
|
deviceType === EDeviceType.Pro ||
|
|
1163
1507
|
deviceType === EDeviceType.Pro2;
|
|
1164
|
-
const unlocked = this.
|
|
1508
|
+
const unlocked = this.state?.status.unlocked;
|
|
1165
1509
|
const preCheckTouch = isModeT && unlocked === false;
|
|
1166
1510
|
const passphraseProtection = this.getCurrentPassphraseProtection();
|
|
1167
1511
|
|
|
@@ -1174,12 +1518,12 @@ export class Device extends EventEmitter {
|
|
|
1174
1518
|
|
|
1175
1519
|
async lockDevice(): Promise<Success> {
|
|
1176
1520
|
const res = await this.commands.typedCall('LockDevice', 'Success', {});
|
|
1521
|
+
this.updateState({ status: { unlocked: false } }, 'lock');
|
|
1177
1522
|
return res.message;
|
|
1178
1523
|
}
|
|
1179
1524
|
|
|
1180
1525
|
supportUnlockVersionRange(): DeviceFirmwareRange {
|
|
1181
|
-
//
|
|
1182
|
-
// 且 Protocol V2 固件从首个版本即支持 UnLockDevice(见 unlockDevice 的 isProtocolV2 短路)。
|
|
1526
|
+
// This range applies to Protocol V1 Pro devices; Pro2 has a dedicated unlock flow.
|
|
1183
1527
|
return {
|
|
1184
1528
|
pro: {
|
|
1185
1529
|
min: '4.15.0',
|
|
@@ -1187,19 +1531,34 @@ export class Device extends EventEmitter {
|
|
|
1187
1531
|
};
|
|
1188
1532
|
}
|
|
1189
1533
|
|
|
1190
|
-
async unlockDevice() {
|
|
1534
|
+
async unlockDevice(pinType: DeviceSessionPinType = DeviceSessionPinType.Main) {
|
|
1535
|
+
if (this.isProtocolV2()) {
|
|
1536
|
+
try {
|
|
1537
|
+
await this.commands.typedCall('DeviceSessionAskPin', 'Success', { type: pinType });
|
|
1538
|
+
} catch (error) {
|
|
1539
|
+
const errorText =
|
|
1540
|
+
error instanceof Error
|
|
1541
|
+
? `${error.name} ${error.message}`
|
|
1542
|
+
: String((error as { message?: unknown } | null)?.message ?? error ?? '');
|
|
1543
|
+
if (errorText.includes('Failure_UnexpectedMessage')) {
|
|
1544
|
+
throw createDeviceNotSupportMethodError('deviceUnlock', this.getCurrentFirmwareType());
|
|
1545
|
+
}
|
|
1546
|
+
throw error;
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1549
|
+
const status = await requestProtocolV2DeviceStatus({ commands: this.commands });
|
|
1550
|
+
return this.updateProtocolV2Status(status);
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1191
1553
|
const firmwareVersion = this.getCurrentFirmwareVersionString() ?? '0.0.0';
|
|
1192
1554
|
const versionRange = this.getCurrentMethodVersionRange(
|
|
1193
1555
|
type => this.supportUnlockVersionRange()[type]
|
|
1194
1556
|
);
|
|
1195
1557
|
|
|
1196
|
-
const supportAttachPinCapability =
|
|
1197
|
-
this.features,
|
|
1558
|
+
const supportAttachPinCapability = this.state?.capabilities.includes(
|
|
1198
1559
|
Enum_Capability.Capability_AttachToPin
|
|
1199
1560
|
);
|
|
1200
|
-
// Pro2 (Protocol V2) 版本线独立于 Pro 系列,固件从首个版本即支持 UnLockDevice
|
|
1201
1561
|
const supportUnlock =
|
|
1202
|
-
this.isProtocolV2() ||
|
|
1203
1562
|
supportAttachPinCapability ||
|
|
1204
1563
|
(versionRange &&
|
|
1205
1564
|
semver.valid(firmwareVersion) &&
|
|
@@ -1207,12 +1566,21 @@ export class Device extends EventEmitter {
|
|
|
1207
1566
|
|
|
1208
1567
|
if (supportUnlock) {
|
|
1209
1568
|
const res = await this.commands.typedCall('UnLockDevice', 'UnLockDeviceResponse');
|
|
1210
|
-
if (this.
|
|
1211
|
-
this.
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1569
|
+
if (this.state) {
|
|
1570
|
+
this.updateState(
|
|
1571
|
+
{
|
|
1572
|
+
status: {
|
|
1573
|
+
unlocked: res.message.unlocked == null ? null : res.message.unlocked,
|
|
1574
|
+
unlockedAttachPin:
|
|
1575
|
+
res.message.unlocked_attach_pin == null ? null : res.message.unlocked_attach_pin,
|
|
1576
|
+
passphraseProtection:
|
|
1577
|
+
res.message.passphrase_protection == null
|
|
1578
|
+
? null
|
|
1579
|
+
: res.message.passphrase_protection,
|
|
1580
|
+
},
|
|
1581
|
+
},
|
|
1582
|
+
'unlock'
|
|
1583
|
+
);
|
|
1216
1584
|
|
|
1217
1585
|
return Promise.resolve(this.features);
|
|
1218
1586
|
}
|
|
@@ -1221,14 +1589,6 @@ export class Device extends EventEmitter {
|
|
|
1221
1589
|
return Promise.resolve(features);
|
|
1222
1590
|
}
|
|
1223
1591
|
|
|
1224
|
-
// legacy 解锁探测仅适用于 Protocol V1 老固件;V2 固件必然支持 UnLockDevice
|
|
1225
|
-
if (this.isProtocolV2()) {
|
|
1226
|
-
throw ERRORS.TypedError(
|
|
1227
|
-
HardwareErrorCode.RuntimeError,
|
|
1228
|
-
'unlock device error: device firmware does not support UnLockDevice'
|
|
1229
|
-
);
|
|
1230
|
-
}
|
|
1231
|
-
|
|
1232
1592
|
const { type } = await this.commands.typedCall('GetAddress', 'Address', {
|
|
1233
1593
|
address_n: [toHardened(44), toHardened(1), toHardened(0), 0, 0],
|
|
1234
1594
|
coin_name: 'Testnet',
|
|
@@ -1251,21 +1611,27 @@ export class Device extends EventEmitter {
|
|
|
1251
1611
|
) {
|
|
1252
1612
|
if (this.isUnacquired()) return false;
|
|
1253
1613
|
|
|
1614
|
+
const expectedPassphraseState = useEmptyPassphrase ? undefined : passphraseState;
|
|
1254
1615
|
const { passphraseState: newPassphraseState, unlockedAttachPin } =
|
|
1255
1616
|
await getPassphraseStateWithRefreshDeviceInfo(this, {
|
|
1256
|
-
expectPassphraseState:
|
|
1617
|
+
expectPassphraseState: expectedPassphraseState,
|
|
1257
1618
|
onlyMainPin: useEmptyPassphrase,
|
|
1258
1619
|
});
|
|
1259
1620
|
|
|
1260
1621
|
// Main wallet and unlock Attach Pin, throw safe error
|
|
1261
1622
|
const mainWalletUseAttachPin = unlockedAttachPin && useEmptyPassphrase;
|
|
1262
1623
|
const useErrorAttachPin =
|
|
1263
|
-
unlockedAttachPin &&
|
|
1264
|
-
|
|
1624
|
+
unlockedAttachPin &&
|
|
1625
|
+
expectedPassphraseState &&
|
|
1626
|
+
expectedPassphraseState !== newPassphraseState;
|
|
1627
|
+
const passphraseStateMismatch =
|
|
1628
|
+
!!expectedPassphraseState && expectedPassphraseState !== newPassphraseState;
|
|
1265
1629
|
|
|
1266
1630
|
Log.debug('Check passphrase state safety: ', {
|
|
1267
|
-
|
|
1268
|
-
newPassphraseState,
|
|
1631
|
+
hasExpectedPassphraseState: Boolean(expectedPassphraseState),
|
|
1632
|
+
hasNewPassphraseState: Boolean(newPassphraseState),
|
|
1633
|
+
passphraseStateMatches:
|
|
1634
|
+
Boolean(expectedPassphraseState) && expectedPassphraseState === newPassphraseState,
|
|
1269
1635
|
unlockedAttachPin,
|
|
1270
1636
|
useEmptyPassphrase,
|
|
1271
1637
|
});
|