@ledgerhq/live-common 27.0.0 → 27.0.1-next.0

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 (405) hide show
  1. package/lib/__tests__/families/bitcoin/wallet-btc/xpub.syncing.integration.test.js +2 -2
  2. package/lib/__tests__/test-helpers/environment.d.ts +2 -0
  3. package/lib/__tests__/test-helpers/environment.d.ts.map +1 -0
  4. package/lib/__tests__/test-helpers/environment.js +107 -0
  5. package/lib/__tests__/test-helpers/environment.js.map +1 -0
  6. package/lib/__tests__/test-helpers/setup.d.ts +1 -1
  7. package/lib/__tests__/test-helpers/setup.d.ts.map +1 -1
  8. package/lib/__tests__/test-helpers/setup.js +1 -101
  9. package/lib/__tests__/test-helpers/setup.js.map +1 -1
  10. package/lib/account/serialization.d.ts.map +1 -1
  11. package/lib/account/serialization.js +83 -40
  12. package/lib/account/serialization.js.map +1 -1
  13. package/lib/bot/bot-test-context.d.ts +3 -0
  14. package/lib/bot/bot-test-context.d.ts.map +1 -0
  15. package/lib/bot/bot-test-context.js +26 -0
  16. package/lib/bot/bot-test-context.js.map +1 -0
  17. package/lib/bot/bot-test-context.test.d.ts +2 -0
  18. package/lib/bot/bot-test-context.test.d.ts.map +1 -0
  19. package/lib/bot/bot-test-context.test.js +41 -0
  20. package/lib/bot/bot-test-context.test.js.map +1 -0
  21. package/lib/bot/cli.d.ts +2 -0
  22. package/lib/bot/cli.d.ts.map +1 -0
  23. package/lib/bot/cli.js +14 -0
  24. package/lib/bot/cli.js.map +1 -0
  25. package/lib/bot/engine.d.ts +5 -5
  26. package/lib/bot/engine.d.ts.map +1 -1
  27. package/lib/bot/engine.js +161 -112
  28. package/lib/bot/engine.js.map +1 -1
  29. package/lib/bot/formatters.d.ts +2 -2
  30. package/lib/bot/formatters.d.ts.map +1 -1
  31. package/lib/bot/formatters.js +41 -15
  32. package/lib/bot/formatters.js.map +1 -1
  33. package/lib/bot/index.d.ts +1 -1
  34. package/lib/bot/index.d.ts.map +1 -1
  35. package/lib/bot/index.js +90 -15
  36. package/lib/bot/index.js.map +1 -1
  37. package/lib/bot/specs.d.ts +2 -1
  38. package/lib/bot/specs.d.ts.map +1 -1
  39. package/lib/bot/specs.js +13 -9
  40. package/lib/bot/specs.js.map +1 -1
  41. package/lib/bot/types.d.ts +5 -2
  42. package/lib/bot/types.d.ts.map +1 -1
  43. package/lib/countervalues/logic.integration.test.js +65 -0
  44. package/lib/countervalues/logic.integration.test.js.map +1 -1
  45. package/lib/countervalues/modules/weth.d.ts.map +1 -1
  46. package/lib/countervalues/modules/weth.js +5 -10
  47. package/lib/countervalues/modules/weth.js.map +1 -1
  48. package/lib/currencies/sortByMarketcap.d.ts +0 -2
  49. package/lib/currencies/sortByMarketcap.d.ts.map +1 -1
  50. package/lib/currencies/sortByMarketcap.js +3 -17
  51. package/lib/currencies/sortByMarketcap.js.map +1 -1
  52. package/lib/currencies/sortByMarketcap.test.js +0 -5
  53. package/lib/currencies/sortByMarketcap.test.js.map +1 -1
  54. package/lib/env.js +1 -1
  55. package/lib/families/algorand/specs.d.ts.map +1 -1
  56. package/lib/families/algorand/specs.js +18 -10
  57. package/lib/families/algorand/specs.js.map +1 -1
  58. package/lib/families/algorand/speculos-deviceActions.d.ts +1 -4
  59. package/lib/families/algorand/speculos-deviceActions.d.ts.map +1 -1
  60. package/lib/families/algorand/speculos-deviceActions.js +25 -8
  61. package/lib/families/algorand/speculos-deviceActions.js.map +1 -1
  62. package/lib/families/bitcoin/bridge/mock.d.ts.map +1 -1
  63. package/lib/families/bitcoin/bridge/mock.js +6 -1
  64. package/lib/families/bitcoin/bridge/mock.js.map +1 -1
  65. package/lib/families/bitcoin/datasets/bitcoin_cash.d.ts.map +1 -1
  66. package/lib/families/bitcoin/datasets/bitcoin_cash.js +1 -1
  67. package/lib/families/bitcoin/datasets/bitcoin_cash.js.map +1 -1
  68. package/lib/families/bitcoin/datasets/dash.d.ts.map +1 -1
  69. package/lib/families/bitcoin/datasets/dash.js +1 -1
  70. package/lib/families/bitcoin/datasets/dash.js.map +1 -1
  71. package/lib/families/bitcoin/datasets/decred.d.ts.map +1 -1
  72. package/lib/families/bitcoin/datasets/decred.js +1 -1
  73. package/lib/families/bitcoin/datasets/decred.js.map +1 -1
  74. package/lib/families/bitcoin/datasets/digibyte.d.ts.map +1 -1
  75. package/lib/families/bitcoin/datasets/digibyte.js +8 -2
  76. package/lib/families/bitcoin/datasets/digibyte.js.map +1 -1
  77. package/lib/families/bitcoin/datasets/dogecoin.d.ts.map +1 -1
  78. package/lib/families/bitcoin/datasets/dogecoin.js +1 -1
  79. package/lib/families/bitcoin/datasets/dogecoin.js.map +1 -1
  80. package/lib/families/bitcoin/datasets/komodo.js +1 -1
  81. package/lib/families/bitcoin/datasets/komodo.js.map +1 -1
  82. package/lib/families/bitcoin/datasets/litecoin.d.ts.map +1 -1
  83. package/lib/families/bitcoin/datasets/litecoin.js +8 -2
  84. package/lib/families/bitcoin/datasets/litecoin.js.map +1 -1
  85. package/lib/families/bitcoin/datasets/peercoin.js +1 -1
  86. package/lib/families/bitcoin/datasets/peercoin.js.map +1 -1
  87. package/lib/families/bitcoin/datasets/pivx.js +1 -1
  88. package/lib/families/bitcoin/datasets/pivx.js.map +1 -1
  89. package/lib/families/bitcoin/datasets/qtum.js +1 -1
  90. package/lib/families/bitcoin/datasets/qtum.js.map +1 -1
  91. package/lib/families/bitcoin/datasets/stakenet.d.ts.map +1 -1
  92. package/lib/families/bitcoin/datasets/stakenet.js +1 -1
  93. package/lib/families/bitcoin/datasets/stakenet.js.map +1 -1
  94. package/lib/families/bitcoin/datasets/vertcoin.d.ts.map +1 -1
  95. package/lib/families/bitcoin/datasets/vertcoin.js +1 -1
  96. package/lib/families/bitcoin/datasets/vertcoin.js.map +1 -1
  97. package/lib/families/bitcoin/datasets/viacoin.d.ts.map +1 -1
  98. package/lib/families/bitcoin/datasets/viacoin.js +1 -1
  99. package/lib/families/bitcoin/datasets/viacoin.js.map +1 -1
  100. package/lib/families/bitcoin/datasets/zcash.d.ts.map +1 -1
  101. package/lib/families/bitcoin/datasets/zcash.js +1 -1
  102. package/lib/families/bitcoin/datasets/zcash.js.map +1 -1
  103. package/lib/families/bitcoin/datasets/zencash.d.ts.map +1 -1
  104. package/lib/families/bitcoin/datasets/zencash.js +1 -1
  105. package/lib/families/bitcoin/datasets/zencash.js.map +1 -1
  106. package/lib/families/bitcoin/platformAdapter.test.d.ts +2 -0
  107. package/lib/families/bitcoin/platformAdapter.test.d.ts.map +1 -0
  108. package/lib/families/bitcoin/platformAdapter.test.js +48 -0
  109. package/lib/families/bitcoin/platformAdapter.test.js.map +1 -0
  110. package/lib/families/bitcoin/specs.d.ts.map +1 -1
  111. package/lib/families/bitcoin/specs.js +62 -24
  112. package/lib/families/bitcoin/specs.js.map +1 -1
  113. package/lib/families/bitcoin/speculos-deviceActions.d.ts +1 -4
  114. package/lib/families/bitcoin/speculos-deviceActions.d.ts.map +1 -1
  115. package/lib/families/bitcoin/speculos-deviceActions.js +2 -4
  116. package/lib/families/bitcoin/speculos-deviceActions.js.map +1 -1
  117. package/lib/families/cardano/js-estimateMaxSpendable.js +1 -1
  118. package/lib/families/cardano/js-estimateMaxSpendable.js.map +1 -1
  119. package/lib/families/cardano/specs.d.ts.map +1 -1
  120. package/lib/families/cardano/specs.js +19 -8
  121. package/lib/families/cardano/specs.js.map +1 -1
  122. package/lib/families/cardano/speculos-deviceActions.d.ts +1 -4
  123. package/lib/families/cardano/speculos-deviceActions.d.ts.map +1 -1
  124. package/lib/families/cardano/speculos-deviceActions.js +2 -2
  125. package/lib/families/cardano/speculos-deviceActions.js.map +1 -1
  126. package/lib/families/celo/specs.d.ts.map +1 -1
  127. package/lib/families/celo/specs.js +2 -0
  128. package/lib/families/celo/specs.js.map +1 -1
  129. package/lib/families/celo/speculos-deviceActions.d.ts +1 -4
  130. package/lib/families/celo/speculos-deviceActions.d.ts.map +1 -1
  131. package/lib/families/celo/speculos-deviceActions.js +2 -4
  132. package/lib/families/celo/speculos-deviceActions.js.map +1 -1
  133. package/lib/families/cosmos/specs.d.ts.map +1 -1
  134. package/lib/families/cosmos/specs.js +41 -25
  135. package/lib/families/cosmos/specs.js.map +1 -1
  136. package/lib/families/cosmos/speculos-deviceActions.d.ts +1 -4
  137. package/lib/families/cosmos/speculos-deviceActions.d.ts.map +1 -1
  138. package/lib/families/cosmos/speculos-deviceActions.js +2 -4
  139. package/lib/families/cosmos/speculos-deviceActions.js.map +1 -1
  140. package/lib/families/crypto_org/specs.d.ts.map +1 -1
  141. package/lib/families/crypto_org/specs.js +3 -0
  142. package/lib/families/crypto_org/specs.js.map +1 -1
  143. package/lib/families/crypto_org/speculos-deviceActions.d.ts +1 -4
  144. package/lib/families/crypto_org/speculos-deviceActions.d.ts.map +1 -1
  145. package/lib/families/crypto_org/speculos-deviceActions.js +2 -2
  146. package/lib/families/crypto_org/speculos-deviceActions.js.map +1 -1
  147. package/lib/families/elrond/specs.d.ts.map +1 -1
  148. package/lib/families/elrond/specs.js +15 -2
  149. package/lib/families/elrond/specs.js.map +1 -1
  150. package/lib/families/elrond/speculos-deviceActions.d.ts +1 -4
  151. package/lib/families/elrond/speculos-deviceActions.d.ts.map +1 -1
  152. package/lib/families/elrond/speculos-deviceActions.js +2 -4
  153. package/lib/families/elrond/speculos-deviceActions.js.map +1 -1
  154. package/lib/families/ethereum/platformAdapter.test.d.ts +2 -0
  155. package/lib/families/ethereum/platformAdapter.test.d.ts.map +1 -0
  156. package/lib/families/ethereum/platformAdapter.test.js +88 -0
  157. package/lib/families/ethereum/platformAdapter.test.js.map +1 -0
  158. package/lib/families/ethereum/specs.d.ts.map +1 -1
  159. package/lib/families/ethereum/specs.js +36 -12
  160. package/lib/families/ethereum/specs.js.map +1 -1
  161. package/lib/families/ethereum/speculos-deviceActions.d.ts +1 -4
  162. package/lib/families/ethereum/speculos-deviceActions.d.ts.map +1 -1
  163. package/lib/families/ethereum/speculos-deviceActions.js +2 -4
  164. package/lib/families/ethereum/speculos-deviceActions.js.map +1 -1
  165. package/lib/families/filecoin/specs.d.ts.map +1 -1
  166. package/lib/families/filecoin/specs.js +2 -0
  167. package/lib/families/filecoin/specs.js.map +1 -1
  168. package/lib/families/filecoin/speculos-deviceActions.d.ts +1 -4
  169. package/lib/families/filecoin/speculos-deviceActions.d.ts.map +1 -1
  170. package/lib/families/filecoin/speculos-deviceActions.js +2 -2
  171. package/lib/families/filecoin/speculos-deviceActions.js.map +1 -1
  172. package/lib/families/hedera/specs.d.ts.map +1 -1
  173. package/lib/families/hedera/specs.js +11 -3
  174. package/lib/families/hedera/specs.js.map +1 -1
  175. package/lib/families/hedera/speculos-deviceActions.d.ts +1 -4
  176. package/lib/families/hedera/speculos-deviceActions.d.ts.map +1 -1
  177. package/lib/families/hedera/speculos-deviceActions.js +4 -4
  178. package/lib/families/hedera/speculos-deviceActions.js.map +1 -1
  179. package/lib/families/osmosis/specs.d.ts.map +1 -1
  180. package/lib/families/osmosis/specs.js +13 -5
  181. package/lib/families/osmosis/specs.js.map +1 -1
  182. package/lib/families/osmosis/speculos-deviceActions.d.ts +1 -4
  183. package/lib/families/osmosis/speculos-deviceActions.d.ts.map +1 -1
  184. package/lib/families/osmosis/speculos-deviceActions.js +2 -4
  185. package/lib/families/osmosis/speculos-deviceActions.js.map +1 -1
  186. package/lib/families/polkadot/platformAdapter.test.d.ts +2 -0
  187. package/lib/families/polkadot/platformAdapter.test.d.ts.map +1 -0
  188. package/lib/families/polkadot/platformAdapter.test.js +51 -0
  189. package/lib/families/polkadot/platformAdapter.test.js.map +1 -0
  190. package/lib/families/polkadot/specs.d.ts.map +1 -1
  191. package/lib/families/polkadot/specs.js +12 -1
  192. package/lib/families/polkadot/specs.js.map +1 -1
  193. package/lib/families/polkadot/speculos-deviceActions.d.ts +1 -4
  194. package/lib/families/polkadot/speculos-deviceActions.d.ts.map +1 -1
  195. package/lib/families/polkadot/speculos-deviceActions.js +2 -4
  196. package/lib/families/polkadot/speculos-deviceActions.js.map +1 -1
  197. package/lib/families/ripple/platformAdapter.test.d.ts +2 -0
  198. package/lib/families/ripple/platformAdapter.test.d.ts.map +1 -0
  199. package/lib/families/ripple/platformAdapter.test.js +51 -0
  200. package/lib/families/ripple/platformAdapter.test.js.map +1 -0
  201. package/lib/families/ripple/specs.d.ts.map +1 -1
  202. package/lib/families/ripple/specs.js +9 -4
  203. package/lib/families/ripple/specs.js.map +1 -1
  204. package/lib/families/ripple/speculos-deviceActions.d.ts +1 -4
  205. package/lib/families/ripple/speculos-deviceActions.d.ts.map +1 -1
  206. package/lib/families/ripple/speculos-deviceActions.js +2 -4
  207. package/lib/families/ripple/speculos-deviceActions.js.map +1 -1
  208. package/lib/families/solana/specs.d.ts.map +1 -1
  209. package/lib/families/solana/specs.js +29 -11
  210. package/lib/families/solana/specs.js.map +1 -1
  211. package/lib/families/solana/speculos-deviceActions.d.ts +0 -5
  212. package/lib/families/solana/speculos-deviceActions.d.ts.map +1 -1
  213. package/lib/families/solana/speculos-deviceActions.js +0 -4
  214. package/lib/families/solana/speculos-deviceActions.js.map +1 -1
  215. package/lib/families/stellar/api/horizon.d.ts.map +1 -1
  216. package/lib/families/stellar/api/horizon.js +15 -10
  217. package/lib/families/stellar/api/horizon.js.map +1 -1
  218. package/lib/families/stellar/specs.d.ts.map +1 -1
  219. package/lib/families/stellar/specs.js +30 -12
  220. package/lib/families/stellar/specs.js.map +1 -1
  221. package/lib/families/stellar/speculos-deviceActions.d.ts +1 -4
  222. package/lib/families/stellar/speculos-deviceActions.d.ts.map +1 -1
  223. package/lib/families/stellar/speculos-deviceActions.js +2 -4
  224. package/lib/families/stellar/speculos-deviceActions.js.map +1 -1
  225. package/lib/families/tezos/bakers.whitelist-default.d.ts.map +1 -1
  226. package/lib/families/tezos/bakers.whitelist-default.js +1 -1
  227. package/lib/families/tezos/bakers.whitelist-default.js.map +1 -1
  228. package/lib/families/tezos/specs.d.ts.map +1 -1
  229. package/lib/families/tezos/specs.js +2 -0
  230. package/lib/families/tezos/specs.js.map +1 -1
  231. package/lib/families/tezos/speculos-deviceActions.d.ts +1 -4
  232. package/lib/families/tezos/speculos-deviceActions.d.ts.map +1 -1
  233. package/lib/families/tezos/speculos-deviceActions.js +2 -2
  234. package/lib/families/tezos/speculos-deviceActions.js.map +1 -1
  235. package/lib/families/tron/specs.d.ts.map +1 -1
  236. package/lib/families/tron/specs.js +49 -17
  237. package/lib/families/tron/specs.js.map +1 -1
  238. package/lib/families/tron/speculos-deviceActions.d.ts +1 -4
  239. package/lib/families/tron/speculos-deviceActions.d.ts.map +1 -1
  240. package/lib/families/tron/speculos-deviceActions.js +2 -4
  241. package/lib/families/tron/speculos-deviceActions.js.map +1 -1
  242. package/lib/hw/getGenuineCheckFromDeviceId.d.ts +22 -0
  243. package/lib/hw/getGenuineCheckFromDeviceId.d.ts.map +1 -0
  244. package/lib/hw/getGenuineCheckFromDeviceId.js +49 -0
  245. package/lib/hw/getGenuineCheckFromDeviceId.js.map +1 -0
  246. package/lib/hw/getGenuineCheckFromDeviceId.test.d.ts +2 -0
  247. package/lib/hw/getGenuineCheckFromDeviceId.test.d.ts.map +1 -0
  248. package/lib/hw/getGenuineCheckFromDeviceId.test.js +84 -0
  249. package/lib/hw/getGenuineCheckFromDeviceId.test.js.map +1 -0
  250. package/lib/hw/getLatestAvailableFirmwareFromDeviceId.d.ts +17 -0
  251. package/lib/hw/getLatestAvailableFirmwareFromDeviceId.d.ts.map +1 -0
  252. package/lib/hw/getLatestAvailableFirmwareFromDeviceId.js +27 -0
  253. package/lib/hw/getLatestAvailableFirmwareFromDeviceId.js.map +1 -0
  254. package/lib/hw/hooks/useGenuineCheck.d.ts +34 -0
  255. package/lib/hw/hooks/useGenuineCheck.d.ts.map +1 -0
  256. package/lib/hw/hooks/useGenuineCheck.js +115 -0
  257. package/lib/hw/hooks/useGenuineCheck.js.map +1 -0
  258. package/lib/hw/hooks/useGenuineCheck.test.d.ts +2 -0
  259. package/lib/hw/hooks/useGenuineCheck.test.d.ts.map +1 -0
  260. package/lib/hw/hooks/useGenuineCheck.test.js +316 -0
  261. package/lib/hw/hooks/useGenuineCheck.test.js.map +1 -0
  262. package/lib/hw/hooks/useGetLatestAvailableFirmware.d.ts +29 -0
  263. package/lib/hw/hooks/useGetLatestAvailableFirmware.d.ts.map +1 -0
  264. package/lib/hw/hooks/useGetLatestAvailableFirmware.js +72 -0
  265. package/lib/hw/hooks/useGetLatestAvailableFirmware.js.map +1 -0
  266. package/lib/hw/hooks/useGetLatestAvailableFirmware.test.d.ts +2 -0
  267. package/lib/hw/hooks/useGetLatestAvailableFirmware.test.d.ts.map +1 -0
  268. package/lib/hw/hooks/useGetLatestAvailableFirmware.test.js +155 -0
  269. package/lib/hw/hooks/useGetLatestAvailableFirmware.test.js.map +1 -0
  270. package/lib/load/speculos.d.ts +1 -0
  271. package/lib/load/speculos.d.ts.map +1 -1
  272. package/lib/load/speculos.js +2 -1
  273. package/lib/load/speculos.js.map +1 -1
  274. package/lib/mock/fixtures/cryptoCurrencies.d.ts +5 -0
  275. package/lib/mock/fixtures/cryptoCurrencies.d.ts.map +1 -0
  276. package/lib/mock/fixtures/cryptoCurrencies.js +91 -0
  277. package/lib/mock/fixtures/cryptoCurrencies.js.map +1 -0
  278. package/lib/platform/converters.test.js +44 -218
  279. package/lib/platform/converters.test.js.map +1 -1
  280. package/lib/platform/logic.d.ts +44 -0
  281. package/lib/platform/logic.d.ts.map +1 -1
  282. package/lib/platform/logic.js +147 -1
  283. package/lib/platform/logic.js.map +1 -1
  284. package/lib/platform/logic.test.d.ts +2 -0
  285. package/lib/platform/logic.test.d.ts.map +1 -0
  286. package/lib/platform/logic.test.js +903 -0
  287. package/lib/platform/logic.test.js.map +1 -0
  288. package/lib/platform/react.d.ts +6 -0
  289. package/lib/platform/react.d.ts.map +1 -1
  290. package/lib/platform/react.js +6 -0
  291. package/lib/platform/react.js.map +1 -1
  292. package/lib/platform/tracking.d.ts +1 -1
  293. package/lib/platform/tracking.d.ts.map +1 -1
  294. package/lib/platform/tracking.test.js +14 -41
  295. package/lib/platform/tracking.test.js.map +1 -1
  296. package/lib/reconciliation.d.ts.map +1 -1
  297. package/lib/reconciliation.js +28 -10
  298. package/lib/reconciliation.js.map +1 -1
  299. package/package.json +5 -6
  300. package/src/__tests__/families/bitcoin/wallet-btc/xpub.syncing.integration.test.ts +2 -2
  301. package/src/__tests__/test-helpers/environment.ts +91 -0
  302. package/src/__tests__/test-helpers/setup.ts +2 -91
  303. package/src/account/serialization.ts +103 -64
  304. package/src/bot/bot-test-context.test.ts +37 -0
  305. package/src/bot/bot-test-context.ts +24 -0
  306. package/src/bot/cli.ts +18 -0
  307. package/src/bot/engine.ts +109 -73
  308. package/src/bot/formatters.ts +40 -14
  309. package/src/bot/index.ts +124 -18
  310. package/src/bot/specs.ts +10 -5
  311. package/src/bot/types.ts +7 -3
  312. package/src/countervalues/logic.integration.test.ts +50 -0
  313. package/src/countervalues/modules/weth.ts +9 -12
  314. package/src/currencies/__snapshots__/sortByMarketcap.test.ts.snap +59 -1
  315. package/src/currencies/sortByMarketcap.test.ts +1 -12
  316. package/src/currencies/sortByMarketcap.ts +2 -22
  317. package/src/env.ts +1 -1
  318. package/src/families/algorand/__snapshots__/bridge.integration.test.ts.snap +733 -8
  319. package/src/families/algorand/specs.ts +26 -16
  320. package/src/families/algorand/speculos-deviceActions.ts +31 -10
  321. package/src/families/bitcoin/__snapshots__/bridge.integration.test.ts.snap +43309 -7957
  322. package/src/families/bitcoin/bridge/mock.ts +7 -1
  323. package/src/families/bitcoin/datasets/bitcoin_cash.ts +73 -13
  324. package/src/families/bitcoin/datasets/dash.ts +29 -17
  325. package/src/families/bitcoin/datasets/decred.ts +42 -12
  326. package/src/families/bitcoin/datasets/digibyte.ts +9 -3
  327. package/src/families/bitcoin/datasets/dogecoin.ts +29 -17
  328. package/src/families/bitcoin/datasets/komodo.ts +22 -22
  329. package/src/families/bitcoin/datasets/litecoin.ts +9 -3
  330. package/src/families/bitcoin/datasets/peercoin.ts +17 -17
  331. package/src/families/bitcoin/datasets/pivx.ts +17 -17
  332. package/src/families/bitcoin/datasets/qtum.ts +40 -40
  333. package/src/families/bitcoin/datasets/stakenet.ts +56 -26
  334. package/src/families/bitcoin/datasets/vertcoin.ts +43 -55
  335. package/src/families/bitcoin/datasets/viacoin.ts +35 -23
  336. package/src/families/bitcoin/datasets/zcash.ts +78 -12
  337. package/src/families/bitcoin/datasets/zencash.ts +56 -10
  338. package/src/families/bitcoin/platformAdapter.test.ts +58 -0
  339. package/src/families/bitcoin/specs.ts +81 -41
  340. package/src/families/bitcoin/speculos-deviceActions.ts +68 -69
  341. package/src/families/cardano/js-estimateMaxSpendable.ts +1 -1
  342. package/src/families/cardano/specs.ts +28 -11
  343. package/src/families/cardano/speculos-deviceActions.ts +65 -66
  344. package/src/families/celo/specs.ts +2 -0
  345. package/src/families/celo/speculos-deviceActions.ts +42 -43
  346. package/src/families/cosmos/__snapshots__/bridge.integration.test.ts.snap +246 -5
  347. package/src/families/cosmos/specs.ts +44 -28
  348. package/src/families/cosmos/speculos-deviceActions.ts +82 -83
  349. package/src/families/crypto_org/specs.ts +3 -0
  350. package/src/families/crypto_org/speculos-deviceActions.ts +58 -59
  351. package/src/families/elrond/specs.ts +21 -4
  352. package/src/families/elrond/speculos-deviceActions.ts +41 -42
  353. package/src/families/ethereum/__snapshots__/bridge.integration.test.ts.snap +90 -90
  354. package/src/families/ethereum/platformAdapter.test.ts +112 -0
  355. package/src/families/ethereum/specs.ts +47 -23
  356. package/src/families/ethereum/speculos-deviceActions.ts +93 -95
  357. package/src/families/filecoin/specs.ts +2 -1
  358. package/src/families/filecoin/speculos-deviceActions.ts +61 -62
  359. package/src/families/hedera/__snapshots__/bridge.integration.test.ts.snap +57 -2
  360. package/src/families/hedera/specs.ts +13 -5
  361. package/src/families/hedera/speculos-deviceActions.ts +59 -60
  362. package/src/families/osmosis/specs.ts +15 -7
  363. package/src/families/osmosis/speculos-deviceActions.ts +82 -83
  364. package/src/families/polkadot/platformAdapter.test.ts +61 -0
  365. package/src/families/polkadot/specs.ts +20 -2
  366. package/src/families/polkadot/speculos-deviceActions.ts +83 -82
  367. package/src/families/ripple/platformAdapter.test.ts +54 -0
  368. package/src/families/ripple/specs.ts +14 -7
  369. package/src/families/ripple/speculos-deviceActions.ts +72 -73
  370. package/src/families/solana/specs.ts +33 -14
  371. package/src/families/solana/speculos-deviceActions.ts +0 -5
  372. package/src/families/stellar/api/horizon.ts +10 -6
  373. package/src/families/stellar/specs.ts +37 -19
  374. package/src/families/stellar/speculos-deviceActions.ts +85 -87
  375. package/src/families/tezos/bakers.whitelist-default.ts +0 -1
  376. package/src/families/tezos/specs.ts +2 -0
  377. package/src/families/tezos/speculos-deviceActions.ts +76 -77
  378. package/src/families/tron/specs.ts +67 -30
  379. package/src/families/tron/speculos-deviceActions.ts +81 -84
  380. package/src/hw/getGenuineCheckFromDeviceId.test.ts +98 -0
  381. package/src/hw/getGenuineCheckFromDeviceId.ts +61 -0
  382. package/src/hw/getLatestAvailableFirmwareFromDeviceId.ts +37 -0
  383. package/src/hw/hooks/useGenuineCheck.test.ts +232 -0
  384. package/src/hw/hooks/useGenuineCheck.ts +138 -0
  385. package/src/hw/hooks/useGetLatestAvailableFirmware.test.ts +111 -0
  386. package/src/hw/hooks/useGetLatestAvailableFirmware.ts +90 -0
  387. package/src/load/speculos.ts +2 -0
  388. package/src/mock/fixtures/cryptoCurrencies.ts +88 -0
  389. package/src/platform/converters.test.ts +49 -282
  390. package/src/platform/logic.test.ts +756 -0
  391. package/src/platform/logic.ts +285 -0
  392. package/src/platform/react.ts +6 -0
  393. package/src/platform/tracking.test.ts +6 -7
  394. package/src/platform/tracking.ts +1 -1
  395. package/src/reconciliation.ts +66 -43
  396. package/lib/bot/test.bot.d.ts +0 -2
  397. package/lib/bot/test.bot.d.ts.map +0 -1
  398. package/lib/bot/test.bot.js +0 -62
  399. package/lib/bot/test.bot.js.map +0 -1
  400. package/lib/generated/speculos-deviceActions.d.ts +0 -56
  401. package/lib/generated/speculos-deviceActions.d.ts.map +0 -1
  402. package/lib/generated/speculos-deviceActions.js +0 -42
  403. package/lib/generated/speculos-deviceActions.js.map +0 -1
  404. package/src/bot/test.bot.ts +0 -21
  405. package/src/generated/speculos-deviceActions.ts +0 -37
