@ledgerhq/live-common 27.2.0 → 27.3.0-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 (371) hide show
  1. package/lib/apps/logic.test.js +1 -1
  2. package/lib/apps/logic.test.js.map +1 -1
  3. package/lib/apps/polyfill.d.ts +1 -1
  4. package/lib/apps/polyfill.d.ts.map +1 -1
  5. package/lib/apps/polyfill.js +6 -3
  6. package/lib/apps/polyfill.js.map +1 -1
  7. package/lib/apps/polyfill.test.d.ts +2 -0
  8. package/lib/apps/polyfill.test.d.ts.map +1 -0
  9. package/lib/apps/polyfill.test.js +25 -0
  10. package/lib/apps/polyfill.test.js.map +1 -0
  11. package/lib/apps/support.d.ts.map +1 -1
  12. package/lib/apps/support.js +3 -2
  13. package/lib/apps/support.js.map +1 -1
  14. package/lib/bot/engine.d.ts.map +1 -1
  15. package/lib/bot/engine.js +154 -45
  16. package/lib/bot/engine.js.map +1 -1
  17. package/lib/bot/formatters.d.ts +1 -1
  18. package/lib/bot/formatters.d.ts.map +1 -1
  19. package/lib/bot/formatters.js +9 -3
  20. package/lib/bot/formatters.js.map +1 -1
  21. package/lib/bot/index.d.ts.map +1 -1
  22. package/lib/bot/index.js +29 -11
  23. package/lib/bot/index.js.map +1 -1
  24. package/lib/bot/specs.d.ts +12 -1
  25. package/lib/bot/specs.d.ts.map +1 -1
  26. package/lib/bot/specs.js +75 -1
  27. package/lib/bot/specs.js.map +1 -1
  28. package/lib/bot/types.d.ts +18 -1
  29. package/lib/bot/types.d.ts.map +1 -1
  30. package/lib/currencies/sortByMarketcap.d.ts.map +1 -1
  31. package/lib/currencies/sortByMarketcap.js +5 -1
  32. package/lib/currencies/sortByMarketcap.js.map +1 -1
  33. package/lib/currencies/support.d.ts.map +1 -1
  34. package/lib/currencies/support.js +2 -1
  35. package/lib/currencies/support.js.map +1 -1
  36. package/lib/derivation.d.ts.map +1 -1
  37. package/lib/derivation.js +2 -4
  38. package/lib/derivation.js.map +1 -1
  39. package/lib/env.js +1 -1
  40. package/lib/exchange/swap/getExchangeRates.d.ts.map +1 -1
  41. package/lib/exchange/swap/getExchangeRates.js +6 -3
  42. package/lib/exchange/swap/getExchangeRates.js.map +1 -1
  43. package/lib/exchange/swap/getProviders.d.ts.map +1 -1
  44. package/lib/exchange/swap/getProviders.js +45 -5
  45. package/lib/exchange/swap/getProviders.js.map +1 -1
  46. package/lib/exchange/swap/getProviders.test.d.ts +2 -0
  47. package/lib/exchange/swap/getProviders.test.d.ts.map +1 -0
  48. package/lib/exchange/swap/getProviders.test.js +519 -0
  49. package/lib/exchange/swap/getProviders.test.js.map +1 -0
  50. package/lib/exchange/swap/hooks/useProviderRates.d.ts +1 -0
  51. package/lib/exchange/swap/hooks/useProviderRates.d.ts.map +1 -1
  52. package/lib/exchange/swap/hooks/useProviderRates.js +19 -4
  53. package/lib/exchange/swap/hooks/useProviderRates.js.map +1 -1
  54. package/lib/exchange/swap/hooks/useProviderRates.test.js +42 -0
  55. package/lib/exchange/swap/hooks/useProviderRates.test.js.map +1 -1
  56. package/lib/exchange/swap/hooks/useSwapTransaction.d.ts +1 -0
  57. package/lib/exchange/swap/hooks/useSwapTransaction.d.ts.map +1 -1
  58. package/lib/exchange/swap/hooks/useSwapTransaction.js +2 -1
  59. package/lib/exchange/swap/hooks/useSwapTransaction.js.map +1 -1
  60. package/lib/exchange/swap/index.d.ts +2 -1
  61. package/lib/exchange/swap/index.d.ts.map +1 -1
  62. package/lib/exchange/swap/index.js +11 -1
  63. package/lib/exchange/swap/index.js.map +1 -1
  64. package/lib/exchange/swap/index.test.js +22 -0
  65. package/lib/exchange/swap/index.test.js.map +1 -1
  66. package/lib/exchange/swap/mock.js +1 -1
  67. package/lib/exchange/swap/mock.js.map +1 -1
  68. package/lib/exchange/swap/types.d.ts +14 -0
  69. package/lib/exchange/swap/types.d.ts.map +1 -1
  70. package/lib/exchange/swap/utils/index.d.ts +1 -0
  71. package/lib/exchange/swap/utils/index.d.ts.map +1 -1
  72. package/lib/exchange/swap/utils/index.js +6 -1
  73. package/lib/exchange/swap/utils/index.js.map +1 -1
  74. package/lib/exchange/swap/utils/index.test.js +12 -0
  75. package/lib/exchange/swap/utils/index.test.js.map +1 -1
  76. package/lib/families/algorand/specs.d.ts.map +1 -1
  77. package/lib/families/algorand/specs.js +2 -0
  78. package/lib/families/algorand/specs.js.map +1 -1
  79. package/lib/families/algorand/speculos-deviceActions.d.ts.map +1 -1
  80. package/lib/families/algorand/speculos-deviceActions.js +2 -29
  81. package/lib/families/algorand/speculos-deviceActions.js.map +1 -1
  82. package/lib/families/bitcoin/specs.d.ts +0 -1
  83. package/lib/families/bitcoin/specs.d.ts.map +1 -1
  84. package/lib/families/bitcoin/specs.js +65 -48
  85. package/lib/families/bitcoin/specs.js.map +1 -1
  86. package/lib/families/bitcoin/speculos-deviceActions.d.ts.map +1 -1
  87. package/lib/families/bitcoin/speculos-deviceActions.js +2 -22
  88. package/lib/families/bitcoin/speculos-deviceActions.js.map +1 -1
  89. package/lib/families/cardano/specs.d.ts.map +1 -1
  90. package/lib/families/cardano/specs.js +9 -4
  91. package/lib/families/cardano/specs.js.map +1 -1
  92. package/lib/families/cardano/speculos-deviceActions.d.ts.map +1 -1
  93. package/lib/families/cardano/speculos-deviceActions.js +2 -10
  94. package/lib/families/cardano/speculos-deviceActions.js.map +1 -1
  95. package/lib/families/celo/specs/createSendMutation.d.ts +1 -0
  96. package/lib/families/celo/specs/createSendMutation.d.ts.map +1 -1
  97. package/lib/families/celo/specs/createSendMutation.js +7 -5
  98. package/lib/families/celo/specs/createSendMutation.js.map +1 -1
  99. package/lib/families/celo/specs.d.ts.map +1 -1
  100. package/lib/families/celo/specs.js +1 -0
  101. package/lib/families/celo/specs.js.map +1 -1
  102. package/lib/families/celo/speculos-deviceActions.d.ts.map +1 -1
  103. package/lib/families/celo/speculos-deviceActions.js +3 -10
  104. package/lib/families/celo/speculos-deviceActions.js.map +1 -1
  105. package/lib/families/cosmos/helpers.d.ts +9 -0
  106. package/lib/families/cosmos/helpers.d.ts.map +1 -0
  107. package/lib/families/cosmos/helpers.js +20 -0
  108. package/lib/families/cosmos/helpers.js.map +1 -0
  109. package/lib/families/cosmos/helpers.unit.test.d.ts +2 -0
  110. package/lib/families/cosmos/helpers.unit.test.d.ts.map +1 -0
  111. package/lib/families/cosmos/helpers.unit.test.js +56 -0
  112. package/lib/families/cosmos/helpers.unit.test.js.map +1 -0
  113. package/lib/families/cosmos/js-signOperation.d.ts.map +1 -1
  114. package/lib/families/cosmos/js-signOperation.js +5 -3
  115. package/lib/families/cosmos/js-signOperation.js.map +1 -1
  116. package/lib/families/cosmos/js-synchronisation.d.ts.map +1 -1
  117. package/lib/families/cosmos/js-synchronisation.js +99 -95
  118. package/lib/families/cosmos/js-synchronisation.js.map +1 -1
  119. package/lib/families/cosmos/specs.d.ts.map +1 -1
  120. package/lib/families/cosmos/specs.js +5 -1
  121. package/lib/families/cosmos/specs.js.map +1 -1
  122. package/lib/families/crypto_org/specs.d.ts.map +1 -1
  123. package/lib/families/crypto_org/specs.js +9 -8
  124. package/lib/families/crypto_org/specs.js.map +1 -1
  125. package/lib/families/elrond/specs.d.ts.map +1 -1
  126. package/lib/families/elrond/specs.js +1 -0
  127. package/lib/families/elrond/specs.js.map +1 -1
  128. package/lib/families/elrond/speculos-deviceActions.d.ts.map +1 -1
  129. package/lib/families/elrond/speculos-deviceActions.js +3 -8
  130. package/lib/families/elrond/speculos-deviceActions.js.map +1 -1
  131. package/lib/families/ethereum/specs.d.ts.map +1 -1
  132. package/lib/families/ethereum/specs.js +20 -8
  133. package/lib/families/ethereum/specs.js.map +1 -1
  134. package/lib/families/ethereum/speculos-deviceActions.d.ts.map +1 -1
  135. package/lib/families/ethereum/speculos-deviceActions.js +10 -33
  136. package/lib/families/ethereum/speculos-deviceActions.js.map +1 -1
  137. package/lib/families/evm/specs.d.ts.map +1 -1
  138. package/lib/families/evm/specs.js +20 -10
  139. package/lib/families/evm/specs.js.map +1 -1
  140. package/lib/families/evm/speculos-deviceActions.d.ts.map +1 -1
  141. package/lib/families/evm/speculos-deviceActions.js +5 -25
  142. package/lib/families/evm/speculos-deviceActions.js.map +1 -1
  143. package/lib/families/filecoin/specs.d.ts.map +1 -1
  144. package/lib/families/filecoin/specs.js +3 -0
  145. package/lib/families/filecoin/specs.js.map +1 -1
  146. package/lib/families/filecoin/speculos-deviceActions.d.ts.map +1 -1
  147. package/lib/families/filecoin/speculos-deviceActions.js +6 -7
  148. package/lib/families/filecoin/speculos-deviceActions.js.map +1 -1
  149. package/lib/families/hedera/specs.d.ts.map +1 -1
  150. package/lib/families/hedera/specs.js +2 -0
  151. package/lib/families/hedera/specs.js.map +1 -1
  152. package/lib/families/osmosis/specs.d.ts.map +1 -1
  153. package/lib/families/osmosis/specs.js +3 -0
  154. package/lib/families/osmosis/specs.js.map +1 -1
  155. package/lib/families/polkadot/specs.d.ts.map +1 -1
  156. package/lib/families/polkadot/specs.js +4 -1
  157. package/lib/families/polkadot/specs.js.map +1 -1
  158. package/lib/families/polkadot/speculos-deviceActions.d.ts.map +1 -1
  159. package/lib/families/polkadot/speculos-deviceActions.js +3 -10
  160. package/lib/families/polkadot/speculos-deviceActions.js.map +1 -1
  161. package/lib/families/ripple/specs.d.ts.map +1 -1
  162. package/lib/families/ripple/specs.js +2 -0
  163. package/lib/families/ripple/specs.js.map +1 -1
  164. package/lib/families/ripple/speculos-deviceActions.d.ts.map +1 -1
  165. package/lib/families/ripple/speculos-deviceActions.js +2 -22
  166. package/lib/families/ripple/speculos-deviceActions.js.map +1 -1
  167. package/lib/families/solana/specs.d.ts.map +1 -1
  168. package/lib/families/solana/specs.js +7 -3
  169. package/lib/families/solana/specs.js.map +1 -1
  170. package/lib/families/solana/speculos-deviceActions.d.ts.map +1 -1
  171. package/lib/families/solana/speculos-deviceActions.js +5 -7
  172. package/lib/families/solana/speculos-deviceActions.js.map +1 -1
  173. package/lib/families/stellar/specs.d.ts.map +1 -1
  174. package/lib/families/stellar/specs.js +1 -0
  175. package/lib/families/stellar/specs.js.map +1 -1
  176. package/lib/families/stellar/speculos-deviceActions.d.ts.map +1 -1
  177. package/lib/families/stellar/speculos-deviceActions.js +4 -8
  178. package/lib/families/stellar/speculos-deviceActions.js.map +1 -1
  179. package/lib/families/tezos/specs.d.ts.map +1 -1
  180. package/lib/families/tezos/specs.js +6 -1
  181. package/lib/families/tezos/specs.js.map +1 -1
  182. package/lib/families/tezos/speculos-deviceActions.d.ts.map +1 -1
  183. package/lib/families/tezos/speculos-deviceActions.js +6 -11
  184. package/lib/families/tezos/speculos-deviceActions.js.map +1 -1
  185. package/lib/families/tron/specs.d.ts.map +1 -1
  186. package/lib/families/tron/specs.js +16 -1
  187. package/lib/families/tron/specs.js.map +1 -1
  188. package/lib/families/tron/speculos-deviceActions.d.ts.map +1 -1
  189. package/lib/families/tron/speculos-deviceActions.js +2 -14
  190. package/lib/families/tron/speculos-deviceActions.js.map +1 -1
  191. package/lib/families/tron/synchronisation.integration.test.d.ts +2 -0
  192. package/lib/families/tron/synchronisation.integration.test.d.ts.map +1 -0
  193. package/lib/families/tron/{synchronisation.test.js → synchronisation.integration.test.js} +1 -1
  194. package/lib/families/tron/synchronisation.integration.test.js.map +1 -0
  195. package/lib/featureFlags/defaultFeatures.d.ts.map +1 -1
  196. package/lib/featureFlags/defaultFeatures.js +6 -0
  197. package/lib/featureFlags/defaultFeatures.js.map +1 -1
  198. package/lib/generated/specs.d.ts +0 -1
  199. package/lib/generated/specs.d.ts.map +1 -1
  200. package/lib/hw/actions/installLanguage.js +1 -1
  201. package/lib/hw/extractOnboardingState.d.ts +5 -1
  202. package/lib/hw/extractOnboardingState.d.ts.map +1 -1
  203. package/lib/hw/extractOnboardingState.js +17 -9
  204. package/lib/hw/extractOnboardingState.js.map +1 -1
  205. package/lib/hw/extractOnboardingState.test.js +21 -11
  206. package/lib/hw/extractOnboardingState.test.js.map +1 -1
  207. package/lib/load/speculos.d.ts.map +1 -1
  208. package/lib/load/speculos.js +39 -15
  209. package/lib/load/speculos.js.map +1 -1
  210. package/lib/manager/hooks.d.ts +4 -1
  211. package/lib/manager/hooks.d.ts.map +1 -1
  212. package/lib/manager/hooks.js +4 -3
  213. package/lib/manager/hooks.js.map +1 -1
  214. package/lib/manager/localization.js +2 -2
  215. package/lib/manager/localization.js.map +1 -1
  216. package/lib/mock/account.d.ts.map +1 -1
  217. package/lib/mock/account.js +17 -19
  218. package/lib/mock/account.js.map +1 -1
  219. package/lib/notifications/ServiceStatusProvider/index.d.ts.map +1 -1
  220. package/lib/notifications/ServiceStatusProvider/index.js +5 -1
  221. package/lib/notifications/ServiceStatusProvider/index.js.map +1 -1
  222. package/lib/postOnboarding/PostOnboardingProvider.d.ts +20 -0
  223. package/lib/postOnboarding/PostOnboardingProvider.d.ts.map +1 -0
  224. package/lib/postOnboarding/PostOnboardingProvider.js +33 -0
  225. package/lib/postOnboarding/PostOnboardingProvider.js.map +1 -0
  226. package/lib/postOnboarding/actions.d.ts +20 -0
  227. package/lib/postOnboarding/actions.d.ts.map +1 -0
  228. package/lib/postOnboarding/actions.js +37 -0
  229. package/lib/postOnboarding/actions.js.map +1 -0
  230. package/lib/postOnboarding/hooks/index.d.ts +6 -0
  231. package/lib/postOnboarding/hooks/index.d.ts.map +1 -0
  232. package/lib/postOnboarding/hooks/index.js +22 -0
  233. package/lib/postOnboarding/hooks/index.js.map +1 -0
  234. package/lib/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.d.ts +8 -0
  235. package/lib/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.d.ts.map +1 -0
  236. package/lib/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.js +16 -0
  237. package/lib/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.js.map +1 -0
  238. package/lib/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.test.d.ts +2 -0
  239. package/lib/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.test.d.ts.map +1 -0
  240. package/lib/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.test.js +75 -0
  241. package/lib/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.test.js.map +1 -0
  242. package/lib/postOnboarding/hooks/usePostOnboardingContext.d.ts +3 -0
  243. package/lib/postOnboarding/hooks/usePostOnboardingContext.d.ts.map +1 -0
  244. package/lib/postOnboarding/hooks/usePostOnboardingContext.js +10 -0
  245. package/lib/postOnboarding/hooks/usePostOnboardingContext.js.map +1 -0
  246. package/lib/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.d.ts +8 -0
  247. package/lib/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.d.ts.map +1 -0
  248. package/lib/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.js +20 -0
  249. package/lib/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.js.map +1 -0
  250. package/lib/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.test.d.ts +2 -0
  251. package/lib/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.test.d.ts.map +1 -0
  252. package/lib/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.test.js +64 -0
  253. package/lib/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.test.js.map +1 -0
  254. package/lib/postOnboarding/hooks/usePostOnboardingHubState.d.ts +12 -0
  255. package/lib/postOnboarding/hooks/usePostOnboardingHubState.d.ts.map +1 -0
  256. package/lib/postOnboarding/hooks/usePostOnboardingHubState.js +65 -0
  257. package/lib/postOnboarding/hooks/usePostOnboardingHubState.js.map +1 -0
  258. package/lib/postOnboarding/hooks/usePostOnboardingHubState.test.d.ts +2 -0
  259. package/lib/postOnboarding/hooks/usePostOnboardingHubState.test.d.ts.map +1 -0
  260. package/lib/postOnboarding/hooks/usePostOnboardingHubState.test.js +129 -0
  261. package/lib/postOnboarding/hooks/usePostOnboardingHubState.test.js.map +1 -0
  262. package/lib/postOnboarding/hooks/useStartPostOnboardingCallback.d.ts +13 -0
  263. package/lib/postOnboarding/hooks/useStartPostOnboardingCallback.d.ts.map +1 -0
  264. package/lib/postOnboarding/hooks/useStartPostOnboardingCallback.js +34 -0
  265. package/lib/postOnboarding/hooks/useStartPostOnboardingCallback.js.map +1 -0
  266. package/lib/postOnboarding/mock.d.ts +8 -0
  267. package/lib/postOnboarding/mock.d.ts.map +1 -0
  268. package/lib/postOnboarding/mock.js +46 -0
  269. package/lib/postOnboarding/mock.js.map +1 -0
  270. package/lib/postOnboarding/reducer.d.ts +22 -0
  271. package/lib/postOnboarding/reducer.d.ts.map +1 -0
  272. package/lib/postOnboarding/reducer.js +71 -0
  273. package/lib/postOnboarding/reducer.js.map +1 -0
  274. package/lib/postOnboarding/reducer.test.d.ts +2 -0
  275. package/lib/postOnboarding/reducer.test.d.ts.map +1 -0
  276. package/lib/postOnboarding/reducer.test.js +251 -0
  277. package/lib/postOnboarding/reducer.test.js.map +1 -0
  278. package/package.json +24 -20
  279. package/src/__tests__/__snapshots__/portfolio.v2.ts.snap +16 -0
  280. package/src/apps/__snapshots__/logic.test.ts.snap +18 -11
  281. package/src/apps/logic.test.ts +1 -2
  282. package/src/apps/polyfill.test.ts +24 -0
  283. package/src/apps/polyfill.ts +7 -2
  284. package/src/apps/support.ts +2 -1
  285. package/src/bot/engine.ts +178 -35
  286. package/src/bot/formatters.ts +15 -2
  287. package/src/bot/index.ts +48 -19
  288. package/src/bot/specs.ts +95 -1
  289. package/src/bot/types.ts +23 -1
  290. package/src/currencies/__snapshots__/sortByMarketcap.test.ts.snap +55 -6
  291. package/src/currencies/sortByMarketcap.ts +6 -1
  292. package/src/currencies/support.ts +2 -1
  293. package/src/derivation.ts +2 -4
  294. package/src/env.ts +1 -1
  295. package/src/exchange/swap/getExchangeRates.ts +12 -5
  296. package/src/exchange/swap/getProviders.test.ts +450 -0
  297. package/src/exchange/swap/getProviders.ts +31 -8
  298. package/src/exchange/swap/hooks/useProviderRates.test.ts +43 -0
  299. package/src/exchange/swap/hooks/useProviderRates.ts +22 -3
  300. package/src/exchange/swap/hooks/useSwapTransaction.ts +3 -1
  301. package/src/exchange/swap/index.test.ts +36 -1
  302. package/src/exchange/swap/index.ts +15 -0
  303. package/src/exchange/swap/mock.ts +2 -2
  304. package/src/exchange/swap/types.ts +11 -0
  305. package/src/exchange/swap/utils/index.test.ts +19 -0
  306. package/src/exchange/swap/utils/index.ts +5 -0
  307. package/src/families/algorand/specs.ts +3 -1
  308. package/src/families/algorand/speculos-deviceActions.ts +4 -35
  309. package/src/families/bitcoin/specs.ts +72 -56
  310. package/src/families/bitcoin/speculos-deviceActions.ts +3 -26
  311. package/src/families/cardano/specs.ts +9 -4
  312. package/src/families/cardano/speculos-deviceActions.ts +3 -14
  313. package/src/families/celo/specs/createSendMutation.ts +5 -3
  314. package/src/families/celo/specs.ts +2 -0
  315. package/src/families/celo/speculos-deviceActions.ts +6 -14
  316. package/src/families/cosmos/__snapshots__/bridge.integration.test.ts.snap +24 -44
  317. package/src/families/cosmos/helpers.ts +21 -0
  318. package/src/families/cosmos/helpers.unit.test.ts +63 -0
  319. package/src/families/cosmos/js-signOperation.ts +6 -3
  320. package/src/families/cosmos/js-synchronisation.ts +120 -119
  321. package/src/families/cosmos/specs.ts +11 -2
  322. package/src/families/crypto_org/specs.ts +12 -19
  323. package/src/families/elrond/specs.ts +1 -0
  324. package/src/families/elrond/speculos-deviceActions.ts +4 -9
  325. package/src/families/ethereum/specs.ts +34 -38
  326. package/src/families/ethereum/speculos-deviceActions.ts +16 -46
  327. package/src/families/evm/specs.ts +18 -8
  328. package/src/families/evm/speculos-deviceActions.ts +7 -35
  329. package/src/families/filecoin/specs.ts +4 -1
  330. package/src/families/filecoin/speculos-deviceActions.ts +7 -8
  331. package/src/families/hedera/specs.ts +3 -1
  332. package/src/families/osmosis/specs.ts +4 -1
  333. package/src/families/polkadot/specs.ts +11 -2
  334. package/src/families/polkadot/speculos-deviceActions.ts +5 -16
  335. package/src/families/ripple/specs.ts +3 -1
  336. package/src/families/ripple/speculos-deviceActions.ts +3 -28
  337. package/src/families/solana/specs.ts +15 -4
  338. package/src/families/solana/speculos-deviceActions.ts +6 -8
  339. package/src/families/stellar/specs.ts +1 -0
  340. package/src/families/stellar/speculos-deviceActions.ts +5 -11
  341. package/src/families/tezos/specs.ts +7 -5
  342. package/src/families/tezos/speculos-deviceActions.ts +9 -16
  343. package/src/families/tron/specs.ts +31 -3
  344. package/src/families/tron/speculos-deviceActions.ts +4 -12
  345. package/src/families/tron/{synchronisation.test.ts → synchronisation.integration.test.ts} +0 -0
  346. package/src/featureFlags/defaultFeatures.ts +6 -0
  347. package/src/hw/actions/installLanguage.ts +1 -1
  348. package/src/hw/extractOnboardingState.test.ts +29 -12
  349. package/src/hw/extractOnboardingState.ts +17 -9
  350. package/src/load/speculos.ts +42 -21
  351. package/src/manager/hooks.ts +6 -6
  352. package/src/manager/localization.ts +2 -2
  353. package/src/mock/account.ts +18 -20
  354. package/src/notifications/ServiceStatusProvider/index.tsx +8 -1
  355. package/src/postOnboarding/PostOnboardingProvider.tsx +49 -0
  356. package/src/postOnboarding/actions.ts +40 -0
  357. package/src/postOnboarding/hooks/index.ts +5 -0
  358. package/src/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.test.ts +82 -0
  359. package/src/postOnboarding/hooks/useAllPostOnboardingActionsCompleted.ts +12 -0
  360. package/src/postOnboarding/hooks/usePostOnboardingContext.ts +9 -0
  361. package/src/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.test.ts +83 -0
  362. package/src/postOnboarding/hooks/usePostOnboardingEntryPointVisibleOnWallet.ts +22 -0
  363. package/src/postOnboarding/hooks/usePostOnboardingHubState.test.ts +184 -0
  364. package/src/postOnboarding/hooks/usePostOnboardingHubState.ts +56 -0
  365. package/src/postOnboarding/hooks/useStartPostOnboardingCallback.ts +38 -0
  366. package/src/postOnboarding/mock.ts +53 -0
  367. package/src/postOnboarding/reducer.test.ts +247 -0
  368. package/src/postOnboarding/reducer.ts +105 -0
  369. package/lib/families/tron/synchronisation.test.d.ts +0 -2
  370. package/lib/families/tron/synchronisation.test.d.ts.map +0 -1
  371. package/lib/families/tron/synchronisation.test.js.map +0 -1
