@ledgerhq/live-common 34.51.0-nightly.9 → 34.52.0-nightly.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 (397) hide show
  1. package/lib/account/helpers.d.ts +10 -0
  2. package/lib/account/helpers.d.ts.map +1 -1
  3. package/lib/account/helpers.js +43 -16
  4. package/lib/account/helpers.js.map +1 -1
  5. package/lib/bridge/generic-alpaca/estimateMaxSpendable.js +1 -1
  6. package/lib/bridge/generic-alpaca/estimateMaxSpendable.js.map +1 -1
  7. package/lib/bridge/generic-alpaca/prepareTransaction.d.ts.map +1 -1
  8. package/lib/bridge/generic-alpaca/prepareTransaction.js +45 -37
  9. package/lib/bridge/generic-alpaca/prepareTransaction.js.map +1 -1
  10. package/lib/bridge/generic-alpaca/signOperation.d.ts.map +1 -1
  11. package/lib/bridge/generic-alpaca/signOperation.js +20 -0
  12. package/lib/bridge/generic-alpaca/signOperation.js.map +1 -1
  13. package/lib/bridge/generic-alpaca/utils.js +1 -1
  14. package/lib/bridge/generic-alpaca/utils.js.map +1 -1
  15. package/lib/config/index.d.ts +2 -2
  16. package/lib/config/index.d.ts.map +1 -1
  17. package/lib/config/index.js.map +1 -1
  18. package/lib/dada-client/hooks/useDrawerConfiguration.d.ts +19 -0
  19. package/lib/dada-client/hooks/useDrawerConfiguration.d.ts.map +1 -0
  20. package/lib/dada-client/hooks/useDrawerConfiguration.js +45 -0
  21. package/lib/dada-client/hooks/useDrawerConfiguration.js.map +1 -0
  22. package/lib/e2e/data/deviceLabelsData.d.ts +8 -0
  23. package/lib/e2e/data/deviceLabelsData.d.ts.map +1 -1
  24. package/lib/e2e/data/deviceLabelsData.js +62 -2
  25. package/lib/e2e/data/deviceLabelsData.js.map +1 -1
  26. package/lib/e2e/deviceInteraction/ButtonDeviceSimulator.d.ts +3 -0
  27. package/lib/e2e/deviceInteraction/ButtonDeviceSimulator.d.ts.map +1 -0
  28. package/lib/e2e/deviceInteraction/ButtonDeviceSimulator.js +26 -0
  29. package/lib/e2e/deviceInteraction/ButtonDeviceSimulator.js.map +1 -0
  30. package/lib/e2e/deviceInteraction/TouchDeviceSimulator.d.ts +4 -0
  31. package/lib/e2e/deviceInteraction/TouchDeviceSimulator.d.ts.map +1 -0
  32. package/lib/e2e/deviceInteraction/TouchDeviceSimulator.js +50 -0
  33. package/lib/e2e/deviceInteraction/TouchDeviceSimulator.js.map +1 -0
  34. package/lib/e2e/enum/Account.d.ts +2 -4
  35. package/lib/e2e/enum/Account.d.ts.map +1 -1
  36. package/lib/e2e/enum/Account.js +5 -8
  37. package/lib/e2e/enum/Account.js.map +1 -1
  38. package/lib/e2e/enum/Device.d.ts +1 -0
  39. package/lib/e2e/enum/Device.d.ts.map +1 -1
  40. package/lib/e2e/enum/Device.js +1 -0
  41. package/lib/e2e/enum/Device.js.map +1 -1
  42. package/lib/e2e/enum/DeviceLabels.d.ts +10 -2
  43. package/lib/e2e/enum/DeviceLabels.d.ts.map +1 -1
  44. package/lib/e2e/enum/DeviceLabels.js +9 -1
  45. package/lib/e2e/enum/DeviceLabels.js.map +1 -1
  46. package/lib/e2e/families/algorand.d.ts.map +1 -1
  47. package/lib/e2e/families/algorand.js +10 -2
  48. package/lib/e2e/families/algorand.js.map +1 -1
  49. package/lib/e2e/families/aptos.d.ts +2 -1
  50. package/lib/e2e/families/aptos.d.ts.map +1 -1
  51. package/lib/e2e/families/aptos.js +12 -4
  52. package/lib/e2e/families/aptos.js.map +1 -1
  53. package/lib/e2e/families/bitcoin.d.ts.map +1 -1
  54. package/lib/e2e/families/bitcoin.js +25 -15
  55. package/lib/e2e/families/bitcoin.js.map +1 -1
  56. package/lib/e2e/families/cardano.d.ts.map +1 -1
  57. package/lib/e2e/families/cardano.js +122 -46
  58. package/lib/e2e/families/cardano.js.map +1 -1
  59. package/lib/e2e/families/celo.d.ts.map +1 -1
  60. package/lib/e2e/families/celo.js +11 -1
  61. package/lib/e2e/families/celo.js.map +1 -1
  62. package/lib/e2e/families/cosmos.d.ts.map +1 -1
  63. package/lib/e2e/families/cosmos.js +16 -3
  64. package/lib/e2e/families/cosmos.js.map +1 -1
  65. package/lib/e2e/families/evm.d.ts +1 -2
  66. package/lib/e2e/families/evm.d.ts.map +1 -1
  67. package/lib/e2e/families/evm.js +28 -13
  68. package/lib/e2e/families/evm.js.map +1 -1
  69. package/lib/e2e/families/hedera.d.ts.map +1 -1
  70. package/lib/e2e/families/hedera.js +3 -2
  71. package/lib/e2e/families/hedera.js.map +1 -1
  72. package/lib/e2e/families/kaspa.d.ts +2 -1
  73. package/lib/e2e/families/kaspa.d.ts.map +1 -1
  74. package/lib/e2e/families/kaspa.js +12 -4
  75. package/lib/e2e/families/kaspa.js.map +1 -1
  76. package/lib/e2e/families/multiversX.d.ts.map +1 -1
  77. package/lib/e2e/families/multiversX.js +11 -1
  78. package/lib/e2e/families/multiversX.js.map +1 -1
  79. package/lib/e2e/families/near.d.ts.map +1 -1
  80. package/lib/e2e/families/near.js +15 -4
  81. package/lib/e2e/families/near.js.map +1 -1
  82. package/lib/e2e/families/osmosis.d.ts.map +1 -1
  83. package/lib/e2e/families/osmosis.js +11 -1
  84. package/lib/e2e/families/osmosis.js.map +1 -1
  85. package/lib/e2e/families/polkadot.d.ts.map +1 -1
  86. package/lib/e2e/families/polkadot.js +10 -2
  87. package/lib/e2e/families/polkadot.js.map +1 -1
  88. package/lib/e2e/families/solana.d.ts.map +1 -1
  89. package/lib/e2e/families/solana.js +16 -3
  90. package/lib/e2e/families/solana.js.map +1 -1
  91. package/lib/e2e/families/stellar.d.ts.map +1 -1
  92. package/lib/e2e/families/stellar.js +10 -2
  93. package/lib/e2e/families/stellar.js.map +1 -1
  94. package/lib/e2e/families/sui.d.ts +2 -1
  95. package/lib/e2e/families/sui.d.ts.map +1 -1
  96. package/lib/e2e/families/sui.js +11 -3
  97. package/lib/e2e/families/sui.js.map +1 -1
  98. package/lib/e2e/families/tezos.d.ts.map +1 -1
  99. package/lib/e2e/families/tezos.js +12 -3
  100. package/lib/e2e/families/tezos.js.map +1 -1
  101. package/lib/e2e/families/tron.d.ts.map +1 -1
  102. package/lib/e2e/families/tron.js +10 -2
  103. package/lib/e2e/families/tron.js.map +1 -1
  104. package/lib/e2e/families/xrp.d.ts.map +1 -1
  105. package/lib/e2e/families/xrp.js +10 -2
  106. package/lib/e2e/families/xrp.js.map +1 -1
  107. package/lib/e2e/index.d.ts +4 -2
  108. package/lib/e2e/index.d.ts.map +1 -1
  109. package/lib/e2e/models/Transaction.d.ts +0 -5
  110. package/lib/e2e/models/Transaction.d.ts.map +1 -1
  111. package/lib/e2e/models/Transaction.js +1 -9
  112. package/lib/e2e/models/Transaction.js.map +1 -1
  113. package/lib/e2e/speculos.d.ts +13 -4
  114. package/lib/e2e/speculos.d.ts.map +1 -1
  115. package/lib/e2e/speculos.js +141 -75
  116. package/lib/e2e/speculos.js.map +1 -1
  117. package/lib/e2e/speculosAppVersion.d.ts +1 -0
  118. package/lib/e2e/speculosAppVersion.d.ts.map +1 -1
  119. package/lib/e2e/speculosAppVersion.js +9 -1
  120. package/lib/e2e/speculosAppVersion.js.map +1 -1
  121. package/lib/exchange/index.d.ts.map +1 -1
  122. package/lib/exchange/index.js +4 -15
  123. package/lib/exchange/index.js.map +1 -1
  124. package/lib/exchange/swap/getCompleteSwapHistory.d.ts +1 -1
  125. package/lib/exchange/swap/getCompleteSwapHistory.d.ts.map +1 -1
  126. package/lib/exchange/swap/getCompleteSwapHistory.js +5 -5
  127. package/lib/exchange/swap/getCompleteSwapHistory.js.map +1 -1
  128. package/lib/exchange/swap/hooks/useSelectableCurrencies.d.ts.map +1 -1
  129. package/lib/exchange/swap/hooks/useSelectableCurrencies.js +16 -4
  130. package/lib/exchange/swap/hooks/useSelectableCurrencies.js.map +1 -1
  131. package/lib/featureFlags/defaultFeatures.d.ts +3 -0
  132. package/lib/featureFlags/defaultFeatures.d.ts.map +1 -1
  133. package/lib/featureFlags/defaultFeatures.js +2 -1
  134. package/lib/featureFlags/defaultFeatures.js.map +1 -1
  135. package/lib/featureFlags/useFeature.d.ts +1 -1
  136. package/lib/featureFlags/useFeature.d.ts.map +1 -1
  137. package/lib/generated/specs.d.ts +1 -1
  138. package/lib/load/speculos.d.ts.map +1 -1
  139. package/lib/load/speculos.js +1 -0
  140. package/lib/load/speculos.js.map +1 -1
  141. package/lib/market/hooks/useLargeMoverChartData.d.ts +1 -2
  142. package/lib/market/hooks/useLargeMoverChartData.d.ts.map +1 -1
  143. package/lib/market/hooks/useLargeMoverChartData.js.map +1 -1
  144. package/lib/market/hooks/useLargeMoverCurrencies.d.ts +1 -2
  145. package/lib/market/hooks/useLargeMoverCurrencies.d.ts.map +1 -1
  146. package/lib/market/hooks/useLargeMoverCurrencies.js +1 -3
  147. package/lib/market/hooks/useLargeMoverCurrencies.js.map +1 -1
  148. package/lib/market/utils/currencyFormatter.d.ts +1 -1
  149. package/lib/market/utils/currencyFormatter.d.ts.map +1 -1
  150. package/lib/market/utils/currencyFormatter.js +1 -1
  151. package/lib/market/utils/currencyFormatter.js.map +1 -1
  152. package/lib/modularDrawer/hooks/modules/useLeftApyModule.d.ts +1 -1
  153. package/lib/modularDrawer/hooks/modules/useLeftMarketTrendModule.d.ts +1 -1
  154. package/lib/modularDrawer/hooks/modules/useRightMarketTrendModule.d.ts +1 -1
  155. package/lib/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.d.ts +1 -2
  156. package/lib/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.d.ts.map +1 -1
  157. package/lib/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.js +3 -0
  158. package/lib/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.js.map +1 -1
  159. package/lib/modularDrawer/hooks/useRightBalanceAsset.d.ts +1 -1
  160. package/lib/wallet-api/constants.d.ts +2 -2
  161. package/lib-es/account/helpers.d.ts +10 -0
  162. package/lib-es/account/helpers.d.ts.map +1 -1
  163. package/lib-es/account/helpers.js +26 -0
  164. package/lib-es/account/helpers.js.map +1 -1
  165. package/lib-es/bridge/generic-alpaca/estimateMaxSpendable.js +1 -1
  166. package/lib-es/bridge/generic-alpaca/estimateMaxSpendable.js.map +1 -1
  167. package/lib-es/bridge/generic-alpaca/prepareTransaction.d.ts.map +1 -1
  168. package/lib-es/bridge/generic-alpaca/prepareTransaction.js +45 -37
  169. package/lib-es/bridge/generic-alpaca/prepareTransaction.js.map +1 -1
  170. package/lib-es/bridge/generic-alpaca/signOperation.d.ts.map +1 -1
  171. package/lib-es/bridge/generic-alpaca/signOperation.js +17 -0
  172. package/lib-es/bridge/generic-alpaca/signOperation.js.map +1 -1
  173. package/lib-es/bridge/generic-alpaca/utils.js +1 -1
  174. package/lib-es/bridge/generic-alpaca/utils.js.map +1 -1
  175. package/lib-es/config/index.d.ts +2 -2
  176. package/lib-es/config/index.d.ts.map +1 -1
  177. package/lib-es/config/index.js.map +1 -1
  178. package/lib-es/dada-client/hooks/useDrawerConfiguration.d.ts +19 -0
  179. package/lib-es/dada-client/hooks/useDrawerConfiguration.d.ts.map +1 -0
  180. package/lib-es/dada-client/hooks/useDrawerConfiguration.js +38 -0
  181. package/lib-es/dada-client/hooks/useDrawerConfiguration.js.map +1 -0
  182. package/lib-es/e2e/data/deviceLabelsData.d.ts +8 -0
  183. package/lib-es/e2e/data/deviceLabelsData.d.ts.map +1 -1
  184. package/lib-es/e2e/data/deviceLabelsData.js +62 -2
  185. package/lib-es/e2e/data/deviceLabelsData.js.map +1 -1
  186. package/lib-es/e2e/deviceInteraction/ButtonDeviceSimulator.d.ts +3 -0
  187. package/lib-es/e2e/deviceInteraction/ButtonDeviceSimulator.d.ts.map +1 -0
  188. package/lib-es/e2e/deviceInteraction/ButtonDeviceSimulator.js +18 -0
  189. package/lib-es/e2e/deviceInteraction/ButtonDeviceSimulator.js.map +1 -0
  190. package/lib-es/e2e/deviceInteraction/TouchDeviceSimulator.d.ts +4 -0
  191. package/lib-es/e2e/deviceInteraction/TouchDeviceSimulator.d.ts.map +1 -0
  192. package/lib-es/e2e/deviceInteraction/TouchDeviceSimulator.js +41 -0
  193. package/lib-es/e2e/deviceInteraction/TouchDeviceSimulator.js.map +1 -0
  194. package/lib-es/e2e/enum/Account.d.ts +2 -4
  195. package/lib-es/e2e/enum/Account.d.ts.map +1 -1
  196. package/lib-es/e2e/enum/Account.js +5 -8
  197. package/lib-es/e2e/enum/Account.js.map +1 -1
  198. package/lib-es/e2e/enum/Device.d.ts +1 -0
  199. package/lib-es/e2e/enum/Device.d.ts.map +1 -1
  200. package/lib-es/e2e/enum/Device.js +1 -0
  201. package/lib-es/e2e/enum/Device.js.map +1 -1
  202. package/lib-es/e2e/enum/DeviceLabels.d.ts +10 -2
  203. package/lib-es/e2e/enum/DeviceLabels.d.ts.map +1 -1
  204. package/lib-es/e2e/enum/DeviceLabels.js +9 -1
  205. package/lib-es/e2e/enum/DeviceLabels.js.map +1 -1
  206. package/lib-es/e2e/families/algorand.d.ts.map +1 -1
  207. package/lib-es/e2e/families/algorand.js +11 -3
  208. package/lib-es/e2e/families/algorand.js.map +1 -1
  209. package/lib-es/e2e/families/aptos.d.ts +2 -1
  210. package/lib-es/e2e/families/aptos.d.ts.map +1 -1
  211. package/lib-es/e2e/families/aptos.js +12 -4
  212. package/lib-es/e2e/families/aptos.js.map +1 -1
  213. package/lib-es/e2e/families/bitcoin.d.ts.map +1 -1
  214. package/lib-es/e2e/families/bitcoin.js +27 -17
  215. package/lib-es/e2e/families/bitcoin.js.map +1 -1
  216. package/lib-es/e2e/families/cardano.d.ts.map +1 -1
  217. package/lib-es/e2e/families/cardano.js +121 -45
  218. package/lib-es/e2e/families/cardano.js.map +1 -1
  219. package/lib-es/e2e/families/celo.d.ts.map +1 -1
  220. package/lib-es/e2e/families/celo.js +12 -2
  221. package/lib-es/e2e/families/celo.js.map +1 -1
  222. package/lib-es/e2e/families/cosmos.d.ts.map +1 -1
  223. package/lib-es/e2e/families/cosmos.js +17 -4
  224. package/lib-es/e2e/families/cosmos.js.map +1 -1
  225. package/lib-es/e2e/families/evm.d.ts +1 -2
  226. package/lib-es/e2e/families/evm.d.ts.map +1 -1
  227. package/lib-es/e2e/families/evm.js +25 -9
  228. package/lib-es/e2e/families/evm.js.map +1 -1
  229. package/lib-es/e2e/families/hedera.d.ts.map +1 -1
  230. package/lib-es/e2e/families/hedera.js +2 -1
  231. package/lib-es/e2e/families/hedera.js.map +1 -1
  232. package/lib-es/e2e/families/kaspa.d.ts +2 -1
  233. package/lib-es/e2e/families/kaspa.d.ts.map +1 -1
  234. package/lib-es/e2e/families/kaspa.js +12 -4
  235. package/lib-es/e2e/families/kaspa.js.map +1 -1
  236. package/lib-es/e2e/families/multiversX.d.ts.map +1 -1
  237. package/lib-es/e2e/families/multiversX.js +12 -2
  238. package/lib-es/e2e/families/multiversX.js.map +1 -1
  239. package/lib-es/e2e/families/near.d.ts.map +1 -1
  240. package/lib-es/e2e/families/near.js +16 -5
  241. package/lib-es/e2e/families/near.js.map +1 -1
  242. package/lib-es/e2e/families/osmosis.d.ts.map +1 -1
  243. package/lib-es/e2e/families/osmosis.js +12 -2
  244. package/lib-es/e2e/families/osmosis.js.map +1 -1
  245. package/lib-es/e2e/families/polkadot.d.ts.map +1 -1
  246. package/lib-es/e2e/families/polkadot.js +11 -3
  247. package/lib-es/e2e/families/polkadot.js.map +1 -1
  248. package/lib-es/e2e/families/solana.d.ts.map +1 -1
  249. package/lib-es/e2e/families/solana.js +17 -4
  250. package/lib-es/e2e/families/solana.js.map +1 -1
  251. package/lib-es/e2e/families/stellar.d.ts.map +1 -1
  252. package/lib-es/e2e/families/stellar.js +11 -3
  253. package/lib-es/e2e/families/stellar.js.map +1 -1
  254. package/lib-es/e2e/families/sui.d.ts +2 -1
  255. package/lib-es/e2e/families/sui.d.ts.map +1 -1
  256. package/lib-es/e2e/families/sui.js +12 -4
  257. package/lib-es/e2e/families/sui.js.map +1 -1
  258. package/lib-es/e2e/families/tezos.d.ts.map +1 -1
  259. package/lib-es/e2e/families/tezos.js +12 -3
  260. package/lib-es/e2e/families/tezos.js.map +1 -1
  261. package/lib-es/e2e/families/tron.d.ts.map +1 -1
  262. package/lib-es/e2e/families/tron.js +11 -3
  263. package/lib-es/e2e/families/tron.js.map +1 -1
  264. package/lib-es/e2e/families/xrp.d.ts.map +1 -1
  265. package/lib-es/e2e/families/xrp.js +11 -3
  266. package/lib-es/e2e/families/xrp.js.map +1 -1
  267. package/lib-es/e2e/index.d.ts +4 -2
  268. package/lib-es/e2e/index.d.ts.map +1 -1
  269. package/lib-es/e2e/models/Transaction.d.ts +0 -5
  270. package/lib-es/e2e/models/Transaction.d.ts.map +1 -1
  271. package/lib-es/e2e/models/Transaction.js +0 -7
  272. package/lib-es/e2e/models/Transaction.js.map +1 -1
  273. package/lib-es/e2e/speculos.d.ts +13 -4
  274. package/lib-es/e2e/speculos.d.ts.map +1 -1
  275. package/lib-es/e2e/speculos.js +134 -71
  276. package/lib-es/e2e/speculos.js.map +1 -1
  277. package/lib-es/e2e/speculosAppVersion.d.ts +1 -0
  278. package/lib-es/e2e/speculosAppVersion.d.ts.map +1 -1
  279. package/lib-es/e2e/speculosAppVersion.js +7 -0
  280. package/lib-es/e2e/speculosAppVersion.js.map +1 -1
  281. package/lib-es/exchange/index.d.ts.map +1 -1
  282. package/lib-es/exchange/index.js +4 -15
  283. package/lib-es/exchange/index.js.map +1 -1
  284. package/lib-es/exchange/swap/getCompleteSwapHistory.d.ts +1 -1
  285. package/lib-es/exchange/swap/getCompleteSwapHistory.d.ts.map +1 -1
  286. package/lib-es/exchange/swap/getCompleteSwapHistory.js +5 -5
  287. package/lib-es/exchange/swap/getCompleteSwapHistory.js.map +1 -1
  288. package/lib-es/exchange/swap/hooks/useSelectableCurrencies.d.ts.map +1 -1
  289. package/lib-es/exchange/swap/hooks/useSelectableCurrencies.js +18 -6
  290. package/lib-es/exchange/swap/hooks/useSelectableCurrencies.js.map +1 -1
  291. package/lib-es/featureFlags/defaultFeatures.d.ts +3 -0
  292. package/lib-es/featureFlags/defaultFeatures.d.ts.map +1 -1
  293. package/lib-es/featureFlags/defaultFeatures.js +2 -1
  294. package/lib-es/featureFlags/defaultFeatures.js.map +1 -1
  295. package/lib-es/featureFlags/useFeature.d.ts +1 -1
  296. package/lib-es/featureFlags/useFeature.d.ts.map +1 -1
  297. package/lib-es/generated/specs.d.ts +1 -1
  298. package/lib-es/load/speculos.d.ts.map +1 -1
  299. package/lib-es/load/speculos.js +1 -0
  300. package/lib-es/load/speculos.js.map +1 -1
  301. package/lib-es/market/hooks/useLargeMoverChartData.d.ts +1 -2
  302. package/lib-es/market/hooks/useLargeMoverChartData.d.ts.map +1 -1
  303. package/lib-es/market/hooks/useLargeMoverChartData.js.map +1 -1
  304. package/lib-es/market/hooks/useLargeMoverCurrencies.d.ts +1 -2
  305. package/lib-es/market/hooks/useLargeMoverCurrencies.d.ts.map +1 -1
  306. package/lib-es/market/hooks/useLargeMoverCurrencies.js +1 -3
  307. package/lib-es/market/hooks/useLargeMoverCurrencies.js.map +1 -1
  308. package/lib-es/market/utils/currencyFormatter.d.ts +1 -1
  309. package/lib-es/market/utils/currencyFormatter.d.ts.map +1 -1
  310. package/lib-es/market/utils/currencyFormatter.js +1 -1
  311. package/lib-es/market/utils/currencyFormatter.js.map +1 -1
  312. package/lib-es/modularDrawer/hooks/modules/useLeftApyModule.d.ts +1 -1
  313. package/lib-es/modularDrawer/hooks/modules/useLeftMarketTrendModule.d.ts +1 -1
  314. package/lib-es/modularDrawer/hooks/modules/useRightMarketTrendModule.d.ts +1 -1
  315. package/lib-es/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.d.ts +1 -2
  316. package/lib-es/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.d.ts.map +1 -1
  317. package/lib-es/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.js +3 -0
  318. package/lib-es/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.js.map +1 -1
  319. package/lib-es/modularDrawer/hooks/useRightBalanceAsset.d.ts +1 -1
  320. package/lib-es/wallet-api/constants.d.ts +2 -2
  321. package/package.json +55 -55
  322. package/src/account/helpers.test.ts +209 -0
  323. package/src/account/helpers.ts +34 -0
  324. package/src/bridge/cache.test.ts +2 -2
  325. package/src/bridge/generic-alpaca/estimateMaxSpendable.ts +1 -1
  326. package/src/bridge/generic-alpaca/prepareTransaction.ts +69 -46
  327. package/src/bridge/generic-alpaca/signOperation.ts +20 -0
  328. package/src/bridge/generic-alpaca/tests/prepareTransaction.test.ts +109 -191
  329. package/src/bridge/generic-alpaca/utils.test.ts +15 -12
  330. package/src/bridge/generic-alpaca/utils.ts +1 -1
  331. package/src/config/index.ts +2 -4
  332. package/src/currencies/sortByMarketcap.test.ts +10 -7
  333. package/src/dada-client/hooks/useDrawerConfiguration.ts +65 -0
  334. package/src/e2e/data/deviceLabelsData.ts +70 -2
  335. package/src/e2e/deviceInteraction/ButtonDeviceSimulator.ts +23 -0
  336. package/src/e2e/deviceInteraction/TouchDeviceSimulator.ts +52 -0
  337. package/src/e2e/enum/Account.ts +1 -16
  338. package/src/e2e/enum/Device.ts +1 -0
  339. package/src/e2e/enum/DeviceLabels.ts +9 -1
  340. package/src/e2e/families/algorand.ts +10 -4
  341. package/src/e2e/families/aptos.ts +12 -4
  342. package/src/e2e/families/bitcoin.ts +25 -18
  343. package/src/e2e/families/cardano.ts +137 -50
  344. package/src/e2e/families/celo.ts +11 -2
  345. package/src/e2e/families/cosmos.ts +15 -9
  346. package/src/e2e/families/evm.ts +28 -11
  347. package/src/e2e/families/hedera.ts +2 -1
  348. package/src/e2e/families/kaspa.ts +12 -4
  349. package/src/e2e/families/multiversX.ts +11 -2
  350. package/src/e2e/families/near.ts +15 -6
  351. package/src/e2e/families/osmosis.ts +11 -2
  352. package/src/e2e/families/polkadot.ts +10 -3
  353. package/src/e2e/families/solana.ts +15 -9
  354. package/src/e2e/families/stellar.ts +10 -3
  355. package/src/e2e/families/sui.ts +12 -4
  356. package/src/e2e/families/tezos.ts +11 -3
  357. package/src/e2e/families/tron.ts +10 -3
  358. package/src/e2e/families/xrp.ts +10 -3
  359. package/src/e2e/models/Transaction.ts +0 -13
  360. package/src/e2e/speculos.ts +160 -89
  361. package/src/e2e/speculosAppVersion.ts +8 -0
  362. package/src/exchange/index.ts +4 -15
  363. package/src/exchange/swap/getCompleteSwapHistory.ts +5 -5
  364. package/src/exchange/swap/hooks/useFromState.test.ts +11 -4
  365. package/src/exchange/swap/hooks/useReverseAccounts.test.ts +11 -4
  366. package/src/exchange/swap/hooks/useSelectableCurrencies.test.ts +14 -8
  367. package/src/exchange/swap/hooks/useSelectableCurrencies.ts +23 -6
  368. package/src/exchange/swap/hooks/useToState.test.ts +11 -4
  369. package/src/exchange/swap/hooks/useUpdateMaxAmount.test.ts +11 -4
  370. package/src/exchange/swap/utils/index.test.ts +10 -4
  371. package/src/families/algorand/bridge.integration.test.ts +1 -1
  372. package/src/families/bitcoin/__snapshots__/bridge.integration.test.ts.snap +3 -3
  373. package/src/families/cardano/bridge.integration.test.ts +1 -1
  374. package/src/families/cosmos/datasets/__snapshots__/cosmos.integration.test.ts.snap +25 -2
  375. package/src/families/evm/bridge.integration.test.ts +1 -1
  376. package/src/families/hedera/__snapshots__/bridge.integration.test.ts.snap +25 -5
  377. package/src/families/icon/bridge.integration.test.ts +1 -1
  378. package/src/families/multiversx/bridge.integration.test.ts +1 -2
  379. package/src/families/near/bridge.integration.test.ts +1 -1
  380. package/src/families/solana/bridge.integration.test.ts +1 -1
  381. package/src/families/sui/bridge.integration.test.ts +1 -1
  382. package/src/families/ton/bridge.integration.test.ts +1 -1
  383. package/src/featureFlags/defaultFeatures.ts +2 -1
  384. package/src/load/speculos.ts +1 -0
  385. package/src/market/hooks/useLargeMoverChartData.ts +1 -2
  386. package/src/market/hooks/useLargeMoverCurrencies.ts +3 -6
  387. package/src/market/utils/currencyFormatter.ts +2 -2
  388. package/src/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.ts +3 -0
  389. package/lib/e2e/enum/Nft.d.ts +0 -15
  390. package/lib/e2e/enum/Nft.d.ts.map +0 -1
  391. package/lib/e2e/enum/Nft.js +0 -25
  392. package/lib/e2e/enum/Nft.js.map +0 -1
  393. package/lib-es/e2e/enum/Nft.d.ts +0 -15
  394. package/lib-es/e2e/enum/Nft.d.ts.map +0 -1
  395. package/lib-es/e2e/enum/Nft.js +0 -21
  396. package/lib-es/e2e/enum/Nft.js.map +0 -1
  397. package/src/e2e/enum/Nft.ts +0 -57