@@ -0,0 +1,232 @@
1
+ import { renderHook, act } from "@testing-library/react-hooks";
2
+ import { of, throwError } from "rxjs";
3
+ import {
4
+ UserRefusedAllowManager,
5
+ DisconnectedDeviceDuringOperation,
6
+ } from "@ledgerhq/errors";
7
+ import { useGenuineCheck } from "./useGenuineCheck";
8
+ import { getGenuineCheckFromDeviceId } from "../getGenuineCheckFromDeviceId";
9
+
10
+ jest.mock("../getGenuineCheckFromDeviceId");
11
+ jest.useFakeTimers();
12
+
13
+ const mockedGetGenuineCheckFromDeviceId = jest.mocked(
14
+ getGenuineCheckFromDeviceId
15
+ );
16
+
17
+ describe("useGenuineCheck", () => {
18
+ afterEach(() => {
19
+ mockedGetGenuineCheckFromDeviceId.mockClear();
20
+ jest.clearAllTimers();
21
+ });
22
+
23
+ describe("When the genuine check requests for a device permission", () => {
24
+ it("should notify the hook consumer of the request", async () => {
25
+ mockedGetGenuineCheckFromDeviceId.mockReturnValue(
26
+ of({
27
+ socketEvent: { type: "device-permission-requested", wording: "" },
28
+ deviceIsLocked: false,
29
+ })
30
+ );
31
+ const { result } = renderHook(() =>
32
+ useGenuineCheck({
33
+ getGenuineCheckFromDeviceId: mockedGetGenuineCheckFromDeviceId,
34
+ deviceId: "A_DEVICE_ID",
35
+ })
36
+ );
37
+
38
+ await act(async () => {
39
+ jest.advanceTimersByTime(1);
40
+ });
41
+
42
+ expect(result.current.devicePermissionState).toEqual("requested");
43
+ expect(result.current.genuineState).toEqual("unchecked");
44
+ expect(result.current.error).toBeNull();
45
+ });
46
+
47
+ it("should notify the hook consumer if the device permission is granted", async () => {
48
+ mockedGetGenuineCheckFromDeviceId.mockReturnValue(
49
+ of({
50
+ socketEvent: { type: "device-permission-granted" },
51
+ deviceIsLocked: false,
52
+ })
53
+ );
54
+ const { result } = renderHook(() =>
55
+ useGenuineCheck({
56
+ getGenuineCheckFromDeviceId: mockedGetGenuineCheckFromDeviceId,
57
+ deviceId: "A_DEVICE_ID",
58
+ })
59
+ );
60
+
61
+ await act(async () => {
62
+ jest.advanceTimersByTime(1);
63
+ });
64
+
65
+ expect(result.current.devicePermissionState).toEqual("granted");
66
+ expect(result.current.genuineState).toEqual("unchecked");
67
+ expect(result.current.error).toBeNull();
68
+ });
69
+
70
+ it("should notify the hook consumer if the device permission is refused", async () => {
71
+ mockedGetGenuineCheckFromDeviceId.mockReturnValue(
72
+ throwError(new UserRefusedAllowManager())
73
+ );
74
+ const { result } = renderHook(() =>
75
+ useGenuineCheck({
76
+ getGenuineCheckFromDeviceId: mockedGetGenuineCheckFromDeviceId,
77
+ deviceId: "A_DEVICE_ID",
78
+ })
79
+ );
80
+
81
+ await act(async () => {
82
+ jest.advanceTimersByTime(1);
83
+ });
84
+
85
+ expect(result.current.devicePermissionState).toEqual("refused");
86
+ expect(result.current.genuineState).toEqual("unchecked");
87
+ expect(result.current.error).toBeNull();
88
+ });
89
+ });
90
+
91
+ describe("When an error occurred during the genuine check", () => {
92
+ it("should notify the hook consumer that an error occurred", async () => {
93
+ mockedGetGenuineCheckFromDeviceId.mockReturnValue(
94
+ throwError(new DisconnectedDeviceDuringOperation())
95
+ );
96
+ const { result } = renderHook(() =>
97
+ useGenuineCheck({
98
+ getGenuineCheckFromDeviceId: mockedGetGenuineCheckFromDeviceId,
99
+ deviceId: "A_DEVICE_ID",
100
+ })
101
+ );
102
+
103
+ await act(async () => {
104
+ jest.advanceTimersByTime(1);
105
+ });
106
+
107
+ expect(result.current.genuineState).toEqual("unchecked");
108
+ expect(result.current.error).toBeInstanceOf(
109
+ DisconnectedDeviceDuringOperation
110
+ );
111
+ });
112
+ });
113
+
114
+ describe("When the genuine check is completed", () => {
115
+ describe("and it is a success", () => {
116
+ it("should notify the hook consumer of the success", async () => {
117
+ mockedGetGenuineCheckFromDeviceId.mockReturnValue(
118
+ of({
119
+ socketEvent: { type: "result", payload: "0000" },
120
+ deviceIsLocked: false,
121
+ })
122
+ );
123
+ const { result } = renderHook(() =>
124
+ useGenuineCheck({
125
+ getGenuineCheckFromDeviceId: mockedGetGenuineCheckFromDeviceId,
126
+ deviceId: "A_DEVICE_ID",
127
+ })
128
+ );
129
+
130
+ await act(async () => {
131
+ jest.advanceTimersByTime(1);
132
+ });
133
+
134
+ expect(result.current.genuineState).toEqual("genuine");
135
+ expect(result.current.error).toBeNull();
136
+ });
137
+ });
138
+
139
+ describe("and the device is not genuine", () => {
140
+ it("should notify the hook consumer that the device is not genuine", async () => {
141
+ mockedGetGenuineCheckFromDeviceId.mockReturnValue(
142
+ of({
143
+ socketEvent: { type: "result", payload: "1111" },
144
+ deviceIsLocked: false,
145
+ })
146
+ );
147
+ const { result } = renderHook(() =>
148
+ useGenuineCheck({
149
+ getGenuineCheckFromDeviceId: mockedGetGenuineCheckFromDeviceId,
150
+ deviceId: "A_DEVICE_ID",
151
+ })
152
+ );
153
+
154
+ await act(async () => {
155
+ jest.advanceTimersByTime(1);
156
+ });
157
+
158
+ expect(result.current.genuineState).toEqual("non-genuine");
159
+ expect(result.current.error).toBeNull();
160
+ });
161
+ });
162
+ });
163
+
164
+ describe("When the hook consumer requests to reset the genuine check state", () => {
165
+ it("should reset the device permission and genuine states", async () => {
166
+ // In the case of an unsuccessful genuine check
167
+ mockedGetGenuineCheckFromDeviceId.mockReturnValue(
168
+ of(
169
+ {
170
+ socketEvent: { type: "device-permission-granted" },
171
+ deviceIsLocked: false,
172
+ },
173
+ {
174
+ socketEvent: { type: "result", payload: "1111" },
175
+ deviceIsLocked: false,
176
+ }
177
+ )
178
+ );
179
+
180
+ const { result } = renderHook(() =>
181
+ useGenuineCheck({
182
+ getGenuineCheckFromDeviceId: mockedGetGenuineCheckFromDeviceId,
183
+ isHookEnabled: true,
184
+ deviceId: "A_DEVICE_ID",
185
+ })
186
+ );
187
+
188
+ await act(async () => {
189
+ jest.advanceTimersByTime(1);
190
+ });
191
+
192
+ expect(result.current.devicePermissionState).toEqual("granted");
193
+ expect(result.current.genuineState).toEqual("non-genuine");
194
+ expect(result.current.error).toBeNull();
195
+
196
+ // We ask to reset the genuine check state
197
+ await act(async () => {
198
+ result.current.resetGenuineCheckState();
199
+ });
200
+
201
+ expect(result.current.devicePermissionState).toEqual("unrequested");
202
+ expect(result.current.genuineState).toEqual("unchecked");
203
+ expect(result.current.error).toBeNull();
204
+ });
205
+ });
206
+
207
+ describe("When the device is locked before doing a genuine check, and it timed out", () => {
208
+ it("should notify the hook consumer of the need to unlock the device", async () => {
209
+ mockedGetGenuineCheckFromDeviceId.mockReturnValue(
210
+ of({
211
+ socketEvent: null,
212
+ deviceIsLocked: true,
213
+ })
214
+ );
215
+
216
+ const { result } = renderHook(() =>
217
+ useGenuineCheck({
218
+ getGenuineCheckFromDeviceId: mockedGetGenuineCheckFromDeviceId,
219
+ deviceId: "A_DEVICE_ID",
220
+ })
221
+ );
222
+
223
+ await act(async () => {
224
+ jest.advanceTimersByTime(1);
225
+ });
226
+
227
+ expect(result.current.devicePermissionState).toEqual("unlock-needed");
228
+ expect(result.current.genuineState).toEqual("unchecked");
229
+ expect(result.current.error).toBeNull();
230
+ });
231
+ });
232
+ });
@@ -0,0 +1,138 @@
1
+ import { useCallback, useEffect, useState } from "react";
2
+ import { UserRefusedAllowManager } from "@ledgerhq/errors";
3
+ import type { DeviceId } from "@ledgerhq/types-live";
4
+ import { getGenuineCheckFromDeviceId as defaultGetGenuineCheckFromDeviceId } from "../getGenuineCheckFromDeviceId";
5
+ import type {
6
+ GetGenuineCheckFromDeviceIdArgs,
7
+ GetGenuineCheckFromDeviceIdResult,
8
+ GetGenuineCheckFromDeviceIdOutput,
9
+ } from "../getGenuineCheckFromDeviceId";
10
+
11
+ export type GenuineState = "unchecked" | "genuine" | "non-genuine";
12
+ export type DevicePermissionState =
13
+ | "unrequested"
14
+ | "unlock-needed"
15
+ | "unlocked"
16
+ | "requested"
17
+ | "granted"
18
+ | "refused";
19
+
20
+ export type UseGenuineCheckArgs = {
21
+ isHookEnabled?: boolean;
22
+ deviceId: DeviceId;
23
+ lockedDeviceTimeoutMs?: number;
24
+ };
25
+
26
+ export type UseGenuineCheckDependencies = {
27
+ getGenuineCheckFromDeviceId?: (
28
+ args: GetGenuineCheckFromDeviceIdArgs
29
+ ) => GetGenuineCheckFromDeviceIdOutput;
30
+ };
31
+
32
+ export type UseGenuineCheckResult = {
33
+ genuineState: GenuineState;
34
+ devicePermissionState: DevicePermissionState;
35
+ error: Error | null;
36
+ resetGenuineCheckState: () => void;
37
+ };
38
+
39
+ const SOCKET_EVENT_PAYLOAD_GENUINE = "0000";
40
+
41
+ /**
42
+ * Hook to check that a device is genuine
43
+ * It replaces a DeviceAction if we're only interested in getting the genuine check
44
+ * @param getGenuineCheckFromDeviceId An optional function to get a genuine check for a given device id,
45
+ * by default set to live-common/hw/getGenuineCheckFromDeviceId.
46
+ * This dependency injection is needed for LLD to have the hook working on the internal thread
47
+ * @param isHookEnabled A boolean to enable (true, default value) or disable (false) the hook
48
+ * @param deviceId A device id, or an empty string if device is usb plugged
49
+ * @param lockedDeviceTimeoutMs Time of no response from device after which the device is considered locked, in ms. Default 1000ms.
50
+ * @returns An object containing:
51
+ * - genuineState: the current GenuineState
52
+ * - devicePermissionState: the current DevicePermissionState
53
+ * - error: any error that occurred during the genuine check, or null
54
+ */
55
+ export const useGenuineCheck = ({
56
+ getGenuineCheckFromDeviceId = defaultGetGenuineCheckFromDeviceId,
57
+ isHookEnabled = true,
58
+ deviceId,
59
+ lockedDeviceTimeoutMs = 1000,
60
+ }: UseGenuineCheckArgs &
61
+ UseGenuineCheckDependencies): UseGenuineCheckResult => {
62
+ const [genuineState, setGenuineState] = useState<GenuineState>("unchecked");
63
+ const [devicePermissionState, setDevicePermissionState] =
64
+ useState<DevicePermissionState>("unrequested");
65
+ const [error, setError] = useState<Error | null>(null);
66
+
67
+ const resetGenuineCheckState = useCallback(() => {
68
+ setDevicePermissionState("unrequested");
69
+ setGenuineState("unchecked");
70
+ }, []);
71
+
72
+ useEffect(() => {
73
+ if (!isHookEnabled) {
74
+ return;
75
+ }
76
+
77
+ const sub = getGenuineCheckFromDeviceId({
78
+ deviceId,
79
+ lockedDeviceTimeoutMs,
80
+ }).subscribe({
81
+ next: ({
82
+ socketEvent,
83
+ deviceIsLocked,
84
+ }: GetGenuineCheckFromDeviceIdResult) => {
85
+ if (socketEvent) {
86
+ switch (socketEvent.type) {
87
+ case "device-permission-requested":
88
+ setDevicePermissionState("requested");
89
+ break;
90
+ case "device-permission-granted":
91
+ setDevicePermissionState("granted");
92
+ break;
93
+ case "result":
94
+ if (socketEvent.payload === SOCKET_EVENT_PAYLOAD_GENUINE) {
95
+ setGenuineState("genuine");
96
+ } else {
97
+ setGenuineState("non-genuine");
98
+ }
99
+ break;
100
+ }
101
+ } else {
102
+ // If no socketEvent, the device is locked or has been unlocked
103
+ if (deviceIsLocked) {
104
+ setDevicePermissionState("unlock-needed");
105
+ } else {
106
+ setDevicePermissionState("unlocked");
107
+ }
108
+ }
109
+ },
110
+ error: (e: any) => {
111
+ if (e instanceof UserRefusedAllowManager) {
112
+ setDevicePermissionState("refused");
113
+ } else if (e instanceof Error) {
114
+ // Probably an error of type DisconnectedDeviceDuringOperation or something else
115
+ setError(e);
116
+ } else {
117
+ setError(new Error(`Unknown error: ${e}`));
118
+ }
119
+ },
120
+ });
121
+
122
+ return () => {
123
+ sub.unsubscribe();
124
+ };
125
+ }, [
126
+ isHookEnabled,
127
+ deviceId,
128
+ lockedDeviceTimeoutMs,
129
+ getGenuineCheckFromDeviceId,
130
+ ]);
131
+
132
+ return {
133
+ genuineState,
134
+ devicePermissionState,
135
+ error,
136
+ resetGenuineCheckState,
137
+ };
138
+ };
@@ -0,0 +1,111 @@
1
+ import { FirmwareUpdateContext } from "@ledgerhq/types-live";
2
+ import { renderHook, act } from "@testing-library/react-hooks";
3
+ import { of } from "rxjs";
4
+ import { getLatestAvailableFirmwareFromDeviceId } from "../getLatestAvailableFirmwareFromDeviceId";
5
+ import { useGetLatestAvailableFirmware } from "./useGetLatestAvailableFirmware";
6
+
7
+ jest.mock("../getLatestAvailableFirmwareFromDeviceId");
8
+ jest.useFakeTimers();
9
+
10
+ const mockedGetLatestAvailableFirmwareFromDeviceId = jest.mocked(
11
+ getLatestAvailableFirmwareFromDeviceId
12
+ );
13
+
14
+ const aLatestFirmwareContext: FirmwareUpdateContext = {
15
+ osu: {
16
+ next_se_firmware_final_version: 1,
17
+ previous_se_firmware_final_version: [],
18
+ id: 0,
19
+ name: "OSU",
20
+ description: null,
21
+ display_name: null,
22
+ notes: null,
23
+ perso: "",
24
+ firmware: "",
25
+ firmware_key: "",
26
+ hash: "",
27
+ date_creation: "",
28
+ date_last_modified: "",
29
+ device_versions: [],
30
+ providers: [],
31
+ },
32
+ final: {
33
+ id: 1,
34
+ name: "FINAL",
35
+ description: null,
36
+ display_name: null,
37
+ notes: null,
38
+ perso: "",
39
+ firmware: "",
40
+ firmware_key: "",
41
+ hash: "",
42
+ date_creation: "",
43
+ date_last_modified: "",
44
+ device_versions: [],
45
+ providers: [],
46
+ version: "",
47
+ se_firmware: 1,
48
+ osu_versions: [],
49
+ mcu_versions: [],
50
+ application_versions: [],
51
+ },
52
+ shouldFlashMCU: false,
53
+ };
54
+
55
+ // TODO: rename into useGetLatestAvailableFirmware ?
56
+ describe("useGetLatestAvailableFirmware", () => {
57
+ afterEach(() => {
58
+ mockedGetLatestAvailableFirmwareFromDeviceId.mockClear();
59
+ jest.clearAllTimers();
60
+ });
61
+
62
+ describe("When no new firmware update is available for a device", () => {
63
+ it("should notify the hook consumer that there is no latest available firmware", async () => {
64
+ mockedGetLatestAvailableFirmwareFromDeviceId.mockReturnValue(
65
+ of({
66
+ firmwareUpdateContext: undefined,
67
+ })
68
+ );
69
+ const { result } = renderHook(() =>
70
+ useGetLatestAvailableFirmware({
71
+ getLatestAvailableFirmwareFromDeviceId:
72
+ mockedGetLatestAvailableFirmwareFromDeviceId,
73
+ deviceId: "A_DEVICE_ID",
74
+ })
75
+ );
76
+
77
+ await act(async () => {
78
+ jest.advanceTimersByTime(1);
79
+ });
80
+
81
+ expect(result.current.status).toEqual("no-available-firmware");
82
+ expect(result.current.error).toBeNull();
83
+ expect(result.current.latestFirmware).toBeNull();
84
+ });
85
+ });
86
+
87
+ describe("When a new firmware update is available for a device", () => {
88
+ it("should notify the hook consumer that there is a new latest available firmware", async () => {
89
+ mockedGetLatestAvailableFirmwareFromDeviceId.mockReturnValue(
90
+ of({
91
+ firmwareUpdateContext: aLatestFirmwareContext,
92
+ })
93
+ );
94
+ const { result } = renderHook(() =>
95
+ useGetLatestAvailableFirmware({
96
+ getLatestAvailableFirmwareFromDeviceId:
97
+ mockedGetLatestAvailableFirmwareFromDeviceId,
98
+ deviceId: "A_DEVICE_ID",
99
+ })
100
+ );
101
+
102
+ await act(async () => {
103
+ jest.advanceTimersByTime(1);
104
+ });
105
+
106
+ expect(result.current.status).toEqual("available-firmware");
107
+ expect(result.current.error).toBeNull();
108
+ expect(result.current.latestFirmware).toEqual(aLatestFirmwareContext);
109
+ });
110
+ });
111
+ });
@@ -0,0 +1,90 @@
1
+ import { useEffect, useState } from "react";
2
+ import type { FirmwareUpdateContext, DeviceId } from "@ledgerhq/types-live";
3
+ import type {
4
+ GetLatestAvailableFirmwareFromDeviceIdArgs,
5
+ GetLatestAvailableFirmwareFromDeviceIdResult,
6
+ GetLatestAvailableFirmwareFromDeviceIdOutput,
7
+ } from "../getLatestAvailableFirmwareFromDeviceId";
8
+ import { getLatestAvailableFirmwareFromDeviceId as defaultGetLatestAvailableFirmwareFromDeviceId } from "../getLatestAvailableFirmwareFromDeviceId";
9
+
10
+ export type FirmwareUpdateGettingStatus =
11
+ | "unchecked"
12
+ | "checking"
13
+ | "no-available-firmware"
14
+ | "available-firmware";
15
+
16
+ export type useGetLatestAvailableFirmwareDependencies = {
17
+ getLatestAvailableFirmwareFromDeviceId?: (
18
+ args: GetLatestAvailableFirmwareFromDeviceIdArgs
19
+ ) => GetLatestAvailableFirmwareFromDeviceIdOutput;
20
+ };
21
+
22
+ export type useGetLatestAvailableFirmwareArgs = {
23
+ isHookEnabled?: boolean;
24
+ deviceId: DeviceId;
25
+ };
26
+
27
+ export type useGetLatestAvailableFirmwareResult = {
28
+ latestFirmware: FirmwareUpdateContext | null;
29
+ status: FirmwareUpdateGettingStatus;
30
+ error: Error | null;
31
+ };
32
+
33
+ /**
34
+ * Hook to get the latest available firmware for a device
35
+ * @param getLatestAvailableFirmwareFromDeviceId An optional function to get the latest available firmware
36
+ * for a given device id, by default set to live-common/hw/getLatestAvailableFirmwareFromDeviceId.
37
+ * This dependency injection is needed for LLD to have the hook working on the internal thread
38
+ * @param isHookEnabled A boolean to enable (true, default value) or disable (false) the hook
39
+ * @param deviceId A device id, or an empty string if device is usb plugged
40
+ * @returns An object containing:
41
+ * - latestFirmware A FirmwareUpdateContext if found, or null if still processing or no available firmware update
42
+ * - status A FirmwareUpdateGettingStatus to notify consumer on the hook state
43
+ * - error: any error that occurred during the process, or null
44
+ */
45
+ export const useGetLatestAvailableFirmware = ({
46
+ getLatestAvailableFirmwareFromDeviceId = defaultGetLatestAvailableFirmwareFromDeviceId,
47
+ isHookEnabled = true,
48
+ deviceId,
49
+ }: useGetLatestAvailableFirmwareArgs &
50
+ useGetLatestAvailableFirmwareDependencies): useGetLatestAvailableFirmwareResult => {
51
+ const [latestFirmware, setLatestFirmware] =
52
+ useState<FirmwareUpdateContext | null>(null);
53
+ const [error, setError] = useState<Error | null>(null);
54
+ const [status, setStatus] =
55
+ useState<FirmwareUpdateGettingStatus>("unchecked");
56
+
57
+ useEffect(() => {
58
+ if (!isHookEnabled) {
59
+ return;
60
+ }
61
+ setStatus("checking");
62
+
63
+ const sub = getLatestAvailableFirmwareFromDeviceId({ deviceId }).subscribe({
64
+ next: ({
65
+ firmwareUpdateContext,
66
+ }: GetLatestAvailableFirmwareFromDeviceIdResult) => {
67
+ if (!firmwareUpdateContext) {
68
+ setLatestFirmware(null);
69
+ setStatus("no-available-firmware");
70
+ } else {
71
+ setLatestFirmware(firmwareUpdateContext);
72
+ setStatus("available-firmware");
73
+ }
74
+ },
75
+ error: (e: any) => {
76
+ if (e instanceof Error) {
77
+ setError(e);
78
+ } else {
79
+ setError(new Error(`Unknown error: ${e}`));
80
+ }
81
+ },
82
+ });
83
+
84
+ return () => {
85
+ sub.unsubscribe();
86
+ };
87
+ }, [deviceId, getLatestAvailableFirmwareFromDeviceId, isHookEnabled]);
88
+
89
+ return { latestFirmware, error, status };
90
+ };
@@ -49,6 +49,7 @@ export async function createSpeculosDevice(
49
49
  ): Promise<{
50
50
  transport: SpeculosTransport;
51
51
  id: string;
52
+ appPath: string;
52
53
  }> {
53
54
  const { model, firmware, appName, appVersion, seed, coinapps, dependency } =
54
55
  arg;
@@ -202,6 +203,7 @@ export async function createSpeculosDevice(
202
203
  return {
203
204
  id: speculosID,
204
205
  transport,
206
+ appPath,
205
207
  };
206
208
  }
207
209
  export type AppCandidate = {
@@ -0,0 +1,88 @@
1
+ import BigNumber from "bignumber.js";
2
+ import type { CryptoCurrency } from "@ledgerhq/types-cryptoassets";
3
+ import type { Account } from "@ledgerhq/types-live";
4
+ import { cryptocurrenciesById } from "@ledgerhq/cryptoassets";
5
+
6
+ export function createFixtureCryptoCurrency(family: string): CryptoCurrency {
7
+ return {
8
+ type: "CryptoCurrency",
9
+ id: "testCoinId",
10
+ coinType: 8008,
11
+ name: "MyCoin",
12
+ managerAppName: "MyCoin",
13
+ ticker: "MYC",
14
+ countervalueTicker: "MYC",
15
+ scheme: "mycoin",
16
+ color: "#ff0000",
17
+ family,
18
+ units: [
19
+ {
20
+ name: "MYC",
21
+ code: "MYC",
22
+ magnitude: 8,
23
+ },
24
+ {
25
+ name: "SmallestUnit",
26
+ code: "SMALLESTUNIT",
27
+ magnitude: 0,
28
+ },
29
+ ],
30
+ explorerViews: [
31
+ {
32
+ address: "https://mycoinexplorer.com/account/$address",
33
+ tx: "https://mycoinexplorer.com/transaction/$hash",
34
+ token: "https://mycoinexplorer.com/token/$contractAddress/?a=$address",
35
+ },
36
+ ],
37
+ };
38
+ }
39
+
40
+ const defaultEthCryptoFamily = cryptocurrenciesById["ethereum"];
41
+
42
+ export function createFixtureAccount(
43
+ id = "00",
44
+ currency: CryptoCurrency = defaultEthCryptoFamily
45
+ ): Account {
46
+ return {
47
+ type: "Account",
48
+ id: `ethereumjs:2:ethereum:0x0${id}:`,
49
+ seedIdentifier: "0x01",
50
+ derivationMode: "ethM",
51
+ index: 0,
52
+ freshAddress: "0x01",
53
+ freshAddressPath: "44'/60'/0'/0/0",
54
+ freshAddresses: [],
55
+ name: "Ethereum 1",
56
+ starred: false,
57
+ used: false,
58
+ balance: new BigNumber("51281813126095913"),
59
+ spendableBalance: new BigNumber("51281813126095913"),
60
+ creationDate: new Date(),
61
+ blockHeight: 8168983,
62
+ currency,
63
+ unit: {
64
+ name: "satoshi",
65
+ code: "BTC",
66
+ magnitude: 5,
67
+ },
68
+ operationsCount: 0,
69
+ operations: [],
70
+ pendingOperations: [],
71
+ lastSyncDate: new Date(),
72
+ balanceHistoryCache: {
73
+ HOUR: {
74
+ balances: [],
75
+ latestDate: undefined,
76
+ },
77
+ DAY: {
78
+ balances: [],
79
+ latestDate: undefined,
80
+ },
81
+ WEEK: {
82
+ balances: [],
83
+ latestDate: undefined,
84
+ },
85
+ },
86
+ swapHistory: [],
87
+ };
88
+ }