@@ -21,6 +21,24 @@ let idCounter = 0;
21
21
 
22
22
  const data = {};
23
23
 
24
+ const modelMap: Record<string, DeviceModelId> = {
25
+ nanos: <DeviceModelId>"nanoS",
26
+ "nanos+": <DeviceModelId>"nanoSP",
27
+ nanox: <DeviceModelId>"nanoX",
28
+ blue: <DeviceModelId>"blue",
29
+ };
30
+ const reverseModelMap = {};
31
+ for (const k in modelMap) {
32
+ reverseModelMap[modelMap[k]] = k;
33
+ }
34
+ const modelMapPriority: Record<string, number> = {
35
+ nanos: 4,
36
+ "nanos+": 3,
37
+ nanox: 2,
38
+ blue: 1,
39
+ };
40
+ const defaultFirmware: Record<string, string> = {};
41
+
24
42
  export async function releaseSpeculosDevice(id: string) {
25
43
  log("speculos", "release " + id);
26
44
  const obj = data[id];
@@ -34,6 +52,23 @@ export function closeAllSpeculosDevices() {
34
52
  return Promise.all(Object.keys(data).map(releaseSpeculosDevice));
35
53
  }
36
54
 
55
+ // to keep in sync from https://github.com/LedgerHQ/speculos/tree/master/speculos/cxlib
56
+ const existingSdks = [
57
+ "nanos-cx-2.0.elf",
58
+ "nanos-cx-2.1.elf",
59
+ "nanosp-cx-1.0.3.elf",
60
+ "nanosp-cx-1.0.elf",
61
+ "nanox-cx-2.0.2.elf",
62
+ "nanox-cx-2.0.elf",
63
+ ];
64
+
65
+ function inferSDK(firmware: string, model: string): string | undefined {
66
+ const begin = `${model.toLowerCase()}-cx-`;
67
+ if (existingSdks.includes(begin + firmware + ".elf")) return firmware;
68
+ const shortVersion = firmware.slice(0, 3);
69
+ if (existingSdks.includes(begin + shortVersion + ".elf")) return shortVersion;
70
+ }
71
+
37
72
  export async function createSpeculosDevice(
38
73
  arg: {
39
74
  model: DeviceModelId;
@@ -59,14 +94,11 @@ export async function createSpeculosDevice(
59
94
  const buttonPort = 42000 + idCounter;
60
95
  const automationPort = 43000 + idCounter;
61
96
 
62
- // workaround until we have a clearer way to resolve sdk for a firmware.
63
- const sdk =
64
- model === "nanoX" ? "1.2" : model === "nanoS" ? firmware.slice(0, 3) : null;
97
+ const sdk = inferSDK(firmware, model);
65
98
 
66
- const appPath = `./apps/${model.toLowerCase()}/${firmware}/${appName.replace(
67
- / /g,
68
- ""
69
- )}/app_${appVersion}.elf`;
99
+ const appPath = `./apps/${
100
+ reverseModelMap[model]
101
+ }/${firmware}/${appName.replace(/ /g, "")}/app_${appVersion}.elf`;
70
102
 
71
103
  const params = [
72
104
  "run",
@@ -91,7 +123,7 @@ export async function createSpeculosDevice(
91
123
  ...(dependency
92
124
  ? [
93
125
  "-l",
94
- `${dependency}:${`./apps/${model.toLowerCase()}/${firmware}/${dependency}/app_${appVersion}.elf`}`,
126
+ `${dependency}:${`./apps/${reverseModelMap[model]}/${firmware}/${dependency}/app_${appVersion}.elf`}`,
95
127
  ]
96
128
  : []),
97
129
  ...(sdk ? ["--sdk", sdk] : []),
@@ -213,17 +245,6 @@ export type AppCandidate = {
213
245
  appName: string;
214
246
  appVersion: string;
215
247
  };
216
- const modelMap: Record<string, DeviceModelId> = {
217
- nanos: <DeviceModelId>"nanoS",
218
- nanox: <DeviceModelId>"nanoX",
219
- blue: <DeviceModelId>"blue",
220
- };
221
- const modelMapPriority: Record<string, number> = {
222
- nanos: 3,
223
- nanox: 2,
224
- blue: 1,
225
- };
226
- const defaultFirmware: Record<string, string> = {};
227
248
 
228
249
  function hackBadSemver(str) {
229
250
  const split = str.split(".");
@@ -268,7 +289,6 @@ export async function listAppCandidates(cwd: string): Promise<AppCandidate[]> {
268
289
  if (elf.startsWith("app_") && elf.endsWith(".elf")) {
269
290
  const p4 = path.join(p3, elf);
270
291
  const appVersion = elf.slice(4, elf.length - 4);
271
-
272
292
  if (
273
293
  semver.valid(appVersion) &&
274
294
  !shouldUpgrade(model, appName, appVersion) &&
@@ -318,7 +338,8 @@ export function appCandidatesMatches(
318
338
  hackBadSemver(appCandidate.firmware),
319
339
  searchFirmware
320
340
  ))) &&
321
- ((!search.appVersion && !appCandidate.appVersion.includes("-")) ||
341
+ (appCandidate.appVersion === search.appVersion ||
342
+ (!search.appVersion && !appCandidate.appVersion.includes("-")) ||
322
343
  (search.appVersion &&
323
344
  semver.satisfies(appCandidate.appVersion, search.appVersion)))
324
345
  );
@@ -76,18 +76,18 @@ export function useManagerBlueDot(
76
76
  return display;
77
77
  }
78
78
 
79
- export const useAvailableLanguagesForDevice = (
80
- deviceInfo: DeviceInfo
81
- ): Language[] => {
79
+ export const useAvailableLanguagesForDevice = (deviceInfo?: DeviceInfo) => {
82
80
  const [availableLanguages, setAvailableLanguages] = useState<Language[]>([]);
81
+ const [loaded, setLoaded] = useState(false);
83
82
 
84
83
  useEffect(() => {
85
84
  if (deviceInfo) {
86
85
  manager
87
86
  .getAvailableLanguagesDevice(deviceInfo)
88
- .then(setAvailableLanguages);
87
+ .then(setAvailableLanguages)
88
+ .finally(() => setLoaded(true));
89
89
  }
90
- }, [deviceInfo, setAvailableLanguages]);
90
+ }, [deviceInfo]);
91
91
 
92
- return availableLanguages;
92
+ return { availableLanguages, loaded };
93
93
  };
@@ -3,8 +3,8 @@ import { satisfies as versionSatisfies } from "semver";
3
3
 
4
4
  const deviceVersionRangesForLocalization: { [key in DeviceModelId]?: string } =
5
5
  {
6
- nanoX: ">=2.1.0 || =2.1.0-lo2 || =2.1.0-lo4 || =2.1.0-lo5",
7
- nanoSP: ">=1.1.0 || =1.1.0-lo1",
6
+ nanoX: ">=2.1.0 || =2.1.0-lo2 || =2.1.0-lo4 || =2.1.0-lo5 || =2.1.0-rc1",
7
+ nanoSP: ">=1.1.0 || =1.1.0-lo1 || =1.1.0-rc1",
8
8
  };
9
9
 
10
10
  export const isDeviceLocalizationSupported = (
@@ -183,25 +183,22 @@ const hardcodedMarketcap = [
183
183
  "algorand/asa/163650",
184
184
  ];
185
185
  // for the mock generation we need to adjust to the actual market price of things, we want to avoid having things < 0.01 EUR
186
- const tickerApproxMarketPrice = {
187
- BTC: 0.0073059,
188
- ETH: 5.7033e-14,
189
- ETC: 1.4857e-15,
190
- BCH: 0.0011739,
191
- BTG: 0.00005004,
192
- LTC: 0.00011728,
193
- XRP: 0.000057633,
194
- DOGE: 4.9e-9,
195
- DASH: 0.0003367,
196
- PPC: 0.000226,
197
- ZEC: 0.000205798,
186
+ const currencyIdApproxMarketPrice = {
187
+ bitcoin: 0.0073059,
188
+ ethereum: 5.7033e-14,
189
+ ethereum_classic: 1.4857e-15,
190
+ bitcoin_cash: 0.0011739,
191
+ bitcoin_gold: 0.00005004,
192
+ litecoin: 0.00011728,
193
+ ripple: 0.000057633,
194
+ dogecoin: 4.9e-9,
195
+ dash: 0.0003367,
196
+ peercoin: 0.000226,
197
+ zcash: 0.000205798,
198
198
  };
199
199
  // mock only use subset of cryptocurrencies to not affect tests when adding coins
200
200
  const currencies = listCryptoCurrencies().filter(
201
- (c) =>
202
- tickerApproxMarketPrice[c.ticker] &&
203
- // take only "official" currencies, otherwise you might end up with ticker collisions
204
- c.name === c.managerAppName
201
+ (c) => currencyIdApproxMarketPrice[c.id]
205
202
  );
206
203
  // TODO fix the mock to never generate negative balance...
207
204
 
@@ -225,11 +222,12 @@ export function genOperation(
225
222
  );
226
223
  const address = genAddress(superAccount.currency, rng);
227
224
  const type = rng.next() < 0.3 ? "OUT" : "IN";
225
+ const divider =
226
+ (account.type === "Account" &&
227
+ currencyIdApproxMarketPrice[account.currency.id]) ||
228
+ currencyIdApproxMarketPrice.bitcoin;
228
229
  const value = new BigNumber(
229
- Math.floor(
230
- rng.nextInt(0, 100000 * rng.next() * rng.next()) /
231
- (tickerApproxMarketPrice[ticker] || tickerApproxMarketPrice.BTC)
232
- )
230
+ Math.floor(rng.nextInt(0, 100000 * rng.next() * rng.next()) / divider)
233
231
  );
234
232
 
235
233
  if (Number.isNaN(value)) {
@@ -47,7 +47,14 @@ export function filterServiceStatusIncidents(
47
47
  incidents: Incident[],
48
48
  tickers: string[] = []
49
49
  ): Incident[] {
50
- if (!tickers || tickers.length === 0) return [];
50
+ if (
51
+ !tickers ||
52
+ tickers.length === 0 ||
53
+ !incidents ||
54
+ incidents.length === 0
55
+ ) {
56
+ return [];
57
+ }
51
58
 
52
59
  const tickersRegex = new RegExp(escapeRegExp(tickers.join("|")), "i");
53
60
  return incidents.filter(
@@ -0,0 +1,49 @@
1
+ import React, { PropsWithChildren } from "react";
2
+ import { DeviceModelId } from "@ledgerhq/types-devices";
3
+ import {
4
+ PostOnboardingAction,
5
+ PostOnboardingActionId,
6
+ } from "@ledgerhq/types-live";
7
+
8
+ export type PostOnboardingDependencies = {
9
+ /** function to navigate to the post onboarding hub */
10
+ navigateToPostOnboardingHub: () => void;
11
+ /**
12
+ * function that returns a `PostOnboardingAction` for the given
13
+ * `PostOnboardingActionId` parameter.
14
+ * */
15
+ getPostOnboardingAction?: (
16
+ id: PostOnboardingActionId
17
+ ) => PostOnboardingAction;
18
+ /**
19
+ * function that returns an array of `PostOnboardingAction` for the given
20
+ * `DeviceModelId` parameter.
21
+ */
22
+ getPostOnboardingActionsForDevice: (
23
+ id: DeviceModelId,
24
+ mock?: boolean
25
+ ) => PostOnboardingAction[];
26
+ };
27
+
28
+ const defaultValue: PostOnboardingDependencies = {
29
+ navigateToPostOnboardingHub: () => {},
30
+ getPostOnboardingAction: undefined,
31
+ getPostOnboardingActionsForDevice: () => [],
32
+ };
33
+
34
+ export const PostOnboardingContext = React.createContext(defaultValue);
35
+
36
+ export const PostOnboardingProvider: React.FC<
37
+ PropsWithChildren<PostOnboardingDependencies>
38
+ > = ({ children, ...props }) => {
39
+ if (!props.getPostOnboardingAction) {
40
+ console.warn(
41
+ "`getPostOnboardingAction` prop is undefined in the current PostOnboardingProvider. Without this, the post onboarding is not able to function normally."
42
+ );
43
+ }
44
+ return (
45
+ <PostOnboardingContext.Provider value={props}>
46
+ {children}
47
+ </PostOnboardingContext.Provider>
48
+ );
49
+ };
@@ -0,0 +1,40 @@
1
+ import { DeviceModelId } from "@ledgerhq/types-devices";
2
+ import {
3
+ PostOnboardingActionId,
4
+ PostOnboardingState,
5
+ } from "@ledgerhq/types-live";
6
+
7
+ type ActionCreatorPlain = () => { type: string };
8
+ type ActionCreator<T> = (arg0: T) => ReturnType<ActionCreatorPlain> & T;
9
+
10
+ export const importPostOnboardingState: ActionCreator<{
11
+ newState: PostOnboardingState;
12
+ }> = ({ newState }) => ({
13
+ type: "POST_ONBOARDING_IMPORT_STATE",
14
+ newState,
15
+ });
16
+
17
+ export const initPostOnboarding: ActionCreator<{
18
+ deviceModelId: DeviceModelId;
19
+ actionsIds: PostOnboardingActionId[];
20
+ }> = ({ deviceModelId, actionsIds }) => ({
21
+ type: "POST_ONBOARDING_INIT",
22
+ deviceModelId,
23
+ actionsIds,
24
+ });
25
+
26
+ export const setPostOnboardingActionCompleted: ActionCreator<{
27
+ actionId: PostOnboardingActionId;
28
+ }> = ({ actionId }) => ({
29
+ type: "POST_ONBOARDING_SET_ACTION_COMPLETED",
30
+ actionId,
31
+ });
32
+
33
+ export const clearPostOnboardingLastActionCompleted: ActionCreatorPlain =
34
+ () => ({
35
+ type: "POST_ONBOARDING_CLEAR_LAST_ACTION_COMPLETED",
36
+ });
37
+
38
+ export const hidePostOnboardingWalletEntryPoint: ActionCreatorPlain = () => ({
39
+ type: "POST_ONBOARDING_HIDE_WALLET_ENTRY_POINT",
40
+ });
@@ -0,0 +1,5 @@
1
+ export * from "./useAllPostOnboardingActionsCompleted";
2
+ export * from "./usePostOnboardingContext";
3
+ export * from "./usePostOnboardingEntryPointVisibleOnWallet";
4
+ export * from "./usePostOnboardingHubState";
5
+ export * from "./useStartPostOnboardingCallback";
@@ -0,0 +1,82 @@
1
+ import { PostOnboardingHubState } from "@ledgerhq/types-live";
2
+ import { renderHook } from "@testing-library/react-hooks";
3
+ import { useAllPostOnboardingActionsCompleted } from "./useAllPostOnboardingActionsCompleted";
4
+ import {
5
+ claimTestMock,
6
+ personalizeTestMock,
7
+ migrateAssetsTestMock,
8
+ } from "../mock";
9
+
10
+ import { usePostOnboardingHubState } from "./usePostOnboardingHubState";
11
+ jest.mock("./usePostOnboardingHubState");
12
+ jest.mock("react-redux", () => ({}));
13
+
14
+ const mockedUsePostOnboardingHubState = jest.mocked(usePostOnboardingHubState);
15
+
16
+ const mockedStateNoActions: PostOnboardingHubState = {
17
+ deviceModelId: null,
18
+ lastActionCompleted: null,
19
+ actionsState: [],
20
+ };
21
+
22
+ const mockedStateAllActionsCompleted: PostOnboardingHubState = {
23
+ deviceModelId: null,
24
+ lastActionCompleted: null,
25
+ actionsState: [
26
+ { ...claimTestMock, completed: true },
27
+ { ...personalizeTestMock, completed: true },
28
+ { ...migrateAssetsTestMock, completed: true },
29
+ ],
30
+ };
31
+
32
+ const mockedStateNoActionsCompleted: PostOnboardingHubState = {
33
+ deviceModelId: null,
34
+ lastActionCompleted: null,
35
+ actionsState: [
36
+ { ...claimTestMock, completed: false },
37
+ { ...personalizeTestMock, completed: false },
38
+ { ...migrateAssetsTestMock, completed: false },
39
+ ],
40
+ };
41
+
42
+ const mockedStateSomeActionsCompleted: PostOnboardingHubState = {
43
+ deviceModelId: null,
44
+ lastActionCompleted: null,
45
+ actionsState: [
46
+ { ...claimTestMock, completed: false },
47
+ { ...personalizeTestMock, completed: true },
48
+ { ...migrateAssetsTestMock, completed: false },
49
+ ],
50
+ };
51
+
52
+ describe("useAllPostOnboardingActionsCompleted", () => {
53
+ it("should return true if no actions are present", () => {
54
+ mockedUsePostOnboardingHubState.mockReturnValue(mockedStateNoActions);
55
+ const { result } = renderHook(() => useAllPostOnboardingActionsCompleted());
56
+ expect(result.current).toBe(true);
57
+ });
58
+
59
+ it("should return true if all actions are completed", () => {
60
+ mockedUsePostOnboardingHubState.mockReturnValue(
61
+ mockedStateAllActionsCompleted
62
+ );
63
+ const { result } = renderHook(() => useAllPostOnboardingActionsCompleted());
64
+ expect(result.current).toBe(true);
65
+ });
66
+
67
+ it("should return false if some actions are completed", () => {
68
+ mockedUsePostOnboardingHubState.mockReturnValue(
69
+ mockedStateSomeActionsCompleted
70
+ );
71
+ const { result } = renderHook(() => useAllPostOnboardingActionsCompleted());
72
+ expect(result.current).toBe(false);
73
+ });
74
+
75
+ it("should return false if no actions are completed", () => {
76
+ mockedUsePostOnboardingHubState.mockReturnValue(
77
+ mockedStateNoActionsCompleted
78
+ );
79
+ const { result } = renderHook(() => useAllPostOnboardingActionsCompleted());
80
+ expect(result.current).toBe(false);
81
+ });
82
+ });
@@ -0,0 +1,12 @@
1
+ import { usePostOnboardingHubState } from "./usePostOnboardingHubState";
2
+
3
+ /**
4
+ *
5
+ * @returns a boolean representing whether all the post onboarding actions have
6
+ * been completed.
7
+ * TODO: unit test this
8
+ */
9
+ export function useAllPostOnboardingActionsCompleted(): boolean {
10
+ const { actionsState } = usePostOnboardingHubState();
11
+ return actionsState.every((action) => action.completed);
12
+ }
@@ -0,0 +1,9 @@
1
+ import { useContext } from "react";
2
+ import {
3
+ PostOnboardingContext,
4
+ PostOnboardingDependencies,
5
+ } from "../PostOnboardingProvider";
6
+
7
+ export function usePostOnboardingContext(): PostOnboardingDependencies {
8
+ return useContext(PostOnboardingContext);
9
+ }
@@ -0,0 +1,83 @@
1
+ import { renderHook } from "@testing-library/react-hooks";
2
+ import {
3
+ postOnboardingDeviceModelIdSelector,
4
+ walletPostOnboardingEntryPointDismissedSelector,
5
+ } from "../reducer";
6
+ import { useAllPostOnboardingActionsCompleted } from "./useAllPostOnboardingActionsCompleted";
7
+ import { usePostOnboardingEntryPointVisibleOnWallet } from "./usePostOnboardingEntryPointVisibleOnWallet";
8
+ import { DeviceModelId } from "@ledgerhq/types-devices";
9
+
10
+ jest.mock("react-redux", () => ({
11
+ useSelector: (fun) => fun(),
12
+ }));
13
+ jest.mock("../reducer");
14
+ jest.mock("./useAllPostOnboardingActionsCompleted");
15
+
16
+ const mockedUseAllCompleted = jest.mocked(useAllPostOnboardingActionsCompleted);
17
+ const mockedDismissedSelector = jest.mocked(
18
+ walletPostOnboardingEntryPointDismissedSelector
19
+ );
20
+ const mockedDeviceModelIdSelector = jest.mocked(
21
+ postOnboardingDeviceModelIdSelector
22
+ );
23
+
24
+ describe("usePostOnboardingEntryPointVisibleOnWallet", () => {
25
+ beforeEach(() => {
26
+ mockedUseAllCompleted.mockClear();
27
+ mockedDismissedSelector.mockClear();
28
+ mockedDeviceModelIdSelector.mockClear();
29
+ });
30
+
31
+ it("should be false if deviceModelId is null", () => {
32
+ mockedUseAllCompleted.mockReturnValue(false);
33
+ mockedDismissedSelector.mockReturnValue(false);
34
+ mockedDeviceModelIdSelector.mockReturnValue(null);
35
+
36
+ const { result } = renderHook(() =>
37
+ usePostOnboardingEntryPointVisibleOnWallet()
38
+ );
39
+
40
+ expect(result.current).toBe(false);
41
+ });
42
+
43
+ it("should be false if the the entry point HAS been dismissed", () => {
44
+ mockedDismissedSelector.mockReturnValue(true);
45
+ mockedDeviceModelIdSelector.mockReturnValue(DeviceModelId.nanoX);
46
+
47
+ mockedUseAllCompleted.mockReturnValue(false);
48
+ const { result: res1 } = renderHook(() =>
49
+ usePostOnboardingEntryPointVisibleOnWallet()
50
+ );
51
+ expect(res1.current).toBe(false);
52
+
53
+ mockedUseAllCompleted.mockReturnValue(true);
54
+ const { result: res2 } = renderHook(() =>
55
+ usePostOnboardingEntryPointVisibleOnWallet()
56
+ );
57
+ expect(res2.current).toBe(false);
58
+ });
59
+
60
+ it("should be false if all actions are completed", () => {
61
+ mockedDismissedSelector.mockReturnValue(false);
62
+ mockedUseAllCompleted.mockReturnValue(true);
63
+
64
+ mockedDeviceModelIdSelector.mockReturnValue(DeviceModelId.nanoX);
65
+ const { result } = renderHook(() =>
66
+ usePostOnboardingEntryPointVisibleOnWallet()
67
+ );
68
+
69
+ expect(result.current).toBe(false);
70
+ });
71
+
72
+ it("should be true if the entry point HAS NOT been dismissed and all actions are NOT completed", () => {
73
+ mockedDismissedSelector.mockReturnValue(false);
74
+ mockedUseAllCompleted.mockReturnValue(false);
75
+ mockedDeviceModelIdSelector.mockReturnValue(DeviceModelId.nanoX);
76
+
77
+ const { result } = renderHook(() =>
78
+ usePostOnboardingEntryPointVisibleOnWallet()
79
+ );
80
+
81
+ expect(result.current).toBe(true);
82
+ });
83
+ });
@@ -0,0 +1,22 @@
1
+ import { useSelector } from "react-redux";
2
+ import {
3
+ postOnboardingDeviceModelIdSelector,
4
+ walletPostOnboardingEntryPointDismissedSelector,
5
+ } from "../reducer";
6
+ import { useAllPostOnboardingActionsCompleted } from "./useAllPostOnboardingActionsCompleted";
7
+
8
+ /**
9
+ *
10
+ * @returns a boolean representing whether the post onboarding entry point
11
+ * should be visible on the wallet page.
12
+ * TODO: unit test this
13
+ */
14
+ export function usePostOnboardingEntryPointVisibleOnWallet(): boolean {
15
+ const deviceModelId = useSelector(postOnboardingDeviceModelIdSelector);
16
+ const dismissed = useSelector(
17
+ walletPostOnboardingEntryPointDismissedSelector
18
+ );
19
+ const allCompleted = useAllPostOnboardingActionsCompleted();
20
+
21
+ return !!deviceModelId && !(dismissed || allCompleted);
22
+ }