@onekeyfe/hd-core 1.2.0-alpha.5 → 1.2.0-alpha.50
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 +155 -0
- package/__tests__/DeviceCommands.test.ts +517 -0
- package/__tests__/DeviceEventRegistration.test.ts +49 -0
- package/__tests__/chain-params-onekey-compatibility.test.ts +229 -0
- package/__tests__/check-all-firmware-release-protocol-v2.test.ts +390 -0
- package/__tests__/connectSettings.test.ts +19 -0
- package/__tests__/core-dispose.test.ts +34 -0
- package/__tests__/core-error-output.test.ts +39 -0
- package/__tests__/device-features-state.test.ts +78 -0
- package/__tests__/device-identity.test.ts +52 -0
- package/__tests__/device-lifecycle-events.test.ts +351 -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__/deviceUploadNft.test.ts +293 -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/firmware-update-v2-download-before-boot.test.ts +402 -0
- package/__tests__/get-device-state.test.ts +578 -0
- package/__tests__/homescreen.test.ts +64 -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 +132 -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 +1781 -0
- package/__tests__/pro2Nft.test.ts +108 -0
- package/__tests__/pro2Wallpaper.test.ts +39 -0
- package/__tests__/protocol-binding.test.ts +89 -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-resources.test.ts +284 -0
- package/__tests__/protocol-v2-ui-lifecycle.test.ts +91 -0
- package/__tests__/protocol-v2-unlock-policy.test.ts +206 -0
- package/__tests__/protocol-v2.test.ts +6162 -2544
- package/__tests__/protocolV2FileWrite.test.ts +92 -0
- package/__tests__/protocolV2UiInteraction.test.ts +329 -0
- package/__tests__/public-device-state-api.test.ts +275 -0
- package/__tests__/public-pro2-api-boundary.test.ts +107 -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 +145 -0
- package/__tests__/tron-sign-message-init.test.ts +74 -0
- package/__tests__/uiProgressThrottle.test.ts +74 -0
- package/__tests__/uiPromiseRegistry.test.ts +86 -0
- package/dist/api/BaseMethod.d.ts +16 -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/DetectDeviceConnectProtocol.d.ts +7 -0
- package/dist/api/DetectDeviceConnectProtocol.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 +2 -2
- package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV4.d.ts +24 -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.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/FirmwareUpdateBaseMethod.d.ts +0 -1
- package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
- package/dist/api/firmware/getBinary.d.ts +8 -4
- package/dist/api/firmware/getBinary.d.ts.map +1 -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 +35 -0
- package/dist/api/helpers/protocolV2FileWrite.d.ts.map +1 -0
- package/dist/api/index.d.ts +9 -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/DeviceUploadNft.d.ts +31 -0
- package/dist/api/protocol-v2/DeviceUploadNft.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 +1 -2
- 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 +13 -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/core/uiPromiseRegistry.d.ts +4 -0
- package/dist/core/uiPromiseRegistry.d.ts.map +1 -0
- package/dist/data-manager/DataManager.d.ts +4 -1
- package/dist/data-manager/DataManager.d.ts.map +1 -1
- package/dist/data-manager/connectSettings.d.ts.map +1 -1
- package/dist/device/Device.d.ts +71 -17
- 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 +16 -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-promise.d.ts +4 -2
- package/dist/events/ui-promise.d.ts.map +1 -1
- package/dist/events/ui-request.d.ts +50 -4
- package/dist/events/ui-request.d.ts.map +1 -1
- package/dist/events/ui-response.d.ts +10 -2
- package/dist/events/ui-response.d.ts.map +1 -1
- package/dist/index.d.ts +1592 -794
- package/dist/index.js +8249 -3981
- package/dist/inject.d.ts +6 -1
- 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/resources.d.ts +30 -0
- package/dist/protocols/protocol-v2/resources.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 +42 -0
- package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -0
- package/dist/protocols/protocol-v2/unlockPolicy.d.ts +2 -0
- package/dist/protocols/protocol-v2/unlockPolicy.d.ts.map +1 -0
- package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts +22 -0
- package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts.map +1 -0
- package/dist/protocols/protocol-v2/walletSession.d.ts +25 -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 +26 -4
- package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
- package/dist/types/api/detectDeviceConnectProtocol.d.ts +4 -0
- package/dist/types/api/detectDeviceConnectProtocol.d.ts.map +1 -0
- 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/export.d.ts +3 -2
- package/dist/types/api/export.d.ts.map +1 -1
- package/dist/types/api/firmwareUpdate.d.ts +7 -1
- package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
- package/dist/types/api/getDeviceState.d.ts +12 -0
- package/dist/types/api/getDeviceState.d.ts.map +1 -0
- package/dist/types/api/getFeatures.d.ts.map +1 -1
- package/dist/types/api/getOnekeyFeatures.d.ts.map +1 -1
- package/dist/types/api/getPassphraseState.d.ts +2 -10
- package/dist/types/api/getPassphraseState.d.ts.map +1 -1
- package/dist/types/api/index.d.ts +23 -30
- 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 +18 -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 +1 -0
- package/dist/types/params.d.ts.map +1 -1
- package/dist/types/settings.d.ts +29 -14
- package/dist/types/settings.d.ts.map +1 -1
- package/dist/utils/assets.d.ts +2 -1
- package/dist/utils/assets.d.ts.map +1 -1
- package/dist/utils/deviceFeaturesCompat.d.ts +13 -0
- package/dist/utils/deviceFeaturesCompat.d.ts.map +1 -0
- package/dist/utils/deviceFeaturesUtils.d.ts +8 -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 +4 -0
- package/dist/utils/homescreen.d.ts.map +1 -1
- package/dist/utils/index.d.ts +6 -3
- 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/pro2Nft.d.ts +31 -0
- package/dist/utils/pro2Nft.d.ts.map +1 -0
- package/dist/utils/pro2Wallpaper.d.ts +22 -0
- package/dist/utils/pro2Wallpaper.d.ts.map +1 -0
- package/dist/utils/tracing.d.ts.map +1 -1
- package/dist/utils/uiProgressThrottle.d.ts +3 -0
- package/dist/utils/uiProgressThrottle.d.ts.map +1 -0
- package/package.json +4 -4
- package/src/api/BaseMethod.ts +53 -20
- package/src/api/CheckAllFirmwareRelease.ts +329 -1
- 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/DetectDeviceConnectProtocol.ts +18 -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 +17 -14
- package/src/api/FirmwareUpdateV2.ts +137 -54
- package/src/api/FirmwareUpdateV3.ts +9 -13
- package/src/api/FirmwareUpdateV4.ts +660 -580
- 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 +36 -21
- package/src/api/OpenWalletSession.ts +251 -0
- package/src/api/PathInfo.ts +9 -4
- package/src/api/PromptWebDeviceAccess.ts +2 -7
- package/src/api/SearchDevices.ts +31 -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 +41 -32
- 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 +14 -1
- package/src/api/device/DeviceUpdateBootloader.ts +1 -2
- 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/FirmwareUpdateBaseMethod.ts +18 -14
- package/src/api/firmware/getBinary.ts +8 -3
- package/src/api/firmware/uploadFirmware.ts +17 -4
- 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 +206 -0
- package/src/api/index.ts +10 -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/DeviceUploadNft.ts +189 -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 +8 -3
- 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 +27 -0
- package/src/core/index.ts +319 -124
- package/src/core/uiPromiseRegistry.ts +41 -0
- package/src/data/messages/messages-protocol-v2.json +1138 -441
- package/src/data/messages/messages.json +286 -1
- package/src/data-manager/DataManager.ts +42 -13
- package/src/data-manager/TransportManager.ts +1 -1
- package/src/data-manager/connectSettings.ts +4 -0
- package/src/device/Device.ts +878 -292
- 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 +72 -17
- 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 +22 -1
- package/src/events/logBlockEvent.ts +80 -2
- package/src/events/ui-promise.ts +4 -2
- package/src/events/ui-request.ts +61 -4
- package/src/events/ui-response.ts +12 -2
- package/src/inject.ts +73 -43
- package/src/lowLevelInject.ts +6 -3
- package/src/protocols/protocol-v2/deviceSession.ts +24 -0
- package/src/protocols/protocol-v2/features.ts +103 -32
- package/src/protocols/protocol-v2/firmware.ts +1 -1
- package/src/protocols/protocol-v2/index.ts +8 -1
- package/src/protocols/protocol-v2/resources.ts +359 -0
- package/src/protocols/protocol-v2/settingsUnlockPolicy.ts +65 -0
- package/src/protocols/protocol-v2/uiInteraction.ts +250 -0
- package/src/protocols/protocol-v2/unlockPolicy.ts +1 -0
- package/src/protocols/protocol-v2/unlockPolicyRunner.ts +124 -0
- package/src/protocols/protocol-v2/walletSession.ts +424 -0
- package/src/topLevelInject.ts +6 -3
- package/src/types/api/checkAllFirmwareRelease.ts +47 -4
- package/src/types/api/detectDeviceConnectProtocol.ts +7 -0
- package/src/types/api/deviceSettings.ts +26 -2
- package/src/types/api/deviceUnlock.ts +1 -1
- package/src/types/api/export.ts +8 -0
- package/src/types/api/firmwareUpdate.ts +26 -5
- 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 +38 -64
- package/src/types/api/kaspaSignTransaction.ts +60 -4
- package/src/types/api/openWalletSession.ts +54 -0
- package/src/types/api/protocolV2.ts +33 -141
- package/src/types/api/sessionCache.ts +19 -0
- package/src/types/device.ts +185 -7
- package/src/types/params.ts +9 -2
- package/src/types/settings.ts +59 -16
- package/src/utils/assets.ts +4 -1
- package/src/utils/deviceFeaturesCompat.ts +180 -0
- package/src/utils/deviceFeaturesUtils.ts +56 -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 +36 -0
- package/src/utils/index.ts +27 -3
- package/src/utils/networkUtils.ts +274 -16
- package/src/utils/pro2Nft.ts +142 -0
- package/src/utils/pro2Wallpaper.ts +130 -0
- package/src/utils/tracing.ts +3 -1
- package/src/utils/uiProgressThrottle.ts +63 -0
- 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/firmware/progressThrottle.d.ts +0 -3
- package/dist/api/firmware/progressThrottle.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/firmware/progressThrottle.ts +0 -44
- 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,23 +54,36 @@ 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,
|
|
77
|
+
HardwareUiInteractionMeta,
|
|
62
78
|
PassphraseRequestPayload,
|
|
79
|
+
ProtocolV2UiEventMetadata,
|
|
63
80
|
} from '../events';
|
|
64
81
|
import type { PassphrasePromptResponse } from './DeviceCommands';
|
|
65
82
|
import type { Deferred, HardwareConnectProtocol } from '@onekeyfe/hd-shared';
|
|
66
83
|
import type {
|
|
67
84
|
OneKeyDeviceInfo as DeviceDescriptor,
|
|
85
|
+
DeviceStatus,
|
|
86
|
+
ProtocolInfo,
|
|
68
87
|
ProtocolV2DeviceInfo,
|
|
69
88
|
Success,
|
|
70
89
|
} from '@onekeyfe/hd-transport';
|
|
@@ -76,7 +95,10 @@ export type InitOptions = {
|
|
|
76
95
|
passphraseState?: string;
|
|
77
96
|
deriveCardano?: boolean;
|
|
78
97
|
connectProtocol?: HardwareConnectProtocol;
|
|
98
|
+
forceProtocolDetection?: boolean;
|
|
79
99
|
protocolV2DeviceInfoTimeoutMs?: number;
|
|
100
|
+
/** Refresh Protocol V2 runtime state before returning discovery results. */
|
|
101
|
+
refreshRuntimeState?: boolean;
|
|
80
102
|
};
|
|
81
103
|
|
|
82
104
|
export type RunOptions = {
|
|
@@ -91,11 +113,35 @@ const parseRunOptions = (options?: RunOptions): RunOptions => {
|
|
|
91
113
|
|
|
92
114
|
const Log = getLogger(LoggerNames.Device);
|
|
93
115
|
|
|
116
|
+
const isProtocolV2DeviceStatusUnsupportedError = (error: unknown) => {
|
|
117
|
+
if (error instanceof HardwareError) {
|
|
118
|
+
if (error.errorCode === HardwareErrorCode.DeviceNotSupportMethod) {
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
if (error.params?.failureCode === 'Failure_UnexpectedMessage') {
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const message =
|
|
127
|
+
error instanceof Error
|
|
128
|
+
? error.message
|
|
129
|
+
: String((error as { message?: unknown } | null)?.message ?? error ?? '');
|
|
130
|
+
return (
|
|
131
|
+
/^Failure_UnexpectedMessage(?:,|\b)/i.test(message) ||
|
|
132
|
+
/\b(?:unsupported message|handler not registered|message handler not found)\b/i.test(message)
|
|
133
|
+
);
|
|
134
|
+
};
|
|
135
|
+
|
|
94
136
|
export interface DeviceEvents {
|
|
95
137
|
[DEVICE.PIN]: [Device, PROTO.PinMatrixRequestType | undefined, (err: any, pin: string) => void];
|
|
96
|
-
[DEVICE.
|
|
138
|
+
[DEVICE.PIN_ON_DEVICE]: [Device, DeviceSessionPinType, ProtocolV2UiEventMetadata?];
|
|
139
|
+
[DEVICE.PIN_ON_DEVICE_COMPLETE]: [Device, HardwareUiInteractionMeta];
|
|
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,52 @@ 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
|
+
/** Runtime context negotiated once per active Protocol V2 link. */
|
|
239
|
+
private protocolV2RuntimeContext?: ProtocolInfo;
|
|
240
|
+
|
|
241
|
+
/** Coalesces concurrent first-use runtime negotiation on the same active link. */
|
|
242
|
+
private protocolV2RuntimeContextPromise?: Promise<ProtocolInfo>;
|
|
243
|
+
|
|
244
|
+
/** Invalidates an in-flight runtime-context response without adding a transport epoch. */
|
|
245
|
+
private protocolV2RuntimeContextRequestToken?: object;
|
|
246
|
+
|
|
247
|
+
private protocolV2UiInteraction?: {
|
|
248
|
+
interactionId: string;
|
|
249
|
+
phaseCounter: number;
|
|
250
|
+
sequence: number;
|
|
251
|
+
opened: boolean;
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
private protocolV2UiInteractionCounter = 0;
|
|
255
|
+
|
|
256
|
+
get state() {
|
|
257
|
+
return this.stateStore.getState();
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
get features(): Features | undefined {
|
|
261
|
+
if (!this.state) return undefined;
|
|
262
|
+
return projectFeatures(this.state);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
set features(features: Features | undefined) {
|
|
266
|
+
this.stateStore = new DeviceStateStore();
|
|
267
|
+
if (features) {
|
|
268
|
+
this.stateStore.update(mapFeaturesToState(features), 'compatibility');
|
|
269
|
+
const { passphraseState } = features;
|
|
270
|
+
const sessionId = features.sessionId ?? features.session_id;
|
|
271
|
+
const deviceKey = this.getSessionCacheDeviceKey(features.deviceId ?? undefined);
|
|
272
|
+
if (passphraseState && sessionId && deviceKey) {
|
|
273
|
+
this.passphraseState = passphraseState;
|
|
274
|
+
deviceWalletSessionStore.set(deviceKey, passphraseState, sessionId);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
204
278
|
|
|
205
279
|
runPromise?: Deferred<void> | null;
|
|
206
280
|
|
|
@@ -254,38 +328,46 @@ export class Device extends EventEmitter {
|
|
|
254
328
|
|
|
255
329
|
// simplified object to pass via postMessage
|
|
256
330
|
toMessageObject(): DeviceTyped | null {
|
|
257
|
-
if (this.isUnacquired()) return null;
|
|
331
|
+
if (this.isUnacquired() || !this.features) return null;
|
|
258
332
|
|
|
259
333
|
const env = DataManager.getSettings('env');
|
|
260
334
|
const deviceType = this.getCurrentDeviceType();
|
|
261
335
|
|
|
262
336
|
const bleName = this.getCurrentBleName();
|
|
263
|
-
const
|
|
337
|
+
const displayName = this.getCurrentDisplayName();
|
|
264
338
|
const serialNo = this.getCurrentSerialNo();
|
|
265
339
|
const connectId = this.getConnectId();
|
|
266
340
|
const deviceId = this.getCurrentDeviceId() || null;
|
|
267
341
|
|
|
268
|
-
const features = this
|
|
342
|
+
const { features } = this;
|
|
343
|
+
const state = this.state ? createPublicDeviceState(this.state) : undefined;
|
|
269
344
|
|
|
270
345
|
return {
|
|
271
|
-
/** Android uses
|
|
346
|
+
/** Android uses a MAC address, while iOS and USB use transport-specific identifiers. */
|
|
272
347
|
connectId: DataManager.isBleConnect(env) ? this.mainId || null : connectId,
|
|
273
|
-
/**
|
|
348
|
+
/** Persist this after the first active probe so later calls do not need to guess. */
|
|
349
|
+
connectProtocol: this.originalDescriptor.protocolType,
|
|
350
|
+
/** Stable physical-device identity. */
|
|
351
|
+
serialNo,
|
|
352
|
+
/** @deprecated Use serialNo instead. */
|
|
274
353
|
uuid: serialNo,
|
|
275
354
|
commType: this.originalDescriptor.commType,
|
|
276
355
|
sdkInstanceId: this.sdkInstanceId,
|
|
277
356
|
instanceId: this.instanceId,
|
|
278
357
|
createdAt: this.createdAt,
|
|
279
358
|
deviceType,
|
|
280
|
-
/** ID
|
|
359
|
+
/** Wallet-lifecycle ID; changes after the device is wiped or reinitialized. */
|
|
281
360
|
deviceId,
|
|
282
361
|
path: this.originalDescriptor?.path,
|
|
283
362
|
bleName,
|
|
284
|
-
name:
|
|
285
|
-
|
|
363
|
+
name: displayName || bleName || `OneKey ${deviceType?.toUpperCase()}`,
|
|
364
|
+
// Keep the legacy top-level field string-compatible while preserving
|
|
365
|
+
// the canonical nullable value at state.identity.label.
|
|
366
|
+
label: displayName ?? '',
|
|
367
|
+
status: this.getStatus(),
|
|
286
368
|
mode: this.getMode(),
|
|
287
369
|
features,
|
|
288
|
-
|
|
370
|
+
state,
|
|
289
371
|
firmwareVersion: this.getFirmwareVersion(),
|
|
290
372
|
bleFirmwareVersion: this.getBLEFirmwareVersion(),
|
|
291
373
|
unavailableCapabilities: this.unavailableCapabilities,
|
|
@@ -296,13 +378,20 @@ export class Device extends EventEmitter {
|
|
|
296
378
|
* Device connect
|
|
297
379
|
* @returns {Promise<boolean>}
|
|
298
380
|
*/
|
|
299
|
-
connect(
|
|
381
|
+
connect(
|
|
382
|
+
connectProtocol?: HardwareConnectProtocol,
|
|
383
|
+
options?: { forceProtocolDetection?: boolean }
|
|
384
|
+
) {
|
|
300
385
|
const env = DataManager.getSettings('env');
|
|
301
386
|
// eslint-disable-next-line no-async-promise-executor
|
|
302
387
|
return new Promise<boolean>(async (resolve, reject) => {
|
|
303
388
|
if (DataManager.isBleConnect(env)) {
|
|
389
|
+
if (this.hasDeviceAcquire() && this.commands && !this.commands.disposed) {
|
|
390
|
+
resolve(true);
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
304
393
|
try {
|
|
305
|
-
await this.acquire(connectProtocol);
|
|
394
|
+
await this.acquire(connectProtocol, options);
|
|
306
395
|
resolve(true);
|
|
307
396
|
} catch (error) {
|
|
308
397
|
reject(error);
|
|
@@ -312,7 +401,7 @@ export class Device extends EventEmitter {
|
|
|
312
401
|
// 不存在 Session ID 或存在 Session ID 但设备在别处使用,都需要 acquire 获取最新 sessionID
|
|
313
402
|
if (!this.mainId || (!this.isUsedHere() && this.originalDescriptor)) {
|
|
314
403
|
try {
|
|
315
|
-
await this.acquire(connectProtocol);
|
|
404
|
+
await this.acquire(connectProtocol, options);
|
|
316
405
|
resolve(true);
|
|
317
406
|
} catch (error) {
|
|
318
407
|
reject(error);
|
|
@@ -328,25 +417,30 @@ export class Device extends EventEmitter {
|
|
|
328
417
|
}
|
|
329
418
|
|
|
330
419
|
async acquire(
|
|
331
|
-
|
|
332
|
-
options?: { throwOnRunPromiseError?: boolean }
|
|
420
|
+
expectedProtocol?: HardwareConnectProtocol,
|
|
421
|
+
options?: { throwOnRunPromiseError?: boolean; forceProtocolDetection?: boolean }
|
|
333
422
|
) {
|
|
334
423
|
const env = DataManager.getSettings('env');
|
|
335
424
|
const mainIdKey = DataManager.isBleConnect(env) ? 'id' : 'session';
|
|
336
|
-
const
|
|
425
|
+
const previousProtocol = this.originalDescriptor.protocolType;
|
|
426
|
+
// A protocol stored after a successful probe is authoritative. Only the explicit
|
|
427
|
+
// first-connection/recovery path may bypass it and probe both protocols again.
|
|
428
|
+
const strictProtocol = options?.forceProtocolDetection
|
|
429
|
+
? undefined
|
|
430
|
+
: expectedProtocol ?? this.originalDescriptor.protocolType;
|
|
337
431
|
try {
|
|
338
432
|
let acquireResult: unknown;
|
|
339
433
|
if (DataManager.isBleConnect(env)) {
|
|
340
|
-
//
|
|
341
|
-
//
|
|
342
|
-
//
|
|
343
|
-
//
|
|
344
|
-
// 因此对 BLE acquire 恒清理是有意为之。
|
|
434
|
+
// acquire starts a new BLE session. Any previous runPromise belongs to a dead
|
|
435
|
+
// session, such as an interrupted probe or firmware-update reboot, and would
|
|
436
|
+
// otherwise block the new session. Device cannot distinguish recovery from a
|
|
437
|
+
// regular acquire, so BLE always clears it intentionally.
|
|
345
438
|
acquireResult = await this.deviceConnector?.acquire(
|
|
346
439
|
this.originalDescriptor.id,
|
|
347
440
|
undefined,
|
|
348
441
|
true,
|
|
349
|
-
|
|
442
|
+
strictProtocol,
|
|
443
|
+
undefined
|
|
350
444
|
);
|
|
351
445
|
this.mainId = (acquireResult as any)?.uuid ?? '';
|
|
352
446
|
Log.debug('Expected uuid:', this.mainId);
|
|
@@ -355,23 +449,31 @@ export class Device extends EventEmitter {
|
|
|
355
449
|
this.originalDescriptor.path,
|
|
356
450
|
this.originalDescriptor.session,
|
|
357
451
|
undefined,
|
|
358
|
-
|
|
452
|
+
strictProtocol,
|
|
453
|
+
undefined
|
|
359
454
|
);
|
|
360
455
|
this.mainId = acquireResult as string | undefined;
|
|
361
456
|
Log.debug('Expected session id:', this.mainId);
|
|
362
457
|
}
|
|
363
|
-
this.deviceAcquired = true;
|
|
364
|
-
this.updateDescriptor({ [mainIdKey]: this.mainId } as unknown as DeviceDescriptor);
|
|
365
|
-
|
|
366
458
|
// Propagate protocol version detected during acquire.
|
|
367
459
|
const detectedProtocol =
|
|
368
460
|
(acquireResult as { protocolType?: HardwareConnectProtocol } | undefined)?.protocolType ??
|
|
369
461
|
TransportManager.transport?.getProtocolType?.(
|
|
370
462
|
DataManager.isBleConnect(env) ? this.originalDescriptor.id : this.originalDescriptor.path
|
|
371
463
|
);
|
|
464
|
+
if (options?.forceProtocolDetection && !detectedProtocol) {
|
|
465
|
+
throw ERRORS.TypedError(
|
|
466
|
+
HardwareErrorCode.RuntimeError,
|
|
467
|
+
`Active protocol detection returned no protocol for ${
|
|
468
|
+
this.originalDescriptor.path || this.originalDescriptor.id
|
|
469
|
+
}`
|
|
470
|
+
);
|
|
471
|
+
}
|
|
372
472
|
if (detectedProtocol) {
|
|
373
473
|
this.originalDescriptor.protocolType = detectedProtocol;
|
|
374
474
|
}
|
|
475
|
+
this.deviceAcquired = true;
|
|
476
|
+
this.updateDescriptor({ [mainIdKey]: this.mainId } as unknown as DeviceDescriptor);
|
|
375
477
|
|
|
376
478
|
if (this.commands) {
|
|
377
479
|
await this.commands.dispose(false);
|
|
@@ -379,6 +481,22 @@ export class Device extends EventEmitter {
|
|
|
379
481
|
|
|
380
482
|
this.commands = new DeviceCommands(this, this.mainId ?? '');
|
|
381
483
|
} catch (error) {
|
|
484
|
+
if (options?.forceProtocolDetection) {
|
|
485
|
+
this.originalDescriptor.protocolType = previousProtocol;
|
|
486
|
+
const failedSession = this.mainId;
|
|
487
|
+
this.deviceAcquired = false;
|
|
488
|
+
if (failedSession) {
|
|
489
|
+
try {
|
|
490
|
+
await this.deviceConnector?.release?.(failedSession, false);
|
|
491
|
+
} catch (releaseError) {
|
|
492
|
+
Log.debug('Failed to release an unsuccessful protocol probe', releaseError);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
if (!DataManager.isBleConnect(env)) {
|
|
496
|
+
this.mainId = null;
|
|
497
|
+
this.updateDescriptor({ session: null } as DeviceDescriptor);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
382
500
|
if (options?.throwOnRunPromiseError) {
|
|
383
501
|
throw error;
|
|
384
502
|
}
|
|
@@ -482,12 +600,11 @@ export class Device extends EventEmitter {
|
|
|
482
600
|
}
|
|
483
601
|
|
|
484
602
|
/**
|
|
485
|
-
*
|
|
603
|
+
* Canonical protocol discriminator.
|
|
486
604
|
*
|
|
487
|
-
* descriptor.protocolType
|
|
488
|
-
*
|
|
489
|
-
*
|
|
490
|
-
* 或从 features 反推。
|
|
605
|
+
* descriptor.protocolType is established by active probing; V2 features are mapped
|
|
606
|
+
* from DeviceInfoGet. All protocol branches must use this method instead of reading
|
|
607
|
+
* originalDescriptor.protocolType directly or inferring a protocol from features.
|
|
491
608
|
*/
|
|
492
609
|
getProtocol(): 'V1' | 'V2' {
|
|
493
610
|
return this.originalDescriptor.protocolType === 'V2' ? 'V2' : 'V1';
|
|
@@ -498,53 +615,75 @@ export class Device extends EventEmitter {
|
|
|
498
615
|
}
|
|
499
616
|
|
|
500
617
|
getCurrentDeviceType() {
|
|
501
|
-
return
|
|
618
|
+
return this.state?.identity.deviceType ?? EDeviceType.Unknown;
|
|
502
619
|
}
|
|
503
620
|
|
|
504
621
|
getCurrentDeviceId() {
|
|
505
|
-
return this.
|
|
622
|
+
return this.state?.identity.deviceId || undefined;
|
|
506
623
|
}
|
|
507
624
|
|
|
508
625
|
getCurrentSerialNo() {
|
|
509
|
-
return this.
|
|
626
|
+
return this.state?.identity.serialNo ?? '';
|
|
510
627
|
}
|
|
511
628
|
|
|
512
629
|
getConnectId() {
|
|
513
630
|
const serialNo = this.getCurrentSerialNo();
|
|
514
631
|
if (serialNo) return serialNo;
|
|
515
632
|
|
|
516
|
-
// connectId
|
|
517
|
-
//
|
|
633
|
+
// connectId is an internal routing key. Falling back to the transport descriptor
|
|
634
|
+
// does not change the business meaning of features.serialNo or deviceId.
|
|
518
635
|
return this.originalDescriptor.path || this.originalDescriptor.id || '';
|
|
519
636
|
}
|
|
520
637
|
|
|
521
638
|
getCurrentBleName() {
|
|
522
|
-
return
|
|
639
|
+
return this.state?.identity.bleName ?? null;
|
|
523
640
|
}
|
|
524
641
|
|
|
525
642
|
getCurrentLabel() {
|
|
526
|
-
return
|
|
643
|
+
return this.state?.identity.label ?? null;
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
getCurrentDisplayName() {
|
|
647
|
+
if (!this.state) return null;
|
|
648
|
+
|
|
649
|
+
const label = this.getCurrentLabel();
|
|
650
|
+
if (label) return label;
|
|
651
|
+
|
|
652
|
+
const bleName = this.getCurrentBleName();
|
|
653
|
+
if (bleName) return bleName;
|
|
654
|
+
|
|
655
|
+
const deviceType = this.getCurrentDeviceType();
|
|
656
|
+
if (deviceType === EDeviceType.ClassicPure) {
|
|
657
|
+
return 'OneKey Classic 1S';
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
return `OneKey ${deviceType.charAt(0).toUpperCase() + deviceType.slice(1)}`;
|
|
527
661
|
}
|
|
528
662
|
|
|
529
663
|
getCurrentPassphraseProtection() {
|
|
530
|
-
return this.
|
|
664
|
+
return this.state?.status.passphraseProtection;
|
|
531
665
|
}
|
|
532
666
|
|
|
533
667
|
getCurrentFirmwareType() {
|
|
534
|
-
return
|
|
668
|
+
return this.state?.identity.firmwareType ?? EFirmwareType.Universal;
|
|
535
669
|
}
|
|
536
670
|
|
|
537
671
|
getCurrentFirmwareVersionString() {
|
|
538
|
-
return
|
|
672
|
+
return parseDeviceVersion(this.state?.versions.firmware).join('.');
|
|
539
673
|
}
|
|
540
674
|
|
|
541
675
|
getCurrentBLEFirmwareVersionString() {
|
|
542
|
-
if (!this.
|
|
543
|
-
return
|
|
676
|
+
if (!this.state) return undefined;
|
|
677
|
+
return parseDeviceVersion(this.state.versions.ble).join('.');
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
getCurrentBootloaderVersionString() {
|
|
681
|
+
if (!this.state) return undefined;
|
|
682
|
+
return parseDeviceVersion(this.state.versions.bootloader).join('.');
|
|
544
683
|
}
|
|
545
684
|
|
|
546
685
|
getCurrentSafetyChecks() {
|
|
547
|
-
return this.
|
|
686
|
+
return this.state?.settings.safetyChecks;
|
|
548
687
|
}
|
|
549
688
|
|
|
550
689
|
getCurrentMethodVersionRange(
|
|
@@ -589,8 +728,6 @@ export class Device extends EventEmitter {
|
|
|
589
728
|
}
|
|
590
729
|
|
|
591
730
|
supportInputPinOnSoftware(): SupportFeatureType {
|
|
592
|
-
if (this.features) return supportInputPinOnSoftware(this.features);
|
|
593
|
-
|
|
594
731
|
const deviceType = this.getCurrentDeviceType();
|
|
595
732
|
if (
|
|
596
733
|
deviceType === EDeviceType.Touch ||
|
|
@@ -608,15 +745,12 @@ export class Device extends EventEmitter {
|
|
|
608
745
|
}
|
|
609
746
|
|
|
610
747
|
supportModifyHomescreen(): SupportFeatureType {
|
|
611
|
-
// Pro2
|
|
612
|
-
//
|
|
613
|
-
// 包含 homescreen 字段,V2 固件从首个版本即支持修改主屏。
|
|
748
|
+
// Pro2 has an independent 1.x version line and must not use the Touch/Pro 3.4.0
|
|
749
|
+
// threshold. ApplySettings includes homescreen from the first V2 firmware version.
|
|
614
750
|
if (this.isProtocolV2()) {
|
|
615
751
|
return { support: true };
|
|
616
752
|
}
|
|
617
753
|
|
|
618
|
-
if (this.features) return supportModifyHomescreen(this.features);
|
|
619
|
-
|
|
620
754
|
const deviceType = this.getCurrentDeviceType();
|
|
621
755
|
if (DeviceModelToTypes.model_mini.includes(deviceType)) {
|
|
622
756
|
return { support: true };
|
|
@@ -628,29 +762,29 @@ export class Device extends EventEmitter {
|
|
|
628
762
|
};
|
|
629
763
|
}
|
|
630
764
|
|
|
631
|
-
private generateStateKey(deviceId: string, passphraseState?: string) {
|
|
632
|
-
if (passphraseState) {
|
|
633
|
-
return `${deviceId}@${passphraseState}`;
|
|
634
|
-
}
|
|
635
|
-
return deviceId;
|
|
636
|
-
}
|
|
637
|
-
|
|
638
765
|
private getSessionCacheDeviceKey(_deviceId?: string) {
|
|
639
766
|
const deviceId = _deviceId || this.getCurrentDeviceId();
|
|
640
767
|
if (deviceId) return deviceId;
|
|
641
768
|
if (this.isProtocolV2()) {
|
|
642
|
-
return this.originalDescriptor.path
|
|
769
|
+
return this.originalDescriptor.path;
|
|
643
770
|
}
|
|
644
771
|
return undefined;
|
|
645
772
|
}
|
|
646
773
|
|
|
774
|
+
private reconcileSessionCacheDeviceIdentity(previousDeviceId?: string) {
|
|
775
|
+
deviceWalletSessionStore.reconcileDeviceIdentity({
|
|
776
|
+
temporaryKey: this.isProtocolV2() ? this.originalDescriptor.path : undefined,
|
|
777
|
+
previousDeviceId,
|
|
778
|
+
nextDeviceId: this.getCurrentDeviceId(),
|
|
779
|
+
});
|
|
780
|
+
}
|
|
781
|
+
|
|
647
782
|
getInternalState(_deviceId?: string) {
|
|
648
|
-
Log.debug('getInternalState session cache: ', deviceSessionCache);
|
|
649
783
|
Log.debug(
|
|
650
784
|
'getInternalState session param: ',
|
|
651
785
|
`device_id: ${_deviceId}`,
|
|
652
|
-
`
|
|
653
|
-
`
|
|
786
|
+
`currentDeviceId: ${this.getCurrentDeviceId()}`,
|
|
787
|
+
`hasPassphraseState: ${Boolean(this.passphraseState)}`
|
|
654
788
|
);
|
|
655
789
|
|
|
656
790
|
const deviceId = this.getSessionCacheDeviceKey(_deviceId);
|
|
@@ -663,8 +797,13 @@ export class Device extends EventEmitter {
|
|
|
663
797
|
// downstream call carries it and hits the primary lookup below.
|
|
664
798
|
if (!this.passphraseState) return undefined;
|
|
665
799
|
|
|
666
|
-
|
|
667
|
-
|
|
800
|
+
return deviceWalletSessionStore.get(deviceId, this.passphraseState);
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
getStandardInternalState(_deviceId?: string) {
|
|
804
|
+
const deviceId = this.getSessionCacheDeviceKey(_deviceId);
|
|
805
|
+
if (!deviceId) return undefined;
|
|
806
|
+
return deviceWalletSessionStore.getStandard(deviceId);
|
|
668
807
|
}
|
|
669
808
|
|
|
670
809
|
// attach to pin to fix internal state
|
|
@@ -673,46 +812,45 @@ export class Device extends EventEmitter {
|
|
|
673
812
|
passphraseState: string | undefined,
|
|
674
813
|
deviceId: string | undefined,
|
|
675
814
|
sessionId: string | null = null,
|
|
676
|
-
featuresSessionId: string | null = null
|
|
815
|
+
featuresSessionId: string | null = null,
|
|
816
|
+
walletType: 'standard' | 'hidden' = 'hidden'
|
|
677
817
|
) {
|
|
678
818
|
Log.debug(
|
|
679
819
|
'updateInternalState session param: ',
|
|
680
820
|
`device_id: ${deviceId}`,
|
|
681
821
|
`enablePassphrase: ${enablePassphrase}`,
|
|
682
|
-
`
|
|
683
|
-
`
|
|
684
|
-
`
|
|
822
|
+
`hasPassphraseState: ${Boolean(passphraseState)}`,
|
|
823
|
+
`hasSessionId: ${Boolean(sessionId)}`,
|
|
824
|
+
`hasFeaturesSessionId: ${Boolean(featuresSessionId)}`
|
|
685
825
|
);
|
|
686
826
|
|
|
687
827
|
const cacheDeviceKey = this.getSessionCacheDeviceKey(deviceId);
|
|
688
828
|
if (!cacheDeviceKey) return;
|
|
689
829
|
|
|
690
830
|
if (enablePassphrase) {
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
831
|
+
const walletSessionId =
|
|
832
|
+
sessionId || featuresSessionId || deviceWalletSessionStore.getPending(cacheDeviceKey);
|
|
833
|
+
if (walletType === 'standard') {
|
|
834
|
+
deviceWalletSessionStore.setStandard(
|
|
835
|
+
cacheDeviceKey,
|
|
836
|
+
passphraseState,
|
|
837
|
+
walletSessionId ?? undefined
|
|
838
|
+
);
|
|
839
|
+
} else {
|
|
840
|
+
deviceWalletSessionStore.set(cacheDeviceKey, passphraseState, walletSessionId ?? undefined);
|
|
697
841
|
}
|
|
698
842
|
}
|
|
699
843
|
|
|
700
|
-
|
|
701
|
-
const oldKey = `${cacheDeviceKey}`;
|
|
702
|
-
if (deviceSessionCache[oldKey]) {
|
|
703
|
-
delete deviceSessionCache[oldKey];
|
|
704
|
-
}
|
|
705
|
-
|
|
706
|
-
Log.debug('updateInternalState session cache: ', deviceSessionCache);
|
|
844
|
+
deviceWalletSessionStore.deletePending(cacheDeviceKey);
|
|
707
845
|
}
|
|
708
846
|
|
|
709
847
|
private setInternalState(state: string, initSession?: boolean) {
|
|
710
848
|
Log.debug(
|
|
711
849
|
'setInternalState session param: ',
|
|
712
|
-
`
|
|
850
|
+
`hasState: ${Boolean(state)}`,
|
|
713
851
|
`initSession: ${initSession}`,
|
|
714
|
-
`deviceId: ${this.
|
|
715
|
-
`
|
|
852
|
+
`deviceId: ${this.getCurrentDeviceId()}`,
|
|
853
|
+
`hasPassphraseState: ${Boolean(this.passphraseState)}`
|
|
716
854
|
);
|
|
717
855
|
|
|
718
856
|
if (!this.passphraseState && !initSession) return;
|
|
@@ -720,12 +858,11 @@ export class Device extends EventEmitter {
|
|
|
720
858
|
const deviceId = this.getSessionCacheDeviceKey();
|
|
721
859
|
if (!deviceId) return;
|
|
722
860
|
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
if (
|
|
726
|
-
|
|
861
|
+
if (this.passphraseState) {
|
|
862
|
+
deviceWalletSessionStore.set(deviceId, this.passphraseState, state);
|
|
863
|
+
} else if (initSession) {
|
|
864
|
+
deviceWalletSessionStore.setPending(deviceId, state);
|
|
727
865
|
}
|
|
728
|
-
Log.debug('setInternalState done session cache: ', deviceSessionCache);
|
|
729
866
|
}
|
|
730
867
|
|
|
731
868
|
clearInternalState(_deviceId?: string) {
|
|
@@ -733,70 +870,80 @@ export class Device extends EventEmitter {
|
|
|
733
870
|
|
|
734
871
|
const deviceId = this.getSessionCacheDeviceKey(_deviceId);
|
|
735
872
|
if (!deviceId) return;
|
|
736
|
-
|
|
737
|
-
delete deviceSessionCache[key];
|
|
873
|
+
deviceWalletSessionStore.deletePending(deviceId);
|
|
738
874
|
|
|
739
875
|
if (this.passphraseState) {
|
|
740
|
-
|
|
741
|
-
delete deviceSessionCache[usePassKey];
|
|
876
|
+
deviceWalletSessionStore.delete(deviceId, this.passphraseState);
|
|
742
877
|
}
|
|
743
878
|
}
|
|
744
879
|
|
|
880
|
+
clearStandardInternalState(_deviceId?: string) {
|
|
881
|
+
const deviceId = this.getSessionCacheDeviceKey(_deviceId);
|
|
882
|
+
if (!deviceId) return;
|
|
883
|
+
deviceWalletSessionStore.deleteStandard(deviceId);
|
|
884
|
+
}
|
|
885
|
+
|
|
745
886
|
async initialize(options?: InitOptions) {
|
|
746
|
-
// Protocol V2
|
|
887
|
+
// Protocol V2 does not support legacy Initialize; use its dedicated flow.
|
|
747
888
|
if (this.isProtocolV2()) {
|
|
748
889
|
this.passphraseState = options?.passphraseState;
|
|
749
|
-
if (this.
|
|
750
|
-
if (this.
|
|
890
|
+
if (this.state && !options?.initSession && !this.protocolV2StateNeedsReload) {
|
|
891
|
+
if (this.state.status.mode === 'bootloader' || this.state.status.mode === 'romloader') {
|
|
751
892
|
return;
|
|
752
893
|
}
|
|
753
|
-
//
|
|
754
|
-
//
|
|
755
|
-
// 用字段级合并保留已有版本和 SE 信息。
|
|
756
|
-
await this._refreshProtocolV2Status(options);
|
|
894
|
+
// Normal calls reuse the cache. Explicit getDeviceState refreshes, unlock flow,
|
|
895
|
+
// and device events update dynamic state without polling on every SDK call.
|
|
757
896
|
return;
|
|
758
897
|
}
|
|
759
898
|
await this._initializeProtocolV2(options);
|
|
899
|
+
this.protocolV2StateNeedsReload = false;
|
|
760
900
|
return;
|
|
761
901
|
}
|
|
762
902
|
|
|
763
|
-
|
|
903
|
+
try {
|
|
904
|
+
const callInitialize = async (payload: Record<string, unknown>, initSession?: boolean) => {
|
|
905
|
+
const initStartAt = Date.now();
|
|
906
|
+
const { message } = await this.commands.typedCall('Initialize', 'Features', payload, {
|
|
907
|
+
// iOS BLE bound devices can need close to 20 seconds.
|
|
908
|
+
timeoutMs: 25 * 1000,
|
|
909
|
+
});
|
|
910
|
+
this.setLastInitializeDuration(Date.now() - initStartAt);
|
|
911
|
+
this._updateFeatures(message, initSession);
|
|
912
|
+
await TransportManager.reconfigure(this.features);
|
|
913
|
+
};
|
|
764
914
|
|
|
765
|
-
|
|
915
|
+
const expectedDeviceId = options?.deviceId;
|
|
916
|
+
if (expectedDeviceId) {
|
|
917
|
+
// 先只读校验物理设备身份;钱包上下文仍由下方携带完整参数的
|
|
918
|
+
// Initialize 选择,避免标准钱包请求复用此前的隐藏钱包上下文。
|
|
919
|
+
this.passphraseState = undefined;
|
|
920
|
+
const { message } = await this.commands.typedCall('GetFeatures', 'Features', {});
|
|
921
|
+
this._updateFeatures(message);
|
|
922
|
+
await TransportManager.reconfigure(this.features);
|
|
923
|
+
if (!this.checkDeviceId(expectedDeviceId)) {
|
|
924
|
+
throw ERRORS.TypedError(HardwareErrorCode.DeviceCheckDeviceIdError);
|
|
925
|
+
}
|
|
926
|
+
}
|
|
766
927
|
|
|
767
|
-
|
|
768
|
-
this.clearInternalState(options?.deviceId);
|
|
769
|
-
}
|
|
928
|
+
this.passphraseState = options?.passphraseState;
|
|
770
929
|
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
payload.session_id = internalState;
|
|
775
|
-
}
|
|
930
|
+
if (options?.initSession) {
|
|
931
|
+
this.clearInternalState(options?.deviceId);
|
|
932
|
+
}
|
|
776
933
|
|
|
777
|
-
|
|
778
|
-
payload
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
934
|
+
const internalState = this.getInternalState(options?.deviceId);
|
|
935
|
+
const payload: Record<string, unknown> = {
|
|
936
|
+
passphrase_state: options?.passphraseState,
|
|
937
|
+
is_contains_attach: true,
|
|
938
|
+
};
|
|
939
|
+
if (internalState) {
|
|
940
|
+
payload.session_id = internalState;
|
|
941
|
+
}
|
|
942
|
+
if (options?.deriveCardano) {
|
|
943
|
+
payload.derive_cardano = true;
|
|
944
|
+
}
|
|
782
945
|
|
|
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);
|
|
946
|
+
await callInitialize(payload, options?.initSession);
|
|
800
947
|
} catch (error) {
|
|
801
948
|
Log.error('Initialization failed:', error);
|
|
802
949
|
throw error;
|
|
@@ -806,59 +953,38 @@ export class Device extends EventEmitter {
|
|
|
806
953
|
/**
|
|
807
954
|
* Device initialization over Protocol V2.
|
|
808
955
|
*
|
|
809
|
-
* Protocol V2
|
|
810
|
-
*
|
|
956
|
+
* Protocol V2 bypasses legacy Initialize/GetFeatures and builds its canonical
|
|
957
|
+
* features state directly from DeviceInfoGet.
|
|
811
958
|
*/
|
|
812
959
|
private async _initializeProtocolV2(options?: InitOptions) {
|
|
813
960
|
Log.debug('Initialize device via Protocol V2 features adapter');
|
|
814
961
|
|
|
815
962
|
try {
|
|
816
|
-
//
|
|
817
|
-
//
|
|
818
|
-
// 且 reject 后底层调用仍会残留。
|
|
963
|
+
// typedCall applies the request timeout. An outer Promise.race would leak its
|
|
964
|
+
// timer and leave the underlying call active after rejection.
|
|
819
965
|
const deviceInfo = await requestProtocolV2DeviceInfo({
|
|
820
966
|
commands: this.commands,
|
|
821
967
|
timeoutMs: options?.protocolV2DeviceInfoTimeoutMs,
|
|
822
968
|
});
|
|
823
|
-
//
|
|
824
|
-
//
|
|
825
|
-
const features = this.
|
|
969
|
+
// The default request excludes SE/hash data and therefore uses basic scope.
|
|
970
|
+
// Full version and verification data require getDeviceState({ scope: 'firmware' }).
|
|
971
|
+
const features = await this.probeProtocolV2RuntimeState(
|
|
972
|
+
deviceInfo,
|
|
973
|
+
options?.protocolV2DeviceInfoTimeoutMs
|
|
974
|
+
);
|
|
826
975
|
Log.debug('Protocol V2 features:', features);
|
|
827
|
-
this.featuresNeedsReload = false;
|
|
828
976
|
} catch (error) {
|
|
829
977
|
Log.error('Protocol V2 initialization failed:', error);
|
|
830
978
|
throw error;
|
|
831
979
|
}
|
|
832
980
|
}
|
|
833
981
|
|
|
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
982
|
async getFeatures() {
|
|
857
983
|
if (this.isProtocolV2()) {
|
|
858
984
|
const deviceInfo = await requestProtocolV2DeviceInfo({
|
|
859
985
|
commands: this.commands,
|
|
860
986
|
});
|
|
861
|
-
return this.
|
|
987
|
+
return this.probeProtocolV2RuntimeState(deviceInfo);
|
|
862
988
|
}
|
|
863
989
|
|
|
864
990
|
const { message } = await this.commands.typedCall('GetFeatures', 'Features', {});
|
|
@@ -866,36 +992,328 @@ export class Device extends EventEmitter {
|
|
|
866
992
|
return this.features;
|
|
867
993
|
}
|
|
868
994
|
|
|
995
|
+
async getDeviceState(params: DeviceStateReadOptions = {}) {
|
|
996
|
+
const refresh = new Set(params.refreshSections ?? []);
|
|
997
|
+
const getProtocolV2DeviceInfoRequest = () => {
|
|
998
|
+
if (refresh.has('verification')) return PROTOCOL_V2_FULL_DEVICE_INFO_REQUEST;
|
|
999
|
+
if (refresh.has('versions')) return PROTOCOL_V2_VERSIONS_DEVICE_INFO_REQUEST;
|
|
1000
|
+
return PROTOCOL_V2_FEATURES_DEVICE_INFO_REQUEST;
|
|
1001
|
+
};
|
|
1002
|
+
let initializedWithDeviceInfo = false;
|
|
1003
|
+
let refreshedDeviceInfo: ProtocolV2DeviceInfo | undefined;
|
|
1004
|
+
|
|
1005
|
+
if (!this.state) {
|
|
1006
|
+
if (this.isProtocolV2()) {
|
|
1007
|
+
const deviceInfo = await requestProtocolV2DeviceInfo({
|
|
1008
|
+
commands: this.commands,
|
|
1009
|
+
request: getProtocolV2DeviceInfoRequest(),
|
|
1010
|
+
});
|
|
1011
|
+
await this.probeProtocolV2RuntimeState(deviceInfo);
|
|
1012
|
+
refreshedDeviceInfo = deviceInfo;
|
|
1013
|
+
initializedWithDeviceInfo = true;
|
|
1014
|
+
} else {
|
|
1015
|
+
await this.getFeatures();
|
|
1016
|
+
}
|
|
1017
|
+
} else if (!this.isProtocolV2() && refresh.size > 0) {
|
|
1018
|
+
await this.getFeatures();
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
const supportsProtocolV1OnekeyFeatures =
|
|
1022
|
+
this.getCurrentDeviceType() === EDeviceType.Touch ||
|
|
1023
|
+
this.getCurrentDeviceType() === EDeviceType.Pro;
|
|
1024
|
+
if (!this.isProtocolV2() && refresh.has('verification') && supportsProtocolV1OnekeyFeatures) {
|
|
1025
|
+
const { message } = await this.commands.typedCall('OnekeyGetFeatures', 'OnekeyFeatures');
|
|
1026
|
+
this.updateState(mapProtocolV1OnekeyFeaturesToState(message), 'device-info');
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
if (this.isProtocolV2()) {
|
|
1030
|
+
const refreshDeviceInfo =
|
|
1031
|
+
refresh.has('identity') || refresh.has('versions') || refresh.has('verification');
|
|
1032
|
+
if (refreshDeviceInfo && !initializedWithDeviceInfo) {
|
|
1033
|
+
const deviceInfo = await requestProtocolV2DeviceInfo({
|
|
1034
|
+
commands: this.commands,
|
|
1035
|
+
request: getProtocolV2DeviceInfoRequest(),
|
|
1036
|
+
});
|
|
1037
|
+
refreshedDeviceInfo = deviceInfo;
|
|
1038
|
+
if (!refresh.has('status')) {
|
|
1039
|
+
this.updateState(
|
|
1040
|
+
mapProtocolV2DeviceInfoToState(deviceInfo, this.state?.status.mode),
|
|
1041
|
+
'device-info'
|
|
1042
|
+
);
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
if (refresh.has('status') && !initializedWithDeviceInfo) {
|
|
1047
|
+
await this.probeProtocolV2RuntimeState(refreshedDeviceInfo);
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
if (refresh.has('settings') && this.state?.status.mode === 'normal') {
|
|
1051
|
+
const { message } = await this.commands.typedCall(
|
|
1052
|
+
'DeviceSettingsGet',
|
|
1053
|
+
'DeviceSettings',
|
|
1054
|
+
{}
|
|
1055
|
+
);
|
|
1056
|
+
this.updateState(mapDeviceSettingsToState(message), 'settings-read');
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
if (!this.state) {
|
|
1061
|
+
throw ERRORS.TypedError(HardwareErrorCode.DeviceInitializeFailed);
|
|
1062
|
+
}
|
|
1063
|
+
return params.includeRaw ? cloneDeviceState(this.state) : createPublicDeviceState(this.state);
|
|
1064
|
+
}
|
|
1065
|
+
|
|
869
1066
|
_updateFeatures(protoFeatures: PROTO.Features | Features, initSession?: boolean) {
|
|
1067
|
+
const previousDeviceId = this.getCurrentDeviceId();
|
|
870
1068
|
let feat =
|
|
871
1069
|
'protocol' in protoFeatures
|
|
872
1070
|
? protoFeatures
|
|
873
1071
|
: buildProtocolV1FeaturesPayload(protoFeatures, this.features);
|
|
874
1072
|
|
|
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
1073
|
feat.unlocked = feat.unlocked ?? true;
|
|
883
1074
|
|
|
884
1075
|
feat = fixFeaturesFirmwareVersion(feat);
|
|
885
1076
|
|
|
886
|
-
this.
|
|
887
|
-
this.
|
|
888
|
-
|
|
1077
|
+
this.updateState(mapFeaturesToState(feat), 'initialize');
|
|
1078
|
+
this.reconcileSessionCacheDeviceIdentity(previousDeviceId);
|
|
1079
|
+
if (feat.deviceId && feat.sessionId) {
|
|
1080
|
+
this.setInternalState(feat.sessionId, initSession);
|
|
1081
|
+
}
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
updateState(patch: DeviceStatePatch, source: DeviceStateUpdateSource) {
|
|
1085
|
+
const result = this.stateStore.update(patch, source);
|
|
1086
|
+
if (result.changedKeys.length === 0) return result.state;
|
|
1087
|
+
|
|
1088
|
+
const event: DeviceStateEvent = {
|
|
1089
|
+
connectId: this.getConnectId() ?? null,
|
|
1090
|
+
state: createPublicDeviceState(result.state),
|
|
1091
|
+
revision: result.revision,
|
|
1092
|
+
source,
|
|
1093
|
+
changedKeys: result.changedKeys,
|
|
1094
|
+
};
|
|
1095
|
+
Log.debug('Device state patch committed', {
|
|
1096
|
+
source,
|
|
1097
|
+
keys: result.changedKeys,
|
|
1098
|
+
});
|
|
1099
|
+
this.emit(DEVICE.STATE, this, event);
|
|
1100
|
+
if (result.state.protocol === 'V1') {
|
|
1101
|
+
this.emit(DEVICE.FEATURES, this, projectFeatures(result.state));
|
|
1102
|
+
}
|
|
1103
|
+
return result.state;
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
updateFeaturesPatch(patch: Partial<Features>, source: DeviceStateUpdateSource) {
|
|
1107
|
+
const currentFeatures = this.features;
|
|
1108
|
+
if (!currentFeatures) return undefined;
|
|
1109
|
+
|
|
1110
|
+
const features = mergeDeviceFeaturesPatch(currentFeatures, patch);
|
|
1111
|
+
if (features === currentFeatures) return currentFeatures;
|
|
1112
|
+
|
|
1113
|
+
const normalized = fixFeaturesFirmwareVersion(features);
|
|
1114
|
+
this.updateState(mapFeaturesToState(normalized), source);
|
|
1115
|
+
return this.features;
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1118
|
+
async ensureProtocolV2RuntimeContext(timeoutMs?: number): Promise<ProtocolInfo> {
|
|
1119
|
+
const cachedProtocolInfo =
|
|
1120
|
+
this.protocolV2RuntimeContext ??
|
|
1121
|
+
(!this.protocolV2StateNeedsReload
|
|
1122
|
+
? this.state?.raw?.protocolV2ProtocolInfo ?? undefined
|
|
1123
|
+
: undefined);
|
|
1124
|
+
if (cachedProtocolInfo) {
|
|
1125
|
+
this.protocolV2RuntimeContext = cachedProtocolInfo;
|
|
1126
|
+
return cachedProtocolInfo;
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
if (this.protocolV2RuntimeContextPromise) {
|
|
1130
|
+
return this.protocolV2RuntimeContextPromise;
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
const requestToken = {};
|
|
1134
|
+
const pendingRequest = (async () => {
|
|
1135
|
+
const protocolInfo = await requestProtocolV2ProtocolInfo({
|
|
1136
|
+
commands: this.commands,
|
|
1137
|
+
timeoutMs,
|
|
1138
|
+
});
|
|
1139
|
+
if (this.protocolV2RuntimeContextRequestToken !== requestToken) {
|
|
1140
|
+
throw ERRORS.TypedError(
|
|
1141
|
+
HardwareErrorCode.DeviceInitializeFailed,
|
|
1142
|
+
'Protocol V2 runtime context was invalidated while loading.'
|
|
1143
|
+
);
|
|
1144
|
+
}
|
|
1145
|
+
this.protocolV2RuntimeContext = protocolInfo;
|
|
1146
|
+
return protocolInfo;
|
|
1147
|
+
})();
|
|
1148
|
+
this.protocolV2RuntimeContextRequestToken = requestToken;
|
|
1149
|
+
this.protocolV2RuntimeContextPromise = pendingRequest;
|
|
1150
|
+
|
|
1151
|
+
try {
|
|
1152
|
+
return await pendingRequest;
|
|
1153
|
+
} finally {
|
|
1154
|
+
if (this.protocolV2RuntimeContextPromise === pendingRequest) {
|
|
1155
|
+
this.protocolV2RuntimeContextPromise = undefined;
|
|
1156
|
+
}
|
|
1157
|
+
if (this.protocolV2RuntimeContextRequestToken === requestToken) {
|
|
1158
|
+
this.protocolV2RuntimeContextRequestToken = undefined;
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
889
1161
|
}
|
|
890
1162
|
|
|
891
|
-
|
|
892
|
-
const
|
|
893
|
-
|
|
1163
|
+
async probeProtocolV2RuntimeState(deviceInfo?: ProtocolV2DeviceInfo, timeoutMs?: number) {
|
|
1164
|
+
const protocolInfo = await this.ensureProtocolV2RuntimeContext(timeoutMs);
|
|
1165
|
+
const runtimeMode = getProtocolV2RuntimeMode(protocolInfo);
|
|
1166
|
+
const runtimeDeviceInfo = deviceInfo ?? this.state?.raw?.protocolV2DeviceInfo;
|
|
1167
|
+
const protocolV2DeviceType = runtimeDeviceInfo
|
|
1168
|
+
? resolveProtocolV2DeviceIdentity(runtimeDeviceInfo.hw?.Device_type).deviceType
|
|
1169
|
+
: this.getCurrentDeviceType();
|
|
1170
|
+
if (runtimeMode === 'romloader' && protocolV2DeviceType !== EDeviceType.Pro2) {
|
|
1171
|
+
throw ERRORS.TypedError(
|
|
1172
|
+
HardwareErrorCode.DeviceInitializeFailed,
|
|
1173
|
+
'Protocol V2 romloader mode is only supported for Pro2.'
|
|
1174
|
+
);
|
|
1175
|
+
}
|
|
1176
|
+
const deviceStatusSupported = supportsProtocolV2Message(
|
|
1177
|
+
protocolInfo,
|
|
1178
|
+
PROTOCOL_V2_DEVICE_STATUS_GET_MESSAGE_TYPE
|
|
1179
|
+
);
|
|
1180
|
+
|
|
1181
|
+
if (runtimeMode === 'bootloader' || runtimeMode === 'romloader') {
|
|
1182
|
+
return this.updateProtocolV2Features(deviceInfo, null, runtimeMode, protocolInfo);
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1185
|
+
if (!deviceStatusSupported) {
|
|
1186
|
+
if (runtimeMode === 'normal') {
|
|
1187
|
+
return this.updateProtocolV2Features(deviceInfo, null, runtimeMode, protocolInfo);
|
|
1188
|
+
}
|
|
1189
|
+
throw ERRORS.TypedError(
|
|
1190
|
+
HardwareErrorCode.DeviceInitializeFailed,
|
|
1191
|
+
`Unknown Protocol V2 build fingerprint without DeviceStatusGet capability: ${protocolInfo.build_fingerprint}`
|
|
1192
|
+
);
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
let deviceStatus: DeviceStatus;
|
|
1196
|
+
try {
|
|
1197
|
+
deviceStatus = await requestProtocolV2DeviceStatus({
|
|
1198
|
+
commands: this.commands,
|
|
1199
|
+
timeoutMs,
|
|
1200
|
+
});
|
|
1201
|
+
} catch (error) {
|
|
1202
|
+
if (runtimeMode === undefined && isProtocolV2DeviceStatusUnsupportedError(error)) {
|
|
1203
|
+
return this.updateProtocolV2Features(deviceInfo, null, 'bootloader', protocolInfo);
|
|
1204
|
+
}
|
|
1205
|
+
throw error;
|
|
1206
|
+
}
|
|
1207
|
+
return this.updateProtocolV2Features(deviceInfo, deviceStatus, 'normal', protocolInfo);
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
updateProtocolV2Features(
|
|
1211
|
+
deviceInfo?: ProtocolV2DeviceInfo,
|
|
1212
|
+
deviceStatus?: DeviceStatus | null,
|
|
1213
|
+
runtimeMode?: ProtocolV2RuntimeMode,
|
|
1214
|
+
protocolInfo?: ProtocolInfo
|
|
1215
|
+
) {
|
|
1216
|
+
const previousDeviceId = this.getCurrentDeviceId();
|
|
1217
|
+
const resolvedMode = runtimeMode ?? (deviceStatus ? 'normal' : this.state?.status.mode);
|
|
1218
|
+
if (deviceInfo) {
|
|
1219
|
+
this.updateState(mapProtocolV2DeviceInfoToState(deviceInfo, resolvedMode), 'device-info');
|
|
1220
|
+
}
|
|
1221
|
+
if (protocolInfo) {
|
|
1222
|
+
this.updateState({ raw: { protocolV2ProtocolInfo: protocolInfo } }, 'device-info');
|
|
1223
|
+
}
|
|
1224
|
+
if (deviceStatus) {
|
|
1225
|
+
this.updateState(mapProtocolV2DeviceStatusToState(deviceStatus), 'device-status');
|
|
1226
|
+
}
|
|
1227
|
+
this.reconcileSessionCacheDeviceIdentity(previousDeviceId);
|
|
1228
|
+
return this.features as Features;
|
|
1229
|
+
}
|
|
1230
|
+
|
|
1231
|
+
updateProtocolV2Status(status: DeviceStatus) {
|
|
1232
|
+
const previousDeviceInfo = this.state?.raw?.protocolV2DeviceInfo;
|
|
1233
|
+
const previousStatus = this.state?.raw?.protocolV2DeviceStatus;
|
|
1234
|
+
return this.updateProtocolV2Features(previousDeviceInfo, {
|
|
1235
|
+
...previousStatus,
|
|
1236
|
+
...status,
|
|
1237
|
+
});
|
|
1238
|
+
}
|
|
1239
|
+
|
|
1240
|
+
markTransportDisconnected() {
|
|
1241
|
+
this.deviceAcquired = false;
|
|
1242
|
+
if (!this.isProtocolV2()) return;
|
|
1243
|
+
this.protocolV2StateNeedsReload = true;
|
|
1244
|
+
this.protocolV2RuntimeContext = undefined;
|
|
1245
|
+
this.protocolV2RuntimeContextPromise = undefined;
|
|
1246
|
+
this.protocolV2RuntimeContextRequestToken = undefined;
|
|
1247
|
+
this.clearPreInitialized();
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1250
|
+
invalidateAfterWipe() {
|
|
1251
|
+
const deviceId = this.getCurrentDeviceId();
|
|
1252
|
+
if (deviceId) {
|
|
1253
|
+
deviceWalletSessionStore.deleteDevice(deviceId);
|
|
1254
|
+
}
|
|
1255
|
+
if (this.isProtocolV2()) {
|
|
1256
|
+
if (this.originalDescriptor.path !== deviceId) {
|
|
1257
|
+
deviceWalletSessionStore.deleteDevice(this.originalDescriptor.path);
|
|
1258
|
+
}
|
|
1259
|
+
this.protocolV2StateNeedsReload = true;
|
|
1260
|
+
this.protocolV2RuntimeContext = undefined;
|
|
1261
|
+
this.protocolV2RuntimeContextPromise = undefined;
|
|
1262
|
+
this.protocolV2RuntimeContextRequestToken = undefined;
|
|
1263
|
+
}
|
|
1264
|
+
|
|
1265
|
+
this.passphraseState = undefined;
|
|
1266
|
+
this.stateStore = new DeviceStateStore();
|
|
1267
|
+
this.clearPreInitialized();
|
|
1268
|
+
this.needReloadDevice = true;
|
|
1269
|
+
}
|
|
1270
|
+
|
|
1271
|
+
markProtocolV2Reboot(rebootType: DeviceRebootType) {
|
|
1272
|
+
if (!this.isProtocolV2()) return;
|
|
1273
|
+
|
|
1274
|
+
this.protocolV2StateNeedsReload = true;
|
|
1275
|
+
this.protocolV2RuntimeContext = undefined;
|
|
1276
|
+
this.protocolV2RuntimeContextPromise = undefined;
|
|
1277
|
+
this.protocolV2RuntimeContextRequestToken = undefined;
|
|
1278
|
+
this.clearPreInitialized();
|
|
1279
|
+
let loaderMode: 'bootloader' | 'romloader' | undefined;
|
|
1280
|
+
if (rebootType === DeviceRebootType.Bootloader) {
|
|
1281
|
+
loaderMode = 'bootloader';
|
|
1282
|
+
} else if (rebootType === DeviceRebootType.Romloader) {
|
|
1283
|
+
loaderMode = 'romloader';
|
|
1284
|
+
}
|
|
1285
|
+
if (loaderMode) {
|
|
1286
|
+
this.updateState(
|
|
1287
|
+
{
|
|
1288
|
+
identity: { deviceId: null },
|
|
1289
|
+
status: {
|
|
1290
|
+
mode: loaderMode,
|
|
1291
|
+
initialized: null,
|
|
1292
|
+
unlocked: null,
|
|
1293
|
+
firmwarePresent: null,
|
|
1294
|
+
backupRequired: null,
|
|
1295
|
+
noBackup: null,
|
|
1296
|
+
unfinishedBackup: null,
|
|
1297
|
+
recoveryMode: null,
|
|
1298
|
+
passphraseProtection: null,
|
|
1299
|
+
pinProtection: null,
|
|
1300
|
+
attachToPinEnabled: null,
|
|
1301
|
+
unlockedAttachPin: null,
|
|
1302
|
+
},
|
|
1303
|
+
raw: { protocolV2ProtocolInfo: null, protocolV2DeviceStatus: null },
|
|
1304
|
+
},
|
|
1305
|
+
'transport-reconnect'
|
|
1306
|
+
);
|
|
1307
|
+
return;
|
|
1308
|
+
}
|
|
1309
|
+
|
|
1310
|
+
this.updateState(
|
|
1311
|
+
{
|
|
1312
|
+
status: { mode: 'normal', unlocked: null },
|
|
1313
|
+
raw: { protocolV2ProtocolInfo: null, protocolV2DeviceStatus: null },
|
|
1314
|
+
},
|
|
1315
|
+
'transport-reconnect'
|
|
894
1316
|
);
|
|
895
|
-
this.features = features;
|
|
896
|
-
this.featuresNeedsReload = false;
|
|
897
|
-
this.emit(DEVICE.FEATURES, this, features);
|
|
898
|
-
return features;
|
|
899
1317
|
}
|
|
900
1318
|
|
|
901
1319
|
/**
|
|
@@ -916,8 +1334,7 @@ export class Device extends EventEmitter {
|
|
|
916
1334
|
}
|
|
917
1335
|
|
|
918
1336
|
if (forceUpdate) {
|
|
919
|
-
//
|
|
920
|
-
// 不能让覆盖丢掉已探测的协议结果。
|
|
1337
|
+
// Enumerated descriptors may omit protocolType, so preserve an actively probed value.
|
|
921
1338
|
this.originalDescriptor = {
|
|
922
1339
|
...descriptor,
|
|
923
1340
|
protocolType: descriptor.protocolType ?? this.originalDescriptor.protocolType,
|
|
@@ -942,19 +1359,43 @@ export class Device extends EventEmitter {
|
|
|
942
1359
|
|
|
943
1360
|
options = parseRunOptions(options);
|
|
944
1361
|
|
|
945
|
-
|
|
946
|
-
|
|
1362
|
+
const runPromise = createDeferred<void>();
|
|
1363
|
+
this.runPromise = runPromise;
|
|
1364
|
+
this._runInner(fn, options, runPromise).catch(error => {
|
|
1365
|
+
if (this.runPromise === runPromise) {
|
|
1366
|
+
this.runPromise = null;
|
|
1367
|
+
}
|
|
1368
|
+
runPromise.reject(error);
|
|
1369
|
+
});
|
|
1370
|
+
return runPromise.promise;
|
|
947
1371
|
}
|
|
948
1372
|
|
|
949
|
-
async _runInner<T>(
|
|
950
|
-
|
|
951
|
-
|
|
1373
|
+
async _runInner<T>(
|
|
1374
|
+
fn: (() => Promise<T>) | undefined,
|
|
1375
|
+
options: RunOptions,
|
|
1376
|
+
runPromise: Deferred<void>
|
|
1377
|
+
) {
|
|
1378
|
+
const clearRunPromise = () => {
|
|
1379
|
+
if (this.runPromise === runPromise) {
|
|
1380
|
+
this.runPromise = null;
|
|
1381
|
+
}
|
|
1382
|
+
};
|
|
1383
|
+
|
|
1384
|
+
const env = DataManager.getSettings('env');
|
|
1385
|
+
if (options.forceProtocolDetection && env !== 'react-native' && this.isUsedHere()) {
|
|
1386
|
+
await this.release();
|
|
1387
|
+
}
|
|
1388
|
+
|
|
1389
|
+
if (options.forceProtocolDetection || !this.isUsedHere() || this.commands.disposed) {
|
|
952
1390
|
if (env !== 'react-native') {
|
|
953
1391
|
try {
|
|
954
|
-
await this.acquire(options.connectProtocol
|
|
1392
|
+
await this.acquire(options.connectProtocol, {
|
|
1393
|
+
forceProtocolDetection: options.forceProtocolDetection,
|
|
1394
|
+
});
|
|
955
1395
|
} catch (error) {
|
|
956
|
-
|
|
957
|
-
|
|
1396
|
+
clearRunPromise();
|
|
1397
|
+
runPromise.reject(error);
|
|
1398
|
+
return;
|
|
958
1399
|
}
|
|
959
1400
|
|
|
960
1401
|
try {
|
|
@@ -964,16 +1405,19 @@ export class Device extends EventEmitter {
|
|
|
964
1405
|
}
|
|
965
1406
|
}
|
|
966
1407
|
} catch (error) {
|
|
967
|
-
this.
|
|
1408
|
+
await this.release();
|
|
1409
|
+
clearRunPromise();
|
|
968
1410
|
if (error instanceof HardwareError) {
|
|
969
|
-
|
|
1411
|
+
runPromise.reject(error);
|
|
1412
|
+
return;
|
|
970
1413
|
}
|
|
971
|
-
|
|
1414
|
+
runPromise.reject(
|
|
972
1415
|
ERRORS.TypedError(
|
|
973
1416
|
HardwareErrorCode.DeviceInitializeFailed,
|
|
974
1417
|
`Initialize failed: ${error.message as string}, code: ${error.code as string}`
|
|
975
1418
|
)
|
|
976
1419
|
);
|
|
1420
|
+
return;
|
|
977
1421
|
}
|
|
978
1422
|
} else if (env === 'react-native') {
|
|
979
1423
|
// TODO: implement react-native acquire
|
|
@@ -992,9 +1436,7 @@ export class Device extends EventEmitter {
|
|
|
992
1436
|
try {
|
|
993
1437
|
await fn();
|
|
994
1438
|
} catch (e) {
|
|
995
|
-
|
|
996
|
-
this.runPromise.reject(e);
|
|
997
|
-
}
|
|
1439
|
+
runPromise.reject(e);
|
|
998
1440
|
|
|
999
1441
|
if (
|
|
1000
1442
|
e instanceof HardwareError &&
|
|
@@ -1007,7 +1449,7 @@ export class Device extends EventEmitter {
|
|
|
1007
1449
|
Log.debug(`error code ${e.errorCode} release device, mainId: ${this.mainId}`);
|
|
1008
1450
|
}
|
|
1009
1451
|
|
|
1010
|
-
|
|
1452
|
+
clearRunPromise();
|
|
1011
1453
|
return;
|
|
1012
1454
|
}
|
|
1013
1455
|
}
|
|
@@ -1021,11 +1463,8 @@ export class Device extends EventEmitter {
|
|
|
1021
1463
|
Log.debug('release device, mainId: ', this.mainId);
|
|
1022
1464
|
}
|
|
1023
1465
|
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
}
|
|
1027
|
-
|
|
1028
|
-
this.runPromise = null;
|
|
1466
|
+
runPromise.resolve();
|
|
1467
|
+
clearRunPromise();
|
|
1029
1468
|
}
|
|
1030
1469
|
|
|
1031
1470
|
async interruptionFromOutside() {
|
|
@@ -1064,33 +1503,37 @@ export class Device extends EventEmitter {
|
|
|
1064
1503
|
}
|
|
1065
1504
|
|
|
1066
1505
|
getMode() {
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1506
|
+
switch (this.state?.status.mode) {
|
|
1507
|
+
case 'bootloader':
|
|
1508
|
+
case 'romloader':
|
|
1509
|
+
return EOneKeyDeviceMode.bootloader;
|
|
1510
|
+
case 'notInitialized':
|
|
1511
|
+
return EOneKeyDeviceMode.notInitialized;
|
|
1512
|
+
case 'backupMode':
|
|
1513
|
+
return EOneKeyDeviceMode.backupMode;
|
|
1514
|
+
case 'normal':
|
|
1515
|
+
return EOneKeyDeviceMode.normal;
|
|
1516
|
+
default:
|
|
1517
|
+
break;
|
|
1075
1518
|
}
|
|
1076
1519
|
|
|
1077
|
-
if (this.features?.noBackup) {
|
|
1078
|
-
// backup mode
|
|
1079
|
-
return EOneKeyDeviceMode.backupMode;
|
|
1080
|
-
}
|
|
1081
|
-
|
|
1082
|
-
// normal mode
|
|
1083
1520
|
return EOneKeyDeviceMode.normal;
|
|
1084
1521
|
}
|
|
1085
1522
|
|
|
1523
|
+
getStatus() {
|
|
1524
|
+
if (this.isUsedElsewhere()) return 'occupied' as const;
|
|
1525
|
+
if (this.isUsedHere()) return 'used' as const;
|
|
1526
|
+
return 'available' as const;
|
|
1527
|
+
}
|
|
1528
|
+
|
|
1086
1529
|
getFirmwareVersion() {
|
|
1087
|
-
if (!this.
|
|
1088
|
-
return
|
|
1530
|
+
if (!this.state) return null;
|
|
1531
|
+
return parseDeviceVersion(this.state.versions.firmware);
|
|
1089
1532
|
}
|
|
1090
1533
|
|
|
1091
1534
|
getBLEFirmwareVersion() {
|
|
1092
|
-
if (!this.
|
|
1093
|
-
return
|
|
1535
|
+
if (!this.state) return null;
|
|
1536
|
+
return parseDeviceVersion(this.state.versions.ble);
|
|
1094
1537
|
}
|
|
1095
1538
|
|
|
1096
1539
|
isUsed() {
|
|
@@ -1108,7 +1551,7 @@ export class Device extends EventEmitter {
|
|
|
1108
1551
|
isUsedHere() {
|
|
1109
1552
|
const env = DataManager.getSettings('env');
|
|
1110
1553
|
if (DataManager.isBleConnect(env)) {
|
|
1111
|
-
return
|
|
1554
|
+
return this.deviceAcquired;
|
|
1112
1555
|
}
|
|
1113
1556
|
return this.isUsed() && this.originalDescriptor.session === this.mainId;
|
|
1114
1557
|
}
|
|
@@ -1118,26 +1561,38 @@ export class Device extends EventEmitter {
|
|
|
1118
1561
|
}
|
|
1119
1562
|
|
|
1120
1563
|
isBootloader() {
|
|
1121
|
-
|
|
1564
|
+
if (!this.state) return undefined;
|
|
1565
|
+
return this.state.status.mode === 'bootloader';
|
|
1566
|
+
}
|
|
1567
|
+
|
|
1568
|
+
isRomloader() {
|
|
1569
|
+
if (!this.state) return undefined;
|
|
1570
|
+
return (
|
|
1571
|
+
this.isProtocolV2() &&
|
|
1572
|
+
this.getCurrentDeviceType() === EDeviceType.Pro2 &&
|
|
1573
|
+
this.state.status.mode === 'romloader'
|
|
1574
|
+
);
|
|
1122
1575
|
}
|
|
1123
1576
|
|
|
1124
1577
|
isInitialized() {
|
|
1125
|
-
|
|
1578
|
+
if (!this.state) return undefined;
|
|
1579
|
+
return this.state.status.initialized === true;
|
|
1126
1580
|
}
|
|
1127
1581
|
|
|
1128
1582
|
isSeedless() {
|
|
1129
|
-
|
|
1583
|
+
if (!this.state) return undefined;
|
|
1584
|
+
return this.state.status.noBackup === true;
|
|
1130
1585
|
}
|
|
1131
1586
|
|
|
1132
1587
|
isUnacquired(): boolean {
|
|
1133
|
-
return this.
|
|
1588
|
+
return this.state === undefined;
|
|
1134
1589
|
}
|
|
1135
1590
|
|
|
1136
1591
|
hasUnexpectedMode(allow: string[], require: string[]) {
|
|
1137
1592
|
// both allow and require cases might generate single unexpected mode
|
|
1138
1593
|
if (!this.isUnacquired()) {
|
|
1139
1594
|
// allow cases
|
|
1140
|
-
if (this.isBootloader() && !allow.includes(UI_REQUEST.BOOTLOADER)) {
|
|
1595
|
+
if (this.isBootloader() && !this.isProtocolV2() && !allow.includes(UI_REQUEST.BOOTLOADER)) {
|
|
1141
1596
|
return UI_REQUEST.BOOTLOADER;
|
|
1142
1597
|
}
|
|
1143
1598
|
if (!this.isInitialized() && !allow.includes(UI_REQUEST.NOT_INITIALIZE)) {
|
|
@@ -1161,7 +1616,7 @@ export class Device extends EventEmitter {
|
|
|
1161
1616
|
deviceType === EDeviceType.Touch ||
|
|
1162
1617
|
deviceType === EDeviceType.Pro ||
|
|
1163
1618
|
deviceType === EDeviceType.Pro2;
|
|
1164
|
-
const unlocked = this.
|
|
1619
|
+
const unlocked = this.state?.status.unlocked;
|
|
1165
1620
|
const preCheckTouch = isModeT && unlocked === false;
|
|
1166
1621
|
const passphraseProtection = this.getCurrentPassphraseProtection();
|
|
1167
1622
|
|
|
@@ -1174,12 +1629,91 @@ export class Device extends EventEmitter {
|
|
|
1174
1629
|
|
|
1175
1630
|
async lockDevice(): Promise<Success> {
|
|
1176
1631
|
const res = await this.commands.typedCall('LockDevice', 'Success', {});
|
|
1632
|
+
this.updateState({ status: { unlocked: false } }, 'lock');
|
|
1177
1633
|
return res.message;
|
|
1178
1634
|
}
|
|
1179
1635
|
|
|
1636
|
+
beginProtocolV2UiInteraction() {
|
|
1637
|
+
if (!this.isProtocolV2()) return;
|
|
1638
|
+
this.protocolV2UiInteraction = {
|
|
1639
|
+
interactionId: `${this.instanceId}:${Date.now()}:${++this.protocolV2UiInteractionCounter}`,
|
|
1640
|
+
phaseCounter: 0,
|
|
1641
|
+
sequence: 0,
|
|
1642
|
+
opened: false,
|
|
1643
|
+
};
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1646
|
+
createProtocolV2UiPhaseMetadata(
|
|
1647
|
+
phase: HardwareUiInteractionMeta['phase'],
|
|
1648
|
+
transition: HardwareUiInteractionMeta['transition'],
|
|
1649
|
+
options?: {
|
|
1650
|
+
phaseId?: string;
|
|
1651
|
+
outcome?: HardwareUiInteractionMeta['outcome'];
|
|
1652
|
+
}
|
|
1653
|
+
): HardwareUiInteractionMeta | undefined {
|
|
1654
|
+
if (!this.isProtocolV2()) return undefined;
|
|
1655
|
+
if (!this.protocolV2UiInteraction) this.beginProtocolV2UiInteraction();
|
|
1656
|
+
|
|
1657
|
+
const interaction = this.protocolV2UiInteraction;
|
|
1658
|
+
if (!interaction) return undefined;
|
|
1659
|
+
const phaseId =
|
|
1660
|
+
options?.phaseId ?? `${interaction.interactionId}:phase-${++interaction.phaseCounter}`;
|
|
1661
|
+
interaction.opened = true;
|
|
1662
|
+
interaction.sequence += 1;
|
|
1663
|
+
|
|
1664
|
+
return {
|
|
1665
|
+
interactionId: interaction.interactionId,
|
|
1666
|
+
phaseId,
|
|
1667
|
+
sequence: interaction.sequence,
|
|
1668
|
+
phase,
|
|
1669
|
+
transition,
|
|
1670
|
+
...(options?.outcome ? { outcome: options.outcome } : {}),
|
|
1671
|
+
protocol: 'V2',
|
|
1672
|
+
};
|
|
1673
|
+
}
|
|
1674
|
+
|
|
1675
|
+
completeProtocolV2UiPhase(
|
|
1676
|
+
phase: HardwareUiInteractionMeta,
|
|
1677
|
+
outcome: HardwareUiInteractionMeta['outcome'] = 'succeeded'
|
|
1678
|
+
) {
|
|
1679
|
+
return this.createProtocolV2UiPhaseMetadata(phase.phase, 'complete', {
|
|
1680
|
+
phaseId: phase.phaseId,
|
|
1681
|
+
outcome,
|
|
1682
|
+
});
|
|
1683
|
+
}
|
|
1684
|
+
|
|
1685
|
+
finishProtocolV2UiInteraction(
|
|
1686
|
+
outcome?: HardwareUiInteractionMeta['outcome'],
|
|
1687
|
+
options?: { ensureMetadata?: boolean }
|
|
1688
|
+
) {
|
|
1689
|
+
const interaction = this.protocolV2UiInteraction;
|
|
1690
|
+
if (!interaction || (!interaction.opened && !options?.ensureMetadata)) {
|
|
1691
|
+
this.protocolV2UiInteraction = undefined;
|
|
1692
|
+
return undefined;
|
|
1693
|
+
}
|
|
1694
|
+
|
|
1695
|
+
const phaseId = `${interaction.interactionId}:phase-${Math.max(interaction.phaseCounter, 1)}`;
|
|
1696
|
+
interaction.opened = true;
|
|
1697
|
+
interaction.sequence += 1;
|
|
1698
|
+
const metadata: HardwareUiInteractionMeta = {
|
|
1699
|
+
interactionId: interaction.interactionId,
|
|
1700
|
+
phaseId,
|
|
1701
|
+
sequence: interaction.sequence,
|
|
1702
|
+
phase: 'processing',
|
|
1703
|
+
transition: 'finish',
|
|
1704
|
+
outcome: outcome ?? 'succeeded',
|
|
1705
|
+
protocol: 'V2',
|
|
1706
|
+
};
|
|
1707
|
+
this.protocolV2UiInteraction = undefined;
|
|
1708
|
+
return metadata;
|
|
1709
|
+
}
|
|
1710
|
+
|
|
1711
|
+
hasOpenProtocolV2UiInteraction() {
|
|
1712
|
+
return this.protocolV2UiInteraction?.opened === true;
|
|
1713
|
+
}
|
|
1714
|
+
|
|
1180
1715
|
supportUnlockVersionRange(): DeviceFirmwareRange {
|
|
1181
|
-
//
|
|
1182
|
-
// 且 Protocol V2 固件从首个版本即支持 UnLockDevice(见 unlockDevice 的 isProtocolV2 短路)。
|
|
1716
|
+
// This range applies to Protocol V1 Pro devices; Pro2 has a dedicated unlock flow.
|
|
1183
1717
|
return {
|
|
1184
1718
|
pro: {
|
|
1185
1719
|
min: '4.15.0',
|
|
@@ -1187,19 +1721,62 @@ export class Device extends EventEmitter {
|
|
|
1187
1721
|
};
|
|
1188
1722
|
}
|
|
1189
1723
|
|
|
1190
|
-
async unlockDevice(
|
|
1724
|
+
async unlockDevice(
|
|
1725
|
+
pinType?: DeviceSessionPinType,
|
|
1726
|
+
options?: ProtocolV2UiEventMetadata & { emitUiEvent?: boolean }
|
|
1727
|
+
) {
|
|
1728
|
+
if (this.isProtocolV2()) {
|
|
1729
|
+
const requestedPinType = pinType ?? DeviceSessionPinType.Main;
|
|
1730
|
+
const interaction =
|
|
1731
|
+
options?.interaction ??
|
|
1732
|
+
(options?.emitUiEvent === false
|
|
1733
|
+
? undefined
|
|
1734
|
+
: this.createProtocolV2UiPhaseMetadata('pin', 'start'));
|
|
1735
|
+
if (options?.emitUiEvent !== false) {
|
|
1736
|
+
this.emit(DEVICE.PIN_ON_DEVICE, this, requestedPinType, {
|
|
1737
|
+
source: options?.source ?? 'unlock-coordinator',
|
|
1738
|
+
reason: options?.reason ?? 'device-unlock',
|
|
1739
|
+
deviceOnly: options?.deviceOnly ?? true,
|
|
1740
|
+
completion: options?.completion,
|
|
1741
|
+
method: options?.method,
|
|
1742
|
+
page: options?.page,
|
|
1743
|
+
operation: options?.operation,
|
|
1744
|
+
interaction: options?.interaction ?? interaction,
|
|
1745
|
+
});
|
|
1746
|
+
}
|
|
1747
|
+
try {
|
|
1748
|
+
await this.commands.typedCall('DeviceSessionAskPin', 'Success', {
|
|
1749
|
+
type: requestedPinType,
|
|
1750
|
+
});
|
|
1751
|
+
} catch (error) {
|
|
1752
|
+
const errorText =
|
|
1753
|
+
error instanceof Error
|
|
1754
|
+
? `${error.name} ${error.message}`
|
|
1755
|
+
: String((error as { message?: unknown } | null)?.message ?? error ?? '');
|
|
1756
|
+
if (errorText.includes('Failure_UnexpectedMessage')) {
|
|
1757
|
+
throw createDeviceNotSupportMethodError('deviceUnlock', this.getCurrentFirmwareType());
|
|
1758
|
+
}
|
|
1759
|
+
throw error;
|
|
1760
|
+
}
|
|
1761
|
+
|
|
1762
|
+
const completion = interaction ? this.completeProtocolV2UiPhase(interaction) : undefined;
|
|
1763
|
+
if (completion) {
|
|
1764
|
+
this.emit(DEVICE.PIN_ON_DEVICE_COMPLETE, this, completion);
|
|
1765
|
+
}
|
|
1766
|
+
|
|
1767
|
+
const status = await requestProtocolV2DeviceStatus({ commands: this.commands });
|
|
1768
|
+
return this.updateProtocolV2Status(status);
|
|
1769
|
+
}
|
|
1770
|
+
|
|
1191
1771
|
const firmwareVersion = this.getCurrentFirmwareVersionString() ?? '0.0.0';
|
|
1192
1772
|
const versionRange = this.getCurrentMethodVersionRange(
|
|
1193
1773
|
type => this.supportUnlockVersionRange()[type]
|
|
1194
1774
|
);
|
|
1195
1775
|
|
|
1196
|
-
const supportAttachPinCapability =
|
|
1197
|
-
this.features,
|
|
1776
|
+
const supportAttachPinCapability = this.state?.capabilities.includes(
|
|
1198
1777
|
Enum_Capability.Capability_AttachToPin
|
|
1199
1778
|
);
|
|
1200
|
-
// Pro2 (Protocol V2) 版本线独立于 Pro 系列,固件从首个版本即支持 UnLockDevice
|
|
1201
1779
|
const supportUnlock =
|
|
1202
|
-
this.isProtocolV2() ||
|
|
1203
1780
|
supportAttachPinCapability ||
|
|
1204
1781
|
(versionRange &&
|
|
1205
1782
|
semver.valid(firmwareVersion) &&
|
|
@@ -1207,12 +1784,21 @@ export class Device extends EventEmitter {
|
|
|
1207
1784
|
|
|
1208
1785
|
if (supportUnlock) {
|
|
1209
1786
|
const res = await this.commands.typedCall('UnLockDevice', 'UnLockDeviceResponse');
|
|
1210
|
-
if (this.
|
|
1211
|
-
this.
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1787
|
+
if (this.state) {
|
|
1788
|
+
this.updateState(
|
|
1789
|
+
{
|
|
1790
|
+
status: {
|
|
1791
|
+
unlocked: res.message.unlocked == null ? null : res.message.unlocked,
|
|
1792
|
+
unlockedAttachPin:
|
|
1793
|
+
res.message.unlocked_attach_pin == null ? null : res.message.unlocked_attach_pin,
|
|
1794
|
+
passphraseProtection:
|
|
1795
|
+
res.message.passphrase_protection == null
|
|
1796
|
+
? null
|
|
1797
|
+
: res.message.passphrase_protection,
|
|
1798
|
+
},
|
|
1799
|
+
},
|
|
1800
|
+
'unlock'
|
|
1801
|
+
);
|
|
1216
1802
|
|
|
1217
1803
|
return Promise.resolve(this.features);
|
|
1218
1804
|
}
|
|
@@ -1221,14 +1807,6 @@ export class Device extends EventEmitter {
|
|
|
1221
1807
|
return Promise.resolve(features);
|
|
1222
1808
|
}
|
|
1223
1809
|
|
|
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
1810
|
const { type } = await this.commands.typedCall('GetAddress', 'Address', {
|
|
1233
1811
|
address_n: [toHardened(44), toHardened(1), toHardened(0), 0, 0],
|
|
1234
1812
|
coin_name: 'Testnet',
|
|
@@ -1247,25 +1825,33 @@ export class Device extends EventEmitter {
|
|
|
1247
1825
|
async checkPassphraseStateSafety(
|
|
1248
1826
|
passphraseState?: string,
|
|
1249
1827
|
useEmptyPassphrase?: boolean,
|
|
1250
|
-
skipPassphraseCheck?: boolean
|
|
1828
|
+
skipPassphraseCheck?: boolean,
|
|
1829
|
+
deriveCardano?: boolean
|
|
1251
1830
|
) {
|
|
1252
1831
|
if (this.isUnacquired()) return false;
|
|
1253
1832
|
|
|
1833
|
+
const expectedPassphraseState = useEmptyPassphrase ? undefined : passphraseState;
|
|
1254
1834
|
const { passphraseState: newPassphraseState, unlockedAttachPin } =
|
|
1255
1835
|
await getPassphraseStateWithRefreshDeviceInfo(this, {
|
|
1256
|
-
expectPassphraseState:
|
|
1836
|
+
expectPassphraseState: expectedPassphraseState,
|
|
1257
1837
|
onlyMainPin: useEmptyPassphrase,
|
|
1838
|
+
deriveCardano,
|
|
1258
1839
|
});
|
|
1259
1840
|
|
|
1260
1841
|
// Main wallet and unlock Attach Pin, throw safe error
|
|
1261
1842
|
const mainWalletUseAttachPin = unlockedAttachPin && useEmptyPassphrase;
|
|
1262
1843
|
const useErrorAttachPin =
|
|
1263
|
-
unlockedAttachPin &&
|
|
1264
|
-
|
|
1844
|
+
unlockedAttachPin &&
|
|
1845
|
+
expectedPassphraseState &&
|
|
1846
|
+
expectedPassphraseState !== newPassphraseState;
|
|
1847
|
+
const passphraseStateMismatch =
|
|
1848
|
+
!!expectedPassphraseState && expectedPassphraseState !== newPassphraseState;
|
|
1265
1849
|
|
|
1266
1850
|
Log.debug('Check passphrase state safety: ', {
|
|
1267
|
-
|
|
1268
|
-
newPassphraseState,
|
|
1851
|
+
hasExpectedPassphraseState: Boolean(expectedPassphraseState),
|
|
1852
|
+
hasNewPassphraseState: Boolean(newPassphraseState),
|
|
1853
|
+
passphraseStateMatches:
|
|
1854
|
+
Boolean(expectedPassphraseState) && expectedPassphraseState === newPassphraseState,
|
|
1269
1855
|
unlockedAttachPin,
|
|
1270
1856
|
useEmptyPassphrase,
|
|
1271
1857
|
});
|