@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
@@ -0,0 +1,450 @@
1
+ import axios from "axios";
2
+ import getProviders from "./getProviders";
3
+ import { getEnv, setEnv } from "../../env";
4
+
5
+ const EXPECTED_RESULT_V4 = [
6
+ {
7
+ provider: "changelly",
8
+ pairs: [
9
+ {
10
+ from: "bitcoin",
11
+ to: "ethereum",
12
+ tradeMethod: "float",
13
+ },
14
+ {
15
+ from: "bitcoin",
16
+ to: "zcash",
17
+ tradeMethod: "float",
18
+ },
19
+ {
20
+ from: "bitcoin",
21
+ to: "ethereum_classic",
22
+ tradeMethod: "float",
23
+ },
24
+ {
25
+ from: "ethereum",
26
+ to: "bitcoin",
27
+ tradeMethod: "float",
28
+ },
29
+ {
30
+ from: "ethereum",
31
+ to: "zcash",
32
+ tradeMethod: "float",
33
+ },
34
+ {
35
+ from: "ethereum",
36
+ to: "ethereum_classic",
37
+ tradeMethod: "float",
38
+ },
39
+ {
40
+ from: "bitcoin",
41
+ to: "ethereum",
42
+ tradeMethod: "float",
43
+ },
44
+ {
45
+ from: "bitcoin",
46
+ to: "zcash",
47
+ tradeMethod: "float",
48
+ },
49
+ {
50
+ from: "bitcoin",
51
+ to: "ethereum_classic",
52
+ tradeMethod: "float",
53
+ },
54
+ {
55
+ from: "ethereum",
56
+ to: "bitcoin",
57
+ tradeMethod: "float",
58
+ },
59
+ {
60
+ from: "ethereum",
61
+ to: "zcash",
62
+ tradeMethod: "float",
63
+ },
64
+ {
65
+ from: "ethereum",
66
+ to: "ethereum_classic",
67
+ tradeMethod: "float",
68
+ },
69
+ {
70
+ from: "zcash",
71
+ to: "bitcoin",
72
+ tradeMethod: "float",
73
+ },
74
+ {
75
+ from: "zcash",
76
+ to: "ethereum_classic",
77
+ tradeMethod: "float",
78
+ },
79
+ {
80
+ from: "ethereum_classic",
81
+ to: "bitcoin",
82
+ tradeMethod: "float",
83
+ },
84
+ {
85
+ from: "ethereum_classic",
86
+ to: "ethereum",
87
+ tradeMethod: "float",
88
+ },
89
+ {
90
+ from: "bitcoin",
91
+ to: "ethereum",
92
+ tradeMethod: "fixed",
93
+ },
94
+ {
95
+ from: "bitcoin",
96
+ to: "zcash",
97
+ tradeMethod: "fixed",
98
+ },
99
+ {
100
+ from: "bitcoin",
101
+ to: "ethereum_classic",
102
+ tradeMethod: "fixed",
103
+ },
104
+ {
105
+ from: "ethereum",
106
+ to: "bitcoin",
107
+ tradeMethod: "fixed",
108
+ },
109
+ {
110
+ from: "ethereum",
111
+ to: "zcash",
112
+ tradeMethod: "fixed",
113
+ },
114
+ {
115
+ from: "ethereum",
116
+ to: "ethereum_classic",
117
+ tradeMethod: "fixed",
118
+ },
119
+ {
120
+ from: "zcash",
121
+ to: "bitcoin",
122
+ tradeMethod: "fixed",
123
+ },
124
+ {
125
+ from: "zcash",
126
+ to: "ethereum_classic",
127
+ tradeMethod: "fixed",
128
+ },
129
+ {
130
+ from: "ethereum_classic",
131
+ to: "bitcoin",
132
+ tradeMethod: "fixed",
133
+ },
134
+ {
135
+ from: "ethereum_classic",
136
+ to: "ethereum",
137
+ tradeMethod: "fixed",
138
+ },
139
+ {
140
+ from: "zcash",
141
+ to: "bitcoin",
142
+ tradeMethod: "fixed",
143
+ },
144
+ {
145
+ from: "zcash",
146
+ to: "ethereum_classic",
147
+ tradeMethod: "fixed",
148
+ },
149
+ {
150
+ from: "ethereum_classic",
151
+ to: "bitcoin",
152
+ tradeMethod: "fixed",
153
+ },
154
+ {
155
+ from: "ethereum_classic",
156
+ to: "ethereum",
157
+ tradeMethod: "fixed",
158
+ },
159
+ ],
160
+ },
161
+ {
162
+ provider: "ftx",
163
+ pairs: [
164
+ {
165
+ from: "bitcoin",
166
+ to: "ethereum",
167
+ tradeMethod: "float",
168
+ },
169
+ {
170
+ from: "bitcoin",
171
+ to: "zcash",
172
+ tradeMethod: "float",
173
+ },
174
+ {
175
+ from: "bitcoin",
176
+ to: "ethereum_classic",
177
+ tradeMethod: "float",
178
+ },
179
+ {
180
+ from: "ethereum",
181
+ to: "bitcoin",
182
+ tradeMethod: "float",
183
+ },
184
+ {
185
+ from: "ethereum",
186
+ to: "zcash",
187
+ tradeMethod: "float",
188
+ },
189
+ {
190
+ from: "ethereum",
191
+ to: "ethereum_classic",
192
+ tradeMethod: "float",
193
+ },
194
+ {
195
+ from: "zcash",
196
+ to: "bitcoin",
197
+ tradeMethod: "float",
198
+ },
199
+ {
200
+ from: "zcash",
201
+ to: "ethereum",
202
+ tradeMethod: "float",
203
+ },
204
+ {
205
+ from: "zcash",
206
+ to: "ethereum_classic",
207
+ tradeMethod: "float",
208
+ },
209
+ {
210
+ from: "ethereum_classic",
211
+ to: "bitcoin",
212
+ tradeMethod: "float",
213
+ },
214
+ {
215
+ from: "ethereum_classic",
216
+ to: "ethereum",
217
+ tradeMethod: "float",
218
+ },
219
+ {
220
+ from: "ethereum_classic",
221
+ to: "zcash",
222
+ tradeMethod: "float",
223
+ },
224
+ ],
225
+ },
226
+ ];
227
+
228
+ jest.mock("axios");
229
+ const mockedAxios = jest.mocked(axios);
230
+
231
+ describe("swap/getProviders", () => {
232
+ const DEFAULT_SWAP_API_BASE = getEnv("SWAP_API_BASE");
233
+
234
+ afterAll(() => {
235
+ // Restore DEFAULT_SWAP_API_BASE
236
+ setEnv("SWAP_API_BASE", DEFAULT_SWAP_API_BASE);
237
+ });
238
+
239
+ describe("version 2", () => {
240
+ const data = [
241
+ {
242
+ provider: "changelly",
243
+ pairs: [
244
+ {
245
+ from: "bitcoin",
246
+ to: "ethereum",
247
+ tradeMethod: ["float", "fixed"],
248
+ },
249
+ {
250
+ from: "bitcoin",
251
+ to: "ethereum_classic",
252
+ tradeMethod: ["float", "fixed"],
253
+ },
254
+ ],
255
+ },
256
+ ];
257
+ const resp = {
258
+ data,
259
+ status: 200,
260
+ statusText: "",
261
+ headers: {},
262
+ config: {},
263
+ };
264
+
265
+ beforeAll(() => {
266
+ // set SWAP_API_BASE
267
+ setEnv("SWAP_API_BASE", "https://swap.ledger.com/v2");
268
+ });
269
+
270
+ beforeEach(() => {
271
+ mockedAxios.mockResolvedValue(Promise.resolve(resp));
272
+ });
273
+
274
+ afterEach(() => {
275
+ mockedAxios.mockClear();
276
+ });
277
+
278
+ test("should not be called with whitelist", async () => {
279
+ await getProviders();
280
+
281
+ expect(mockedAxios).toBeCalledWith(
282
+ expect.objectContaining({
283
+ params: undefined,
284
+ })
285
+ );
286
+ });
287
+ });
288
+
289
+ describe("version 3", () => {
290
+ const data = [
291
+ {
292
+ provider: "changelly",
293
+ pairs: [
294
+ {
295
+ from: "bitcoin",
296
+ to: "ethereum",
297
+ tradeMethod: ["float", "fixed"],
298
+ },
299
+ {
300
+ from: "bitcoin",
301
+ to: "ethereum_classic",
302
+ tradeMethod: ["float", "fixed"],
303
+ },
304
+ ],
305
+ },
306
+ ];
307
+ const resp = {
308
+ data,
309
+ status: 200,
310
+ statusText: "",
311
+ headers: {},
312
+ config: {},
313
+ };
314
+
315
+ beforeAll(() => {
316
+ // set SWAP_API_BASE
317
+ setEnv("SWAP_API_BASE", "https://swap.ledger.com/v3");
318
+ });
319
+
320
+ beforeEach(() => {
321
+ mockedAxios.mockResolvedValue(Promise.resolve(resp));
322
+ });
323
+
324
+ afterEach(() => {
325
+ mockedAxios.mockClear();
326
+ });
327
+
328
+ test("should be called with whitelist", async () => {
329
+ await getProviders();
330
+
331
+ expect(mockedAxios).toBeCalledWith(
332
+ expect.objectContaining({
333
+ params: expect.objectContaining({
334
+ whitelist: expect.any(Array),
335
+ }),
336
+ })
337
+ );
338
+ });
339
+
340
+ test("should throw error if no data", async () => {
341
+ const emptyResp = { ...resp, data: [] };
342
+
343
+ mockedAxios.mockResolvedValue(Promise.resolve(emptyResp));
344
+
345
+ await expect(getProviders).rejects.toThrow("SwapNoAvailableProviders");
346
+ });
347
+
348
+ test("should return list of providers with pairs", async () => {
349
+ const res = await getProviders();
350
+
351
+ expect(res).toEqual(data);
352
+ });
353
+ });
354
+
355
+ describe("version 4", () => {
356
+ const data = {
357
+ currencies: {
358
+ "1": "bitcoin",
359
+ "2": "ethereum",
360
+ "3": "zcash",
361
+ "4": "ethereum_classic",
362
+ },
363
+ providers: {
364
+ changelly: [
365
+ {
366
+ methods: ["float"],
367
+ pairs: {
368
+ "1": [2, 3, 4],
369
+ "2": [1, 3, 4],
370
+ },
371
+ },
372
+ {
373
+ methods: ["float", "fixed"],
374
+ pairs: {
375
+ "1": [2, 3, 4],
376
+ "2": [1, 3, 4],
377
+ "3": [1, 4],
378
+ "4": [1, 2],
379
+ },
380
+ },
381
+ {
382
+ methods: ["fixed"],
383
+ pairs: {
384
+ "3": [1, 4],
385
+ "4": [1, 2],
386
+ },
387
+ },
388
+ ],
389
+ ftx: [
390
+ {
391
+ methods: ["float"],
392
+ pairs: {
393
+ "1": [2, 3, 4],
394
+ "2": [1, 3, 4],
395
+ "3": [1, 2, 4],
396
+ "4": [1, 2, 3],
397
+ },
398
+ },
399
+ ],
400
+ },
401
+ };
402
+
403
+ const resp = {
404
+ data,
405
+ status: 200,
406
+ statusText: "",
407
+ headers: {},
408
+ config: {},
409
+ };
410
+
411
+ beforeAll(() => {
412
+ // set SWAP_API_BASE
413
+ setEnv("SWAP_API_BASE", "https://swap.ledger.com/v4");
414
+ });
415
+
416
+ beforeEach(() => {
417
+ mockedAxios.mockResolvedValue(Promise.resolve(resp));
418
+ });
419
+
420
+ afterEach(() => {
421
+ mockedAxios.mockClear();
422
+ });
423
+
424
+ test("should be called with whitelist", async () => {
425
+ await getProviders();
426
+
427
+ expect(mockedAxios).toBeCalledWith(
428
+ expect.objectContaining({
429
+ params: expect.objectContaining({
430
+ whitelist: expect.any(Array),
431
+ }),
432
+ })
433
+ );
434
+ });
435
+
436
+ test("should throw error if no providers", async () => {
437
+ const emptyResp = { ...resp, data: { ...data, providers: {} } };
438
+
439
+ mockedAxios.mockResolvedValue(Promise.resolve(emptyResp));
440
+
441
+ await expect(getProviders).rejects.toThrow("SwapNoAvailableProviders");
442
+ });
443
+
444
+ test("should return list of providers with pairs", async () => {
445
+ const res = await getProviders();
446
+
447
+ expect(res).toEqual(EXPECTED_RESULT_V4);
448
+ });
449
+ });
450
+ });
@@ -2,29 +2,52 @@ import qs from "qs";
2
2
  import { getEnv } from "../../env";
