@onekeyfe/hd-core 1.2.0-alpha.6 → 1.2.0-alpha.62
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-initialize-timeout.test.ts +56 -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-bootloader-poll.test.ts +200 -0
- package/__tests__/firmware-update/firmware-update-capabilities.test.ts +13 -0
- package/__tests__/firmware-update/firmware-update-plan-bootloader-identity.test.ts +294 -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 +6058 -2525
- 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 +40 -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 +32 -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/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 +1 -0
- 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 +1 -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 +45 -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 +1564 -739
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9236 -3918
- 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/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 +14 -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 +24 -13
- package/src/api/FirmwareUpdateV2.ts +386 -113
- package/src/api/FirmwareUpdateV3.ts +266 -68
- package/src/api/FirmwareUpdateV4.ts +1222 -635
- 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 +75 -4
- package/src/api/firmware/FirmwareUpdateCapabilities.ts +9 -0
- package/src/api/firmware/FirmwareUpdatePlan.ts +772 -0
- package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +415 -0
- package/src/api/firmware/getBinary.ts +8 -3
- 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 +10 -6
- 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 +17 -17
- 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 -483
- 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 +652 -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 +1 -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 -145
- 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 +186 -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,13 @@ 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;
|
|
99
|
+
/**
|
|
100
|
+
* Protocol V1 Initialize response timeout override. Reboot-wait polling passes a
|
|
101
|
+
* short value so an unanswered probe settles before the next poll tick.
|
|
102
|
+
*/
|
|
103
|
+
timeoutMs?: number;
|
|
80
104
|
};
|
|
81
105
|
|
|
82
106
|
export type RunOptions = {
|
|
@@ -91,11 +115,33 @@ const parseRunOptions = (options?: RunOptions): RunOptions => {
|
|
|
91
115
|
|
|
92
116
|
const Log = getLogger(LoggerNames.Device);
|
|
93
117
|
|
|
118
|
+
const isProtocolV2DeviceStatusUnsupportedError = (error: unknown) => {
|
|
119
|
+
if (error instanceof HardwareError) {
|
|
120
|
+
if (error.errorCode === HardwareErrorCode.DeviceNotSupportMethod) {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
if (error.params?.failureCode === 'Failure_UnexpectedMessage') {
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const message =
|
|
129
|
+
error instanceof Error
|
|
130
|
+
? error.message
|
|
131
|
+
: String((error as { message?: unknown } | null)?.message ?? error ?? '');
|
|
132
|
+
return (
|
|
133
|
+
/^Failure_UnexpectedMessage(?:,|\b)/i.test(message) ||
|
|
134
|
+
/\b(?:unsupported message|handler not registered|message handler not found)\b/i.test(message)
|
|
135
|
+
);
|
|
136
|
+
};
|
|
137
|
+
|
|
94
138
|
export interface DeviceEvents {
|
|
95
139
|
[DEVICE.PIN]: [Device, PROTO.PinMatrixRequestType | undefined, (err: any, pin: string) => void];
|
|
96
|
-
[DEVICE.PASSPHRASE_ON_DEVICE]: [Device,
|
|
140
|
+
[DEVICE.PASSPHRASE_ON_DEVICE]: [Device, PassphraseRequestPayload?];
|
|
141
|
+
[DEVICE.ATTACH_PIN_ON_DEVICE]: [Device, PassphraseRequestPayload?];
|
|
97
142
|
[DEVICE.BUTTON]: [Device, DeviceButtonRequestPayload];
|
|
98
143
|
[DEVICE.FEATURES]: [Device, DeviceFeaturesPayload];
|
|
144
|
+
[DEVICE.STATE]: [Device, DeviceStateEvent];
|
|
99
145
|
[DEVICE.PASSPHRASE]: [
|
|
100
146
|
Device,
|
|
101
147
|
PassphraseRequestPayload,
|
|
@@ -119,15 +165,14 @@ export interface Device {
|
|
|
119
165
|
emit<K extends keyof DeviceEvents>(type: K, ...args: DeviceEvents[K]): boolean;
|
|
120
166
|
}
|
|
121
167
|
|
|
122
|
-
const deviceSessionCache: Record<string, string> = {};
|
|
123
|
-
|
|
124
168
|
/**
|
|
125
169
|
* Pre-populate the device session cache with a known session ID.
|
|
126
170
|
*
|
|
127
171
|
* This allows short-lived processes (e.g. CLI) to restore a previously
|
|
128
172
|
* obtained session, avoiding the need to re-enter passphrase on every
|
|
129
173
|
* invocation. The session must have been obtained from a prior
|
|
130
|
-
*
|
|
174
|
+
* wallet-session call on the same device. This compatibility hook is intended
|
|
175
|
+
* for a trusted CLI process restoring its own OS-keychain entry.
|
|
131
176
|
*
|
|
132
177
|
* @param deviceId - The device's device_id (from features)
|
|
133
178
|
* @param passphraseState - The passphrase state token
|
|
@@ -138,8 +183,7 @@ export function preloadSessionCache(
|
|
|
138
183
|
passphraseState: string,
|
|
139
184
|
sessionId: string
|
|
140
185
|
): void {
|
|
141
|
-
|
|
142
|
-
deviceSessionCache[key] = sessionId;
|
|
186
|
+
deviceWalletSessionStore.set(deviceId, passphraseState, sessionId);
|
|
143
187
|
}
|
|
144
188
|
|
|
145
189
|
export class Device extends EventEmitter {
|
|
@@ -185,22 +229,34 @@ export class Device extends EventEmitter {
|
|
|
185
229
|
*/
|
|
186
230
|
private deviceAcquired = false;
|
|
187
231
|
|
|
188
|
-
/**
|
|
189
|
-
|
|
190
|
-
*
|
|
191
|
-
* V1 直接保存原生 Features;V2 保存由 DeviceInfoGet 映射出的
|
|
192
|
-
* Features 视图。Device 不再保存 profile,结构化 DeviceProfile 只作为
|
|
193
|
-
* getDeviceInfo() 的 API 返回值存在。
|
|
194
|
-
*/
|
|
195
|
-
features: Features | undefined = undefined;
|
|
232
|
+
/** Canonical device-state cache; legacy Features is a compatibility projection. */
|
|
233
|
+
private stateStore = new DeviceStateStore();
|
|
196
234
|
|
|
197
|
-
/**
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
235
|
+
/** Force the next initialization to reload DeviceInfo after reconnect or reboot. */
|
|
236
|
+
private protocolV2StateNeedsReload = false;
|
|
237
|
+
|
|
238
|
+
get state() {
|
|
239
|
+
return this.stateStore.getState();
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
get features(): Features | undefined {
|
|
243
|
+
if (!this.state) return undefined;
|
|
244
|
+
return projectFeatures(this.state);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
set features(features: Features | undefined) {
|
|
248
|
+
this.stateStore = new DeviceStateStore();
|
|
249
|
+
if (features) {
|
|
250
|
+
this.stateStore.update(mapFeaturesToState(features), 'compatibility');
|
|
251
|
+
const { passphraseState } = features;
|
|
252
|
+
const sessionId = features.sessionId ?? features.session_id;
|
|
253
|
+
const deviceKey = this.getSessionCacheDeviceKey(features.deviceId ?? undefined);
|
|
254
|
+
if (passphraseState && sessionId && deviceKey) {
|
|
255
|
+
this.passphraseState = passphraseState;
|
|
256
|
+
deviceWalletSessionStore.set(deviceKey, passphraseState, sessionId);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
204
260
|
|
|
205
261
|
runPromise?: Deferred<void> | null;
|
|
206
262
|
|
|
@@ -254,38 +310,46 @@ export class Device extends EventEmitter {
|
|
|
254
310
|
|
|
255
311
|
// simplified object to pass via postMessage
|
|
256
312
|
toMessageObject(): DeviceTyped | null {
|
|
257
|
-
if (this.isUnacquired()) return null;
|
|
313
|
+
if (this.isUnacquired() || !this.features) return null;
|
|
258
314
|
|
|
259
315
|
const env = DataManager.getSettings('env');
|
|
260
316
|
const deviceType = this.getCurrentDeviceType();
|
|
261
317
|
|
|
262
318
|
const bleName = this.getCurrentBleName();
|
|
263
|
-
const
|
|
319
|
+
const displayName = this.getCurrentDisplayName();
|
|
264
320
|
const serialNo = this.getCurrentSerialNo();
|
|
265
321
|
const connectId = this.getConnectId();
|
|
266
322
|
const deviceId = this.getCurrentDeviceId() || null;
|
|
267
323
|
|
|
268
|
-
const features = this
|
|
324
|
+
const { features } = this;
|
|
325
|
+
const state = this.state ? createPublicDeviceState(this.state) : undefined;
|
|
269
326
|
|
|
270
327
|
return {
|
|
271
|
-
/** Android uses
|
|
328
|
+
/** Android uses a MAC address, while iOS and USB use transport-specific identifiers. */
|
|
272
329
|
connectId: DataManager.isBleConnect(env) ? this.mainId || null : connectId,
|
|
273
|
-
/**
|
|
330
|
+
/** Persist this after the first active probe so later calls do not need to guess. */
|
|
331
|
+
connectProtocol: this.originalDescriptor.protocolType,
|
|
332
|
+
/** Stable physical-device identity. */
|
|
333
|
+
serialNo,
|
|
334
|
+
/** @deprecated Use serialNo instead. */
|
|
274
335
|
uuid: serialNo,
|
|
275
336
|
commType: this.originalDescriptor.commType,
|
|
276
337
|
sdkInstanceId: this.sdkInstanceId,
|
|
277
338
|
instanceId: this.instanceId,
|
|
278
339
|
createdAt: this.createdAt,
|
|
279
340
|
deviceType,
|
|
280
|
-
/** ID
|
|
341
|
+
/** Wallet-lifecycle ID; changes after the device is wiped or reinitialized. */
|
|
281
342
|
deviceId,
|
|
282
343
|
path: this.originalDescriptor?.path,
|
|
283
344
|
bleName,
|
|
284
|
-
name:
|
|
285
|
-
|
|
345
|
+
name: displayName || bleName || `OneKey ${deviceType?.toUpperCase()}`,
|
|
346
|
+
// Keep the legacy top-level field string-compatible while preserving
|
|
347
|
+
// the canonical nullable value at state.identity.label.
|
|
348
|
+
label: displayName ?? '',
|
|
349
|
+
status: this.getStatus(),
|
|
286
350
|
mode: this.getMode(),
|
|
287
351
|
features,
|
|
288
|
-
|
|
352
|
+
state,
|
|
289
353
|
firmwareVersion: this.getFirmwareVersion(),
|
|
290
354
|
bleFirmwareVersion: this.getBLEFirmwareVersion(),
|
|
291
355
|
unavailableCapabilities: this.unavailableCapabilities,
|
|
@@ -301,6 +365,10 @@ export class Device extends EventEmitter {
|
|
|
301
365
|
// eslint-disable-next-line no-async-promise-executor
|
|
302
366
|
return new Promise<boolean>(async (resolve, reject) => {
|
|
303
367
|
if (DataManager.isBleConnect(env)) {
|
|
368
|
+
if (this.hasDeviceAcquire() && this.commands && !this.commands.disposed) {
|
|
369
|
+
resolve(true);
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
304
372
|
try {
|
|
305
373
|
await this.acquire(connectProtocol);
|
|
306
374
|
resolve(true);
|
|
@@ -328,25 +396,25 @@ export class Device extends EventEmitter {
|
|
|
328
396
|
}
|
|
329
397
|
|
|
330
398
|
async acquire(
|
|
331
|
-
|
|
399
|
+
expectedProtocol?: HardwareConnectProtocol,
|
|
332
400
|
options?: { throwOnRunPromiseError?: boolean }
|
|
333
401
|
) {
|
|
334
402
|
const env = DataManager.getSettings('env');
|
|
335
403
|
const mainIdKey = DataManager.isBleConnect(env) ? 'id' : 'session';
|
|
336
|
-
const
|
|
404
|
+
const protocolHint = expectedProtocol ? undefined : this.originalDescriptor.protocolType;
|
|
337
405
|
try {
|
|
338
406
|
let acquireResult: unknown;
|
|
339
407
|
if (DataManager.isBleConnect(env)) {
|
|
340
|
-
//
|
|
341
|
-
//
|
|
342
|
-
//
|
|
343
|
-
//
|
|
344
|
-
// 因此对 BLE acquire 恒清理是有意为之。
|
|
408
|
+
// acquire starts a new BLE session. Any previous runPromise belongs to a dead
|
|
409
|
+
// session, such as an interrupted probe or firmware-update reboot, and would
|
|
410
|
+
// otherwise block the new session. Device cannot distinguish recovery from a
|
|
411
|
+
// regular acquire, so BLE always clears it intentionally.
|
|
345
412
|
acquireResult = await this.deviceConnector?.acquire(
|
|
346
413
|
this.originalDescriptor.id,
|
|
347
414
|
undefined,
|
|
348
415
|
true,
|
|
349
|
-
expectedProtocol
|
|
416
|
+
expectedProtocol,
|
|
417
|
+
protocolHint
|
|
350
418
|
);
|
|
351
419
|
this.mainId = (acquireResult as any)?.uuid ?? '';
|
|
352
420
|
Log.debug('Expected uuid:', this.mainId);
|
|
@@ -355,7 +423,8 @@ export class Device extends EventEmitter {
|
|
|
355
423
|
this.originalDescriptor.path,
|
|
356
424
|
this.originalDescriptor.session,
|
|
357
425
|
undefined,
|
|
358
|
-
expectedProtocol
|
|
426
|
+
expectedProtocol,
|
|
427
|
+
protocolHint
|
|
359
428
|
);
|
|
360
429
|
this.mainId = acquireResult as string | undefined;
|
|
361
430
|
Log.debug('Expected session id:', this.mainId);
|
|
@@ -482,12 +551,11 @@ export class Device extends EventEmitter {
|
|
|
482
551
|
}
|
|
483
552
|
|
|
484
553
|
/**
|
|
485
|
-
*
|
|
554
|
+
* Canonical protocol discriminator.
|
|
486
555
|
*
|
|
487
|
-
* descriptor.protocolType
|
|
488
|
-
*
|
|
489
|
-
*
|
|
490
|
-
* 或从 features 反推。
|
|
556
|
+
* descriptor.protocolType is established by active probing; V2 features are mapped
|
|
557
|
+
* from DeviceInfoGet. All protocol branches must use this method instead of reading
|
|
558
|
+
* originalDescriptor.protocolType directly or inferring a protocol from features.
|
|
491
559
|
*/
|
|
492
560
|
getProtocol(): 'V1' | 'V2' {
|
|
493
561
|
return this.originalDescriptor.protocolType === 'V2' ? 'V2' : 'V1';
|
|
@@ -498,53 +566,75 @@ export class Device extends EventEmitter {
|
|
|
498
566
|
}
|
|
499
567
|
|
|
500
568
|
getCurrentDeviceType() {
|
|
501
|
-
return
|
|
569
|
+
return this.state?.identity.deviceType ?? EDeviceType.Unknown;
|
|
502
570
|
}
|
|
503
571
|
|
|
504
572
|
getCurrentDeviceId() {
|
|
505
|
-
return this.
|
|
573
|
+
return this.state?.identity.deviceId || undefined;
|
|
506
574
|
}
|
|
507
575
|
|
|
508
576
|
getCurrentSerialNo() {
|
|
509
|
-
return this.
|
|
577
|
+
return this.state?.identity.serialNo ?? '';
|
|
510
578
|
}
|
|
511
579
|
|
|
512
580
|
getConnectId() {
|
|
513
581
|
const serialNo = this.getCurrentSerialNo();
|
|
514
582
|
if (serialNo) return serialNo;
|
|
515
583
|
|
|
516
|
-
// connectId
|
|
517
|
-
//
|
|
584
|
+
// connectId is an internal routing key. Falling back to the transport descriptor
|
|
585
|
+
// does not change the business meaning of features.serialNo or deviceId.
|
|
518
586
|
return this.originalDescriptor.path || this.originalDescriptor.id || '';
|
|
519
587
|
}
|
|
520
588
|
|
|
521
589
|
getCurrentBleName() {
|
|
522
|
-
return
|
|
590
|
+
return this.state?.identity.bleName ?? null;
|
|
523
591
|
}
|
|
524
592
|
|
|
525
593
|
getCurrentLabel() {
|
|
526
|
-
return
|
|
594
|
+
return this.state?.identity.label ?? null;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
getCurrentDisplayName() {
|
|
598
|
+
if (!this.state) return null;
|
|
599
|
+
|
|
600
|
+
const label = this.getCurrentLabel();
|
|
601
|
+
if (label) return label;
|
|
602
|
+
|
|
603
|
+
const bleName = this.getCurrentBleName();
|
|
604
|
+
if (bleName) return bleName;
|
|
605
|
+
|
|
606
|
+
const deviceType = this.getCurrentDeviceType();
|
|
607
|
+
if (deviceType === EDeviceType.ClassicPure) {
|
|
608
|
+
return 'OneKey Classic 1S';
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
return `OneKey ${deviceType.charAt(0).toUpperCase() + deviceType.slice(1)}`;
|
|
527
612
|
}
|
|
528
613
|
|
|
529
614
|
getCurrentPassphraseProtection() {
|
|
530
|
-
return this.
|
|
615
|
+
return this.state?.status.passphraseProtection;
|
|
531
616
|
}
|
|
532
617
|
|
|
533
618
|
getCurrentFirmwareType() {
|
|
534
|
-
return
|
|
619
|
+
return this.state?.identity.firmwareType ?? EFirmwareType.Universal;
|
|
535
620
|
}
|
|
536
621
|
|
|
537
622
|
getCurrentFirmwareVersionString() {
|
|
538
|
-
return
|
|
623
|
+
return parseDeviceVersion(this.state?.versions.firmware).join('.');
|
|
539
624
|
}
|
|
540
625
|
|
|
541
626
|
getCurrentBLEFirmwareVersionString() {
|
|
542
|
-
if (!this.
|
|
543
|
-
return
|
|
627
|
+
if (!this.state) return undefined;
|
|
628
|
+
return parseDeviceVersion(this.state.versions.ble).join('.');
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
getCurrentBootloaderVersionString() {
|
|
632
|
+
if (!this.state) return undefined;
|
|
633
|
+
return parseDeviceVersion(this.state.versions.bootloader).join('.');
|
|
544
634
|
}
|
|
545
635
|
|
|
546
636
|
getCurrentSafetyChecks() {
|
|
547
|
-
return this.
|
|
637
|
+
return this.state?.settings.safetyChecks;
|
|
548
638
|
}
|
|
549
639
|
|
|
550
640
|
getCurrentMethodVersionRange(
|
|
@@ -589,8 +679,6 @@ export class Device extends EventEmitter {
|
|
|
589
679
|
}
|
|
590
680
|
|
|
591
681
|
supportInputPinOnSoftware(): SupportFeatureType {
|
|
592
|
-
if (this.features) return supportInputPinOnSoftware(this.features);
|
|
593
|
-
|
|
594
682
|
const deviceType = this.getCurrentDeviceType();
|
|
595
683
|
if (
|
|
596
684
|
deviceType === EDeviceType.Touch ||
|
|
@@ -608,15 +696,12 @@ export class Device extends EventEmitter {
|
|
|
608
696
|
}
|
|
609
697
|
|
|
610
698
|
supportModifyHomescreen(): SupportFeatureType {
|
|
611
|
-
// Pro2
|
|
612
|
-
//
|
|
613
|
-
// 包含 homescreen 字段,V2 固件从首个版本即支持修改主屏。
|
|
699
|
+
// Pro2 has an independent 1.x version line and must not use the Touch/Pro 3.4.0
|
|
700
|
+
// threshold. ApplySettings includes homescreen from the first V2 firmware version.
|
|
614
701
|
if (this.isProtocolV2()) {
|
|
615
702
|
return { support: true };
|
|
616
703
|
}
|
|
617
704
|
|
|
618
|
-
if (this.features) return supportModifyHomescreen(this.features);
|
|
619
|
-
|
|
620
705
|
const deviceType = this.getCurrentDeviceType();
|
|
621
706
|
if (DeviceModelToTypes.model_mini.includes(deviceType)) {
|
|
622
707
|
return { support: true };
|
|
@@ -628,29 +713,29 @@ export class Device extends EventEmitter {
|
|
|
628
713
|
};
|
|
629
714
|
}
|
|
630
715
|
|
|
631
|
-
private generateStateKey(deviceId: string, passphraseState?: string) {
|
|
632
|
-
if (passphraseState) {
|
|
633
|
-
return `${deviceId}@${passphraseState}`;
|
|
634
|
-
}
|
|
635
|
-
return deviceId;
|
|
636
|
-
}
|
|
637
|
-
|
|
638
716
|
private getSessionCacheDeviceKey(_deviceId?: string) {
|
|
639
717
|
const deviceId = _deviceId || this.getCurrentDeviceId();
|
|
640
718
|
if (deviceId) return deviceId;
|
|
641
719
|
if (this.isProtocolV2()) {
|
|
642
|
-
return this.originalDescriptor.path
|
|
720
|
+
return this.originalDescriptor.path;
|
|
643
721
|
}
|
|
644
722
|
return undefined;
|
|
645
723
|
}
|
|
646
724
|
|
|
725
|
+
private reconcileSessionCacheDeviceIdentity(previousDeviceId?: string) {
|
|
726
|
+
deviceWalletSessionStore.reconcileDeviceIdentity({
|
|
727
|
+
temporaryKey: this.isProtocolV2() ? this.originalDescriptor.path : undefined,
|
|
728
|
+
previousDeviceId,
|
|
729
|
+
nextDeviceId: this.getCurrentDeviceId(),
|
|
730
|
+
});
|
|
731
|
+
}
|
|
732
|
+
|
|
647
733
|
getInternalState(_deviceId?: string) {
|
|
648
|
-
Log.debug('getInternalState session cache: ', deviceSessionCache);
|
|
649
734
|
Log.debug(
|
|
650
735
|
'getInternalState session param: ',
|
|
651
736
|
`device_id: ${_deviceId}`,
|
|
652
|
-
`
|
|
653
|
-
`
|
|
737
|
+
`currentDeviceId: ${this.getCurrentDeviceId()}`,
|
|
738
|
+
`hasPassphraseState: ${Boolean(this.passphraseState)}`
|
|
654
739
|
);
|
|
655
740
|
|
|
656
741
|
const deviceId = this.getSessionCacheDeviceKey(_deviceId);
|
|
@@ -663,8 +748,13 @@ export class Device extends EventEmitter {
|
|
|
663
748
|
// downstream call carries it and hits the primary lookup below.
|
|
664
749
|
if (!this.passphraseState) return undefined;
|
|
665
750
|
|
|
666
|
-
|
|
667
|
-
|
|
751
|
+
return deviceWalletSessionStore.get(deviceId, this.passphraseState);
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
getStandardInternalState(_deviceId?: string) {
|
|
755
|
+
const deviceId = this.getSessionCacheDeviceKey(_deviceId);
|
|
756
|
+
if (!deviceId) return undefined;
|
|
757
|
+
return deviceWalletSessionStore.getStandard(deviceId);
|
|
668
758
|
}
|
|
669
759
|
|
|
670
760
|
// attach to pin to fix internal state
|
|
@@ -673,46 +763,45 @@ export class Device extends EventEmitter {
|
|
|
673
763
|
passphraseState: string | undefined,
|
|
674
764
|
deviceId: string | undefined,
|
|
675
765
|
sessionId: string | null = null,
|
|
676
|
-
featuresSessionId: string | null = null
|
|
766
|
+
featuresSessionId: string | null = null,
|
|
767
|
+
walletType: 'standard' | 'hidden' = 'hidden'
|
|
677
768
|
) {
|
|
678
769
|
Log.debug(
|
|
679
770
|
'updateInternalState session param: ',
|
|
680
771
|
`device_id: ${deviceId}`,
|
|
681
772
|
`enablePassphrase: ${enablePassphrase}`,
|
|
682
|
-
`
|
|
683
|
-
`
|
|
684
|
-
`
|
|
773
|
+
`hasPassphraseState: ${Boolean(passphraseState)}`,
|
|
774
|
+
`hasSessionId: ${Boolean(sessionId)}`,
|
|
775
|
+
`hasFeaturesSessionId: ${Boolean(featuresSessionId)}`
|
|
685
776
|
);
|
|
686
777
|
|
|
687
778
|
const cacheDeviceKey = this.getSessionCacheDeviceKey(deviceId);
|
|
688
779
|
if (!cacheDeviceKey) return;
|
|
689
780
|
|
|
690
781
|
if (enablePassphrase) {
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
782
|
+
const walletSessionId =
|
|
783
|
+
sessionId || featuresSessionId || deviceWalletSessionStore.getPending(cacheDeviceKey);
|
|
784
|
+
if (walletType === 'standard') {
|
|
785
|
+
deviceWalletSessionStore.setStandard(
|
|
786
|
+
cacheDeviceKey,
|
|
787
|
+
passphraseState,
|
|
788
|
+
walletSessionId ?? undefined
|
|
789
|
+
);
|
|
790
|
+
} else {
|
|
791
|
+
deviceWalletSessionStore.set(cacheDeviceKey, passphraseState, walletSessionId ?? undefined);
|
|
697
792
|
}
|
|
698
793
|
}
|
|
699
794
|
|
|
700
|
-
|
|
701
|
-
const oldKey = `${cacheDeviceKey}`;
|
|
702
|
-
if (deviceSessionCache[oldKey]) {
|
|
703
|
-
delete deviceSessionCache[oldKey];
|
|
704
|
-
}
|
|
705
|
-
|
|
706
|
-
Log.debug('updateInternalState session cache: ', deviceSessionCache);
|
|
795
|
+
deviceWalletSessionStore.deletePending(cacheDeviceKey);
|
|
707
796
|
}
|
|
708
797
|
|
|
709
798
|
private setInternalState(state: string, initSession?: boolean) {
|
|
710
799
|
Log.debug(
|
|
711
800
|
'setInternalState session param: ',
|
|
712
|
-
`
|
|
801
|
+
`hasState: ${Boolean(state)}`,
|
|
713
802
|
`initSession: ${initSession}`,
|
|
714
|
-
`deviceId: ${this.
|
|
715
|
-
`
|
|
803
|
+
`deviceId: ${this.getCurrentDeviceId()}`,
|
|
804
|
+
`hasPassphraseState: ${Boolean(this.passphraseState)}`
|
|
716
805
|
);
|
|
717
806
|
|
|
718
807
|
if (!this.passphraseState && !initSession) return;
|
|
@@ -720,12 +809,11 @@ export class Device extends EventEmitter {
|
|
|
720
809
|
const deviceId = this.getSessionCacheDeviceKey();
|
|
721
810
|
if (!deviceId) return;
|
|
722
811
|
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
if (
|
|
726
|
-
|
|
812
|
+
if (this.passphraseState) {
|
|
813
|
+
deviceWalletSessionStore.set(deviceId, this.passphraseState, state);
|
|
814
|
+
} else if (initSession) {
|
|
815
|
+
deviceWalletSessionStore.setPending(deviceId, state);
|
|
727
816
|
}
|
|
728
|
-
Log.debug('setInternalState done session cache: ', deviceSessionCache);
|
|
729
817
|
}
|
|
730
818
|
|
|
731
819
|
clearInternalState(_deviceId?: string) {
|
|
@@ -733,70 +821,80 @@ export class Device extends EventEmitter {
|
|
|
733
821
|
|
|
734
822
|
const deviceId = this.getSessionCacheDeviceKey(_deviceId);
|
|
735
823
|
if (!deviceId) return;
|
|
736
|
-
|
|
737
|
-
delete deviceSessionCache[key];
|
|
824
|
+
deviceWalletSessionStore.deletePending(deviceId);
|
|
738
825
|
|
|
739
826
|
if (this.passphraseState) {
|
|
740
|
-
|
|
741
|
-
delete deviceSessionCache[usePassKey];
|
|
827
|
+
deviceWalletSessionStore.delete(deviceId, this.passphraseState);
|
|
742
828
|
}
|
|
743
829
|
}
|
|
744
830
|
|
|
831
|
+
clearStandardInternalState(_deviceId?: string) {
|
|
832
|
+
const deviceId = this.getSessionCacheDeviceKey(_deviceId);
|
|
833
|
+
if (!deviceId) return;
|
|
834
|
+
deviceWalletSessionStore.deleteStandard(deviceId);
|
|
835
|
+
}
|
|
836
|
+
|
|
745
837
|
async initialize(options?: InitOptions) {
|
|
746
|
-
// Protocol V2
|
|
838
|
+
// Protocol V2 does not support legacy Initialize; use its dedicated flow.
|
|
747
839
|
if (this.isProtocolV2()) {
|
|
748
840
|
this.passphraseState = options?.passphraseState;
|
|
749
|
-
if (this.
|
|
750
|
-
if (this.
|
|
841
|
+
if (this.state && !options?.initSession && !this.protocolV2StateNeedsReload) {
|
|
842
|
+
if (this.state.status.mode === 'bootloader' || this.state.status.mode === 'romloader') {
|
|
751
843
|
return;
|
|
752
844
|
}
|
|
753
|
-
//
|
|
754
|
-
//
|
|
755
|
-
// 用字段级合并保留已有版本和 SE 信息。
|
|
756
|
-
await this._refreshProtocolV2Status(options);
|
|
845
|
+
// Normal calls reuse the cache. Explicit getDeviceState refreshes, unlock flow,
|
|
846
|
+
// and device events update dynamic state without polling on every SDK call.
|
|
757
847
|
return;
|
|
758
848
|
}
|
|
759
849
|
await this._initializeProtocolV2(options);
|
|
850
|
+
this.protocolV2StateNeedsReload = false;
|
|
760
851
|
return;
|
|
761
852
|
}
|
|
762
853
|
|
|
763
|
-
|
|
854
|
+
try {
|
|
855
|
+
const callInitialize = async (payload: Record<string, unknown>, initSession?: boolean) => {
|
|
856
|
+
const initStartAt = Date.now();
|
|
857
|
+
const { message } = await this.commands.typedCall('Initialize', 'Features', payload, {
|
|
858
|
+
// iOS BLE bound devices can need close to 20 seconds.
|
|
859
|
+
timeoutMs: options?.timeoutMs ?? 25 * 1000,
|
|
860
|
+
});
|
|
861
|
+
this.setLastInitializeDuration(Date.now() - initStartAt);
|
|
862
|
+
this._updateFeatures(message, initSession);
|
|
863
|
+
await TransportManager.reconfigure(this.features);
|
|
864
|
+
};
|
|
764
865
|
|
|
765
|
-
|
|
866
|
+
const expectedDeviceId = options?.deviceId;
|
|
867
|
+
if (expectedDeviceId) {
|
|
868
|
+
// 先只读校验物理设备身份;钱包上下文仍由下方携带完整参数的
|
|
869
|
+
// Initialize 选择,避免标准钱包请求复用此前的隐藏钱包上下文。
|
|
870
|
+
this.passphraseState = undefined;
|
|
871
|
+
const { message } = await this.commands.typedCall('GetFeatures', 'Features', {});
|
|
872
|
+
this._updateFeatures(message);
|
|
873
|
+
await TransportManager.reconfigure(this.features);
|
|
874
|
+
if (!this.checkDeviceId(expectedDeviceId)) {
|
|
875
|
+
throw ERRORS.TypedError(HardwareErrorCode.DeviceCheckDeviceIdError);
|
|
876
|
+
}
|
|
877
|
+
}
|
|
766
878
|
|
|
767
|
-
|
|
768
|
-
this.clearInternalState(options?.deviceId);
|
|
769
|
-
}
|
|
879
|
+
this.passphraseState = options?.passphraseState;
|
|
770
880
|
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
payload.session_id = internalState;
|
|
775
|
-
}
|
|
881
|
+
if (options?.initSession) {
|
|
882
|
+
this.clearInternalState(options?.deviceId);
|
|
883
|
+
}
|
|
776
884
|
|
|
777
|
-
|
|
778
|
-
payload
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
885
|
+
const internalState = this.getInternalState(options?.deviceId);
|
|
886
|
+
const payload: Record<string, unknown> = {
|
|
887
|
+
passphrase_state: options?.passphraseState,
|
|
888
|
+
is_contains_attach: true,
|
|
889
|
+
};
|
|
890
|
+
if (internalState) {
|
|
891
|
+
payload.session_id = internalState;
|
|
892
|
+
}
|
|
893
|
+
if (options?.deriveCardano) {
|
|
894
|
+
payload.derive_cardano = true;
|
|
895
|
+
}
|
|
782
896
|
|
|
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);
|
|
897
|
+
await callInitialize(payload, options?.initSession);
|
|
800
898
|
} catch (error) {
|
|
801
899
|
Log.error('Initialization failed:', error);
|
|
802
900
|
throw error;
|
|
@@ -806,59 +904,38 @@ export class Device extends EventEmitter {
|
|
|
806
904
|
/**
|
|
807
905
|
* Device initialization over Protocol V2.
|
|
808
906
|
*
|
|
809
|
-
* Protocol V2
|
|
810
|
-
*
|
|
907
|
+
* Protocol V2 bypasses legacy Initialize/GetFeatures and builds its canonical
|
|
908
|
+
* features state directly from DeviceInfoGet.
|
|
811
909
|
*/
|
|
812
910
|
private async _initializeProtocolV2(options?: InitOptions) {
|
|
813
911
|
Log.debug('Initialize device via Protocol V2 features adapter');
|
|
814
912
|
|
|
815
913
|
try {
|
|
816
|
-
//
|
|
817
|
-
//
|
|
818
|
-
// 且 reject 后底层调用仍会残留。
|
|
914
|
+
// typedCall applies the request timeout. An outer Promise.race would leak its
|
|
915
|
+
// timer and leave the underlying call active after rejection.
|
|
819
916
|
const deviceInfo = await requestProtocolV2DeviceInfo({
|
|
820
917
|
commands: this.commands,
|
|
821
918
|
timeoutMs: options?.protocolV2DeviceInfoTimeoutMs,
|
|
822
919
|
});
|
|
823
|
-
//
|
|
824
|
-
//
|
|
825
|
-
const features = this.
|
|
920
|
+
// The default request excludes SE/hash data and therefore uses basic scope.
|
|
921
|
+
// Full version and verification data require getDeviceState({ scope: 'firmware' }).
|
|
922
|
+
const features = await this.probeProtocolV2RuntimeState(
|
|
923
|
+
deviceInfo,
|
|
924
|
+
options?.protocolV2DeviceInfoTimeoutMs
|
|
925
|
+
);
|
|
826
926
|
Log.debug('Protocol V2 features:', features);
|
|
827
|
-
this.featuresNeedsReload = false;
|
|
828
927
|
} catch (error) {
|
|
829
928
|
Log.error('Protocol V2 initialization failed:', error);
|
|
830
929
|
throw error;
|
|
831
930
|
}
|
|
832
931
|
}
|
|
833
932
|
|
|
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
933
|
async getFeatures() {
|
|
857
934
|
if (this.isProtocolV2()) {
|
|
858
935
|
const deviceInfo = await requestProtocolV2DeviceInfo({
|
|
859
936
|
commands: this.commands,
|
|
860
937
|
});
|
|
861
|
-
return this.
|
|
938
|
+
return this.probeProtocolV2RuntimeState(deviceInfo);
|
|
862
939
|
}
|
|
863
940
|
|
|
864
941
|
const { message } = await this.commands.typedCall('GetFeatures', 'Features', {});
|
|
@@ -866,36 +943,277 @@ export class Device extends EventEmitter {
|
|
|
866
943
|
return this.features;
|
|
867
944
|
}
|
|
868
945
|
|
|
946
|
+
async getDeviceState(params: DeviceStateReadOptions = {}) {
|
|
947
|
+
const refresh = new Set(params.refreshSections ?? []);
|
|
948
|
+
const getProtocolV2DeviceInfoRequest = () => {
|
|
949
|
+
if (refresh.has('verification')) return PROTOCOL_V2_FULL_DEVICE_INFO_REQUEST;
|
|
950
|
+
if (refresh.has('versions')) return PROTOCOL_V2_VERSIONS_DEVICE_INFO_REQUEST;
|
|
951
|
+
return PROTOCOL_V2_FEATURES_DEVICE_INFO_REQUEST;
|
|
952
|
+
};
|
|
953
|
+
let initializedWithDeviceInfo = false;
|
|
954
|
+
let refreshedDeviceInfo: ProtocolV2DeviceInfo | undefined;
|
|
955
|
+
|
|
956
|
+
if (!this.state) {
|
|
957
|
+
if (this.isProtocolV2()) {
|
|
958
|
+
const deviceInfo = await requestProtocolV2DeviceInfo({
|
|
959
|
+
commands: this.commands,
|
|
960
|
+
request: getProtocolV2DeviceInfoRequest(),
|
|
961
|
+
});
|
|
962
|
+
await this.probeProtocolV2RuntimeState(deviceInfo);
|
|
963
|
+
refreshedDeviceInfo = deviceInfo;
|
|
964
|
+
initializedWithDeviceInfo = true;
|
|
965
|
+
} else {
|
|
966
|
+
await this.getFeatures();
|
|
967
|
+
}
|
|
968
|
+
} else if (!this.isProtocolV2() && refresh.size > 0) {
|
|
969
|
+
await this.getFeatures();
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
if (!this.isProtocolV2() && refresh.has('verification')) {
|
|
973
|
+
const { message } = await this.commands.typedCall('OnekeyGetFeatures', 'OnekeyFeatures');
|
|
974
|
+
this.updateState(mapProtocolV1OnekeyFeaturesToState(message), 'device-info');
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
if (this.isProtocolV2()) {
|
|
978
|
+
const refreshDeviceInfo =
|
|
979
|
+
refresh.has('identity') || refresh.has('versions') || refresh.has('verification');
|
|
980
|
+
if (refreshDeviceInfo && !initializedWithDeviceInfo) {
|
|
981
|
+
const deviceInfo = await requestProtocolV2DeviceInfo({
|
|
982
|
+
commands: this.commands,
|
|
983
|
+
request: getProtocolV2DeviceInfoRequest(),
|
|
984
|
+
});
|
|
985
|
+
refreshedDeviceInfo = deviceInfo;
|
|
986
|
+
if (!refresh.has('status')) {
|
|
987
|
+
this.updateState(
|
|
988
|
+
mapProtocolV2DeviceInfoToState(deviceInfo, this.state?.status.mode),
|
|
989
|
+
'device-info'
|
|
990
|
+
);
|
|
991
|
+
}
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
if (refresh.has('status') && !initializedWithDeviceInfo) {
|
|
995
|
+
const deviceInfo =
|
|
996
|
+
refreshedDeviceInfo ??
|
|
997
|
+
(await requestProtocolV2DeviceInfo({
|
|
998
|
+
commands: this.commands,
|
|
999
|
+
request: getProtocolV2DeviceInfoRequest(),
|
|
1000
|
+
}));
|
|
1001
|
+
await this.probeProtocolV2RuntimeState(deviceInfo);
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
if (refresh.has('settings') && this.state?.status.mode === 'normal') {
|
|
1005
|
+
const { message } = await this.commands.typedCall(
|
|
1006
|
+
'DeviceSettingsGet',
|
|
1007
|
+
'DeviceSettings',
|
|
1008
|
+
{}
|
|
1009
|
+
);
|
|
1010
|
+
this.updateState(mapDeviceSettingsToState(message), 'settings-read');
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
if (!this.state) {
|
|
1015
|
+
throw ERRORS.TypedError(HardwareErrorCode.DeviceInitializeFailed);
|
|
1016
|
+
}
|
|
1017
|
+
return params.includeRaw ? cloneDeviceState(this.state) : createPublicDeviceState(this.state);
|
|
1018
|
+
}
|
|
1019
|
+
|
|
869
1020
|
_updateFeatures(protoFeatures: PROTO.Features | Features, initSession?: boolean) {
|
|
1021
|
+
const previousDeviceId = this.getCurrentDeviceId();
|
|
870
1022
|
let feat =
|
|
871
1023
|
'protocol' in protoFeatures
|
|
872
1024
|
? protoFeatures
|
|
873
1025
|
: buildProtocolV1FeaturesPayload(protoFeatures, this.features);
|
|
874
1026
|
|
|
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
1027
|
feat.unlocked = feat.unlocked ?? true;
|
|
883
1028
|
|
|
884
1029
|
feat = fixFeaturesFirmwareVersion(feat);
|
|
885
1030
|
|
|
886
|
-
this.
|
|
887
|
-
this.
|
|
888
|
-
|
|
1031
|
+
this.updateState(mapFeaturesToState(feat), 'initialize');
|
|
1032
|
+
this.reconcileSessionCacheDeviceIdentity(previousDeviceId);
|
|
1033
|
+
if (feat.deviceId && feat.sessionId) {
|
|
1034
|
+
this.setInternalState(feat.sessionId, initSession);
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
updateState(patch: DeviceStatePatch, source: DeviceStateUpdateSource) {
|
|
1039
|
+
const result = this.stateStore.update(patch, source);
|
|
1040
|
+
if (result.changedKeys.length === 0) return result.state;
|
|
1041
|
+
|
|
1042
|
+
const event: DeviceStateEvent = {
|
|
1043
|
+
connectId: this.getConnectId() ?? null,
|
|
1044
|
+
state: createPublicDeviceState(result.state),
|
|
1045
|
+
revision: result.revision,
|
|
1046
|
+
source,
|
|
1047
|
+
changedKeys: result.changedKeys,
|
|
1048
|
+
};
|
|
1049
|
+
Log.debug('Device state patch committed', {
|
|
1050
|
+
source,
|
|
1051
|
+
keys: result.changedKeys,
|
|
1052
|
+
});
|
|
1053
|
+
this.emit(DEVICE.STATE, this, event);
|
|
1054
|
+
if (result.state.protocol === 'V1') {
|
|
1055
|
+
this.emit(DEVICE.FEATURES, this, projectFeatures(result.state));
|
|
1056
|
+
}
|
|
1057
|
+
return result.state;
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
updateFeaturesPatch(patch: Partial<Features>, source: DeviceStateUpdateSource) {
|
|
1061
|
+
const currentFeatures = this.features;
|
|
1062
|
+
if (!currentFeatures) return undefined;
|
|
1063
|
+
|
|
1064
|
+
const features = mergeDeviceFeaturesPatch(currentFeatures, patch);
|
|
1065
|
+
if (features === currentFeatures) return currentFeatures;
|
|
1066
|
+
|
|
1067
|
+
const normalized = fixFeaturesFirmwareVersion(features);
|
|
1068
|
+
this.updateState(mapFeaturesToState(normalized), source);
|
|
1069
|
+
return this.features;
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
async probeProtocolV2RuntimeState(deviceInfo: ProtocolV2DeviceInfo, timeoutMs?: number) {
|
|
1073
|
+
const protocolInfo = await requestProtocolV2ProtocolInfo({
|
|
1074
|
+
commands: this.commands,
|
|
1075
|
+
timeoutMs,
|
|
1076
|
+
});
|
|
1077
|
+
const runtimeMode = getProtocolV2RuntimeMode(protocolInfo);
|
|
1078
|
+
const protocolV2DeviceType = resolveProtocolV2DeviceIdentity(
|
|
1079
|
+
deviceInfo.hw?.Device_type
|
|
1080
|
+
).deviceType;
|
|
1081
|
+
if (runtimeMode === 'romloader' && protocolV2DeviceType !== EDeviceType.Pro2) {
|
|
1082
|
+
throw ERRORS.TypedError(
|
|
1083
|
+
HardwareErrorCode.DeviceInitializeFailed,
|
|
1084
|
+
'Protocol V2 romloader mode is only supported for Pro2.'
|
|
1085
|
+
);
|
|
1086
|
+
}
|
|
1087
|
+
const deviceStatusSupported = supportsProtocolV2Message(
|
|
1088
|
+
protocolInfo,
|
|
1089
|
+
PROTOCOL_V2_DEVICE_STATUS_GET_MESSAGE_TYPE
|
|
1090
|
+
);
|
|
1091
|
+
|
|
1092
|
+
if (runtimeMode === 'bootloader' || runtimeMode === 'romloader') {
|
|
1093
|
+
return this.updateProtocolV2Features(deviceInfo, null, runtimeMode, protocolInfo);
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
if (!deviceStatusSupported) {
|
|
1097
|
+
if (runtimeMode === 'normal') {
|
|
1098
|
+
return this.updateProtocolV2Features(deviceInfo, null, runtimeMode, protocolInfo);
|
|
1099
|
+
}
|
|
1100
|
+
throw ERRORS.TypedError(
|
|
1101
|
+
HardwareErrorCode.DeviceInitializeFailed,
|
|
1102
|
+
`Unknown Protocol V2 build fingerprint without DeviceStatusGet capability: ${protocolInfo.build_fingerprint}`
|
|
1103
|
+
);
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
let deviceStatus: DeviceStatus;
|
|
1107
|
+
try {
|
|
1108
|
+
deviceStatus = await requestProtocolV2DeviceStatus({
|
|
1109
|
+
commands: this.commands,
|
|
1110
|
+
timeoutMs,
|
|
1111
|
+
});
|
|
1112
|
+
} catch (error) {
|
|
1113
|
+
if (runtimeMode === undefined && isProtocolV2DeviceStatusUnsupportedError(error)) {
|
|
1114
|
+
return this.updateProtocolV2Features(deviceInfo, null, 'bootloader', protocolInfo);
|
|
1115
|
+
}
|
|
1116
|
+
throw error;
|
|
1117
|
+
}
|
|
1118
|
+
return this.updateProtocolV2Features(deviceInfo, deviceStatus, 'normal', protocolInfo);
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
updateProtocolV2Features(
|
|
1122
|
+
deviceInfo?: ProtocolV2DeviceInfo,
|
|
1123
|
+
deviceStatus?: DeviceStatus | null,
|
|
1124
|
+
runtimeMode?: ProtocolV2RuntimeMode,
|
|
1125
|
+
protocolInfo?: ProtocolInfo
|
|
1126
|
+
) {
|
|
1127
|
+
const previousDeviceId = this.getCurrentDeviceId();
|
|
1128
|
+
const resolvedMode = runtimeMode ?? (deviceStatus ? 'normal' : this.state?.status.mode);
|
|
1129
|
+
if (deviceInfo) {
|
|
1130
|
+
this.updateState(mapProtocolV2DeviceInfoToState(deviceInfo, resolvedMode), 'device-info');
|
|
1131
|
+
}
|
|
1132
|
+
if (protocolInfo) {
|
|
1133
|
+
this.updateState({ raw: { protocolV2ProtocolInfo: protocolInfo } }, 'device-info');
|
|
1134
|
+
}
|
|
1135
|
+
if (deviceStatus) {
|
|
1136
|
+
this.updateState(mapProtocolV2DeviceStatusToState(deviceStatus), 'device-status');
|
|
1137
|
+
}
|
|
1138
|
+
this.reconcileSessionCacheDeviceIdentity(previousDeviceId);
|
|
1139
|
+
return this.features as Features;
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
updateProtocolV2Status(status: DeviceStatus) {
|
|
1143
|
+
const previousDeviceInfo = this.state?.raw?.protocolV2DeviceInfo;
|
|
1144
|
+
const previousStatus = this.state?.raw?.protocolV2DeviceStatus;
|
|
1145
|
+
return this.updateProtocolV2Features(previousDeviceInfo, {
|
|
1146
|
+
...previousStatus,
|
|
1147
|
+
...status,
|
|
1148
|
+
});
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
markTransportDisconnected() {
|
|
1152
|
+
this.deviceAcquired = false;
|
|
1153
|
+
if (!this.isProtocolV2()) return;
|
|
1154
|
+
this.protocolV2StateNeedsReload = true;
|
|
1155
|
+
this.clearPreInitialized();
|
|
889
1156
|
}
|
|
890
1157
|
|
|
891
|
-
|
|
892
|
-
const
|
|
893
|
-
|
|
1158
|
+
invalidateAfterWipe() {
|
|
1159
|
+
const deviceId = this.getCurrentDeviceId();
|
|
1160
|
+
if (deviceId) {
|
|
1161
|
+
deviceWalletSessionStore.deleteDevice(deviceId);
|
|
1162
|
+
}
|
|
1163
|
+
if (this.isProtocolV2() && this.originalDescriptor.path !== deviceId) {
|
|
1164
|
+
deviceWalletSessionStore.deleteDevice(this.originalDescriptor.path);
|
|
1165
|
+
this.protocolV2StateNeedsReload = true;
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
this.passphraseState = undefined;
|
|
1169
|
+
this.stateStore = new DeviceStateStore();
|
|
1170
|
+
this.clearPreInitialized();
|
|
1171
|
+
this.needReloadDevice = true;
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
markProtocolV2Reboot(rebootType: DeviceRebootType) {
|
|
1175
|
+
if (!this.isProtocolV2()) return;
|
|
1176
|
+
|
|
1177
|
+
this.protocolV2StateNeedsReload = true;
|
|
1178
|
+
this.clearPreInitialized();
|
|
1179
|
+
let loaderMode: 'bootloader' | 'romloader' | undefined;
|
|
1180
|
+
if (rebootType === DeviceRebootType.Bootloader) {
|
|
1181
|
+
loaderMode = 'bootloader';
|
|
1182
|
+
} else if (rebootType === DeviceRebootType.Romloader) {
|
|
1183
|
+
loaderMode = 'romloader';
|
|
1184
|
+
}
|
|
1185
|
+
if (loaderMode) {
|
|
1186
|
+
this.updateState(
|
|
1187
|
+
{
|
|
1188
|
+
identity: { deviceId: null },
|
|
1189
|
+
status: {
|
|
1190
|
+
mode: loaderMode,
|
|
1191
|
+
initialized: null,
|
|
1192
|
+
unlocked: null,
|
|
1193
|
+
firmwarePresent: null,
|
|
1194
|
+
backupRequired: null,
|
|
1195
|
+
noBackup: null,
|
|
1196
|
+
unfinishedBackup: null,
|
|
1197
|
+
recoveryMode: null,
|
|
1198
|
+
passphraseProtection: null,
|
|
1199
|
+
pinProtection: null,
|
|
1200
|
+
attachToPinEnabled: null,
|
|
1201
|
+
unlockedAttachPin: null,
|
|
1202
|
+
},
|
|
1203
|
+
raw: { protocolV2ProtocolInfo: null, protocolV2DeviceStatus: null },
|
|
1204
|
+
},
|
|
1205
|
+
'transport-reconnect'
|
|
1206
|
+
);
|
|
1207
|
+
return;
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
this.updateState(
|
|
1211
|
+
{
|
|
1212
|
+
status: { mode: 'normal', unlocked: null },
|
|
1213
|
+
raw: { protocolV2ProtocolInfo: null, protocolV2DeviceStatus: null },
|
|
1214
|
+
},
|
|
1215
|
+
'transport-reconnect'
|
|
894
1216
|
);
|
|
895
|
-
this.features = features;
|
|
896
|
-
this.featuresNeedsReload = false;
|
|
897
|
-
this.emit(DEVICE.FEATURES, this, features);
|
|
898
|
-
return features;
|
|
899
1217
|
}
|
|
900
1218
|
|
|
901
1219
|
/**
|
|
@@ -916,8 +1234,7 @@ export class Device extends EventEmitter {
|
|
|
916
1234
|
}
|
|
917
1235
|
|
|
918
1236
|
if (forceUpdate) {
|
|
919
|
-
//
|
|
920
|
-
// 不能让覆盖丢掉已探测的协议结果。
|
|
1237
|
+
// Enumerated descriptors may omit protocolType, so preserve an actively probed value.
|
|
921
1238
|
this.originalDescriptor = {
|
|
922
1239
|
...descriptor,
|
|
923
1240
|
protocolType: descriptor.protocolType ?? this.originalDescriptor.protocolType,
|
|
@@ -942,19 +1259,37 @@ export class Device extends EventEmitter {
|
|
|
942
1259
|
|
|
943
1260
|
options = parseRunOptions(options);
|
|
944
1261
|
|
|
945
|
-
|
|
946
|
-
|
|
1262
|
+
const runPromise = createDeferred<void>();
|
|
1263
|
+
this.runPromise = runPromise;
|
|
1264
|
+
this._runInner(fn, options, runPromise).catch(error => {
|
|
1265
|
+
if (this.runPromise === runPromise) {
|
|
1266
|
+
this.runPromise = null;
|
|
1267
|
+
}
|
|
1268
|
+
runPromise.reject(error);
|
|
1269
|
+
});
|
|
1270
|
+
return runPromise.promise;
|
|
947
1271
|
}
|
|
948
1272
|
|
|
949
|
-
async _runInner<T>(
|
|
1273
|
+
async _runInner<T>(
|
|
1274
|
+
fn: (() => Promise<T>) | undefined,
|
|
1275
|
+
options: RunOptions,
|
|
1276
|
+
runPromise: Deferred<void>
|
|
1277
|
+
) {
|
|
1278
|
+
const clearRunPromise = () => {
|
|
1279
|
+
if (this.runPromise === runPromise) {
|
|
1280
|
+
this.runPromise = null;
|
|
1281
|
+
}
|
|
1282
|
+
};
|
|
1283
|
+
|
|
950
1284
|
if (!this.isUsedHere() || this.commands.disposed) {
|
|
951
1285
|
const env = DataManager.getSettings('env');
|
|
952
1286
|
if (env !== 'react-native') {
|
|
953
1287
|
try {
|
|
954
1288
|
await this.acquire(options.connectProtocol);
|
|
955
1289
|
} catch (error) {
|
|
956
|
-
|
|
957
|
-
|
|
1290
|
+
clearRunPromise();
|
|
1291
|
+
runPromise.reject(error);
|
|
1292
|
+
return;
|
|
958
1293
|
}
|
|
959
1294
|
|
|
960
1295
|
try {
|
|
@@ -964,16 +1299,19 @@ export class Device extends EventEmitter {
|
|
|
964
1299
|
}
|
|
965
1300
|
}
|
|
966
1301
|
} catch (error) {
|
|
967
|
-
this.
|
|
1302
|
+
await this.release();
|
|
1303
|
+
clearRunPromise();
|
|
968
1304
|
if (error instanceof HardwareError) {
|
|
969
|
-
|
|
1305
|
+
runPromise.reject(error);
|
|
1306
|
+
return;
|
|
970
1307
|
}
|
|
971
|
-
|
|
1308
|
+
runPromise.reject(
|
|
972
1309
|
ERRORS.TypedError(
|
|
973
1310
|
HardwareErrorCode.DeviceInitializeFailed,
|
|
974
1311
|
`Initialize failed: ${error.message as string}, code: ${error.code as string}`
|
|
975
1312
|
)
|
|
976
1313
|
);
|
|
1314
|
+
return;
|
|
977
1315
|
}
|
|
978
1316
|
} else if (env === 'react-native') {
|
|
979
1317
|
// TODO: implement react-native acquire
|
|
@@ -992,9 +1330,7 @@ export class Device extends EventEmitter {
|
|
|
992
1330
|
try {
|
|
993
1331
|
await fn();
|
|
994
1332
|
} catch (e) {
|
|
995
|
-
|
|
996
|
-
this.runPromise.reject(e);
|
|
997
|
-
}
|
|
1333
|
+
runPromise.reject(e);
|
|
998
1334
|
|
|
999
1335
|
if (
|
|
1000
1336
|
e instanceof HardwareError &&
|
|
@@ -1007,7 +1343,7 @@ export class Device extends EventEmitter {
|
|
|
1007
1343
|
Log.debug(`error code ${e.errorCode} release device, mainId: ${this.mainId}`);
|
|
1008
1344
|
}
|
|
1009
1345
|
|
|
1010
|
-
|
|
1346
|
+
clearRunPromise();
|
|
1011
1347
|
return;
|
|
1012
1348
|
}
|
|
1013
1349
|
}
|
|
@@ -1021,11 +1357,8 @@ export class Device extends EventEmitter {
|
|
|
1021
1357
|
Log.debug('release device, mainId: ', this.mainId);
|
|
1022
1358
|
}
|
|
1023
1359
|
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
}
|
|
1027
|
-
|
|
1028
|
-
this.runPromise = null;
|
|
1360
|
+
runPromise.resolve();
|
|
1361
|
+
clearRunPromise();
|
|
1029
1362
|
}
|
|
1030
1363
|
|
|
1031
1364
|
async interruptionFromOutside() {
|
|
@@ -1064,33 +1397,37 @@ export class Device extends EventEmitter {
|
|
|
1064
1397
|
}
|
|
1065
1398
|
|
|
1066
1399
|
getMode() {
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1400
|
+
switch (this.state?.status.mode) {
|
|
1401
|
+
case 'bootloader':
|
|
1402
|
+
case 'romloader':
|
|
1403
|
+
return EOneKeyDeviceMode.bootloader;
|
|
1404
|
+
case 'notInitialized':
|
|
1405
|
+
return EOneKeyDeviceMode.notInitialized;
|
|
1406
|
+
case 'backupMode':
|
|
1407
|
+
return EOneKeyDeviceMode.backupMode;
|
|
1408
|
+
case 'normal':
|
|
1409
|
+
return EOneKeyDeviceMode.normal;
|
|
1410
|
+
default:
|
|
1411
|
+
break;
|
|
1075
1412
|
}
|
|
1076
1413
|
|
|
1077
|
-
if (this.features?.noBackup) {
|
|
1078
|
-
// backup mode
|
|
1079
|
-
return EOneKeyDeviceMode.backupMode;
|
|
1080
|
-
}
|
|
1081
|
-
|
|
1082
|
-
// normal mode
|
|
1083
1414
|
return EOneKeyDeviceMode.normal;
|
|
1084
1415
|
}
|
|
1085
1416
|
|
|
1417
|
+
getStatus() {
|
|
1418
|
+
if (this.isUsedElsewhere()) return 'occupied' as const;
|
|
1419
|
+
if (this.isUsedHere()) return 'used' as const;
|
|
1420
|
+
return 'available' as const;
|
|
1421
|
+
}
|
|
1422
|
+
|
|
1086
1423
|
getFirmwareVersion() {
|
|
1087
|
-
if (!this.
|
|
1088
|
-
return
|
|
1424
|
+
if (!this.state) return null;
|
|
1425
|
+
return parseDeviceVersion(this.state.versions.firmware);
|
|
1089
1426
|
}
|
|
1090
1427
|
|
|
1091
1428
|
getBLEFirmwareVersion() {
|
|
1092
|
-
if (!this.
|
|
1093
|
-
return
|
|
1429
|
+
if (!this.state) return null;
|
|
1430
|
+
return parseDeviceVersion(this.state.versions.ble);
|
|
1094
1431
|
}
|
|
1095
1432
|
|
|
1096
1433
|
isUsed() {
|
|
@@ -1108,7 +1445,7 @@ export class Device extends EventEmitter {
|
|
|
1108
1445
|
isUsedHere() {
|
|
1109
1446
|
const env = DataManager.getSettings('env');
|
|
1110
1447
|
if (DataManager.isBleConnect(env)) {
|
|
1111
|
-
return
|
|
1448
|
+
return this.deviceAcquired;
|
|
1112
1449
|
}
|
|
1113
1450
|
return this.isUsed() && this.originalDescriptor.session === this.mainId;
|
|
1114
1451
|
}
|
|
@@ -1118,26 +1455,38 @@ export class Device extends EventEmitter {
|
|
|
1118
1455
|
}
|
|
1119
1456
|
|
|
1120
1457
|
isBootloader() {
|
|
1121
|
-
|
|
1458
|
+
if (!this.state) return undefined;
|
|
1459
|
+
return this.state.status.mode === 'bootloader';
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1462
|
+
isRomloader() {
|
|
1463
|
+
if (!this.state) return undefined;
|
|
1464
|
+
return (
|
|
1465
|
+
this.isProtocolV2() &&
|
|
1466
|
+
this.getCurrentDeviceType() === EDeviceType.Pro2 &&
|
|
1467
|
+
this.state.status.mode === 'romloader'
|
|
1468
|
+
);
|
|
1122
1469
|
}
|
|
1123
1470
|
|
|
1124
1471
|
isInitialized() {
|
|
1125
|
-
|
|
1472
|
+
if (!this.state) return undefined;
|
|
1473
|
+
return this.state.status.initialized === true;
|
|
1126
1474
|
}
|
|
1127
1475
|
|
|
1128
1476
|
isSeedless() {
|
|
1129
|
-
|
|
1477
|
+
if (!this.state) return undefined;
|
|
1478
|
+
return this.state.status.noBackup === true;
|
|
1130
1479
|
}
|
|
1131
1480
|
|
|
1132
1481
|
isUnacquired(): boolean {
|
|
1133
|
-
return this.
|
|
1482
|
+
return this.state === undefined;
|
|
1134
1483
|
}
|
|
1135
1484
|
|
|
1136
1485
|
hasUnexpectedMode(allow: string[], require: string[]) {
|
|
1137
1486
|
// both allow and require cases might generate single unexpected mode
|
|
1138
1487
|
if (!this.isUnacquired()) {
|
|
1139
1488
|
// allow cases
|
|
1140
|
-
if (this.isBootloader() && !allow.includes(UI_REQUEST.BOOTLOADER)) {
|
|
1489
|
+
if (this.isBootloader() && !this.isProtocolV2() && !allow.includes(UI_REQUEST.BOOTLOADER)) {
|
|
1141
1490
|
return UI_REQUEST.BOOTLOADER;
|
|
1142
1491
|
}
|
|
1143
1492
|
if (!this.isInitialized() && !allow.includes(UI_REQUEST.NOT_INITIALIZE)) {
|
|
@@ -1161,7 +1510,7 @@ export class Device extends EventEmitter {
|
|
|
1161
1510
|
deviceType === EDeviceType.Touch ||
|
|
1162
1511
|
deviceType === EDeviceType.Pro ||
|
|
1163
1512
|
deviceType === EDeviceType.Pro2;
|
|
1164
|
-
const unlocked = this.
|
|
1513
|
+
const unlocked = this.state?.status.unlocked;
|
|
1165
1514
|
const preCheckTouch = isModeT && unlocked === false;
|
|
1166
1515
|
const passphraseProtection = this.getCurrentPassphraseProtection();
|
|
1167
1516
|
|
|
@@ -1174,12 +1523,12 @@ export class Device extends EventEmitter {
|
|
|
1174
1523
|
|
|
1175
1524
|
async lockDevice(): Promise<Success> {
|
|
1176
1525
|
const res = await this.commands.typedCall('LockDevice', 'Success', {});
|
|
1526
|
+
this.updateState({ status: { unlocked: false } }, 'lock');
|
|
1177
1527
|
return res.message;
|
|
1178
1528
|
}
|
|
1179
1529
|
|
|
1180
1530
|
supportUnlockVersionRange(): DeviceFirmwareRange {
|
|
1181
|
-
//
|
|
1182
|
-
// 且 Protocol V2 固件从首个版本即支持 UnLockDevice(见 unlockDevice 的 isProtocolV2 短路)。
|
|
1531
|
+
// This range applies to Protocol V1 Pro devices; Pro2 has a dedicated unlock flow.
|
|
1183
1532
|
return {
|
|
1184
1533
|
pro: {
|
|
1185
1534
|
min: '4.15.0',
|
|
@@ -1187,19 +1536,34 @@ export class Device extends EventEmitter {
|
|
|
1187
1536
|
};
|
|
1188
1537
|
}
|
|
1189
1538
|
|
|
1190
|
-
async unlockDevice() {
|
|
1539
|
+
async unlockDevice(pinType: DeviceSessionPinType = DeviceSessionPinType.Main) {
|
|
1540
|
+
if (this.isProtocolV2()) {
|
|
1541
|
+
try {
|
|
1542
|
+
await this.commands.typedCall('DeviceSessionAskPin', 'Success', { type: pinType });
|
|
1543
|
+
} catch (error) {
|
|
1544
|
+
const errorText =
|
|
1545
|
+
error instanceof Error
|
|
1546
|
+
? `${error.name} ${error.message}`
|
|
1547
|
+
: String((error as { message?: unknown } | null)?.message ?? error ?? '');
|
|
1548
|
+
if (errorText.includes('Failure_UnexpectedMessage')) {
|
|
1549
|
+
throw createDeviceNotSupportMethodError('deviceUnlock', this.getCurrentFirmwareType());
|
|
1550
|
+
}
|
|
1551
|
+
throw error;
|
|
1552
|
+
}
|
|
1553
|
+
|
|
1554
|
+
const status = await requestProtocolV2DeviceStatus({ commands: this.commands });
|
|
1555
|
+
return this.updateProtocolV2Status(status);
|
|
1556
|
+
}
|
|
1557
|
+
|
|
1191
1558
|
const firmwareVersion = this.getCurrentFirmwareVersionString() ?? '0.0.0';
|
|
1192
1559
|
const versionRange = this.getCurrentMethodVersionRange(
|
|
1193
1560
|
type => this.supportUnlockVersionRange()[type]
|
|
1194
1561
|
);
|
|
1195
1562
|
|
|
1196
|
-
const supportAttachPinCapability =
|
|
1197
|
-
this.features,
|
|
1563
|
+
const supportAttachPinCapability = this.state?.capabilities.includes(
|
|
1198
1564
|
Enum_Capability.Capability_AttachToPin
|
|
1199
1565
|
);
|
|
1200
|
-
// Pro2 (Protocol V2) 版本线独立于 Pro 系列,固件从首个版本即支持 UnLockDevice
|
|
1201
1566
|
const supportUnlock =
|
|
1202
|
-
this.isProtocolV2() ||
|
|
1203
1567
|
supportAttachPinCapability ||
|
|
1204
1568
|
(versionRange &&
|
|
1205
1569
|
semver.valid(firmwareVersion) &&
|
|
@@ -1207,12 +1571,21 @@ export class Device extends EventEmitter {
|
|
|
1207
1571
|
|
|
1208
1572
|
if (supportUnlock) {
|
|
1209
1573
|
const res = await this.commands.typedCall('UnLockDevice', 'UnLockDeviceResponse');
|
|
1210
|
-
if (this.
|
|
1211
|
-
this.
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1574
|
+
if (this.state) {
|
|
1575
|
+
this.updateState(
|
|
1576
|
+
{
|
|
1577
|
+
status: {
|
|
1578
|
+
unlocked: res.message.unlocked == null ? null : res.message.unlocked,
|
|
1579
|
+
unlockedAttachPin:
|
|
1580
|
+
res.message.unlocked_attach_pin == null ? null : res.message.unlocked_attach_pin,
|
|
1581
|
+
passphraseProtection:
|
|
1582
|
+
res.message.passphrase_protection == null
|
|
1583
|
+
? null
|
|
1584
|
+
: res.message.passphrase_protection,
|
|
1585
|
+
},
|
|
1586
|
+
},
|
|
1587
|
+
'unlock'
|
|
1588
|
+
);
|
|
1216
1589
|
|
|
1217
1590
|
return Promise.resolve(this.features);
|
|
1218
1591
|
}
|
|
@@ -1221,14 +1594,6 @@ export class Device extends EventEmitter {
|
|
|
1221
1594
|
return Promise.resolve(features);
|
|
1222
1595
|
}
|
|
1223
1596
|
|
|
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
1597
|
const { type } = await this.commands.typedCall('GetAddress', 'Address', {
|
|
1233
1598
|
address_n: [toHardened(44), toHardened(1), toHardened(0), 0, 0],
|
|
1234
1599
|
coin_name: 'Testnet',
|
|
@@ -1251,21 +1616,27 @@ export class Device extends EventEmitter {
|
|
|
1251
1616
|
) {
|
|
1252
1617
|
if (this.isUnacquired()) return false;
|
|
1253
1618
|
|
|
1619
|
+
const expectedPassphraseState = useEmptyPassphrase ? undefined : passphraseState;
|
|
1254
1620
|
const { passphraseState: newPassphraseState, unlockedAttachPin } =
|
|
1255
1621
|
await getPassphraseStateWithRefreshDeviceInfo(this, {
|
|
1256
|
-
expectPassphraseState:
|
|
1622
|
+
expectPassphraseState: expectedPassphraseState,
|
|
1257
1623
|
onlyMainPin: useEmptyPassphrase,
|
|
1258
1624
|
});
|
|
1259
1625
|
|
|
1260
1626
|
// Main wallet and unlock Attach Pin, throw safe error
|
|
1261
1627
|
const mainWalletUseAttachPin = unlockedAttachPin && useEmptyPassphrase;
|
|
1262
1628
|
const useErrorAttachPin =
|
|
1263
|
-
unlockedAttachPin &&
|
|
1264
|
-
|
|
1629
|
+
unlockedAttachPin &&
|
|
1630
|
+
expectedPassphraseState &&
|
|
1631
|
+
expectedPassphraseState !== newPassphraseState;
|
|
1632
|
+
const passphraseStateMismatch =
|
|
1633
|
+
!!expectedPassphraseState && expectedPassphraseState !== newPassphraseState;
|
|
1265
1634
|
|
|
1266
1635
|
Log.debug('Check passphrase state safety: ', {
|
|
1267
|
-
|
|
1268
|
-
newPassphraseState,
|
|
1636
|
+
hasExpectedPassphraseState: Boolean(expectedPassphraseState),
|
|
1637
|
+
hasNewPassphraseState: Boolean(newPassphraseState),
|
|
1638
|
+
passphraseStateMatches:
|
|
1639
|
+
Boolean(expectedPassphraseState) && expectedPassphraseState === newPassphraseState,
|
|
1269
1640
|
unlockedAttachPin,
|
|
1270
1641
|
useEmptyPassphrase,
|
|
1271
1642
|
});
|