@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.
Files changed (382) hide show
  1. package/.eslintrc +6 -0
  2. package/README.md +32 -0
  3. package/__tests__/benfen.test.ts +68 -0
  4. package/__tests__/checkBootloaderReleast.test.ts +115 -0
  5. package/__tests__/evmSignTransaction.test.ts +419 -0
  6. package/jest.config.js +6 -0
  7. package/package.json +48 -0
  8. package/src/api/BaseMethod.ts +275 -0
  9. package/src/api/CheckAllFirmwareRelease.ts +73 -0
  10. package/src/api/CheckBLEFirmwareRelease.ts +23 -0
  11. package/src/api/CheckBootloaderRelease.ts +32 -0
  12. package/src/api/CheckBridgeRelease.ts +28 -0
  13. package/src/api/CheckBridgeStatus.ts +32 -0
  14. package/src/api/CheckFirmwareRelease.ts +31 -0
  15. package/src/api/CheckFirmwareTypeAvailable.tsx +30 -0
  16. package/src/api/CipherKeyValue.ts +68 -0
  17. package/src/api/FirmwareUpdate.ts +219 -0
  18. package/src/api/FirmwareUpdateV2.ts +408 -0
  19. package/src/api/FirmwareUpdateV3.ts +560 -0
  20. package/src/api/GetFeatures.ts +23 -0
  21. package/src/api/GetLogs.ts +40 -0
  22. package/src/api/GetOnetokenFeatures.ts +25 -0
  23. package/src/api/GetPassphraseState.ts +28 -0
  24. package/src/api/PromptWebDeviceAccess.ts +77 -0
  25. package/src/api/SearchDevices.ts +50 -0
  26. package/src/api/alephium/AlephiumGetAddress.ts +84 -0
  27. package/src/api/alephium/AlephiumSignMessage.ts +51 -0
  28. package/src/api/alephium/AlephiumSignTransaction.ts +135 -0
  29. package/src/api/algo/AlgoGetAddress.ts +73 -0
  30. package/src/api/algo/AlgoSignTransaction.ts +52 -0
  31. package/src/api/allnetwork/AllNetworkGetAddress.ts +88 -0
  32. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +529 -0
  33. package/src/api/allnetwork/AllNetworkGetAddressByLoop.ts +162 -0
  34. package/src/api/aptos/AptosGetAddress.ts +129 -0
  35. package/src/api/aptos/AptosGetPublicKey.ts +64 -0
  36. package/src/api/aptos/AptosSignInMessage.ts +55 -0
  37. package/src/api/aptos/AptosSignMessage.ts +79 -0
  38. package/src/api/aptos/AptosSignTransaction.ts +72 -0
  39. package/src/api/benfen/BenfenGetAddress.ts +122 -0
  40. package/src/api/benfen/BenfenGetPublicKey.ts +68 -0
  41. package/src/api/benfen/BenfenSignMessage.ts +50 -0
  42. package/src/api/benfen/BenfenSignTransaction.ts +105 -0
  43. package/src/api/benfen/normalize.ts +51 -0
  44. package/src/api/btc/BTCGetAddress.ts +91 -0
  45. package/src/api/btc/BTCGetPublicKey.ts +174 -0
  46. package/src/api/btc/BTCSignMessage.ts +73 -0
  47. package/src/api/btc/BTCSignPsbt.ts +65 -0
  48. package/src/api/btc/BTCSignTransaction.ts +148 -0
  49. package/src/api/btc/BTCVerifyMessage.ts +46 -0
  50. package/src/api/btc/helpers/btcParamsUtils.ts +64 -0
  51. package/src/api/btc/helpers/signtx.ts +251 -0
  52. package/src/api/btc/helpers/signtxLegacy.ts +227 -0
  53. package/src/api/btc/helpers/versionLimit.ts +25 -0
  54. package/src/api/btc/helpers/xpubUtils.ts +132 -0
  55. package/src/api/cardano/CardanoGetAddress.ts +139 -0
  56. package/src/api/cardano/CardanoGetPublicKey.ts +72 -0
  57. package/src/api/cardano/CardanoSignMessage.ts +73 -0
  58. package/src/api/cardano/CardanoSignTransaction.ts +404 -0
  59. package/src/api/cardano/helper/addressParameters.ts +120 -0
  60. package/src/api/cardano/helper/auxiliaryData.ts +133 -0
  61. package/src/api/cardano/helper/cardanoInputs.ts +55 -0
  62. package/src/api/cardano/helper/cardanoOutputs.ts +89 -0
  63. package/src/api/cardano/helper/certificate.ts +246 -0
  64. package/src/api/cardano/helper/token.ts +44 -0
  65. package/src/api/cardano/helper/utils.ts +17 -0
  66. package/src/api/cardano/helper/witnesses.ts +62 -0
  67. package/src/api/conflux/ConfluxGetAddress.ts +78 -0
  68. package/src/api/conflux/ConfluxSignMessage.ts +49 -0
  69. package/src/api/conflux/ConfluxSignMessageCIP23.ts +49 -0
  70. package/src/api/conflux/ConfluxSignTransaction.ts +135 -0
  71. package/src/api/cosmos/CosmosGetAddress.ts +80 -0
  72. package/src/api/cosmos/CosmosGetPublicKey.ts +77 -0
  73. package/src/api/cosmos/CosmosSignTransaction.ts +68 -0
  74. package/src/api/device/DeviceBackup.ts +15 -0
  75. package/src/api/device/DeviceCancel.ts +15 -0
  76. package/src/api/device/DeviceChangePin.ts +25 -0
  77. package/src/api/device/DeviceFlags.ts +26 -0
  78. package/src/api/device/DeviceFullyUploadResource.ts +80 -0
  79. package/src/api/device/DeviceLock.ts +15 -0
  80. package/src/api/device/DeviceRebootToBoardloader.ts +30 -0
  81. package/src/api/device/DeviceRebootToBootloader.ts +28 -0
  82. package/src/api/device/DeviceRecovery.ts +44 -0
  83. package/src/api/device/DeviceReset.ts +46 -0
  84. package/src/api/device/DeviceSettings.ts +96 -0
  85. package/src/api/device/DeviceSupportFeatures.ts +29 -0
  86. package/src/api/device/DeviceUnlock.ts +13 -0
  87. package/src/api/device/DeviceUpdateBootloader.ts +111 -0
  88. package/src/api/device/DeviceUpdateReboot.ts +17 -0
  89. package/src/api/device/DeviceUploadResource.ts +204 -0
  90. package/src/api/device/DeviceVerify.ts +65 -0
  91. package/src/api/device/DeviceWipe.ts +15 -0
  92. package/src/api/dynex/DnxGetAddress.ts +75 -0
  93. package/src/api/dynex/DnxSignTransaction.ts +126 -0
  94. package/src/api/evm/EVMGetAddress.ts +88 -0
  95. package/src/api/evm/EVMGetPublicKey.ts +116 -0
  96. package/src/api/evm/EVMSignMessage.ts +49 -0
  97. package/src/api/evm/EVMSignMessageEIP712.ts +56 -0
  98. package/src/api/evm/EVMSignTransaction.ts +141 -0
  99. package/src/api/evm/EVMSignTypedData.ts +477 -0
  100. package/src/api/evm/EVMVerifyMessage.ts +46 -0
  101. package/src/api/evm/latest/getAddress.ts +13 -0
  102. package/src/api/evm/latest/getPublicKey.ts +17 -0
  103. package/src/api/evm/latest/signMessage.ts +19 -0
  104. package/src/api/evm/latest/signTransaction.ts +303 -0
  105. package/src/api/evm/latest/signTypedData.ts +34 -0
  106. package/src/api/evm/latest/signTypedHash.ts +46 -0
  107. package/src/api/evm/latest/verifyMessage.ts +15 -0
  108. package/src/api/evm/legacyV1/getAddress.ts +16 -0
  109. package/src/api/evm/legacyV1/getPublicKey.ts +20 -0
  110. package/src/api/evm/legacyV1/signMessage.ts +22 -0
  111. package/src/api/evm/legacyV1/signTransaction.ts +37 -0
  112. package/src/api/evm/legacyV1/signTypedData.ts +37 -0
  113. package/src/api/evm/legacyV1/signTypedHash.ts +50 -0
  114. package/src/api/evm/legacyV1/verifyMessage.ts +19 -0
  115. package/src/api/filecoin/FilecoinGetAddress.ts +80 -0
  116. package/src/api/filecoin/FilecoinSignTransaction.ts +57 -0
  117. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +476 -0
  118. package/src/api/firmware/bootloaderHelper.ts +46 -0
  119. package/src/api/firmware/getBinary.ts +99 -0
  120. package/src/api/firmware/releaseHelper.ts +78 -0
  121. package/src/api/firmware/updateBootloader.ts +82 -0
  122. package/src/api/firmware/uploadFirmware.ts +541 -0
  123. package/src/api/helpers/batchGetPublickeys.ts +84 -0
  124. package/src/api/helpers/bigNumberUtils.ts +58 -0
  125. package/src/api/helpers/hexUtils.ts +111 -0
  126. package/src/api/helpers/paramsValidator.ts +165 -0
  127. package/src/api/helpers/pathUtils.ts +145 -0
  128. package/src/api/helpers/stringUtils.ts +11 -0
  129. package/src/api/helpers/typeNameUtils.ts +137 -0
  130. package/src/api/index.ts +161 -0
  131. package/src/api/kaspa/KaspaGetAddress.ts +103 -0
  132. package/src/api/kaspa/KaspaSignTransaction.ts +182 -0
  133. package/src/api/kaspa/helpers/BufferWriter.ts +177 -0
  134. package/src/api/kaspa/helpers/HashWriter.ts +74 -0
  135. package/src/api/kaspa/helpers/SignatureType.ts +7 -0
  136. package/src/api/kaspa/helpers/TransferSerialize.ts +144 -0
  137. package/src/api/lightning/LnurlAuth.ts +52 -0
  138. package/src/api/near/NearGetAddress.ts +75 -0
  139. package/src/api/near/NearSignTransaction.ts +46 -0
  140. package/src/api/nem/NEMGetAddress.ts +72 -0
  141. package/src/api/nem/NEMSignTransaction.ts +251 -0
  142. package/src/api/neo/NeoGetAddress.ts +80 -0
  143. package/src/api/neo/NeoSignTransaction.ts +59 -0
  144. package/src/api/nervos/NervosGetAddress.ts +80 -0
  145. package/src/api/nervos/NervosSignTransaction.ts +116 -0
  146. package/src/api/nexa/NexaGetAddress.ts +88 -0
  147. package/src/api/nexa/NexaSignTransaction.ts +107 -0
  148. package/src/api/nostr/NostrDecryptMessage.ts +57 -0
  149. package/src/api/nostr/NostrEncryptMessage.ts +57 -0
  150. package/src/api/nostr/NostrGetPublicKey.ts +74 -0
  151. package/src/api/nostr/NostrSignEvent.ts +65 -0
  152. package/src/api/nostr/NostrSignSchnorr.ts +52 -0
  153. package/src/api/nostr/helper/index.ts +28 -0
  154. package/src/api/polkadot/PolkadotGetAddress.ts +83 -0
  155. package/src/api/polkadot/PolkadotSignTransaction.ts +53 -0
  156. package/src/api/polkadot/networks.ts +72 -0
  157. package/src/api/scdo/ScdoGetAddress.ts +76 -0
  158. package/src/api/scdo/ScdoSignMessage.ts +45 -0
  159. package/src/api/scdo/ScdoSignTransaction.ts +106 -0
  160. package/src/api/solana/SolGetAddress.ts +68 -0
  161. package/src/api/solana/SolSignMessage.ts +61 -0
  162. package/src/api/solana/SolSignOffchainMessage.ts +61 -0
  163. package/src/api/solana/SolSignTransaction.ts +108 -0
  164. package/src/api/starcoin/StarcoinGetAddress.ts +69 -0
  165. package/src/api/starcoin/StarcoinGetPublicKey.ts +70 -0
  166. package/src/api/starcoin/StarcoinSignMessage.ts +42 -0
  167. package/src/api/starcoin/StarcoinSignTransaction.ts +38 -0
  168. package/src/api/starcoin/StarcoinVerifyMessage.ts +35 -0
  169. package/src/api/stellar/StellarGetAddress.ts +68 -0
  170. package/src/api/stellar/StellarSignTransaction.ts +220 -0
  171. package/src/api/sui/SuiGetAddress.ts +117 -0
  172. package/src/api/sui/SuiGetPublicKey.ts +66 -0
  173. package/src/api/sui/SuiSignMessage.ts +48 -0
  174. package/src/api/sui/SuiSignTransaction.ts +126 -0
  175. package/src/api/sui/normalize.ts +28 -0
  176. package/src/api/test/TestInitializeDeviceDuration.ts +22 -0
  177. package/src/api/ton/TonGetAddress.ts +96 -0
  178. package/src/api/ton/TonSignMessage.ts +217 -0
  179. package/src/api/ton/TonSignProof.ts +62 -0
  180. package/src/api/tron/TronGetAddress.ts +75 -0
  181. package/src/api/tron/TronSignMessage.ts +89 -0
  182. package/src/api/tron/TronSignTransaction.ts +214 -0
  183. package/src/api/u2f/GetNextU2FCounter.ts +15 -0
  184. package/src/api/u2f/SetU2FCounter.ts +19 -0
  185. package/src/api/utils.ts +23 -0
  186. package/src/api/xrp/XrpGetAddress.ts +96 -0
  187. package/src/api/xrp/XrpSignTransaction.ts +71 -0
  188. package/src/constants/errors.ts +15 -0
  189. package/src/constants/index.ts +2 -0
  190. package/src/constants/ui-request.ts +3 -0
  191. package/src/core/RequestQueue.ts +134 -0
  192. package/src/core/index.ts +1320 -0
  193. package/src/data/coins/bitcoin.json +44 -0
  194. package/src/data/config.ts +25 -0
  195. package/src/data/messages/messages.json +13167 -0
  196. package/src/data/messages/messages_legacy_v1.json +10282 -0
  197. package/src/data-manager/CoinManager.ts +31 -0
  198. package/src/data-manager/DataManager.ts +499 -0
  199. package/src/data-manager/MessagesConfig.ts +28 -0
  200. package/src/data-manager/TransportManager.ts +140 -0
  201. package/src/data-manager/connectSettings.ts +121 -0
  202. package/src/data-manager/index.ts +3 -0
  203. package/src/device/Device.ts +884 -0
  204. package/src/device/DeviceCommands.ts +631 -0
  205. package/src/device/DeviceConnector.ts +124 -0
  206. package/src/device/DeviceList.ts +39 -0
  207. package/src/device/DevicePool.ts +266 -0
  208. package/src/events/call.ts +95 -0
  209. package/src/events/core.ts +65 -0
  210. package/src/events/device.ts +92 -0
  211. package/src/events/firmware.ts +43 -0
  212. package/src/events/iframe.ts +55 -0
  213. package/src/events/index.ts +10 -0
  214. package/src/events/log.ts +23 -0
  215. package/src/events/logBlockEvent.ts +6 -0
  216. package/src/events/ui-promise.ts +14 -0
  217. package/src/events/ui-request.ts +216 -0
  218. package/src/events/ui-response.ts +59 -0
  219. package/src/events/utils.ts +19 -0
  220. package/src/index.ts +70 -0
  221. package/src/inject.ts +408 -0
  222. package/src/lowLevelInject.ts +61 -0
  223. package/src/topLevelInject.ts +62 -0
  224. package/src/types/api/alephiumGetAddress.ts +31 -0
  225. package/src/types/api/alephiumSignMessage.ts +14 -0
  226. package/src/types/api/alephiumSignTransaction.ts +18 -0
  227. package/src/types/api/algoGetAddress.ts +23 -0
  228. package/src/types/api/algoSignTransaction.ts +17 -0
  229. package/src/types/api/allNetworkGetAddress.ts +130 -0
  230. package/src/types/api/aptosGetAddress.ts +28 -0
  231. package/src/types/api/aptosGetPublicKey.ts +27 -0
  232. package/src/types/api/aptosSignInMessage.ts +17 -0
  233. package/src/types/api/aptosSignMessage.ts +26 -0
  234. package/src/types/api/aptosSignTransaction.ts +18 -0
  235. package/src/types/api/benfenGetAddress.ts +24 -0
  236. package/src/types/api/benfenGetPublicKey.ts +23 -0
  237. package/src/types/api/benfenSignMessage.ts +13 -0
  238. package/src/types/api/benfenSignTransaction.ts +19 -0
  239. package/src/types/api/btcGetAddress.ts +26 -0
  240. package/src/types/api/btcGetPublicKey.ts +26 -0
  241. package/src/types/api/btcSignMessage.ts +16 -0
  242. package/src/types/api/btcSignPsbt.ts +13 -0
  243. package/src/types/api/btcSignTransaction.ts +98 -0
  244. package/src/types/api/btcVerifyMessage.ts +15 -0
  245. package/src/types/api/cardano.ts +212 -0
  246. package/src/types/api/cardanoGetAddress.ts +49 -0
  247. package/src/types/api/cardanoGetPublicKey.ts +33 -0
  248. package/src/types/api/cardanoSignMessage.ts +31 -0
  249. package/src/types/api/cardanoSignTransaction.ts +8 -0
  250. package/src/types/api/checkAllFirmwareRelease.ts +34 -0
  251. package/src/types/api/checkBLEFirmwareRelease.ts +15 -0
  252. package/src/types/api/checkBootloaderRelease.ts +19 -0
  253. package/src/types/api/checkBridgeRelease.ts +14 -0
  254. package/src/types/api/checkBridgeStatus.ts +3 -0
  255. package/src/types/api/checkFirmwareRelease.ts +23 -0
  256. package/src/types/api/checkFirmwareTypeAvailable.ts +12 -0
  257. package/src/types/api/cipherKeyValue.ts +28 -0
  258. package/src/types/api/confluxGetAddress.ts +24 -0
  259. package/src/types/api/confluxSignMessage.ts +13 -0
  260. package/src/types/api/confluxSignMessageCIP23.ts +14 -0
  261. package/src/types/api/confluxSignTransaction.ts +32 -0
  262. package/src/types/api/cosmosGetAddress.ts +24 -0
  263. package/src/types/api/cosmosGetPublicKey.ts +28 -0
  264. package/src/types/api/cosmosSignTransaction.ts +17 -0
  265. package/src/types/api/deviceBackup.ts +4 -0
  266. package/src/types/api/deviceCancel.ts +4 -0
  267. package/src/types/api/deviceChangePin.ts +11 -0
  268. package/src/types/api/deviceFlags.ts +11 -0
  269. package/src/types/api/deviceFullyUploadResource.ts +15 -0
  270. package/src/types/api/deviceLock.ts +4 -0
  271. package/src/types/api/deviceRebootToBoardloader.ts +6 -0
  272. package/src/types/api/deviceRebootToBootloader.ts +4 -0
  273. package/src/types/api/deviceRecovery.ts +19 -0
  274. package/src/types/api/deviceReset.ts +20 -0
  275. package/src/types/api/deviceSettings.ts +23 -0
  276. package/src/types/api/deviceSupportFeatures.ts +6 -0
  277. package/src/types/api/deviceUnlock.ts +4 -0
  278. package/src/types/api/deviceUpdateBootloader.ts +13 -0
  279. package/src/types/api/deviceUpdateReboot.ts +3 -0
  280. package/src/types/api/deviceUploadResource.ts +21 -0
  281. package/src/types/api/deviceVerify.ts +15 -0
  282. package/src/types/api/deviceWipe.ts +4 -0
  283. package/src/types/api/dnxGetAddress.ts +23 -0
  284. package/src/types/api/dnxSignTransaction.ts +36 -0
  285. package/src/types/api/event.ts +8 -0
  286. package/src/types/api/evmGetAddress.ts +24 -0
  287. package/src/types/api/evmGetPublicKey.ts +36 -0
  288. package/src/types/api/evmSignMessage.ts +14 -0
  289. package/src/types/api/evmSignMessageEIP712.ts +14 -0
  290. package/src/types/api/evmSignTransaction.ts +80 -0
  291. package/src/types/api/evmSignTypedData.ts +42 -0
  292. package/src/types/api/evmVerifyMessage.ts +15 -0
  293. package/src/types/api/export.ts +194 -0
  294. package/src/types/api/filecoinGetAddress.ts +24 -0
  295. package/src/types/api/filecoinSignTransaction.ts +24 -0
  296. package/src/types/api/firmwareUpdate.ts +66 -0
  297. package/src/types/api/getFeatures.ts +4 -0
  298. package/src/types/api/getLogs.ts +3 -0
  299. package/src/types/api/getNextU2FCounter.ts +7 -0
  300. package/src/types/api/getOnetokenFeatures.ts +7 -0
  301. package/src/types/api/getPassphraseState.ts +6 -0
  302. package/src/types/api/index.ts +404 -0
  303. package/src/types/api/init.ts +11 -0
  304. package/src/types/api/kaspaGetAddress.ts +26 -0
  305. package/src/types/api/kaspaSignTransaction.ts +44 -0
  306. package/src/types/api/lnurlAuth.ts +22 -0
  307. package/src/types/api/nearGetAddress.ts +23 -0
  308. package/src/types/api/nearSignTransaction.ts +13 -0
  309. package/src/types/api/nemGetAddress.ts +24 -0
  310. package/src/types/api/nemSignTransaction.ts +118 -0
  311. package/src/types/api/neoGetAddress.ts +24 -0
  312. package/src/types/api/neoSignTransaction.ts +18 -0
  313. package/src/types/api/nervosGetAddress.ts +24 -0
  314. package/src/types/api/nervosSignTransaction.ts +19 -0
  315. package/src/types/api/nexaGetAddress.ts +26 -0
  316. package/src/types/api/nexaSignTransaction.ts +28 -0
  317. package/src/types/api/nostrDecryptMessage.ts +25 -0
  318. package/src/types/api/nostrEncryptMessage.ts +25 -0
  319. package/src/types/api/nostrGetPublicKey.ts +28 -0
  320. package/src/types/api/nostrSignEvent.ts +52 -0
  321. package/src/types/api/nostrSignSchnorr.ts +22 -0
  322. package/src/types/api/polkadotGetAddress.ts +30 -0
  323. package/src/types/api/polkadotSignTransaction.ts +19 -0
  324. package/src/types/api/promptWebDeviceAccess.ts +6 -0
  325. package/src/types/api/scdoGetAddress.ts +23 -0
  326. package/src/types/api/scdoSignMessage.ts +13 -0
  327. package/src/types/api/scdoSignTransaction.ts +24 -0
  328. package/src/types/api/searchDevices.ts +4 -0
  329. package/src/types/api/setU2FCounter.ts +7 -0
  330. package/src/types/api/solGetAddress.ts +23 -0
  331. package/src/types/api/solSignMessage.ts +17 -0
  332. package/src/types/api/solSignOffchainMessage.ts +24 -0
  333. package/src/types/api/solSignTransaction.ts +27 -0
  334. package/src/types/api/starcoinGetAddress.ts +23 -0
  335. package/src/types/api/starcoinGetPublicKey.ts +23 -0
  336. package/src/types/api/starcoinSignMessage.ts +13 -0
  337. package/src/types/api/starcoinSignTransaction.ts +13 -0
  338. package/src/types/api/starcoinVerifyMessage.ts +14 -0
  339. package/src/types/api/stellarGetAddress.ts +23 -0
  340. package/src/types/api/stellarSignTransaction.ts +154 -0
  341. package/src/types/api/suiGetAddress.ts +28 -0
  342. package/src/types/api/suiGetPublicKey.ts +27 -0
  343. package/src/types/api/suiSignMessage.ts +13 -0
  344. package/src/types/api/suiSignTransaction.ts +17 -0
  345. package/src/types/api/testInitializeDeviceDuration.ts +6 -0
  346. package/src/types/api/tonGetAddress.ts +34 -0
  347. package/src/types/api/tonSignMessage.ts +42 -0
  348. package/src/types/api/tonSignProof.ts +25 -0
  349. package/src/types/api/tronGetAddress.ts +23 -0
  350. package/src/types/api/tronSignMessage.ts +14 -0
  351. package/src/types/api/tronSignTransaction.ts +89 -0
  352. package/src/types/api/uiResponse.ts +3 -0
  353. package/src/types/api/xrpGetAddress.ts +28 -0
  354. package/src/types/api/xrpSignTransaction.ts +29 -0
  355. package/src/types/device.ts +194 -0
  356. package/src/types/firmware.ts +41 -0
  357. package/src/types/global.d.ts +3 -0
  358. package/src/types/index.ts +5 -0
  359. package/src/types/params.ts +64 -0
  360. package/src/types/settings.ts +144 -0
  361. package/src/utils/arrayUtils.ts +7 -0
  362. package/src/utils/assets.ts +5 -0
  363. package/src/utils/bridgeUpdate.ts +80 -0
  364. package/src/utils/capabilitieUtils.ts +12 -0
  365. package/src/utils/deviceFeaturesUtils.ts +352 -0
  366. package/src/utils/deviceInfoUtils.ts +167 -0
  367. package/src/utils/deviceSettings.ts +109 -0
  368. package/src/utils/deviceVersionUtils.ts +79 -0
  369. package/src/utils/findDefectiveBatchDevice.ts +39 -0
  370. package/src/utils/getMutex.ts +41 -0
  371. package/src/utils/getSynchronize.ts +25 -0
  372. package/src/utils/homescreen.ts +345 -0
  373. package/src/utils/index.ts +44 -0
  374. package/src/utils/logger.ts +190 -0
  375. package/src/utils/networkUtils.ts +25 -0
  376. package/src/utils/patch.ts +14 -0
  377. package/src/utils/promiseUtils.ts +4 -0
  378. package/src/utils/release.ts +42 -0
  379. package/src/utils/semver.test.js +53 -0
  380. package/src/utils/tracing.ts +238 -0
  381. package/src/utils/versionUtils.ts +120 -0
  382. package/tsconfig.json +11 -0