3
3
  import { SwapNoAvailableProviders } from "../../errors";
4
4
  import network from "../../network";
5
- import { getAvailableProviders, getSwapAPIBaseURL } from "./";
5
+ import {
6
+ getAvailableProviders,
7
+ getSwapAPIBaseURL,
8
+ getSwapAPIVersion,
9
+ } from "./";
6
10
  import { mockGetProviders } from "./mock";
7
- import type { GetProviders } from "./types";
11
+ import type { GetProviders, ProvidersResponseV4 } from "./types";
8
12
 
9
13
  const getProviders: GetProviders = async () => {
10
14
  if (getEnv("MOCK")) return mockGetProviders();
11
15
 
12
- // Rely on the api base to determine the version logic
13
- const usesV3 = getSwapAPIBaseURL().endsWith("v3");
16
+ const version = getSwapAPIVersion();
14
17
 
15
18
  const res = await network({
16
19
  method: "GET",
17
20
  url: `${getSwapAPIBaseURL()}/providers`,
18
- params: usesV3 ? { whitelist: getAvailableProviders() } : undefined,
21
+ params: version >= 3 ? { whitelist: getAvailableProviders() } : undefined,
19
22
  paramsSerializer: (params) =>
20
23
  qs.stringify(params, { arrayFormat: "comma" }),
21
24
  });
22
25
 
23
- if (!res.data.length) {
24
- throw new SwapNoAvailableProviders();
26
+ if (version < 4) {
27
+ if (!res.data.length) {
28
+ throw new SwapNoAvailableProviders();
29
+ }
30
+ return res.data;
25
31
  }
26
32
 
27
- return res.data;
33
+ const responseV4 = res.data as ProvidersResponseV4;
34
+ if (!responseV4.providers || !Object.keys(responseV4.providers).length) {
35
+ throw new SwapNoAvailableProviders();
36
+ }
37
+ return Object.entries(responseV4.providers).flatMap(([provider, groups]) => ({
38
+ provider: provider,
39
+ pairs: groups.flatMap((group) =>
40
+ group.methods.flatMap((tradeMethod) =>
41
+ Object.entries(group.pairs).flatMap(([from, toArray]) =>
42
+ (toArray as number[]).map((to) => ({
43
+ from: responseV4.currencies[from],
44
+ to: responseV4.currencies[to.toString()],
45
+ tradeMethod,
46
+ }))
47
+ )
48
+ )
49
+ ),
50
+ }));
28
51
  };
29
52
 
30
53
  export default getProviders;
@@ -137,6 +137,49 @@ describe("useProviderRates", () => {
137
137
  expect(mockedGetExchangeRates).toHaveBeenCalledTimes(1);
138
138
  });
139
139
 
140
+ it("should refetch with the corrected selected rate", async () => {
141
+ const setExchangeRate = jest.fn();
142
+
143
+ mockedGetExchangeRates.mockResolvedValue(mockedRatesPromise);
144
+
145
+ const { result, waitForNextUpdate } = renderHook(useProviderRates, {
146
+ initialProps: { ...baseInitalProps, setExchangeRate },
147
+ });
148
+
149
+ mockedGetExchangeRates.mockClear();
150
+
151
+ act(() => {
152
+ result.current.refetchRates();
153
+ });
154
+ await waitForNextUpdate({ timeout: 1000 });
155
+
156
+ expect(setExchangeRate).toBeCalledWith(
157
+ expect.objectContaining({
158
+ provider: "ftx",
159
+ tradeMethod: "fixed",
160
+ })
161
+ );
162
+
163
+ act(() => {
164
+ result.current.updateSelectedRate({
165
+ rate: new BigNumber(1),
166
+ toAmount: new BigNumber(1),
167
+ magnitudeAwareRate: new BigNumber(1),
168
+ provider: "ftx",
169
+ tradeMethod: "float",
170
+ });
171
+ result.current.refetchRates();
172
+ });
173
+ await waitForNextUpdate({ timeout: 1000 });
174
+
175
+ expect(setExchangeRate).toBeCalledWith(
176
+ expect.objectContaining({
177
+ provider: "ftx",
178
+ tradeMethod: "float",
179
+ })
180
+ );
181
+ });
182
+
140
183
  it("should refetch the rates if refetchRates is called", async () => {
141
184
  const { result, waitForNextUpdate } = renderHook(useProviderRates, {
142
185
  initialProps: baseInitalProps,
@@ -45,6 +45,7 @@ export const useProviderRates = ({
45
45
  }): {
46
46
  rates: RatesReducerState;
47
47
  refetchRates: () => void;
48
+ updateSelectedRate: (selected?: ExchangeRate) => void;
48
49
  } => {
49
50
  const { account: fromAccount } = fromState;
50
51
  const { currency: toCurrency } = toState;
@@ -55,8 +56,15 @@ export const useProviderRates = ({
55
56
  const [getRatesDependency, setGetRatesDependency] = useState<unknown | null>(
56
57
  null
57
58
  );
59
+ const [getSelectedRate, setGetSelectedRate] = useState<ExchangeRate | {}>({});
60
+
58
61
  const refetchRates = useCallback(() => setGetRatesDependency({}), []);
59
62
 
63
+ const updateSelectedRate = useCallback(
64
+ (selected = {}) => setGetSelectedRate(selected),
65
+ []
66
+ );
67
+
60
68
  useEffect(
61
69
  () => {
62
70
  let abort = false;
@@ -141,12 +149,22 @@ export const useProviderRates = ({
141
149
  dispatchRates({ type: "set", payload: rates });
142
150
 
143
151
  /**
144
- * Select the first rate returned by the API. Should be the prefered
152
+ * By default select the first rate returned by the API. Should be the prefered
145
153
  * rate for the user. Rate ordering logic is handeled on backend side
146
154
  */
147
- const rate = rates?.length > 0 ? rates[0] : null;
148
155
 
149
- setExchangeRate && setExchangeRate(rate);
156
+ const getRate = () => {
157
+ if (!(rates?.length > 0)) {
158
+ return null;
159
+ }
160
+ const { provider, tradeMethod } = getSelectedRate as ExchangeRate;
161
+ const rate = rates.find(
162
+ (rate) =>
163
+ rate.provider === provider && rate.tradeMethod === tradeMethod
164
+ );
165
+ return rate ? rate : rates[0];
166
+ };
167
+ setExchangeRate && setExchangeRate(getRate());
150
168
  }
151
169
  } catch (error) {
152
170
  !abort && dispatchRates({ type: "error", payload: error });
@@ -174,5 +192,6 @@ export const useProviderRates = ({
174
192
  return {
175
193
  rates,
176
194
  refetchRates,
195
+ updateSelectedRate,
177
196
  };
178
197
  };
@@ -32,6 +32,7 @@ export type SwapDataType = {
32
32
  isSwapReversable: boolean;
33
33
  rates: RatesReducerState;
34
34
  refetchRates: () => void;
35
+ updateSelectedRate: (selected?: ExchangeRate) => void;
35
36
  targetAccounts?: Account[];
36
37
  };
37
38
  export const selectorStateDefaultValues = {
@@ -139,7 +140,7 @@ export const useSwapTransaction = ({
139
140
  setIsSendMaxLoading,
140
141
  });
141
142
 
142
- const { rates, refetchRates } = useProviderRates({
143
+ const { rates, refetchRates, updateSelectedRate } = useProviderRates({
143
144
  fromState,
144
145
  toState,
145
146
  transaction,
@@ -156,6 +157,7 @@ export const useSwapTransaction = ({
156
157
  isSwapReversable,
157
158
  rates,
158
159
  refetchRates,
160
+ updateSelectedRate,
159
161
  targetAccounts,
160
162
  },
161
163
  setFromAmount,
@@ -1,4 +1,6 @@
1
- import { isSwapOperationPending } from ".";
1
+ import { isSwapOperationPending, getSwapAPIVersion } from ".";
2
+
3
+ import { getEnv, setEnv } from "../../env";
2
4
 
3
5
  describe("swap/index", () => {
4
6
  describe("isSwapOperationPending", () => {
@@ -33,4 +35,37 @@ describe("swap/index", () => {
33
35
  expect(result).toBe(true);
34
36
  });
35
37
  });
38
+
39
+ describe("getSwapAPIVersion", () => {
40
+ const DEFAULT_SWAP_API_BASE = getEnv("SWAP_API_BASE");
41
+
42
+ afterEach(() => {
43
+ // Restore DEFAULT_SWAP_API_BASE
44
+ setEnv("SWAP_API_BASE", DEFAULT_SWAP_API_BASE);
45
+ });
46
+
47
+ test("should return version when SWAP_API_BASE contains one", () => {
48
+ const result = getSwapAPIVersion();
49
+
50
+ expect(result).toBe(4);
51
+ });
52
+
53
+ test("should throw an error if no version in SWAP_API_BASE", () => {
54
+ setEnv("SWAP_API_BASE", "https://swap.ledger.com");
55
+
56
+ expect(getSwapAPIVersion).toThrow(Error);
57
+ expect(getSwapAPIVersion).toThrow(
58
+ "Configured swap API base URL is invalid, should end with /v<number>"
59
+ );
60
+ });
61
+
62
+ test("should throw an error if version is NaN", () => {
63
+ setEnv("SWAP_API_BASE", "https://swap.ledger.com/vtest");
64
+
65
+ expect(getSwapAPIVersion).toThrow(Error);
66
+ expect(getSwapAPIVersion).toThrow(
67
+ "Configured swap API base URL is invalid, should end with /v<number>"
68
+ );
69
+ });
70
+ });
36
71
  });