@@ -19,7 +19,7 @@ import { Account } from "./enum/Account";
19
19
  import { Currency } from "./enum/Currency";
20
20
  import expect from "expect";
21
21
  import { sendBTC, sendBTCBasedCoin } from "./families/bitcoin";
22
- import { sendEVM, sendEvmNFT } from "./families/evm";
22
+ import { sendEVM } from "./families/evm";
23
23
  import { sendPolkadot } from "./families/polkadot";
24
24
  import { sendAlgorand } from "./families/algorand";
25
25
  import { sendTron } from "./families/tron";
@@ -35,14 +35,20 @@ import { delegateSolana, sendSolana } from "./families/solana";
35
35
  import { delegateTezos } from "./families/tezos";
36
36
  import { delegateCelo } from "./families/celo";
37
37
  import { delegateMultiversX } from "./families/multiversX";
38
- import { NFTTransaction, Transaction } from "./models/Transaction";
38
+ import { Transaction } from "./models/Transaction";
39
39
  import { Delegate } from "./models/Delegate";
40
40
  import { Swap } from "./models/Swap";
41
41
  import { delegateOsmosis } from "./families/osmosis";
42
42
  import { AppInfos } from "./enum/AppInfos";
43
43
  import { DEVICE_LABELS_CONFIG } from "./data/deviceLabelsData";