@@ -0,0 +1,631 @@
1
+ import { ERRORS, HardwareError, HardwareErrorCode } from '@onetokenfe/hd-shared';
2
+
3
+ import TransportManager from '../data-manager/TransportManager';
4
+ import DataManager from '../data-manager/DataManager';
5
+ import { LoggerNames, getDeviceType, getLogger, patchFeatures } from '../utils';
6
+ import { DEVICE, type PassphraseRequestPayload } from '../events';
7
+ import { DeviceModelToTypes } from '../types';
8
+ import {
9
+ formatRequestContext,
10
+ generateInstanceId,
11
+ getActiveRequestsByDeviceInstance,
12
+ } from '../utils/tracing';
13
+
14
+ import type { Device } from './Device';
15
+ import type { FailureType, Messages, Transport } from '@onetokenfe/hd-transport';
16
+
17
+ export type PassphrasePromptResponse = {
18
+ passphrase?: string;
19
+ passphraseOnDevice?: boolean;
20
+ attachPinOnDevice?: boolean;
21
+ cache?: boolean;
22
+ };
23
+
24
+ type MessageType = Messages.MessageType;
25
+ type MessageKey = keyof MessageType;
26
+ export type TypedResponseMessage<T extends MessageKey> = {
27
+ type: T;
28
+ message: MessageType[T];
29
+ };
30
+ type TypedCallResponseMap = {
31
+ [K in keyof MessageType]: TypedResponseMessage<K>;
32
+ };
33
+ export type DefaultMessageResponse = TypedCallResponseMap[keyof MessageType];
34
+
35
+ const assertType = (res: DefaultMessageResponse, resType: string | string[]) => {
36
+ const splitResTypes = Array.isArray(resType) ? resType : resType.split('|');
37
+ if (!splitResTypes.includes(res.type)) {
38
+ throw ERRORS.TypedError(
39
+ HardwareErrorCode.ResponseUnexpectTypeError,
40
+ `assertType: Response of unexpected type: ${res.type}. Should be ${resType as string}`
41
+ );
42
+ }
43
+ };
44
+
45
+ export const cancelDeviceInPrompt = (device: Device, expectResponse = true) => {
46
+ const session = device.hasDeviceAcquire() ? device.mainId : undefined;
47
+
48
+ if (!session) {
49
+ // device disconnected or acquired by someone else
50
+ return Promise.resolve({
51
+ success: false,
52
+ error: HardwareErrorCode.RuntimeError,
53
+ payload: {
54
+ message: 'Device disconnected or acquired by someone else',
55
+ },
56
+ } as const);
57
+ }
58
+
59
+ const transport = device.commands?.transport;
60
+
61
+ if (expectResponse) {
62
+ return transport
63
+ ?.call(session, 'Cancel', {})
64
+ .then(() => ({
65
+ success: true,
66
+ error: null,
67
+ payload: {
68
+ message: 'Cancel request sent',
69
+ },
70
+ }))
71
+ .catch((error: HardwareError) => ({
72
+ success: false,
73
+ error: error.errorCode,
74
+ payload: {
75
+ message: error.message,
76
+ },
77
+ }));
78
+ }
79
+
80
+ return transport?.post(session, 'Cancel', {}).then(() => ({
81
+ success: true,
82
+ error: HardwareErrorCode.RuntimeError,
83
+ payload: {
84
+ message: 'Cancel request sent',
85
+ },
86
+ }));
87
+ };
88
+
89
+ export const cancelDeviceWithInitialize = (device: Device) => {
90
+ const session = device.hasDeviceAcquire() ? device.mainId : undefined;
91
+
92
+ if (!session) {
93
+ // device disconnected or acquired by someone else
94
+ return Promise.resolve({
95
+ success: false,
96
+ error: HardwareErrorCode.RuntimeError,
97
+ payload: {
98
+ message: 'Device disconnected or acquired by someone else',
99
+ },
100
+ } as const);
101
+ }
102
+
103
+ const transport = device.commands?.transport;
104
+
105
+ return transport
106
+ ?.call(session, 'Initialize', {})
107
+ .then(() => ({
108
+ success: true,
109
+ error: null,
110
+ payload: {
111
+ message: 'Cancel request sent',
112
+ },
113
+ }))
114
+ .catch((error: HardwareError) => ({
115
+ success: false,
116
+ error: error.errorCode,
117
+ payload: {
118
+ message: error.message,
119
+ },
120
+ }));
121
+ };
122
+
123
+ const Log = getLogger(LoggerNames.DeviceCommands);
124
+ const LogCore = getLogger(LoggerNames.Core);
125
+
126
+ /**
127
+ * The life cycle begins with the acquisition of the device and ends with the disposal device commands
128
+ * acquire device -> create DeviceCommands -> release device -> dispose DeviceCommands
129
+ */
130
+ export class DeviceCommands {
131
+ instanceId: string;
132
+
133
+ currentResponseID?: number;
134
+
135
+ device: Device;
136
+
137
+ transport: Transport;
138
+
139
+ mainId: string;
140
+
141
+ disposed: boolean;
142
+
143
+ callPromise?: Promise<DefaultMessageResponse>;
144
+
145
+ constructor(device: Device, mainId: string) {
146
+ this.device = device;
147
+ this.mainId = mainId;
148
+ this.transport = TransportManager.getTransport();
149
+ this.disposed = false;
150
+ this.instanceId = generateInstanceId('DeviceCommands', device.sdkInstanceId);
151
+
152
+ Log.debug(`[DeviceCommands] Created: ${this.instanceId}, device: ${this.device.instanceId}`);
153
+ }
154
+
155
+ async dispose(_cancelRequest: boolean) {
156
+ this.disposed = true;
157
+ await this.transport.cancel?.();
158
+ }
159
+
160
+ checkDisposed() {
161
+ if (this.disposed) {
162
+ throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'DeviceCommands already disposed');
163
+ }
164
+ }
165
+
166
+ // on device input pin or passphrase, cancel the request with initialize
167
+ async cancelDeviceOnOneTokenDevice() {
168
+ const { name } = this.transport;
169
+ if (name === 'HttpTransport') {
170
+ /**
171
+ * Bridge throws "other call in progress" error.
172
+ * as workaround takeover transportSession (acquire) before sending Cancel, this will resolve previous pending call.
173
+ */
174
+ try {
175
+ await this.device.acquire();
176
+ await cancelDeviceWithInitialize(this.device);
177
+ } catch {
178
+ // ignore whatever happens
179
+ }
180
+ } else {
181
+ return cancelDeviceWithInitialize(this.device);
182
+ }
183
+ }
184
+
185
+ async cancelDevice() {
186
+ const { name } = this.transport;
187
+ if (name === 'HttpTransport') {
188
+ /**
189
+ * Bridge throws "other call in progress" error.
190
+ * as workaround takeover transportSession (acquire) before sending Cancel, this will resolve previous pending call.
191
+ */
192
+ try {
193
+ await this.device.acquire();
194
+ await cancelDeviceInPrompt(this.device, false);
195
+ } catch {
196
+ // ignore whatever happens
197
+ }
198
+ } else {
199
+ return cancelDeviceInPrompt(this.device, false);
200
+ }
201
+ }
202
+
203
+ async cancel() {
204
+ if (this.disposed) {
205
+ return;
206
+ }
207
+ this.dispose(true);
208
+ if (this.callPromise) {
209
+ try {
210
+ await Promise.all([
211
+ new Promise((_resolve, reject) =>
212
+ // eslint-disable-next-line no-promise-executor-return
213
+ setTimeout(() => reject(new Error('cancel timeout')), 10 * 1000)
214
+ ),
215
+ await this.callPromise,
216
+ ]);
217
+ } catch {
218
+ // device error
219
+ this.callPromise = undefined;
220
+ }
221
+ }
222
+ }
223
+
224
+ // Sends an async message to the opened device.
225
+ async call(
226
+ type: MessageKey,
227
+ msg: DefaultMessageResponse['message'] = {}
228
+ ): Promise<DefaultMessageResponse> {
229
+ Log.debug('[DeviceCommands] [call] Sending', type);
230
+
231
+ try {
232
+ const promise = this.transport.call(this.mainId, type, msg) as any;
233
+ this.callPromise = promise;
234
+ const res = await promise;
235
+ if (res.type === 'Failure') {
236
+ LogCore.debug('[DeviceCommands] [call] Received', res.type, res.message);
237
+ } else {
238
+ LogCore.debug('[DeviceCommands] [call] Received', res.type);
239
+ }
240
+ return res;
241
+ } catch (error) {
242
+ LogCore.debug('[DeviceCommands] [call] Received error', error);
243
+ if (error.errorCode === HardwareErrorCode.BleDeviceBondError) {
244
+ return {
245
+ type: 'BleDeviceBondError',
246
+ message: {
247
+ error: error?.message,
248
+ },
249
+ } as any;
250
+ }
251
+
252
+ const responseData = error?.response?.data;
253
+ let responseError = responseData?.error;
254
+ if (!responseError && responseData && typeof responseData === 'string') {
255
+ try {
256
+ const parsedData = JSON.parse(responseData);
257
+ responseError = parsedData?.error;
258
+ } catch (error) {
259
+ // ignore
260
+ }
261
+ }
262
+
263
+ if (responseData) {
264
+ Log.debug('error response', responseData);
265
+ }
266
+ if (responseError === 'device disconnected during action') {
267
+ return { type: 'BridgeDeviceDisconnected', message: { error: responseError } } as any;
268
+ }
269
+
270
+ // undefined.indexOf('...') !== -1 Always true
271
+ if (responseError && responseError.indexOf('Request failed with status code') !== -1) {
272
+ return {
273
+ type: 'CallMethodError',
274
+ message: {
275
+ error: responseData ?? '',
276
+ },
277
+ } as any;
278
+ }
279
+ throw error;
280
+ }
281
+ }
282
+
283
+ typedCall<T extends MessageKey, R extends MessageKey[]>(
284
+ type: T,
285
+ resType: R,
286
+ msg?: MessageType[T]
287
+ ): Promise<TypedCallResponseMap[R[number]]>;
288
+
289
+ typedCall<T extends MessageKey, R extends MessageKey>(
290
+ type: T,
291
+ resType: R,
292
+ msg?: MessageType[T]
293
+ ): Promise<TypedResponseMessage<R>>;
294
+
295
+ async typedCall(
296
+ type: MessageKey,
297
+ resType: MessageKey | MessageKey[],
298
+ msg?: DefaultMessageResponse['message']
299
+ ) {
300
+ if (this.disposed) {
301
+ throw ERRORS.TypedError(
302
+ HardwareErrorCode.RuntimeError,
303
+ 'typedCall: DeviceCommands already disposed'
304
+ );
305
+ }
306
+
307
+ // Structured log of actual outgoing payloads (skip acks)
308
+ try {
309
+ const skipTypes: MessageKey[] = [
310
+ 'ButtonAck',
311
+ 'PinMatrixAck',
312
+ 'PassphraseAck',
313
+ 'Cancel',
314
+ 'BixinPinInputOnDevice',
315
+ ] as any;
316
+ if (!skipTypes.includes(type) && msg) {
317
+ // Use debug channel to avoid noise escalation
318
+ Log.debug('[DeviceCommands] [typedCall] Sending payload', type, msg);
319
+ }
320
+ } catch (e) {
321
+ // ignore logging errors
322
+ }
323
+
324
+ const response = await this._commonCall(type, msg);
325
+ try {
326
+ assertType(response, resType);
327
+ } catch (error) {
328
+ // handle possible race condition
329
+ // Bridge may have some unread message in buffer, read it
330
+ // await this.transport.read?.(this.mainId);
331
+
332
+ Log.debug('DeviceCommands typedcall error: ', error);
333
+
334
+ // throw bridge network error
335
+ if (error instanceof HardwareError) {
336
+ if (error.errorCode === HardwareErrorCode.ResponseUnexpectTypeError) {
337
+ // Do not intercept CallMethodError
338
+ // Do not intercept “assertType: Response of unexpected type” error
339
+ // Blocking the above two messages will not know what the specific error message is, and the specific error should be handled by the subsequent business logic.
340
+
341
+ if (error.message.indexOf('BridgeNetworkError') > -1) {
342
+ throw ERRORS.TypedError(HardwareErrorCode.BridgeNetworkError);
343
+ }
344
+ if (error.message.indexOf('BleDeviceBondError') > -1) {
345
+ throw ERRORS.TypedError(HardwareErrorCode.BleDeviceBondError);
346
+ }
347
+ if (error.message.indexOf('BridgeDeviceDisconnected') > -1) {
348
+ throw ERRORS.TypedError(HardwareErrorCode.BridgeDeviceDisconnected);
349
+ }
350
+ throw ERRORS.TypedError(HardwareErrorCode.ResponseUnexpectTypeError);
351
+ }
352
+ } else {
353
+ // throw error anyway, next call should be resolved properly// throw error anyway, next call should be resolved properly
354
+ throw error;
355
+ }
356
+ }
357
+ return response;
358
+ }
359
+
360
+ async _commonCall(type: MessageKey, msg?: DefaultMessageResponse['message']) {
361
+ const resp = await this.call(type, msg);
362
+ return this._filterCommonTypes(resp, type);
363
+ }
364
+
365
+ _filterCommonTypes(
366
+ res: DefaultMessageResponse,
367
+ callType: MessageKey
368
+ ): Promise<DefaultMessageResponse> {
369
+ try {
370
+ if (DataManager.getSettings('env') === 'react-native') {
371
+ Log.debug('_filterCommonTypes: ', JSON.stringify(res));
372
+ } else {
373
+ Log.debug('_filterCommonTypes: ', res);
374
+ }
375
+ } catch (error) {
376
+ // ignore
377
+ }
378
+
379
+ this.device.clearCancelableAction();
380
+ if (res.type === 'Failure') {
381
+ const { code, message } = res.message as {
382
+ code?: string | FailureType;
383
+ message?: string;
384
+ };
385
+ let error: HardwareError | null = null;
386
+ // Model One does not send any message in firmware update
387
+ if (code === 'Failure_FirmwareError' && !message) {
388
+ error = ERRORS.TypedError(HardwareErrorCode.FirmwareError);
389
+ }
390
+ // Failure_ActionCancelled message could be also missing
391
+ if (code === 'Failure_ActionCancelled') {
392
+ error = ERRORS.TypedError(HardwareErrorCode.ActionCancelled);
393
+ }
394
+
395
+ if (code === 'Failure_PinInvalid') {
396
+ error = ERRORS.TypedError(HardwareErrorCode.PinInvalid, message);
397
+ }
398
+
399
+ if (code === 'Failure_PinCancelled') {
400
+ error = ERRORS.TypedError(HardwareErrorCode.PinCancelled);
401
+ }
402
+
403
+ if (code === 'Failure_DataError') {
404
+ if (message === 'Please confirm the BlindSign enabled') {
405
+ error = ERRORS.TypedError(HardwareErrorCode.BlindSignDisabled);
406
+ }
407
+ if (message === 'File already exists') {
408
+ error = ERRORS.TypedError(HardwareErrorCode.FileAlreadyExists);
409
+ }
410
+ if (message?.includes('bytes overflow')) {
411
+ error = ERRORS.TypedError(HardwareErrorCode.DataOverload);
412
+ }
413
+ }
414
+
415
+ if (code === 'Failure_ProcessError') {
416
+ // Handle firmware verification failures
417
+ if (
418
+ message?.includes('Bootloader file verify failed') ||
419
+ message?.includes('verify failed')
420
+ ) {
421
+ error = ERRORS.TypedError(HardwareErrorCode.FirmwareVerificationFailed, message);
422
+ } else if (message?.includes('Firmware downgrade not allowed')) {
423
+ // Check firmware check failed
424
+ error = ERRORS.TypedError(HardwareErrorCode.FirmwareDowngradeNotAllowed, message);
425
+ }
426
+ }
427
+
428
+ if (code === 'Failure_UnexpectedMessage') {
429
+ if (callType === 'PassphraseAck') {
430
+ error = ERRORS.TypedError(HardwareErrorCode.UnexpectPassphrase);
431
+ } else if (message === 'Not in Signing mode') {
432
+ error = ERRORS.TypedError(HardwareErrorCode.NotInSigningMode);
433
+ }
434
+ }
435
+
436
+ if (error) {
437
+ return Promise.reject(error);
438
+ }
439
+
440
+ return Promise.reject(
441
+ ERRORS.TypedError(
442
+ HardwareErrorCode.RuntimeError,
443
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
444
+ `${(code as any) || 'Failure_UnknownCode'},${message || 'no error message'}`
445
+ )
446
+ );
447
+ }
448
+
449
+ if (res.type === 'Features') {
450
+ return Promise.resolve(patchFeatures(res));
451
+ }
452
+
453
+ if (res.type === 'ButtonRequest') {
454
+ const deviceType = getDeviceType(this.device.features);
455
+ if (DeviceModelToTypes.model_mini.includes(deviceType)) {
456
+ this.device.setCancelableAction(() => this.cancelDeviceOnOneTokenDevice());
457
+ } else {
458
+ this.device.setCancelableAction(() => this.cancelDevice());
459
+ }
460
+ if (res.message.code === 'ButtonRequest_PassphraseEntry') {
461
+ this.device.emit(DEVICE.PASSPHRASE_ON_DEVICE, this.device);
462
+ } else {
463
+ this.device.emit(DEVICE.BUTTON, this.device, res.message);
464
+ }
465
+ return this._commonCall('ButtonAck', {});
466
+ }
467
+
468
+ if (res.type === 'EntropyRequest') {
469
+ // TODO: EntropyRequest
470
+ }
471
+
472
+ if (res.type === 'PinMatrixRequest') {
473
+ return this._promptPin(res.message.type).then(
474
+ pin => {
475
+ if (pin === '@@ONETOKEN_INPUT_PIN_IN_DEVICE') {
476
+ // only classic\1s\mini\pure
477
+ this.device.setCancelableAction(() => this.cancelDeviceOnOneTokenDevice());
478
+ return this._commonCall('BixinPinInputOnDevice').finally(() => {
479
+ this.device.clearCancelableAction();
480
+ });
481
+ }
482
+ return this._commonCall('PinMatrixAck', { pin });
483
+ },
484
+ error => Promise.reject(error)
485
+ );
486
+ }
487
+
488
+ if (res.type === 'PassphraseRequest') {
489
+ const existsAttachPinUser = res.message.exists_attach_pin_user;
490
+ return this._promptPassphrase({
491
+ existsAttachPinUser,
492
+ }).then(response => {
493
+ const { passphrase, passphraseOnDevice, attachPinOnDevice } = response;
494
+
495
+ // Attach PIN on device
496
+ if (attachPinOnDevice && existsAttachPinUser) {
497
+ return this._commonCall('PassphraseAck', { on_device_attach_pin: true });
498
+ }
499
+
500
+ return !passphraseOnDevice
501
+ ? this._commonCall('PassphraseAck', { passphrase })
502
+ : this._commonCall('PassphraseAck', { on_device: true });
503
+ });
504
+ }
505
+
506
+ // TT fw lower than 2.3.0, device send his current state
507
+ // new passphrase design set this value from `features.session_id`
508
+ if (res.type === 'Deprecated_PassphraseStateRequest') {
509
+ // TODO: Deprecated_PassphraseStateRequest
510
+ }
511
+
512
+ if (res.type === 'WordRequest') {
513
+ // TODO: WordRequest
514
+ }
515
+ return Promise.resolve(res);
516
+ }
517
+
518
+ _promptPin(type?: Messages.PinMatrixRequestType) {
519
+ return new Promise<string>((resolve, reject) => {
520
+ const cancelAndReject = (_error?: Error) =>
521
+ cancelDeviceInPrompt(this.device, false)
522
+ .then(onCancel => {
523
+ const error = ERRORS.TypedError(
524
+ HardwareErrorCode.CallQueueActionCancelled,
525
+ `${DEVICE.PIN} canceled`
526
+ );
527
+ // onCancel not void
528
+ if (onCancel) {
529
+ const { payload } = onCancel || {};
530
+ reject(error || new Error(payload?.message));
531
+ } else {
532
+ reject(error);
533
+ }
534
+ })
535
+ .catch(error => {
536
+ reject(error);
537
+ });
538
+
539
+ const listenerCount = this.device.listenerCount(DEVICE.PIN);
540
+
541
+ Log.debug(`[${this.instanceId}] _promptPin called`, {
542
+ responseID: this.currentResponseID,
543
+ deviceInstanceId: this.device.instanceId,
544
+ listenerCount,
545
+ });
546
+
547
+ if (listenerCount > 0) {
548
+ this.device.setCancelableAction(cancelAndReject);
549
+ this.device.emit(DEVICE.PIN, this.device, type, (err, pin) => {
550
+ this.device.clearCancelableAction();
551
+ if (err) {
552
+ cancelAndReject(err);
553
+ } else {
554
+ resolve(pin);
555
+ }
556
+ });
557
+ } else {
558
+ const activeRequests = getActiveRequestsByDeviceInstance(this.device.instanceId);
559
+ const errorInfo = {
560
+ commandsInstanceId: this.instanceId,
561
+ deviceInstanceId: this.device.instanceId,
562
+ currentResponseID: this.currentResponseID,
563
+ listenerCount,
564
+ activeRequests: activeRequests.map(formatRequestContext),
565
+ };
566
+
567
+ LogCore.error('[DeviceCommands] [call] PIN callback not configured, cancelling request', {
568
+ ...errorInfo,
569
+ });
570
+ reject(
571
+ ERRORS.TypedError(
572
+ HardwareErrorCode.RuntimeError,
573
+ `_promptPin: PIN callback not configured: ${JSON.stringify(errorInfo)}`
574
+ )
575
+ );
576
+ }
577
+ });
578
+ }
579
+
580
+ _promptPassphrase(options: PassphraseRequestPayload) {
581
+ return new Promise<PassphrasePromptResponse>((resolve, reject) => {
582
+ const cancelAndReject = (_error?: Error) =>
583
+ cancelDeviceInPrompt(this.device, false)
584
+ .then(onCancel => {
585
+ const error = ERRORS.TypedError(
586
+ HardwareErrorCode.CallQueueActionCancelled,
587
+ `${DEVICE.PASSPHRASE} canceled`
588
+ );
589
+ // onCancel not void
590
+ if (onCancel) {
591
+ const { payload } = onCancel || {};
592
+ reject(error || new Error(payload?.message));
593
+ } else {
594
+ reject(error);
595
+ }
596
+ })
597
+ .catch(error => {
598
+ reject(error);
599
+ });
600
+
601
+ if (this.device.listenerCount(DEVICE.PASSPHRASE) > 0) {
602
+ this.device.setCancelableAction(cancelAndReject);
603
+ this.device.emit(
604
+ DEVICE.PASSPHRASE,
605
+ this.device,
606
+ options,
607
+ (response: PassphrasePromptResponse, error?: Error) => {
608
+ this.device.clearCancelableAction();
609
+ if (error) {
610
+ cancelAndReject(error);
611
+ } else {
612
+ resolve(response);
613
+ }
614
+ }
615
+ );
616
+ } else {
617
+ LogCore.error(
618
+ '[DeviceCommands] [call] Passphrase callback not configured, cancelling request'
619
+ );
620
+ reject(
621
+ ERRORS.TypedError(
622
+ HardwareErrorCode.RuntimeError,
623
+ '_promptPassphrase: Passphrase callback not configured'
624
+ )
625
+ );
626
+ }
627
+ });
628
+ }
629
+ }
630
+
631
+ export type TypedCall = DeviceCommands['typedCall'];