@onetokenfe/hd-core 1.1.23
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/.eslintrc +6 -0
- package/README.md +32 -0
- package/__tests__/benfen.test.ts +68 -0
- package/__tests__/checkBootloaderReleast.test.ts +115 -0
- package/__tests__/evmSignTransaction.test.ts +419 -0
- package/jest.config.js +6 -0
- package/package.json +48 -0
- package/src/api/BaseMethod.ts +275 -0
- package/src/api/CheckAllFirmwareRelease.ts +73 -0
- package/src/api/CheckBLEFirmwareRelease.ts +23 -0
- package/src/api/CheckBootloaderRelease.ts +32 -0
- package/src/api/CheckBridgeRelease.ts +28 -0
- package/src/api/CheckBridgeStatus.ts +32 -0
- package/src/api/CheckFirmwareRelease.ts +31 -0
- package/src/api/CheckFirmwareTypeAvailable.tsx +30 -0
- package/src/api/CipherKeyValue.ts +68 -0
- package/src/api/FirmwareUpdate.ts +219 -0
- package/src/api/FirmwareUpdateV2.ts +408 -0
- package/src/api/FirmwareUpdateV3.ts +560 -0
- package/src/api/GetFeatures.ts +23 -0
- package/src/api/GetLogs.ts +40 -0
- package/src/api/GetOnetokenFeatures.ts +25 -0
- package/src/api/GetPassphraseState.ts +28 -0
- package/src/api/PromptWebDeviceAccess.ts +77 -0
- package/src/api/SearchDevices.ts +50 -0
- package/src/api/alephium/AlephiumGetAddress.ts +84 -0
- package/src/api/alephium/AlephiumSignMessage.ts +51 -0
- package/src/api/alephium/AlephiumSignTransaction.ts +135 -0
- package/src/api/algo/AlgoGetAddress.ts +73 -0
- package/src/api/algo/AlgoSignTransaction.ts +52 -0
- package/src/api/allnetwork/AllNetworkGetAddress.ts +88 -0
- package/src/api/allnetwork/AllNetworkGetAddressBase.ts +529 -0
- package/src/api/allnetwork/AllNetworkGetAddressByLoop.ts +162 -0
- package/src/api/aptos/AptosGetAddress.ts +129 -0
- package/src/api/aptos/AptosGetPublicKey.ts +64 -0
- package/src/api/aptos/AptosSignInMessage.ts +55 -0
- package/src/api/aptos/AptosSignMessage.ts +79 -0
- package/src/api/aptos/AptosSignTransaction.ts +72 -0
- package/src/api/benfen/BenfenGetAddress.ts +122 -0
- package/src/api/benfen/BenfenGetPublicKey.ts +68 -0
- package/src/api/benfen/BenfenSignMessage.ts +50 -0
- package/src/api/benfen/BenfenSignTransaction.ts +105 -0
- package/src/api/benfen/normalize.ts +51 -0
- package/src/api/btc/BTCGetAddress.ts +91 -0
- package/src/api/btc/BTCGetPublicKey.ts +174 -0
- package/src/api/btc/BTCSignMessage.ts +73 -0
- package/src/api/btc/BTCSignPsbt.ts +65 -0
- package/src/api/btc/BTCSignTransaction.ts +148 -0
- package/src/api/btc/BTCVerifyMessage.ts +46 -0
- package/src/api/btc/helpers/btcParamsUtils.ts +64 -0
- package/src/api/btc/helpers/signtx.ts +251 -0
- package/src/api/btc/helpers/signtxLegacy.ts +227 -0
- package/src/api/btc/helpers/versionLimit.ts +25 -0
- package/src/api/btc/helpers/xpubUtils.ts +132 -0
- package/src/api/cardano/CardanoGetAddress.ts +139 -0
- package/src/api/cardano/CardanoGetPublicKey.ts +72 -0
- package/src/api/cardano/CardanoSignMessage.ts +73 -0
- package/src/api/cardano/CardanoSignTransaction.ts +404 -0
- package/src/api/cardano/helper/addressParameters.ts +120 -0
- package/src/api/cardano/helper/auxiliaryData.ts +133 -0
- package/src/api/cardano/helper/cardanoInputs.ts +55 -0
- package/src/api/cardano/helper/cardanoOutputs.ts +89 -0
- package/src/api/cardano/helper/certificate.ts +246 -0
- package/src/api/cardano/helper/token.ts +44 -0
- package/src/api/cardano/helper/utils.ts +17 -0
- package/src/api/cardano/helper/witnesses.ts +62 -0
- package/src/api/conflux/ConfluxGetAddress.ts +78 -0
- package/src/api/conflux/ConfluxSignMessage.ts +49 -0
- package/src/api/conflux/ConfluxSignMessageCIP23.ts +49 -0
- package/src/api/conflux/ConfluxSignTransaction.ts +135 -0
- package/src/api/cosmos/CosmosGetAddress.ts +80 -0
- package/src/api/cosmos/CosmosGetPublicKey.ts +77 -0
- package/src/api/cosmos/CosmosSignTransaction.ts +68 -0
- package/src/api/device/DeviceBackup.ts +15 -0
- package/src/api/device/DeviceCancel.ts +15 -0
- package/src/api/device/DeviceChangePin.ts +25 -0
- package/src/api/device/DeviceFlags.ts +26 -0
- package/src/api/device/DeviceFullyUploadResource.ts +80 -0
- package/src/api/device/DeviceLock.ts +15 -0
- package/src/api/device/DeviceRebootToBoardloader.ts +30 -0
- package/src/api/device/DeviceRebootToBootloader.ts +28 -0
- package/src/api/device/DeviceRecovery.ts +44 -0
- package/src/api/device/DeviceReset.ts +46 -0
- package/src/api/device/DeviceSettings.ts +96 -0
- package/src/api/device/DeviceSupportFeatures.ts +29 -0
- package/src/api/device/DeviceUnlock.ts +13 -0
- package/src/api/device/DeviceUpdateBootloader.ts +111 -0
- package/src/api/device/DeviceUpdateReboot.ts +17 -0
- package/src/api/device/DeviceUploadResource.ts +204 -0
- package/src/api/device/DeviceVerify.ts +65 -0
- package/src/api/device/DeviceWipe.ts +15 -0
- package/src/api/dynex/DnxGetAddress.ts +75 -0
- package/src/api/dynex/DnxSignTransaction.ts +126 -0
- package/src/api/evm/EVMGetAddress.ts +88 -0
- package/src/api/evm/EVMGetPublicKey.ts +116 -0
- package/src/api/evm/EVMSignMessage.ts +49 -0
- package/src/api/evm/EVMSignMessageEIP712.ts +56 -0
- package/src/api/evm/EVMSignTransaction.ts +141 -0
- package/src/api/evm/EVMSignTypedData.ts +477 -0
- package/src/api/evm/EVMVerifyMessage.ts +46 -0
- package/src/api/evm/latest/getAddress.ts +13 -0
- package/src/api/evm/latest/getPublicKey.ts +17 -0
- package/src/api/evm/latest/signMessage.ts +19 -0
- package/src/api/evm/latest/signTransaction.ts +303 -0
- package/src/api/evm/latest/signTypedData.ts +34 -0
- package/src/api/evm/latest/signTypedHash.ts +46 -0
- package/src/api/evm/latest/verifyMessage.ts +15 -0
- package/src/api/evm/legacyV1/getAddress.ts +16 -0
- package/src/api/evm/legacyV1/getPublicKey.ts +20 -0
- package/src/api/evm/legacyV1/signMessage.ts +22 -0
- package/src/api/evm/legacyV1/signTransaction.ts +37 -0
- package/src/api/evm/legacyV1/signTypedData.ts +37 -0
- package/src/api/evm/legacyV1/signTypedHash.ts +50 -0
- package/src/api/evm/legacyV1/verifyMessage.ts +19 -0
- package/src/api/filecoin/FilecoinGetAddress.ts +80 -0
- package/src/api/filecoin/FilecoinSignTransaction.ts +57 -0
- package/src/api/firmware/FirmwareUpdateBaseMethod.ts +476 -0
- package/src/api/firmware/bootloaderHelper.ts +46 -0
- package/src/api/firmware/getBinary.ts +99 -0
- package/src/api/firmware/releaseHelper.ts +78 -0
- package/src/api/firmware/updateBootloader.ts +82 -0
- package/src/api/firmware/uploadFirmware.ts +541 -0
- package/src/api/helpers/batchGetPublickeys.ts +84 -0
- package/src/api/helpers/bigNumberUtils.ts +58 -0
- package/src/api/helpers/hexUtils.ts +111 -0
- package/src/api/helpers/paramsValidator.ts +165 -0
- package/src/api/helpers/pathUtils.ts +145 -0
- package/src/api/helpers/stringUtils.ts +11 -0
- package/src/api/helpers/typeNameUtils.ts +137 -0
- package/src/api/index.ts +161 -0
- package/src/api/kaspa/KaspaGetAddress.ts +103 -0
- package/src/api/kaspa/KaspaSignTransaction.ts +182 -0
- package/src/api/kaspa/helpers/BufferWriter.ts +177 -0
- package/src/api/kaspa/helpers/HashWriter.ts +74 -0
- package/src/api/kaspa/helpers/SignatureType.ts +7 -0
- package/src/api/kaspa/helpers/TransferSerialize.ts +144 -0
- package/src/api/lightning/LnurlAuth.ts +52 -0
- package/src/api/near/NearGetAddress.ts +75 -0
- package/src/api/near/NearSignTransaction.ts +46 -0
- package/src/api/nem/NEMGetAddress.ts +72 -0
- package/src/api/nem/NEMSignTransaction.ts +251 -0
- package/src/api/neo/NeoGetAddress.ts +80 -0
- package/src/api/neo/NeoSignTransaction.ts +59 -0
- package/src/api/nervos/NervosGetAddress.ts +80 -0
- package/src/api/nervos/NervosSignTransaction.ts +116 -0
- package/src/api/nexa/NexaGetAddress.ts +88 -0
- package/src/api/nexa/NexaSignTransaction.ts +107 -0
- package/src/api/nostr/NostrDecryptMessage.ts +57 -0
- package/src/api/nostr/NostrEncryptMessage.ts +57 -0
- package/src/api/nostr/NostrGetPublicKey.ts +74 -0
- package/src/api/nostr/NostrSignEvent.ts +65 -0
- package/src/api/nostr/NostrSignSchnorr.ts +52 -0
- package/src/api/nostr/helper/index.ts +28 -0
- package/src/api/polkadot/PolkadotGetAddress.ts +83 -0
- package/src/api/polkadot/PolkadotSignTransaction.ts +53 -0
- package/src/api/polkadot/networks.ts +72 -0
- package/src/api/scdo/ScdoGetAddress.ts +76 -0
- package/src/api/scdo/ScdoSignMessage.ts +45 -0
- package/src/api/scdo/ScdoSignTransaction.ts +106 -0
- package/src/api/solana/SolGetAddress.ts +68 -0
- package/src/api/solana/SolSignMessage.ts +61 -0
- package/src/api/solana/SolSignOffchainMessage.ts +61 -0
- package/src/api/solana/SolSignTransaction.ts +108 -0
- package/src/api/starcoin/StarcoinGetAddress.ts +69 -0
- package/src/api/starcoin/StarcoinGetPublicKey.ts +70 -0
- package/src/api/starcoin/StarcoinSignMessage.ts +42 -0
- package/src/api/starcoin/StarcoinSignTransaction.ts +38 -0
- package/src/api/starcoin/StarcoinVerifyMessage.ts +35 -0
- package/src/api/stellar/StellarGetAddress.ts +68 -0
- package/src/api/stellar/StellarSignTransaction.ts +220 -0
- package/src/api/sui/SuiGetAddress.ts +117 -0
- package/src/api/sui/SuiGetPublicKey.ts +66 -0
- package/src/api/sui/SuiSignMessage.ts +48 -0
- package/src/api/sui/SuiSignTransaction.ts +126 -0
- package/src/api/sui/normalize.ts +28 -0
- package/src/api/test/TestInitializeDeviceDuration.ts +22 -0
- package/src/api/ton/TonGetAddress.ts +96 -0
- package/src/api/ton/TonSignMessage.ts +217 -0
- package/src/api/ton/TonSignProof.ts +62 -0
- package/src/api/tron/TronGetAddress.ts +75 -0
- package/src/api/tron/TronSignMessage.ts +89 -0
- package/src/api/tron/TronSignTransaction.ts +214 -0
- package/src/api/u2f/GetNextU2FCounter.ts +15 -0
- package/src/api/u2f/SetU2FCounter.ts +19 -0
- package/src/api/utils.ts +23 -0
- package/src/api/xrp/XrpGetAddress.ts +96 -0
- package/src/api/xrp/XrpSignTransaction.ts +71 -0
- package/src/constants/errors.ts +15 -0
- package/src/constants/index.ts +2 -0
- package/src/constants/ui-request.ts +3 -0
- package/src/core/RequestQueue.ts +134 -0
- package/src/core/index.ts +1320 -0
- package/src/data/coins/bitcoin.json +44 -0
- package/src/data/config.ts +25 -0
- package/src/data/messages/messages.json +13167 -0
- package/src/data/messages/messages_legacy_v1.json +10282 -0
- package/src/data-manager/CoinManager.ts +31 -0
- package/src/data-manager/DataManager.ts +499 -0
- package/src/data-manager/MessagesConfig.ts +28 -0
- package/src/data-manager/TransportManager.ts +140 -0
- package/src/data-manager/connectSettings.ts +121 -0
- package/src/data-manager/index.ts +3 -0
- package/src/device/Device.ts +884 -0
- package/src/device/DeviceCommands.ts +631 -0
- package/src/device/DeviceConnector.ts +124 -0
- package/src/device/DeviceList.ts +39 -0
- package/src/device/DevicePool.ts +266 -0
- package/src/events/call.ts +95 -0
- package/src/events/core.ts +65 -0
- package/src/events/device.ts +92 -0
- package/src/events/firmware.ts +43 -0
- package/src/events/iframe.ts +55 -0
- package/src/events/index.ts +10 -0
- package/src/events/log.ts +23 -0
- package/src/events/logBlockEvent.ts +6 -0
- package/src/events/ui-promise.ts +14 -0
- package/src/events/ui-request.ts +216 -0
- package/src/events/ui-response.ts +59 -0
- package/src/events/utils.ts +19 -0
- package/src/index.ts +70 -0
- package/src/inject.ts +408 -0
- package/src/lowLevelInject.ts +61 -0
- package/src/topLevelInject.ts +62 -0
- package/src/types/api/alephiumGetAddress.ts +31 -0
- package/src/types/api/alephiumSignMessage.ts +14 -0
- package/src/types/api/alephiumSignTransaction.ts +18 -0
- package/src/types/api/algoGetAddress.ts +23 -0
- package/src/types/api/algoSignTransaction.ts +17 -0
- package/src/types/api/allNetworkGetAddress.ts +130 -0
- package/src/types/api/aptosGetAddress.ts +28 -0
- package/src/types/api/aptosGetPublicKey.ts +27 -0
- package/src/types/api/aptosSignInMessage.ts +17 -0
- package/src/types/api/aptosSignMessage.ts +26 -0
- package/src/types/api/aptosSignTransaction.ts +18 -0
- package/src/types/api/benfenGetAddress.ts +24 -0
- package/src/types/api/benfenGetPublicKey.ts +23 -0
- package/src/types/api/benfenSignMessage.ts +13 -0
- package/src/types/api/benfenSignTransaction.ts +19 -0
- package/src/types/api/btcGetAddress.ts +26 -0
- package/src/types/api/btcGetPublicKey.ts +26 -0
- package/src/types/api/btcSignMessage.ts +16 -0
- package/src/types/api/btcSignPsbt.ts +13 -0
- package/src/types/api/btcSignTransaction.ts +98 -0
- package/src/types/api/btcVerifyMessage.ts +15 -0
- package/src/types/api/cardano.ts +212 -0
- package/src/types/api/cardanoGetAddress.ts +49 -0
- package/src/types/api/cardanoGetPublicKey.ts +33 -0
- package/src/types/api/cardanoSignMessage.ts +31 -0
- package/src/types/api/cardanoSignTransaction.ts +8 -0
- package/src/types/api/checkAllFirmwareRelease.ts +34 -0
- package/src/types/api/checkBLEFirmwareRelease.ts +15 -0
- package/src/types/api/checkBootloaderRelease.ts +19 -0
- package/src/types/api/checkBridgeRelease.ts +14 -0
- package/src/types/api/checkBridgeStatus.ts +3 -0
- package/src/types/api/checkFirmwareRelease.ts +23 -0
- package/src/types/api/checkFirmwareTypeAvailable.ts +12 -0
- package/src/types/api/cipherKeyValue.ts +28 -0
- package/src/types/api/confluxGetAddress.ts +24 -0
- package/src/types/api/confluxSignMessage.ts +13 -0
- package/src/types/api/confluxSignMessageCIP23.ts +14 -0
- package/src/types/api/confluxSignTransaction.ts +32 -0
- package/src/types/api/cosmosGetAddress.ts +24 -0
- package/src/types/api/cosmosGetPublicKey.ts +28 -0
- package/src/types/api/cosmosSignTransaction.ts +17 -0
- package/src/types/api/deviceBackup.ts +4 -0
- package/src/types/api/deviceCancel.ts +4 -0
- package/src/types/api/deviceChangePin.ts +11 -0
- package/src/types/api/deviceFlags.ts +11 -0
- package/src/types/api/deviceFullyUploadResource.ts +15 -0
- package/src/types/api/deviceLock.ts +4 -0
- package/src/types/api/deviceRebootToBoardloader.ts +6 -0
- package/src/types/api/deviceRebootToBootloader.ts +4 -0
- package/src/types/api/deviceRecovery.ts +19 -0
- package/src/types/api/deviceReset.ts +20 -0
- package/src/types/api/deviceSettings.ts +23 -0
- package/src/types/api/deviceSupportFeatures.ts +6 -0
- package/src/types/api/deviceUnlock.ts +4 -0
- package/src/types/api/deviceUpdateBootloader.ts +13 -0
- package/src/types/api/deviceUpdateReboot.ts +3 -0
- package/src/types/api/deviceUploadResource.ts +21 -0
- package/src/types/api/deviceVerify.ts +15 -0
- package/src/types/api/deviceWipe.ts +4 -0
- package/src/types/api/dnxGetAddress.ts +23 -0
- package/src/types/api/dnxSignTransaction.ts +36 -0
- package/src/types/api/event.ts +8 -0
- package/src/types/api/evmGetAddress.ts +24 -0
- package/src/types/api/evmGetPublicKey.ts +36 -0
- package/src/types/api/evmSignMessage.ts +14 -0
- package/src/types/api/evmSignMessageEIP712.ts +14 -0
- package/src/types/api/evmSignTransaction.ts +80 -0
- package/src/types/api/evmSignTypedData.ts +42 -0
- package/src/types/api/evmVerifyMessage.ts +15 -0
- package/src/types/api/export.ts +194 -0
- package/src/types/api/filecoinGetAddress.ts +24 -0
- package/src/types/api/filecoinSignTransaction.ts +24 -0
- package/src/types/api/firmwareUpdate.ts +66 -0
- package/src/types/api/getFeatures.ts +4 -0
- package/src/types/api/getLogs.ts +3 -0
- package/src/types/api/getNextU2FCounter.ts +7 -0
- package/src/types/api/getOnetokenFeatures.ts +7 -0
- package/src/types/api/getPassphraseState.ts +6 -0
- package/src/types/api/index.ts +404 -0
- package/src/types/api/init.ts +11 -0
- package/src/types/api/kaspaGetAddress.ts +26 -0
- package/src/types/api/kaspaSignTransaction.ts +44 -0
- package/src/types/api/lnurlAuth.ts +22 -0
- package/src/types/api/nearGetAddress.ts +23 -0
- package/src/types/api/nearSignTransaction.ts +13 -0
- package/src/types/api/nemGetAddress.ts +24 -0
- package/src/types/api/nemSignTransaction.ts +118 -0
- package/src/types/api/neoGetAddress.ts +24 -0
- package/src/types/api/neoSignTransaction.ts +18 -0
- package/src/types/api/nervosGetAddress.ts +24 -0
- package/src/types/api/nervosSignTransaction.ts +19 -0
- package/src/types/api/nexaGetAddress.ts +26 -0
- package/src/types/api/nexaSignTransaction.ts +28 -0
- package/src/types/api/nostrDecryptMessage.ts +25 -0
- package/src/types/api/nostrEncryptMessage.ts +25 -0
- package/src/types/api/nostrGetPublicKey.ts +28 -0
- package/src/types/api/nostrSignEvent.ts +52 -0
- package/src/types/api/nostrSignSchnorr.ts +22 -0
- package/src/types/api/polkadotGetAddress.ts +30 -0
- package/src/types/api/polkadotSignTransaction.ts +19 -0
- package/src/types/api/promptWebDeviceAccess.ts +6 -0
- package/src/types/api/scdoGetAddress.ts +23 -0
- package/src/types/api/scdoSignMessage.ts +13 -0
- package/src/types/api/scdoSignTransaction.ts +24 -0
- package/src/types/api/searchDevices.ts +4 -0
- package/src/types/api/setU2FCounter.ts +7 -0
- package/src/types/api/solGetAddress.ts +23 -0
- package/src/types/api/solSignMessage.ts +17 -0
- package/src/types/api/solSignOffchainMessage.ts +24 -0
- package/src/types/api/solSignTransaction.ts +27 -0
- package/src/types/api/starcoinGetAddress.ts +23 -0
- package/src/types/api/starcoinGetPublicKey.ts +23 -0
- package/src/types/api/starcoinSignMessage.ts +13 -0
- package/src/types/api/starcoinSignTransaction.ts +13 -0
- package/src/types/api/starcoinVerifyMessage.ts +14 -0
- package/src/types/api/stellarGetAddress.ts +23 -0
- package/src/types/api/stellarSignTransaction.ts +154 -0
- package/src/types/api/suiGetAddress.ts +28 -0
- package/src/types/api/suiGetPublicKey.ts +27 -0
- package/src/types/api/suiSignMessage.ts +13 -0
- package/src/types/api/suiSignTransaction.ts +17 -0
- package/src/types/api/testInitializeDeviceDuration.ts +6 -0
- package/src/types/api/tonGetAddress.ts +34 -0
- package/src/types/api/tonSignMessage.ts +42 -0
- package/src/types/api/tonSignProof.ts +25 -0
- package/src/types/api/tronGetAddress.ts +23 -0
- package/src/types/api/tronSignMessage.ts +14 -0
- package/src/types/api/tronSignTransaction.ts +89 -0
- package/src/types/api/uiResponse.ts +3 -0
- package/src/types/api/xrpGetAddress.ts +28 -0
- package/src/types/api/xrpSignTransaction.ts +29 -0
- package/src/types/device.ts +194 -0
- package/src/types/firmware.ts +41 -0
- package/src/types/global.d.ts +3 -0
- package/src/types/index.ts +5 -0
- package/src/types/params.ts +64 -0
- package/src/types/settings.ts +144 -0
- package/src/utils/arrayUtils.ts +7 -0
- package/src/utils/assets.ts +5 -0
- package/src/utils/bridgeUpdate.ts +80 -0
- package/src/utils/capabilitieUtils.ts +12 -0
- package/src/utils/deviceFeaturesUtils.ts +352 -0
- package/src/utils/deviceInfoUtils.ts +167 -0
- package/src/utils/deviceSettings.ts +109 -0
- package/src/utils/deviceVersionUtils.ts +79 -0
- package/src/utils/findDefectiveBatchDevice.ts +39 -0
- package/src/utils/getMutex.ts +41 -0
- package/src/utils/getSynchronize.ts +25 -0
- package/src/utils/homescreen.ts +345 -0
- package/src/utils/index.ts +44 -0
- package/src/utils/logger.ts +190 -0
- package/src/utils/networkUtils.ts +25 -0
- package/src/utils/patch.ts +14 -0
- package/src/utils/promiseUtils.ts +4 -0
- package/src/utils/release.ts +42 -0
- package/src/utils/semver.test.js +53 -0
- package/src/utils/tracing.ts +238 -0
- package/src/utils/versionUtils.ts +120 -0
- package/tsconfig.json +11 -0
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
import semver from 'semver';
|
|
2
|
+
import { isNaN } from 'lodash';
|
|
3
|
+
import { EDeviceType, type EFirmwareType, ERRORS, HardwareErrorCode } from '@onetokenfe/hd-shared';
|
|
4
|
+
import { Enum_Capability } from '@onetokenfe/hd-transport';
|
|
5
|
+
|
|
6
|
+
import { toHardened } from '../api/helpers/pathUtils';
|
|
7
|
+
import { DeviceModelToTypes, DeviceTypeToModels } from '../types';
|
|
8
|
+
import DataManager, { type IFirmwareField, type MessageVersion } from '../data-manager/DataManager';
|
|
9
|
+
import { PROTOBUF_MESSAGE_CONFIG } from '../data-manager/MessagesConfig';
|
|
10
|
+
import { getDeviceType } from './deviceInfoUtils';
|
|
11
|
+
import { getDeviceFirmwareVersion } from './deviceVersionUtils';
|
|
12
|
+
import { existCapability } from './capabilitieUtils';
|
|
13
|
+
|
|
14
|
+
import type { Device } from '../device/Device';
|
|
15
|
+
import type { DeviceCommands } from '../device/DeviceCommands';
|
|
16
|
+
import type { Features, SupportFeatureType } from '../types';
|
|
17
|
+
|
|
18
|
+
export const getSupportMessageVersion = (
|
|
19
|
+
features: Features | undefined
|
|
20
|
+
): { messages: JSON; messageVersion: MessageVersion } => {
|
|
21
|
+
if (!features)
|
|
22
|
+
return {
|
|
23
|
+
messages: DataManager.messages.latest,
|
|
24
|
+
messageVersion: 'latest',
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const currentDeviceVersion = getDeviceFirmwareVersion(features).join('.');
|
|
28
|
+
const deviceType = getDeviceType(features);
|
|
29
|
+
|
|
30
|
+
const deviceVersionConfigs =
|
|
31
|
+
PROTOBUF_MESSAGE_CONFIG[deviceType] ||
|
|
32
|
+
(DeviceTypeToModels[deviceType] &&
|
|
33
|
+
DeviceTypeToModels[deviceType]
|
|
34
|
+
.map(model => PROTOBUF_MESSAGE_CONFIG[model])
|
|
35
|
+
.find(range => range !== undefined));
|
|
36
|
+
|
|
37
|
+
const sortedDeviceVersionConfigs =
|
|
38
|
+
deviceVersionConfigs?.sort((a, b) => semver.compare(b.minVersion, a.minVersion)) ?? [];
|
|
39
|
+
|
|
40
|
+
for (const { minVersion, messageVersion } of sortedDeviceVersionConfigs) {
|
|
41
|
+
if (semver.gte(currentDeviceVersion, minVersion)) {
|
|
42
|
+
return {
|
|
43
|
+
messages: DataManager.messages[messageVersion],
|
|
44
|
+
messageVersion,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return {
|
|
50
|
+
messages: DataManager.messages.latest,
|
|
51
|
+
messageVersion: 'latest',
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export const supportInputPinOnSoftware = (features: Features): SupportFeatureType => {
|
|
56
|
+
if (!features) return { support: false };
|
|
57
|
+
|
|
58
|
+
const deviceType = getDeviceType(features);
|
|
59
|
+
if (deviceType === EDeviceType.Touch || deviceType === EDeviceType.Pro) {
|
|
60
|
+
return { support: false };
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const currentVersion = getDeviceFirmwareVersion(features).join('.');
|
|
64
|
+
return { support: semver.gte(currentVersion, '2.3.0'), require: '2.3.0' };
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export const supportNewPassphrase = (features?: Features): SupportFeatureType => {
|
|
68
|
+
if (!features) return { support: false };
|
|
69
|
+
|
|
70
|
+
const deviceType = getDeviceType(features);
|
|
71
|
+
if (deviceType === EDeviceType.Touch || deviceType === EDeviceType.Pro) {
|
|
72
|
+
return { support: true };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const currentVersion = getDeviceFirmwareVersion(features).join('.');
|
|
76
|
+
|
|
77
|
+
return { support: semver.gte(currentVersion, '2.4.0'), require: '2.4.0' };
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export const getPassphraseStateWithRefreshDeviceInfo = async (
|
|
81
|
+
device: Device,
|
|
82
|
+
options?: {
|
|
83
|
+
expectPassphraseState?: string;
|
|
84
|
+
onlyMainPin?: boolean;
|
|
85
|
+
}
|
|
86
|
+
) => {
|
|
87
|
+
const { features, commands } = device;
|
|
88
|
+
const locked = features?.unlocked === false;
|
|
89
|
+
|
|
90
|
+
const { passphraseState, newSession, unlockedAttachPin } = await getPassphraseState(
|
|
91
|
+
features,
|
|
92
|
+
commands,
|
|
93
|
+
{
|
|
94
|
+
...options,
|
|
95
|
+
}
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
const isModeT =
|
|
99
|
+
getDeviceType(features) === EDeviceType.Touch || getDeviceType(features) === EDeviceType.Pro;
|
|
100
|
+
|
|
101
|
+
// 如果可以获取到 passphraseState,但是设备 features 显示设备未开启 passphrase,需要刷新设备状态
|
|
102
|
+
// if passphraseState can be obtained, but the device features show that the device has not enabled passphrase, the device status needs to be refreshed
|
|
103
|
+
const needRefreshWithPassphrase = passphraseState && features?.passphrase_protection !== true;
|
|
104
|
+
// 如果 Touch/Pro 在之前是锁定状态,刷新设备状态
|
|
105
|
+
// if Touch/Pro was locked before, refresh the device state
|
|
106
|
+
const needRefreshWithLocked = isModeT && locked;
|
|
107
|
+
|
|
108
|
+
if (needRefreshWithLocked || needRefreshWithPassphrase) {
|
|
109
|
+
// refresh device state
|
|
110
|
+
await device.getFeatures();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Attach to pin try to fix internal state
|
|
114
|
+
if (features?.device_id) {
|
|
115
|
+
device.updateInternalState(
|
|
116
|
+
device.features?.passphrase_protection ?? false,
|
|
117
|
+
passphraseState,
|
|
118
|
+
device.features?.device_id ?? '',
|
|
119
|
+
newSession,
|
|
120
|
+
device.features?.session_id
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return { passphraseState, newSession, unlockedAttachPin };
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
export const getPassphraseState = async (
|
|
128
|
+
features: Features | undefined,
|
|
129
|
+
commands: DeviceCommands,
|
|
130
|
+
options?: {
|
|
131
|
+
expectPassphraseState?: string;
|
|
132
|
+
onlyMainPin?: boolean;
|
|
133
|
+
}
|
|
134
|
+
): Promise<{
|
|
135
|
+
passphraseState: string | undefined;
|
|
136
|
+
newSession: string | undefined;
|
|
137
|
+
unlockedAttachPin: boolean | undefined;
|
|
138
|
+
}> => {
|
|
139
|
+
if (!features)
|
|
140
|
+
return { passphraseState: undefined, newSession: undefined, unlockedAttachPin: undefined };
|
|
141
|
+
|
|
142
|
+
const firmwareVersion = getDeviceFirmwareVersion(features);
|
|
143
|
+
const deviceType = getDeviceType(features);
|
|
144
|
+
|
|
145
|
+
const supportAttachPinCapability = existCapability(
|
|
146
|
+
features,
|
|
147
|
+
Enum_Capability.Capability_AttachToPin
|
|
148
|
+
);
|
|
149
|
+
const supportGetPassphraseState =
|
|
150
|
+
supportAttachPinCapability ||
|
|
151
|
+
(deviceType === EDeviceType.Pro && semver.gte(firmwareVersion.join('.'), '4.15.0'));
|
|
152
|
+
|
|
153
|
+
if (supportGetPassphraseState) {
|
|
154
|
+
const { message, type } = await commands.typedCall('GetPassphraseState', 'PassphraseState', {
|
|
155
|
+
passphrase_state: options?.onlyMainPin ? undefined : options?.expectPassphraseState,
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
// @ts-expect-error
|
|
159
|
+
if (type === 'CallMethodError') {
|
|
160
|
+
throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'Get the passphrase state error');
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return {
|
|
164
|
+
passphraseState: message.passphrase_state,
|
|
165
|
+
newSession: message.session_id,
|
|
166
|
+
unlockedAttachPin: message.unlocked_attach_pin,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const { message, type } = await commands.typedCall('GetAddress', 'Address', {
|
|
171
|
+
address_n: [toHardened(44), toHardened(1), toHardened(0), 0, 0],
|
|
172
|
+
coin_name: 'Testnet',
|
|
173
|
+
script_type: 'SPENDADDRESS',
|
|
174
|
+
show_display: false,
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
// @ts-expect-error
|
|
178
|
+
if (type === 'CallMethodError') {
|
|
179
|
+
throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'Get the passphrase state error');
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return {
|
|
183
|
+
passphraseState: message.address,
|
|
184
|
+
newSession: undefined,
|
|
185
|
+
unlockedAttachPin: undefined,
|
|
186
|
+
};
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
export const supportBatchPublicKey = (
|
|
190
|
+
features?: Features,
|
|
191
|
+
options?: {
|
|
192
|
+
includeNode?: boolean;
|
|
193
|
+
}
|
|
194
|
+
): boolean => {
|
|
195
|
+
if (!features) return false;
|
|
196
|
+
const currentVersion = getDeviceFirmwareVersion(features).join('.');
|
|
197
|
+
|
|
198
|
+
const deviceType = getDeviceType(features);
|
|
199
|
+
// btc batch get public key
|
|
200
|
+
if (!!options?.includeNode && deviceType === EDeviceType.Pro) {
|
|
201
|
+
return semver.gte(currentVersion, '4.14.0');
|
|
202
|
+
}
|
|
203
|
+
if (!!options?.includeNode && deviceType === EDeviceType.Touch) {
|
|
204
|
+
return semver.gte(currentVersion, '4.11.0');
|
|
205
|
+
}
|
|
206
|
+
if (!!options?.includeNode && DeviceModelToTypes.model_classic1s.includes(deviceType)) {
|
|
207
|
+
return semver.gte(currentVersion, '3.12.0');
|
|
208
|
+
}
|
|
209
|
+
if (!!options?.includeNode && DeviceModelToTypes.model_mini.includes(deviceType)) {
|
|
210
|
+
return semver.gte(currentVersion, '3.10.0');
|
|
211
|
+
}
|
|
212
|
+
if (options?.includeNode) {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// support batch get public key
|
|
217
|
+
if (deviceType === EDeviceType.Touch || deviceType === EDeviceType.Pro) {
|
|
218
|
+
return semver.gte(currentVersion, '3.1.0');
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return semver.gte(currentVersion, '2.6.0');
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
export const supportModifyHomescreen = (features?: Features): SupportFeatureType => {
|
|
225
|
+
if (!features) return { support: false };
|
|
226
|
+
const currentVersion = getDeviceFirmwareVersion(features).join('.');
|
|
227
|
+
|
|
228
|
+
const deviceType = getDeviceType(features);
|
|
229
|
+
if (DeviceModelToTypes.model_mini.includes(deviceType)) {
|
|
230
|
+
return { support: true };
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return { support: semver.gte(currentVersion, '3.4.0') };
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
export const getLatestFirmwareField = (firmwareType?: EFirmwareType): IFirmwareField => {
|
|
237
|
+
if (firmwareType === 'bitcoinonly') {
|
|
238
|
+
return `firmware-btc-v8`;
|
|
239
|
+
}
|
|
240
|
+
return `firmware-v8`;
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Since 3.5.0, Touch uses the firmware-v3 field to get firmware release info
|
|
245
|
+
*/
|
|
246
|
+
export const getFirmwareUpdateField = ({
|
|
247
|
+
features,
|
|
248
|
+
updateType,
|
|
249
|
+
targetVersion,
|
|
250
|
+
firmwareType,
|
|
251
|
+
}: {
|
|
252
|
+
features: Features;
|
|
253
|
+
updateType: 'firmware' | 'ble';
|
|
254
|
+
targetVersion?: string;
|
|
255
|
+
firmwareType: EFirmwareType;
|
|
256
|
+
}): 'ble' | IFirmwareField => {
|
|
257
|
+
const deviceType = getDeviceType(features);
|
|
258
|
+
const deviceFirmwareVersion = getDeviceFirmwareVersion(features);
|
|
259
|
+
if (updateType === 'ble') {
|
|
260
|
+
return 'ble';
|
|
261
|
+
}
|
|
262
|
+
const latestFirmwareField = getLatestFirmwareField(firmwareType);
|
|
263
|
+
|
|
264
|
+
if (DeviceModelToTypes.model_mini.includes(deviceType)) {
|
|
265
|
+
return latestFirmwareField;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (deviceType === EDeviceType.Touch) {
|
|
269
|
+
if (targetVersion) {
|
|
270
|
+
if (semver.eq(targetVersion, '4.0.0')) return 'firmware-v2';
|
|
271
|
+
if (semver.gt(targetVersion, '4.0.0')) return latestFirmwareField;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
if (semver.lt(deviceFirmwareVersion.join('.'), '3.4.0')) return 'firmware';
|
|
275
|
+
|
|
276
|
+
return latestFirmwareField;
|
|
277
|
+
}
|
|
278
|
+
if (deviceType === EDeviceType.Pro) {
|
|
279
|
+
return latestFirmwareField;
|
|
280
|
+
}
|
|
281
|
+
return 'firmware';
|
|
282
|
+
};
|
|
283
|
+
/**
|
|
284
|
+
* Returns the optional firmware version
|
|
285
|
+
* Used in firmware web update
|
|
286
|
+
* https://firmware.onetoken.so/
|
|
287
|
+
*/
|
|
288
|
+
export const getFirmwareUpdateFieldArray = (
|
|
289
|
+
features: Features,
|
|
290
|
+
updateType: 'firmware' | 'ble' | 'bootloader'
|
|
291
|
+
): ('ble' | IFirmwareField)[] => {
|
|
292
|
+
const deviceType = getDeviceType(features);
|
|
293
|
+
if (updateType === 'ble') {
|
|
294
|
+
return ['ble'];
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
if (
|
|
298
|
+
deviceType === 'classic' ||
|
|
299
|
+
deviceType === 'classic1s' ||
|
|
300
|
+
deviceType === 'mini' ||
|
|
301
|
+
deviceType === 'classicpure'
|
|
302
|
+
) {
|
|
303
|
+
return ['firmware-v8'];
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (deviceType === 'touch') {
|
|
307
|
+
const currentVersion = getDeviceFirmwareVersion(features).join('.');
|
|
308
|
+
if (semver.gt(currentVersion, '4.0.0')) {
|
|
309
|
+
return ['firmware-v8', 'firmware'];
|
|
310
|
+
}
|
|
311
|
+
if (semver.gte(currentVersion, '4.0.0')) {
|
|
312
|
+
return ['firmware-v2', 'firmware'];
|
|
313
|
+
}
|
|
314
|
+
if (!currentVersion || semver.lt(currentVersion, '3.0.0')) {
|
|
315
|
+
return ['firmware-v8', 'firmware-v2', 'firmware'];
|
|
316
|
+
}
|
|
317
|
+
return ['firmware'];
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
if (deviceType === 'pro') {
|
|
321
|
+
return ['firmware-v8'];
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
return ['firmware'];
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
export function fixVersion(version: string) {
|
|
328
|
+
let parts = version.split('.');
|
|
329
|
+
|
|
330
|
+
while (parts.length < 3) {
|
|
331
|
+
parts.push('0');
|
|
332
|
+
}
|
|
333
|
+
parts = parts.map(part => (isNaN(parseInt(part, 10)) ? '0' : part));
|
|
334
|
+
|
|
335
|
+
return parts.join('.');
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
export const fixFeaturesFirmwareVersion = (features: Features): Features => {
|
|
339
|
+
// 修复 Touch、Pro 设备 bootloader 低于 2.5.2 版本时,返回的 features 中没有 firmware_version 错误的问题
|
|
340
|
+
// fix Touch、Pro device when bootloader version is lower than 2.5.2, the features returned do not have firmware_version error
|
|
341
|
+
const tempFeatures = { ...features };
|
|
342
|
+
|
|
343
|
+
if (tempFeatures.onetoken_firmware_version && !semver.valid(tempFeatures.onetoken_firmware_version)) {
|
|
344
|
+
tempFeatures.onetoken_firmware_version = fixVersion(tempFeatures.onetoken_firmware_version);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
if (tempFeatures.onetoken_version && !semver.valid(tempFeatures.onetoken_version)) {
|
|
348
|
+
tempFeatures.onetoken_version = fixVersion(tempFeatures.onetoken_version);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
return tempFeatures;
|
|
352
|
+
};
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { isEmpty } from 'lodash';
|
|
2
|
+
import { EDeviceType, EFirmwareType } from '@onetokenfe/hd-shared';
|
|
3
|
+
import { Enum_Capability } from '@onetokenfe/hd-transport';
|
|
4
|
+
|
|
5
|
+
import { DeviceModelToTypes } from '../types';
|
|
6
|
+
import { existCapability } from './capabilitieUtils';
|
|
7
|
+
|
|
8
|
+
import type { Features, IDeviceModel, IDeviceType, IVersionRange } from '../types';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* get device type by features
|
|
12
|
+
*/
|
|
13
|
+
export const getDeviceType = (features?: Features): IDeviceType => {
|
|
14
|
+
if (!features || typeof features !== 'object') {
|
|
15
|
+
return EDeviceType.Unknown;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// classic1s 3.5.0 pro 4.6.0
|
|
19
|
+
switch (features.onetoken_device_type) {
|
|
20
|
+
case 'CLASSIC':
|
|
21
|
+
return EDeviceType.Classic;
|
|
22
|
+
case 'CLASSIC1S':
|
|
23
|
+
return EDeviceType.Classic1s;
|
|
24
|
+
case 'MINI':
|
|
25
|
+
return EDeviceType.Mini;
|
|
26
|
+
case 'TOUCH':
|
|
27
|
+
return EDeviceType.Touch;
|
|
28
|
+
case 'PRO':
|
|
29
|
+
return EDeviceType.Pro;
|
|
30
|
+
case 'PURE':
|
|
31
|
+
return EDeviceType.ClassicPure;
|
|
32
|
+
default:
|
|
33
|
+
// future And old device onetoken_device_type is empty
|
|
34
|
+
if (!isEmpty(features.onetoken_serial_no)) {
|
|
35
|
+
return EDeviceType.Unknown;
|
|
36
|
+
}
|
|
37
|
+
// old device type
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// low version hardware
|
|
41
|
+
// onetoken_serial_no > onetoken_serial > serial_no
|
|
42
|
+
const serialNo = getDeviceUUID(features);
|
|
43
|
+
|
|
44
|
+
// not exist serialNo, bootloader mode, model 1 is classic
|
|
45
|
+
if (isEmpty(serialNo) && features.bootloader_mode === true && features.model === '1') {
|
|
46
|
+
return EDeviceType.Classic;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (isEmpty(serialNo)) return EDeviceType.Unknown;
|
|
50
|
+
|
|
51
|
+
const miniFlag = serialNo.slice(0, 2);
|
|
52
|
+
// By May 2021, the miniFlag is 'bixin' for all classic devices
|
|
53
|
+
if (miniFlag.toLowerCase() === 'bi') return EDeviceType.Classic;
|
|
54
|
+
if (miniFlag.toLowerCase() === 'cl') return EDeviceType.Classic;
|
|
55
|
+
if (miniFlag.toLowerCase() === 'cp') return EDeviceType.ClassicPure;
|
|
56
|
+
if (miniFlag.toLowerCase() === 'mi') return EDeviceType.Mini;
|
|
57
|
+
if (miniFlag.toLowerCase() === 'tc') return EDeviceType.Touch;
|
|
58
|
+
if (miniFlag.toLowerCase() === 'pr') return EDeviceType.Pro;
|
|
59
|
+
|
|
60
|
+
// unknown device
|
|
61
|
+
return EDeviceType.Unknown;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* get device type by ble name
|
|
66
|
+
* @param name Ble name
|
|
67
|
+
*/
|
|
68
|
+
export const getDeviceTypeByBleName = (name?: string): IDeviceType => {
|
|
69
|
+
if (!name) return EDeviceType.Unknown;
|
|
70
|
+
|
|
71
|
+
if (name.startsWith('BixinKey')) return EDeviceType.Classic;
|
|
72
|
+
if (name.startsWith('K')) return EDeviceType.Classic;
|
|
73
|
+
|
|
74
|
+
if (name.startsWith('T')) return EDeviceType.Touch;
|
|
75
|
+
if (name.startsWith('Touch')) return EDeviceType.Touch;
|
|
76
|
+
|
|
77
|
+
if (name.startsWith('Pro')) return EDeviceType.Pro;
|
|
78
|
+
|
|
79
|
+
return EDeviceType.Unknown;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Get Connected Device ble name by features
|
|
84
|
+
* @returns
|
|
85
|
+
*/
|
|
86
|
+
export const getDeviceBleName = (features?: Features): string | null => {
|
|
87
|
+
if (features == null) return null;
|
|
88
|
+
return features.onetoken_ble_name || features.ble_name || null;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Get Connected Device UUID by features
|
|
93
|
+
*/
|
|
94
|
+
export const getDeviceUUID = (features: Features) => {
|
|
95
|
+
const serialNo = features.onetoken_serial_no || features.onetoken_serial || features.serial_no;
|
|
96
|
+
return serialNo ?? '';
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Get Connected Device label by features
|
|
101
|
+
*/
|
|
102
|
+
export const getDeviceLabel = (features?: Features) => {
|
|
103
|
+
if (!features) return null;
|
|
104
|
+
|
|
105
|
+
const deviceType = getDeviceType(features);
|
|
106
|
+
if (deviceType == null) return null;
|
|
107
|
+
|
|
108
|
+
if (typeof features.label === 'string' && !isEmpty(features.label)) {
|
|
109
|
+
return features.label;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const bleName = getDeviceBleName(features);
|
|
113
|
+
if (!isEmpty(bleName)) return bleName;
|
|
114
|
+
|
|
115
|
+
if (deviceType === EDeviceType.ClassicPure) {
|
|
116
|
+
return 'OneToken Classic 1S';
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return `OneToken ${deviceType.charAt(0).toUpperCase() + deviceType.slice(1)}`;
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Get firmware version range by features
|
|
124
|
+
* Type has a higher priority than Model
|
|
125
|
+
*/
|
|
126
|
+
export const getMethodVersionRange = (
|
|
127
|
+
features: Features | undefined,
|
|
128
|
+
getVersionRange: (deviceModel: IDeviceType | IDeviceModel) => IVersionRange | undefined
|
|
129
|
+
): IVersionRange | undefined => {
|
|
130
|
+
const deviceType = getDeviceType(features);
|
|
131
|
+
let versionRange: IVersionRange | undefined = getVersionRange(deviceType);
|
|
132
|
+
|
|
133
|
+
if (versionRange) {
|
|
134
|
+
return versionRange;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const modelFallbacks: IDeviceModel[] = [
|
|
138
|
+
'model_classic1s',
|
|
139
|
+
'model_classic',
|
|
140
|
+
'model_mini',
|
|
141
|
+
'model_touch',
|
|
142
|
+
];
|
|
143
|
+
for (const model of modelFallbacks) {
|
|
144
|
+
if (DeviceModelToTypes[model].includes(deviceType)) {
|
|
145
|
+
versionRange = getVersionRange(model);
|
|
146
|
+
if (versionRange) {
|
|
147
|
+
return versionRange;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return versionRange;
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
export const getFirmwareType = (features: Features | undefined) => {
|
|
156
|
+
if (!features) {
|
|
157
|
+
return EFirmwareType.Universal;
|
|
158
|
+
}
|
|
159
|
+
if (features.fw_vendor === 'OneToken Bitcoin-only') {
|
|
160
|
+
return EFirmwareType.BitcoinOnly;
|
|
161
|
+
}
|
|
162
|
+
// old firmware
|
|
163
|
+
return features?.capabilities?.length > 0 &&
|
|
164
|
+
!existCapability(features, Enum_Capability.Capability_Bitcoin_like)
|
|
165
|
+
? EFirmwareType.BitcoinOnly
|
|
166
|
+
: EFirmwareType.Universal;
|
|
167
|
+
};
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { EDeviceType } from '@onetokenfe/hd-shared';
|
|
2
|
+
|
|
3
|
+
import type { IDeviceType } from '../types';
|
|
4
|
+
|
|
5
|
+
export const LANGUAGE_LABELS = {
|
|
6
|
+
en: 'English',
|
|
7
|
+
zh_cn: '简体中文',
|
|
8
|
+
zh_hk: '繁體中文',
|
|
9
|
+
ja: '日本語',
|
|
10
|
+
ko: '한국어',
|
|
11
|
+
fr: 'Français',
|
|
12
|
+
de: 'Deutsch',
|
|
13
|
+
ru: 'Russian',
|
|
14
|
+
es: 'Spanish',
|
|
15
|
+
it: 'Italiano',
|
|
16
|
+
pt_br: 'Portuguese (Brazil)',
|
|
17
|
+
} as const;
|
|
18
|
+
|
|
19
|
+
export type LanguageKey = keyof typeof LANGUAGE_LABELS;
|
|
20
|
+
export type LanguageOption = { code: LanguageKey; label: (typeof LANGUAGE_LABELS)[LanguageKey] };
|
|
21
|
+
|
|
22
|
+
export const getLanguageConfig = (deviceType: IDeviceType): Record<string, string>[] => {
|
|
23
|
+
let keys: LanguageKey[] = [];
|
|
24
|
+
|
|
25
|
+
switch (deviceType) {
|
|
26
|
+
case EDeviceType.Classic:
|
|
27
|
+
case EDeviceType.Mini:
|
|
28
|
+
keys = ['en', 'zh_cn'];
|
|
29
|
+
break;
|
|
30
|
+
case EDeviceType.Classic1s:
|
|
31
|
+
case EDeviceType.ClassicPure:
|
|
32
|
+
keys = ['en', 'zh_cn', 'zh_hk', 'ja', 'pt_br', 'de', 'ko'];
|
|
33
|
+
break;
|
|
34
|
+
|
|
35
|
+
case EDeviceType.Touch:
|
|
36
|
+
case EDeviceType.Pro:
|
|
37
|
+
keys = Object.keys(LANGUAGE_LABELS) as LanguageKey[];
|
|
38
|
+
break;
|
|
39
|
+
default:
|
|
40
|
+
keys = [];
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return keys.map(key => ({ code: key, label: LANGUAGE_LABELS[key] }));
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export type DurationParts = {
|
|
48
|
+
seconds: number;
|
|
49
|
+
minute: number;
|
|
50
|
+
hour: number;
|
|
51
|
+
day: number;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export const getAutoLockOptions = (_deviceType: IDeviceType): DurationParts[] => {
|
|
55
|
+
switch (_deviceType) {
|
|
56
|
+
case EDeviceType.Mini:
|
|
57
|
+
case EDeviceType.Classic:
|
|
58
|
+
case EDeviceType.Classic1s:
|
|
59
|
+
case EDeviceType.ClassicPure:
|
|
60
|
+
return [
|
|
61
|
+
{ seconds: 0, minute: 1, hour: 0, day: 0 },
|
|
62
|
+
{ seconds: 0, minute: 2, hour: 0, day: 0 },
|
|
63
|
+
{ seconds: 0, minute: 5, hour: 0, day: 0 },
|
|
64
|
+
{ seconds: 0, minute: 10, hour: 0, day: 0 },
|
|
65
|
+
{ seconds: 0, minute: 0, hour: 0, day: 0 },
|
|
66
|
+
];
|
|
67
|
+
case EDeviceType.Touch:
|
|
68
|
+
case EDeviceType.Pro:
|
|
69
|
+
return [
|
|
70
|
+
{ seconds: 30, minute: 0, hour: 0, day: 0 },
|
|
71
|
+
{ seconds: 0, minute: 1, hour: 0, day: 0 },
|
|
72
|
+
{ seconds: 0, minute: 2, hour: 0, day: 0 },
|
|
73
|
+
{ seconds: 0, minute: 5, hour: 0, day: 0 },
|
|
74
|
+
{ seconds: 0, minute: 10, hour: 0, day: 0 },
|
|
75
|
+
{ seconds: 0, minute: 30, hour: 0, day: 0 },
|
|
76
|
+
{ seconds: 0, minute: 0, hour: 0, day: 0 },
|
|
77
|
+
];
|
|
78
|
+
default:
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const getAutoShutDownOptions = (_deviceType: IDeviceType): DurationParts[] => {
|
|
84
|
+
switch (_deviceType) {
|
|
85
|
+
case EDeviceType.Mini:
|
|
86
|
+
return [];
|
|
87
|
+
case EDeviceType.Classic:
|
|
88
|
+
case EDeviceType.Classic1s:
|
|
89
|
+
case EDeviceType.ClassicPure:
|
|
90
|
+
return [
|
|
91
|
+
{ seconds: 0, minute: 1, hour: 0, day: 0 },
|
|
92
|
+
{ seconds: 0, minute: 3, hour: 0, day: 0 },
|
|
93
|
+
{ seconds: 0, minute: 5, hour: 0, day: 0 },
|
|
94
|
+
{ seconds: 0, minute: 10, hour: 0, day: 0 },
|
|
95
|
+
{ seconds: 0, minute: 0, hour: 0, day: 0 },
|
|
96
|
+
];
|
|
97
|
+
case EDeviceType.Touch:
|
|
98
|
+
case EDeviceType.Pro:
|
|
99
|
+
return [
|
|
100
|
+
{ seconds: 0, minute: 1, hour: 0, day: 0 },
|
|
101
|
+
{ seconds: 0, minute: 2, hour: 0, day: 0 },
|
|
102
|
+
{ seconds: 0, minute: 5, hour: 0, day: 0 },
|
|
103
|
+
{ seconds: 0, minute: 10, hour: 0, day: 0 },
|
|
104
|
+
{ seconds: 0, minute: 0, hour: 0, day: 0 },
|
|
105
|
+
];
|
|
106
|
+
default:
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import semver from 'semver';
|
|
2
|
+
|
|
3
|
+
import type { Features, IVersionArray } from '../types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Get Connected Device version by features
|
|
7
|
+
*/
|
|
8
|
+
export const getDeviceFirmwareVersion = (features: Features | undefined): IVersionArray => {
|
|
9
|
+
if (!features) return [0, 0, 0];
|
|
10
|
+
|
|
11
|
+
if (semver.valid(features.onetoken_firmware_version)) {
|
|
12
|
+
return features.onetoken_firmware_version?.split('.') as unknown as IVersionArray;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (semver.valid(features.onetoken_version)) {
|
|
16
|
+
return features.onetoken_version?.split('.') as unknown as IVersionArray;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return [0, 0, 0];
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Get Connected Device bluetooth firmware version by features
|
|
24
|
+
*/
|
|
25
|
+
export const getDeviceBLEFirmwareVersion = (features: Features): IVersionArray => {
|
|
26
|
+
const bleVer = features?.onetoken_ble_version || features?.ble_ver;
|
|
27
|
+
|
|
28
|
+
if (!bleVer) {
|
|
29
|
+
return [0, 0, 0];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (!semver.valid(bleVer)) {
|
|
33
|
+
return [0, 0, 0];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (bleVer) {
|
|
37
|
+
return bleVer.split('.').map(Number) as IVersionArray;
|
|
38
|
+
}
|
|
39
|
+
return [0, 0, 0];
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Get Connected Device bootloader version by features
|
|
44
|
+
*/
|
|
45
|
+
export const getDeviceBootloaderVersion = (features: Features | undefined): IVersionArray => {
|
|
46
|
+
if (!features) return [0, 0, 0];
|
|
47
|
+
|
|
48
|
+
// classic1s 3.5.0 pro 4.6.0
|
|
49
|
+
if (semver.valid(features.onetoken_boot_version)) {
|
|
50
|
+
return features.onetoken_boot_version?.split('.') as unknown as IVersionArray;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// low version hardware
|
|
54
|
+
if (!features.bootloader_version) {
|
|
55
|
+
if (features.bootloader_mode) {
|
|
56
|
+
return [
|
|
57
|
+
features?.major_version ?? 0,
|
|
58
|
+
features?.minor_version ?? 0,
|
|
59
|
+
features?.patch_version ?? 0,
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
return [0, 0, 0];
|
|
63
|
+
}
|
|
64
|
+
if (semver.valid(features.bootloader_version)) {
|
|
65
|
+
return features.bootloader_version?.split('.') as unknown as IVersionArray;
|
|
66
|
+
}
|
|
67
|
+
return [0, 0, 0];
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Get Connected Device boardloader version by features
|
|
72
|
+
*/
|
|
73
|
+
export const getDeviceBoardloaderVersion = (features: Features): IVersionArray => {
|
|
74
|
+
if (semver.valid(features?.onetoken_board_version)) {
|
|
75
|
+
return features?.onetoken_board_version?.split('.') as unknown as IVersionArray;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return [0, 0, 0];
|
|
79
|
+
};
|