44
44
  import { sendSui } from "./families/sui";
45
- import { getAppVersionFromCatalog, getSpeculosModel } from "./speculosAppVersion";
45
+ import { getAppVersionFromCatalog, getSpeculosModel, isTouchDevice } from "./speculosAppVersion";
46
+ import {
47
+ pressAndRelease,
48
+ longPressAndRelease,
49
+ swipeRight,
50
+ } from "./deviceInteraction/TouchDeviceSimulator";
51
+ import { pressBoth, pressRightButton } from "./deviceInteraction/ButtonDeviceSimulator";
46
52
 
47
53
  const isSpeculosRemote = process.env.REMOTE_SPECULOS === "true";
48
54
 
@@ -431,18 +437,20 @@ export async function stopSpeculos(deviceId: string | undefined) {
431
437
 
432
438
  interface Event {
433
439
  text: string;
440
+ x: number;
441
+ y: number;
434
442
  }
435
443
 
436
444
  interface ResponseData {
437
445
  events: Event[];
438
446
  }
439
447
 
440
- function getSpeculosAddress(): string {
448
+ export function getSpeculosAddress(): string {
441
449
  const speculosAddress = process.env.SPECULOS_ADDRESS;
442
450
  return speculosAddress || "http://127.0.0.1";
443
451
  }
444
452
 
445
- async function retryAxiosRequest<T>(
453
+ export async function retryAxiosRequest<T>(
446
454
  requestFn: () => Promise<AxiosResponse<T>>,
447
455
  maxRetries: number = 5,
448
456
  baseDelay: number = 1000,
@@ -501,49 +509,36 @@ export async function waitFor(text: string, maxAttempts = 60): Promise<string> {
501
509
  );
502
510
  }
503
511
 
504
- export async function pressBoth() {
505
- const speculosApiPort = getEnv("SPECULOS_API_PORT");
512
+ export async function fetchCurrentScreenTexts(speculosApiPort: number): Promise<string> {
506
513
  const speculosAddress = getSpeculosAddress();
507
- await retryAxiosRequest(() =>
508
- axios.post(`${speculosAddress}:${speculosApiPort}/button/both`, {
509
- action: "press-and-release",
510
- }),
511
- );
512
- }
513
-
514
- export async function pressUntilTextFound(
515
- targetText: string,
516
- strictMatch: boolean = false,
517
- ): Promise<string[]> {
518
- const maxAttempts = 18;
519
- const speculosApiPort = getEnv("SPECULOS_API_PORT");
520
-
521
- for (let attempts = 0; attempts < maxAttempts; attempts++) {
522
- const texts = await fetchCurrentScreenTexts(speculosApiPort);
523
- if (strictMatch ? texts === targetText : texts.includes(targetText)) {
524
- return await fetchAllEvents(speculosApiPort);
525
- }
526
-
527
- await pressRightButton();
528
- await waitForTimeOut(200);
529
- }
530
-
531
- throw new Error(
532
- `ElementNotFoundException: Element with text "${targetText}" not found on speculos screen`,
514
+ const response = await retryAxiosRequest(() =>
515
+ axios.get<ResponseData>(
516
+ `${speculosAddress}:${speculosApiPort}/events?stream=false&currentscreenonly=true`,
517
+ ),
533
518
  );
519
+ return response.data.events.map(event => event.text).join(" ");
534
520
  }
535
521
 
536
- async function fetchCurrentScreenTexts(speculosApiPort: number): Promise<string> {
522
+ export async function getDeviceLabelCoordinates(
523
+ label: string,
524
+ speculosApiPort: number,
525
+ ): Promise<{ x: number; y: number }> {
537
526
  const speculosAddress = getSpeculosAddress();
538
527
  const response = await retryAxiosRequest(() =>
539
528
  axios.get<ResponseData>(
540
529
  `${speculosAddress}:${speculosApiPort}/events?stream=false&currentscreenonly=true`,
541
530
  ),
542
531
  );
543
- return response.data.events.map(event => event.text).join(" ");
532
+ const event = response.data.events.find(e => e.text === label);
533
+
534
+ if (!event) {
535
+ throw new Error(`Label "${label}" not found in screen events`);
536
+ }
537
+
538
+ return { x: event.x, y: event.y };
544
539
  }
545
540
 
546
- async function fetchAllEvents(speculosApiPort: number): Promise<string[]> {
541
+ export async function fetchAllEvents(speculosApiPort: number): Promise<string[]> {
547
542
  const speculosAddress = getSpeculosAddress();
548
543
  const response = await retryAxiosRequest(() =>
549
544
  axios.get<ResponseData>(
@@ -553,13 +548,30 @@ async function fetchAllEvents(speculosApiPort: number): Promise<string[]> {
553
548
  return response.data.events.map(event => event.text);
554
549
  }
555
550
 
556
- export async function pressRightButton(): Promise<void> {
551
+ export async function pressUntilTextFound(
552
+ targetText: string,
553
+ strictMatch: boolean = false,
554
+ ): Promise<string[]> {
555
+ const maxAttempts = 18;
557
556
  const speculosApiPort = getEnv("SPECULOS_API_PORT");
558
- const speculosAddress = getSpeculosAddress();
559
- await retryAxiosRequest(() =>
560
- axios.post(`${speculosAddress}:${speculosApiPort}/button/right`, {
561
- action: "press-and-release",
562
- }),
557
+
558
+ for (let attempts = 0; attempts < maxAttempts; attempts++) {
559
+ const texts = await fetchCurrentScreenTexts(speculosApiPort);
560
+ if (
561
+ strictMatch ? texts === targetText : texts.toLowerCase().includes(targetText.toLowerCase())
562
+ ) {
563
+ return await fetchAllEvents(speculosApiPort);
564
+ }
565
+ if (isTouchDevice()) {
566
+ await swipeRight();
567
+ } else {
568
+ await pressRightButton();
569
+ }
570
+ await waitForTimeOut(200);
571
+ }
572
+
573
+ throw new Error(
574
+ `ElementNotFoundException: Element with text "${targetText}" not found on speculos screen`,
563
575
  );
564
576
  }
565
577
 
@@ -597,31 +609,56 @@ export async function waitForTimeOut(ms: number) {
597
609
  }
598
610
 
599
611
  export async function removeMemberLedgerSync() {
600
- await waitFor(DeviceLabels.CONNECT_TO);
601
- await pressUntilTextFound(DeviceLabels.CONNECT, true);
602
- await pressBoth();
603
- await waitFor(DeviceLabels.REMOVE_FROM_LEDGER_SYNC);
604
- await pressUntilTextFound(DeviceLabels.REMOVE, true);
605
- await pressBoth();
606
- await waitFor(DeviceLabels.TURN_ON_SYNC);
607
- await pressUntilTextFound(DeviceLabels.LEDGER_LIVE_WILL_BE);
608
- await pressUntilTextFound(DeviceLabels.TURN_ON_SYNC2);
609
- await pressBoth();
612
+ await waitFor(DeviceLabels.CONNECT_WITH);
613
+ if (isTouchDevice()) {
614
+ await pressAndRelease(DeviceLabels.CONNECT);
615
+ await waitFor(DeviceLabels.REMOVE_FROM_LEDGER_SYNC);
616
+ await pressAndRelease(DeviceLabels.REMOVE);
617
+ await waitFor(DeviceLabels.CONFIRM_CHANGE);
618
+ await pressAndRelease(DeviceLabels.TAP_TO_CONTINUE);
619
+ await waitFor(DeviceLabels.TURN_ON_SYNC);
620
+ await pressUntilTextFound(DeviceLabels.LEDGER_LIVE_WILL_BE);
621
+ await pressUntilTextFound(DeviceLabels.TURN_ON_SYNC);
622
+ await pressAndRelease(DeviceLabels.TURN_ON_SYNC);
623
+ } else {
624
+ await pressUntilTextFound(DeviceLabels.CONNECT_WITH_LEDGER_SYNC, true);
625
+ await pressBoth();
626
+ await waitFor(DeviceLabels.REMOVE_PHONE_OR_COMPUTER);
627
+ await pressUntilTextFound(DeviceLabels.REMOVE_PHONE_OR_COMPUTER, true);
628
+ await pressBoth();
629
+ await waitFor(DeviceLabels.TURN_ON_SYNC);
630
+ await pressUntilTextFound(DeviceLabels.LEDGER_LIVE_WILL_BE);
631
+ await pressUntilTextFound(DeviceLabels.TURN_ON_SYNC);
632
+ await pressBoth();
633
+ }
610
634
  }
611
635
 
612
636
  export async function activateLedgerSync() {
613
- await waitFor(DeviceLabels.CONNECT_TO);
614
- await pressUntilTextFound(DeviceLabels.CONNECT, true);
615
- await pressBoth();
637
+ await waitFor(DeviceLabels.CONNECT_WITH);
638
+ if (isTouchDevice()) {
639
+ await pressAndRelease(DeviceLabels.CONNECT_WITH_LEDGER_SYNC);
640
+ } else {
641
+ await pressUntilTextFound(DeviceLabels.CONNECT_WITH_LEDGER_SYNC, true);
642
+ await pressBoth();
643
+ }
616
644
  await waitFor(DeviceLabels.TURN_ON_SYNC);
617
- await pressUntilTextFound(DeviceLabels.LEDGER_LIVE_WILL_BE);
618
- await pressUntilTextFound(DeviceLabels.TURN_ON_SYNC2);
619
- await pressBoth();
645
+ if (isTouchDevice()) {
646
+ await pressAndRelease(DeviceLabels.TURN_ON_SYNC);
647
+ } else {
648
+ await pressUntilTextFound(DeviceLabels.LEDGER_LIVE_WILL_BE);
649
+ await pressUntilTextFound(DeviceLabels.TURN_ON_SYNC);
650
+ await pressBoth();
651
+ }
620
652
  }
621
653
 
622
654
  export async function activateExpertMode() {
623
- await pressUntilTextFound(DeviceLabels.EXPERT_MODE);
624
- await pressBoth();
655
+ if (isTouchDevice()) {
656
+ await goToSettings();
657
+ await pressAndRelease(DeviceLabels.SETTINGS_TOGGLE_1);
658
+ } else {
659
+ await pressUntilTextFound(DeviceLabels.EXPERT_MODE);
660
+ await pressBoth();
661
+ }
625
662
  }
626
663
 
627
664
  export async function activateContractData() {
@@ -632,8 +669,12 @@ export async function activateContractData() {
632
669
  }
633
670
 
634
671
  export async function goToSettings() {
635
- await pressUntilTextFound(DeviceLabels.SETTINGS);
636
- await pressBoth();
672
+ if (isTouchDevice()) {
673
+ await pressAndRelease(DeviceLabels.SETTINGS);
674
+ } else {
675
+ await pressUntilTextFound(DeviceLabels.SETTINGS);
676
+ await pressBoth();
677
+ }
637
678
  }
638
679
 
639
680
  export async function providePublicKey() {
@@ -645,6 +686,8 @@ type DeviceLabelsReturn = {
645
686
  delegateVerifyLabel: string;
646
687
  receiveConfirmLabel: string;
647
688
  receiveVerifyLabel: string;
689
+ sendVerifyLabel: string;
690
+ sendConfirmLabel: string;
648
691
  };
649
692
 
650
693
  export function getDeviceLabels(appInfo: AppInfos): DeviceLabelsReturn {
@@ -663,22 +706,44 @@ export function getDeviceLabels(appInfo: AppInfos): DeviceLabelsReturn {
663
706
  deviceConfig.delegateVerify[appInfo.name] ?? deviceConfig.delegateVerify.default;
664
707
  const delegateConfirmLabel =
665
708
  deviceConfig.delegateConfirm[appInfo.name] ?? deviceConfig.delegateConfirm.default;
666
-
667
- return { receiveVerifyLabel, receiveConfirmLabel, delegateVerifyLabel, delegateConfirmLabel };
709
+ const sendVerifyLabel = deviceConfig.sendVerify[appInfo.name] ?? deviceConfig.sendVerify.default;
710
+ const sendConfirmLabel =
711
+ deviceConfig.sendConfirm[appInfo.name] ?? deviceConfig.sendConfirm.default;
712
+
713
+ return {
714
+ receiveVerifyLabel,
715
+ receiveConfirmLabel,
716
+ delegateVerifyLabel,
717
+ delegateConfirmLabel,
718
+ sendVerifyLabel,
719
+ sendConfirmLabel,
720
+ };
668
721
  }
669
722
 
670
723
  export async function expectValidAddressDevice(account: Account, addressDisplayed: string) {
671
724
  if (account.currency === Currency.SUI_USDC) {
672
725
  providePublicKey();
726
+ } else {
727
+ const { receiveVerifyLabel, receiveConfirmLabel } = getDeviceLabels(
728
+ account.currency.speculosApp,
729
+ );
730
+ await waitFor(receiveVerifyLabel);
731
+ if (isTouchDevice()) {
732
+ const events = await pressUntilTextFound(receiveConfirmLabel);
733
+ const isAddressCorrect = containsSubstringInEvent(addressDisplayed, events);
734
+ expect(isAddressCorrect).toBeTruthy();
735
+ await pressAndRelease(DeviceLabels.CONFIRM);
736
+ } else {
737
+ const { receiveVerifyLabel, receiveConfirmLabel } = getDeviceLabels(
738
+ account.currency.speculosApp,
739
+ );
740
+ await waitFor(receiveVerifyLabel);
741
+ const events = await pressUntilTextFound(receiveConfirmLabel);
742
+ const isAddressCorrect = containsSubstringInEvent(addressDisplayed, events);
743
+ expect(isAddressCorrect).toBeTruthy();
744
+ await pressBoth();
745
+ }
673
746
  }
674
-
675
- const { receiveVerifyLabel, receiveConfirmLabel } = getDeviceLabels(account.currency.speculosApp);
676
-
677
- await waitFor(receiveVerifyLabel);
678
- const events = await pressUntilTextFound(receiveConfirmLabel);
679
- const isAddressCorrect = containsSubstringInEvent(addressDisplayed, events);
680
- expect(isAddressCorrect).toBeTruthy();
681
- await pressBoth();
682
747
  }
683
748
 
684
749
  export async function signSendTransaction(tx: Transaction) {
@@ -725,32 +790,29 @@ export async function signSendTransaction(tx: Transaction) {
725
790
  await sendXRP(tx);
726
791
  break;
727
792
  case Currency.APT:
728
- await sendAptos();
793
+ await sendAptos(tx);
729
794
  break;
730
795
  case Currency.KAS:
731
- await sendKaspa();
796
+ await sendKaspa(tx);
732
797
  break;
733
798
  case Currency.HBAR:
734
799
  await sendHedera();
735
800
  break;
736
801
  case Currency.SUI:
737
- await sendSui();
738
- break;
739
802
  case Currency.SUI_USDC:
740
- await sendSui();
803
+ await sendSui(tx);
741
804
  break;
742
805
  default:
743
806
  throw new Error(`Unsupported currency: ${currencyName.ticker}`);
744
807
  }
745
808
  }
746
809
 
747
- export async function signSendNFTTransaction(tx: NFTTransaction) {
748
- const currencyName = tx.accountToDebit.currency;
749
- if (currencyName === Currency.ETH) {
750
- await sendEvmNFT(tx);
751
- } else {
752
- throw new Error(`Unsupported currency: ${currencyName.ticker}`);
753
- }
810
+ export async function getSendEvents(tx: Transaction): Promise<string[]> {
811
+ const { sendVerifyLabel, sendConfirmLabel } = getDeviceLabels(
812
+ tx.accountToDebit.currency.speculosApp,
813
+ );
814
+ await waitFor(sendVerifyLabel);
815
+ return await pressUntilTextFound(sendConfirmLabel);
754
816
  }
755
817
 
756
818
  export async function signDelegationTransaction(delegatingAccount: Delegate) {
@@ -793,17 +855,22 @@ export async function getDelegateEvents(delegatingAccount: Delegate): Promise<st
793
855
  const { delegateVerifyLabel, delegateConfirmLabel } = getDeviceLabels(
794
856
  delegatingAccount.account.currency.speculosApp,
795
857
  );
796
-
797
858
  await waitFor(delegateVerifyLabel);
798
-
799
859
  return await pressUntilTextFound(delegateConfirmLabel);
800
860
  }
801
861
 
802
862
  export async function verifyAmountsAndAcceptSwap(swap: Swap, amount: string) {
803
863
  await waitFor(DeviceLabels.REVIEW_TRANSACTION);
804
- const events = await pressUntilTextFound(DeviceLabels.SIGN_TRANSACTION);
864
+ const events =
865
+ getSpeculosModel() === DeviceModelId.nanoS
866
+ ? await pressUntilTextFound(DeviceLabels.ACCEPT_AND_SEND)
867
+ : await pressUntilTextFound(DeviceLabels.SIGN_TRANSACTION);
805
868
  verifySwapData(swap, events, amount);
806
- await pressBoth();
869
+ if (isTouchDevice()) {
870
+ await longPressAndRelease(DeviceLabels.HOLD_TO_SIGN, 3);
871
+ } else {
872
+ await pressBoth();
873
+ }
807
874
  }
808
875
 
809
876
  export async function verifyAmountsAndAcceptSwapForDifferentSeed(swap: Swap, amount: string) {
@@ -817,7 +884,11 @@ export async function verifyAmountsAndRejectSwap(swap: Swap, amount: string) {
817
884
  await waitFor(DeviceLabels.REVIEW_TRANSACTION);
818
885
  const events = await pressUntilTextFound(DeviceLabels.REJECT);
819
886
  verifySwapData(swap, events, amount);
820
- await pressBoth();
887
+ if (isTouchDevice()) {
888
+ await longPressAndRelease(DeviceLabels.HOLD_TO_SIGN, 3);
889
+ } else {
890
+ await pressBoth();
891
+ }
821
892
  }
822
893
 
823
894
  function verifySwapData(swap: Swap, events: string[], amount: string) {
@@ -13,17 +13,25 @@ export function getSpeculosModel(): DeviceModelId {
13
13
  return DeviceModelId.nanoS;
14
14
  case CryptoWallet.LNX.name:
15
15
  return DeviceModelId.nanoX;
16
+ case CryptoWallet.STAX.name:
17
+ return DeviceModelId.stax;
16
18
  case CryptoWallet.LNSP.name:
17
19
  default:
18
20
  return DeviceModelId.nanoSP;
19
21
  }
20
22
  }
21
23
 
24
+ export function isTouchDevice(): boolean {
25
+ const model = getSpeculosModel();
26
+ return model === DeviceModelId.stax;
27
+ }
28
+
22
29
  function getDeviceTargetId(device: DeviceModelId): number {
23
30
  const modelToTargetIdMap = {
24
31
  [DeviceModelId.nanoS]: CryptoWallet.LNS.targetId,
25
32
  [DeviceModelId.nanoX]: CryptoWallet.LNX.targetId,
26
33
  [DeviceModelId.nanoSP]: CryptoWallet.LNSP.targetId,
34
+ [DeviceModelId.stax]: CryptoWallet.STAX.targetId,
27
35
  };
28
36
  return modelToTargetIdMap[device];
29
37
  }
@@ -1,7 +1,6 @@
1
1
  import { valid, gte } from "semver";
2
2
  import type { CryptoCurrency, TokenCurrency } from "@ledgerhq/types-cryptoassets";
3
3
  import { getEnv } from "@ledgerhq/live-env";
4
- import { findExchangeCurrencyConfig as findProdExchangeCurrencyConfig } from "@ledgerhq/cryptoassets";
5
4
  import calService from "@ledgerhq/ledger-cal-service";
6
5
  // Minimum version of a currency app which has exchange capabilities, meaning it can be used
7
6
  // for sell/swap, and do silent signing.
@@ -40,21 +39,11 @@ export const isExchangeSupportedByApp = (appName: string, appVersion: string): b
40
39
  export const getCurrencyExchangeConfig = async (
41
40
  currency: CryptoCurrency | TokenCurrency,
42
41
  ): Promise<ExchangeCurrencyNameAndSignature> => {
43
- let res;
44
- try {
45
- const env = getEnv("MOCK_EXCHANGE_TEST_CONFIG") ? "test" : "prod";
46
- res = await calService.findCurrencyData(currency.id, { env });
42
+ const env = getEnv("MOCK_EXCHANGE_TEST_CONFIG") ? "test" : "prod";
43
+ const res = await calService.findCurrencyData(currency.id, { env });
47
44
 
48
- if (!res) {
49
- throw new Error("Missing primary config");
50
- }
51
- } catch (error) {
52
- // Fallback to old production config if the primary fetch fails, should be removed when we have a HA CAL
53
- res = await findProdExchangeCurrencyConfig(currency.id);
54
-
55
- if (!res) {
56
- throw new Error(`Exchange, missing configuration for ${currency.id}`);
57
- }
45
+ if (!res) {
46
+ throw new Error(`Exchange, missing configuration for ${currency.id}`);
58
47
  }
59
48
 
60
49
  return {
@@ -1,11 +1,11 @@
1
- import { findTokenById } from "@ledgerhq/cryptoassets";
1
+ import { getCryptoAssetsStore } from "../../bridge/crypto-assets/index";
2
2
  import type { AccountLike, SwapOperation } from "@ledgerhq/types-live";
3
3
  import { accountWithMandatoryTokens, getAccountCurrency } from "../../account";
4
4
  import type { MappedSwapOperation, SwapHistorySection } from "./types";
5
5
 
6
6
  const getSwapOperationMap =
7
7
  (account: AccountLike, accounts: AccountLike[]) =>
8
- (swapOperation: SwapOperation): MappedSwapOperation | null | undefined => {
8
+ async (swapOperation: SwapOperation): Promise<MappedSwapOperation | null | undefined> => {
9
9
  const {
10
10
  provider,
11
11
  swapId,
@@ -34,7 +34,7 @@ const getSwapOperationMap =
34
34
  toExists = true;
35
35
  }
36
36
  if (toAccount && tokenId) {
37
- const token = findTokenById(tokenId);
37
+ const token = await getCryptoAssetsStore().findTokenById(tokenId);
38
38
 
39
39
  if (token && toAccount.type === "Account") {
40
40
  toParentAccount = toAccount;
@@ -74,7 +74,7 @@ function startOfDay(t) {
74
74
  return new Date(t.getFullYear(), t.getMonth(), t.getDate());
75
75
  }
76
76
 
77
- const getCompleteSwapHistory = (accounts: AccountLike[]): SwapHistorySection[] => {
77
+ const getCompleteSwapHistory = async (accounts: AccountLike[]): Promise<SwapHistorySection[]> => {
78
78
  const swaps: MappedSwapOperation[] = [];
79
79
 
80
80
  for (const account of accounts) {
@@ -83,7 +83,7 @@ const getCompleteSwapHistory = (accounts: AccountLike[]): SwapHistorySection[] =
83
83
  const mapFn = getSwapOperationMap(account, accounts);
84
84
 
85
85
  if (swapHistory) {
86
- const mappedSwapHistory = swapHistory.map(mapFn);
86
+ const mappedSwapHistory = await Promise.all(swapHistory.map(mapFn));
87
87
 
88
88
  if (mappedSwapHistory) {
89
89
  const filteredMappdSwapOperations = <MappedSwapOperation[]>(
@@ -2,7 +2,7 @@
2
2
  * @jest-environment jsdom
3
3
  */
4
4
  import "../../../__tests__/test-helpers/dom-polyfill";
5
- import { getCryptoCurrencyById, findTokenById } from "@ledgerhq/cryptoassets";
5
+ import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets";
6
6
  import { Account } from "@ledgerhq/types-live";
7
7
  import { renderHook, act } from "@testing-library/react";
8
8
  import BigNumber from "bignumber.js";
@@ -14,9 +14,16 @@ import { useFromState } from "./useFromState";
14
14
 
15
15
  const BTC = getCryptoCurrencyById("bitcoin");
16
16
  const ETH = getCryptoCurrencyById("ethereum");
17
- const usdtToken = findTokenById("ethereum/erc20/usd_tether__erc20_");
18
- if (!usdtToken) throw new Error("USDT token not found");
19
- const USDT = usdtToken;
17
+ const USDT = {
18
+ type: "TokenCurrency" as const,
19
+ id: "ethereum/erc20/usd_tether__erc20_",
20
+ name: "Tether USD (ERC-20)",
21
+ ticker: "USDT",
22
+ units: [{ name: "Tether USD", code: "USDT", magnitude: 6 }],
23
+ contractAddress: "0xdac17f958d2ee523a2206206994597c13d831ec7",
24
+ parentCurrency: ETH,
25
+ tokenType: "erc20" as const,
26
+ };
20
27
 
21
28
  jest.useFakeTimers();
22
29
 
@@ -2,7 +2,7 @@
2
2
  * @jest-environment jsdom
3
3
  */
4
4
  import "../../../__tests__/test-helpers/dom-polyfill";
5
- import { getCryptoCurrencyById, findTokenById } from "@ledgerhq/cryptoassets";
5
+ import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets";
6
6
  import type { Account } from "@ledgerhq/types-live";
7
7
  import { renderHook, act } from "@testing-library/react";
8
8
  import { genTokenAccount } from "@ledgerhq/coin-framework/mocks/account";
@@ -11,9 +11,16 @@ import { useReverseAccounts } from "./useReverseAccounts";
11
11
 
12
12
  const BTC = getCryptoCurrencyById("bitcoin");
13
13
  const ETH = getCryptoCurrencyById("ethereum");
14
- const usdtToken = findTokenById("ethereum/erc20/usd_tether__erc20_");
15
- if (!usdtToken) throw new Error("USDT token not found");
16
- const USDT = usdtToken;
14
+ const USDT = {
15
+ type: "TokenCurrency" as const,
16
+ id: "ethereum/erc20/usd_tether__erc20_",
17
+ name: "Tether USD (ERC-20)",
18
+ ticker: "USDT",
19
+ units: [{ name: "Tether USD", code: "USDT", magnitude: 6 }],
20
+ contractAddress: "0xdac17f958d2ee523a2206206994597c13d831ec7",
21
+ parentCurrency: ETH,
22
+ tokenType: "erc20" as const,
23
+ };
17
24
 
18
25
  const fromParentAccount = genAccount("mocked-account-2", {
19
26
  currency: ETH,
@@ -1,36 +1,42 @@
1
1
  /**
2
2
  * @jest-environment jsdom
3
3
  */
4
- import { renderHook } from "@testing-library/react";
4
+ import { renderHook, waitFor } from "@testing-library/react";
5
5
 
6
6
  import { useSelectableCurrencies } from "./useSelectableCurrencies";
7
7
  import { getCryptoCurrencyById } from "../../../currencies";
8
8
 
9
9
  describe("useSelectableCurrencies", () => {
10
- test("returns an empty array when empty list are passed", () => {
10
+ test("returns an empty array when empty list are passed", async () => {
11
11
  const allCurrencies = [];
12
12
 
13
13
  const { result } = renderHook(() => useSelectableCurrencies({ allCurrencies }));
14
14
 
15
- expect(result.current).toEqual([]);
15
+ await waitFor(() => {
16
+ expect(result.current).toEqual([]);
17
+ });
16
18
  });
17
19
 
18
- test("returns an empty array when incorrect ids are passed", () => {
20
+ test("returns an empty array when incorrect ids are passed", async () => {
19
21
  const allCurrencies = ["ethercoin", "bitether", "polkamos"];
20
22
 
21
23
  const { result } = renderHook(() => useSelectableCurrencies({ allCurrencies }));
22
24
 
23
- expect(result.current).toEqual([]);
25
+ await waitFor(() => {
26
+ expect(result.current).toEqual([]);
27
+ });
24
28
  });
25
29
 
26
- test("returns correct currencies for all correct ids, in the same order", () => {
30
+ test("returns correct currencies for all correct ids, in the same order", async () => {
27
31
  const allCurrencies = ["ethereum", "bitcoin", "polkamos"];
28
32
  const ethereumCurrency = getCryptoCurrencyById("ethereum");
29
33
  const bitcoinCurrency = getCryptoCurrencyById("bitcoin");
30
34
 
31
35
  const { result } = renderHook(() => useSelectableCurrencies({ allCurrencies }));
32
36
 
33
- expect(result.current).toHaveLength(2);
34
- expect(result.current).toEqual([ethereumCurrency, bitcoinCurrency]);
37
+ await waitFor(() => {
38
+ expect(result.current).toHaveLength(2);
39
+ expect(result.current).toEqual([ethereumCurrency, bitcoinCurrency]);
40
+ });
35
41
  });
36
42
  });
@@ -1,5 +1,6 @@
1
- import { useMemo } from "react";
2
- import { findCryptoCurrencyById, findTokenById } from "@ledgerhq/cryptoassets";
1
+ import { useEffect, useState } from "react";
2
+ import { findCryptoCurrencyById } from "@ledgerhq/cryptoassets";
3
+ import { getCryptoAssetsStore } from "../../../bridge/crypto-assets/index";
3
4
  import type { CryptoCurrency, TokenCurrency } from "@ledgerhq/types-cryptoassets";
4
5
 
5
6
  export const useSelectableCurrencies = ({
@@ -7,10 +8,26 @@ export const useSelectableCurrencies = ({
7
8
  }: {
8
9
  allCurrencies: string[];
9
10
  }): (TokenCurrency | CryptoCurrency)[] => {
10
- const currencies = useMemo(() => {
11
- const tokens = allCurrencies.map(findTokenById).filter(Boolean);
12
- const cryptoCurrencies = allCurrencies.map(findCryptoCurrencyById).filter(Boolean);
13
- return [...tokens, ...cryptoCurrencies] as (TokenCurrency | CryptoCurrency)[];
11
+ const [currencies, setCurrencies] = useState<(TokenCurrency | CryptoCurrency)[]>([]);
12
+
13
+ useEffect(() => {
14
+ const loadCurrencies = async () => {
15
+ const results = await Promise.all(
16
+ allCurrencies.map(async id => {
17
+ // Try token first, then crypto currency
18
+ const token = await getCryptoAssetsStore().findTokenById(id);
19
+ if (token) return token;
20
+
21
+ const crypto = findCryptoCurrencyById(id);
22
+ return crypto;
23
+ }),
24
+ );
25
+
26
+ const validCurrencies = results.filter(Boolean) as (TokenCurrency | CryptoCurrency)[];
27
+ setCurrencies(validCurrencies);
28
+ };
29
+
30
+ loadCurrencies();
14
31
  }, [allCurrencies]);
15
32
 
16
33
  return currencies;