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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (423) hide show
  1. package/lib/__tests__/families/bitcoin/wallet-btc/xpub.syncing.integration.test.js +2 -2
  2. package/lib/__tests__/test-helpers/environment.d.ts +2 -0
  3. package/lib/__tests__/test-helpers/environment.d.ts.map +1 -0
  4. package/lib/__tests__/test-helpers/environment.js +107 -0
  5. package/lib/__tests__/test-helpers/environment.js.map +1 -0
  6. package/lib/__tests__/test-helpers/setup.d.ts +1 -1
  7. package/lib/__tests__/test-helpers/setup.d.ts.map +1 -1
  8. package/lib/__tests__/test-helpers/setup.js +1 -101
  9. package/lib/__tests__/test-helpers/setup.js.map +1 -1
  10. package/lib/account/importAccounts.d.ts +35 -2
  11. package/lib/account/importAccounts.d.ts.map +1 -1
  12. package/lib/account/importAccounts.integration.test.d.ts +2 -0
  13. package/lib/account/importAccounts.integration.test.d.ts.map +1 -0
  14. package/lib/account/importAccounts.integration.test.js +219 -0
  15. package/lib/account/importAccounts.integration.test.js.map +1 -0
  16. package/lib/account/importAccounts.js +130 -12
  17. package/lib/account/importAccounts.js.map +1 -1
  18. package/lib/account/importAccounts.test.d.ts +2 -0
  19. package/lib/account/importAccounts.test.d.ts.map +1 -0
  20. package/lib/{__tests__/accounts/importAccounts.js → account/importAccounts.test.js} +44 -64
  21. package/lib/account/importAccounts.test.js.map +1 -0
  22. package/lib/account/serialization.d.ts.map +1 -1
  23. package/lib/account/serialization.js +83 -40
  24. package/lib/account/serialization.js.map +1 -1
  25. package/lib/bot/bot-test-context.d.ts +3 -0
  26. package/lib/bot/bot-test-context.d.ts.map +1 -0
  27. package/lib/bot/bot-test-context.js +26 -0
  28. package/lib/bot/bot-test-context.js.map +1 -0
  29. package/lib/bot/bot-test-context.test.d.ts +2 -0
  30. package/lib/bot/bot-test-context.test.d.ts.map +1 -0
  31. package/lib/bot/bot-test-context.test.js +41 -0
  32. package/lib/bot/bot-test-context.test.js.map +1 -0
  33. package/lib/bot/cli.d.ts +2 -0
  34. package/lib/bot/cli.d.ts.map +1 -0
  35. package/lib/bot/cli.js +14 -0
  36. package/lib/bot/cli.js.map +1 -0
  37. package/lib/bot/engine.d.ts +5 -5
  38. package/lib/bot/engine.d.ts.map +1 -1
  39. package/lib/bot/engine.js +161 -112
  40. package/lib/bot/engine.js.map +1 -1
  41. package/lib/bot/formatters.d.ts +2 -2
  42. package/lib/bot/formatters.d.ts.map +1 -1
  43. package/lib/bot/formatters.js +41 -15
  44. package/lib/bot/formatters.js.map +1 -1
  45. package/lib/bot/index.d.ts +1 -1
  46. package/lib/bot/index.d.ts.map +1 -1
  47. package/lib/bot/index.js +90 -15
  48. package/lib/bot/index.js.map +1 -1
  49. package/lib/bot/specs.d.ts +2 -1
  50. package/lib/bot/specs.d.ts.map +1 -1
  51. package/lib/bot/specs.js +13 -9
  52. package/lib/bot/specs.js.map +1 -1
  53. package/lib/bot/types.d.ts +5 -2
  54. package/lib/bot/types.d.ts.map +1 -1
  55. package/lib/countervalues/logic.integration.test.js +65 -0
  56. package/lib/countervalues/logic.integration.test.js.map +1 -1
  57. package/lib/countervalues/modules/weth.d.ts.map +1 -1
  58. package/lib/countervalues/modules/weth.js +5 -10
  59. package/lib/countervalues/modules/weth.js.map +1 -1
  60. package/lib/currencies/sortByMarketcap.d.ts +0 -2
  61. package/lib/currencies/sortByMarketcap.d.ts.map +1 -1
  62. package/lib/currencies/sortByMarketcap.js +3 -17
  63. package/lib/currencies/sortByMarketcap.js.map +1 -1
  64. package/lib/currencies/sortByMarketcap.test.js +0 -5
  65. package/lib/currencies/sortByMarketcap.test.js.map +1 -1
  66. package/lib/env.js +1 -1
  67. package/lib/families/algorand/specs.d.ts.map +1 -1
  68. package/lib/families/algorand/specs.js +18 -10
  69. package/lib/families/algorand/specs.js.map +1 -1
  70. package/lib/families/algorand/speculos-deviceActions.d.ts +1 -4
  71. package/lib/families/algorand/speculos-deviceActions.d.ts.map +1 -1
  72. package/lib/families/algorand/speculos-deviceActions.js +25 -8
  73. package/lib/families/algorand/speculos-deviceActions.js.map +1 -1
  74. package/lib/families/bitcoin/bridge/mock.d.ts.map +1 -1
  75. package/lib/families/bitcoin/bridge/mock.js +6 -1
  76. package/lib/families/bitcoin/bridge/mock.js.map +1 -1
  77. package/lib/families/bitcoin/datasets/bitcoin_cash.d.ts.map +1 -1
  78. package/lib/families/bitcoin/datasets/bitcoin_cash.js +1 -1
  79. package/lib/families/bitcoin/datasets/bitcoin_cash.js.map +1 -1
  80. package/lib/families/bitcoin/datasets/dash.d.ts.map +1 -1
  81. package/lib/families/bitcoin/datasets/dash.js +1 -1
  82. package/lib/families/bitcoin/datasets/dash.js.map +1 -1
  83. package/lib/families/bitcoin/datasets/decred.d.ts.map +1 -1
  84. package/lib/families/bitcoin/datasets/decred.js +1 -1
  85. package/lib/families/bitcoin/datasets/decred.js.map +1 -1
  86. package/lib/families/bitcoin/datasets/digibyte.d.ts.map +1 -1
  87. package/lib/families/bitcoin/datasets/digibyte.js +8 -2
  88. package/lib/families/bitcoin/datasets/digibyte.js.map +1 -1
  89. package/lib/families/bitcoin/datasets/dogecoin.d.ts.map +1 -1
  90. package/lib/families/bitcoin/datasets/dogecoin.js +1 -1
  91. package/lib/families/bitcoin/datasets/dogecoin.js.map +1 -1
  92. package/lib/families/bitcoin/datasets/komodo.js +1 -1
  93. package/lib/families/bitcoin/datasets/komodo.js.map +1 -1
  94. package/lib/families/bitcoin/datasets/litecoin.d.ts.map +1 -1
  95. package/lib/families/bitcoin/datasets/litecoin.js +8 -2
  96. package/lib/families/bitcoin/datasets/litecoin.js.map +1 -1
  97. package/lib/families/bitcoin/datasets/peercoin.js +1 -1
  98. package/lib/families/bitcoin/datasets/peercoin.js.map +1 -1
  99. package/lib/families/bitcoin/datasets/pivx.js +1 -1
  100. package/lib/families/bitcoin/datasets/pivx.js.map +1 -1
  101. package/lib/families/bitcoin/datasets/qtum.js +1 -1
  102. package/lib/families/bitcoin/datasets/qtum.js.map +1 -1
  103. package/lib/families/bitcoin/datasets/stakenet.d.ts.map +1 -1
  104. package/lib/families/bitcoin/datasets/stakenet.js +1 -1
  105. package/lib/families/bitcoin/datasets/stakenet.js.map +1 -1
  106. package/lib/families/bitcoin/datasets/vertcoin.d.ts.map +1 -1
  107. package/lib/families/bitcoin/datasets/vertcoin.js +1 -1
  108. package/lib/families/bitcoin/datasets/vertcoin.js.map +1 -1
  109. package/lib/families/bitcoin/datasets/viacoin.d.ts.map +1 -1
  110. package/lib/families/bitcoin/datasets/viacoin.js +1 -1
  111. package/lib/families/bitcoin/datasets/viacoin.js.map +1 -1
  112. package/lib/families/bitcoin/datasets/zcash.d.ts.map +1 -1
  113. package/lib/families/bitcoin/datasets/zcash.js +1 -1
  114. package/lib/families/bitcoin/datasets/zcash.js.map +1 -1
  115. package/lib/families/bitcoin/datasets/zencash.d.ts.map +1 -1
  116. package/lib/families/bitcoin/datasets/zencash.js +1 -1
  117. package/lib/families/bitcoin/datasets/zencash.js.map +1 -1
  118. package/lib/families/bitcoin/platformAdapter.test.d.ts +2 -0
  119. package/lib/families/bitcoin/platformAdapter.test.d.ts.map +1 -0
  120. package/lib/families/bitcoin/platformAdapter.test.js +48 -0
  121. package/lib/families/bitcoin/platformAdapter.test.js.map +1 -0
  122. package/lib/families/bitcoin/specs.d.ts.map +1 -1
  123. package/lib/families/bitcoin/specs.js +62 -24
  124. package/lib/families/bitcoin/specs.js.map +1 -1
  125. package/lib/families/bitcoin/speculos-deviceActions.d.ts +1 -4
  126. package/lib/families/bitcoin/speculos-deviceActions.d.ts.map +1 -1
  127. package/lib/families/bitcoin/speculos-deviceActions.js +2 -4
  128. package/lib/families/bitcoin/speculos-deviceActions.js.map +1 -1
  129. package/lib/families/cardano/js-estimateMaxSpendable.js +1 -1
  130. package/lib/families/cardano/js-estimateMaxSpendable.js.map +1 -1
  131. package/lib/families/cardano/specs.d.ts.map +1 -1
  132. package/lib/families/cardano/specs.js +19 -8
  133. package/lib/families/cardano/specs.js.map +1 -1
  134. package/lib/families/cardano/speculos-deviceActions.d.ts +1 -4
  135. package/lib/families/cardano/speculos-deviceActions.d.ts.map +1 -1
  136. package/lib/families/cardano/speculos-deviceActions.js +2 -2
  137. package/lib/families/cardano/speculos-deviceActions.js.map +1 -1
  138. package/lib/families/celo/specs.d.ts.map +1 -1
  139. package/lib/families/celo/specs.js +2 -0
  140. package/lib/families/celo/specs.js.map +1 -1
  141. package/lib/families/celo/speculos-deviceActions.d.ts +1 -4
  142. package/lib/families/celo/speculos-deviceActions.d.ts.map +1 -1
  143. package/lib/families/celo/speculos-deviceActions.js +2 -4
  144. package/lib/families/celo/speculos-deviceActions.js.map +1 -1
  145. package/lib/families/cosmos/specs.d.ts.map +1 -1
  146. package/lib/families/cosmos/specs.js +41 -25
  147. package/lib/families/cosmos/specs.js.map +1 -1
  148. package/lib/families/cosmos/speculos-deviceActions.d.ts +1 -4
  149. package/lib/families/cosmos/speculos-deviceActions.d.ts.map +1 -1
  150. package/lib/families/cosmos/speculos-deviceActions.js +2 -4
  151. package/lib/families/cosmos/speculos-deviceActions.js.map +1 -1
  152. package/lib/families/crypto_org/specs.d.ts.map +1 -1
  153. package/lib/families/crypto_org/specs.js +3 -0
  154. package/lib/families/crypto_org/specs.js.map +1 -1
  155. package/lib/families/crypto_org/speculos-deviceActions.d.ts +1 -4
  156. package/lib/families/crypto_org/speculos-deviceActions.d.ts.map +1 -1
  157. package/lib/families/crypto_org/speculos-deviceActions.js +2 -2
  158. package/lib/families/crypto_org/speculos-deviceActions.js.map +1 -1
  159. package/lib/families/elrond/specs.d.ts.map +1 -1
  160. package/lib/families/elrond/specs.js +15 -2
  161. package/lib/families/elrond/specs.js.map +1 -1
  162. package/lib/families/elrond/speculos-deviceActions.d.ts +1 -4
  163. package/lib/families/elrond/speculos-deviceActions.d.ts.map +1 -1
  164. package/lib/families/elrond/speculos-deviceActions.js +2 -4
  165. package/lib/families/elrond/speculos-deviceActions.js.map +1 -1
  166. package/lib/families/ethereum/platformAdapter.test.d.ts +2 -0
  167. package/lib/families/ethereum/platformAdapter.test.d.ts.map +1 -0
  168. package/lib/families/ethereum/platformAdapter.test.js +88 -0
  169. package/lib/families/ethereum/platformAdapter.test.js.map +1 -0
  170. package/lib/families/ethereum/specs.d.ts.map +1 -1
  171. package/lib/families/ethereum/specs.js +36 -12
  172. package/lib/families/ethereum/specs.js.map +1 -1
  173. package/lib/families/ethereum/speculos-deviceActions.d.ts +1 -4
  174. package/lib/families/ethereum/speculos-deviceActions.d.ts.map +1 -1
  175. package/lib/families/ethereum/speculos-deviceActions.js +2 -4
  176. package/lib/families/ethereum/speculos-deviceActions.js.map +1 -1
  177. package/lib/families/filecoin/specs.d.ts.map +1 -1
  178. package/lib/families/filecoin/specs.js +2 -0
  179. package/lib/families/filecoin/specs.js.map +1 -1
  180. package/lib/families/filecoin/speculos-deviceActions.d.ts +1 -4
  181. package/lib/families/filecoin/speculos-deviceActions.d.ts.map +1 -1
  182. package/lib/families/filecoin/speculos-deviceActions.js +2 -2
  183. package/lib/families/filecoin/speculos-deviceActions.js.map +1 -1
  184. package/lib/families/hedera/specs.d.ts.map +1 -1
  185. package/lib/families/hedera/specs.js +11 -3
  186. package/lib/families/hedera/specs.js.map +1 -1
  187. package/lib/families/hedera/speculos-deviceActions.d.ts +1 -4
  188. package/lib/families/hedera/speculos-deviceActions.d.ts.map +1 -1
  189. package/lib/families/hedera/speculos-deviceActions.js +4 -4
  190. package/lib/families/hedera/speculos-deviceActions.js.map +1 -1
  191. package/lib/families/osmosis/specs.d.ts.map +1 -1
  192. package/lib/families/osmosis/specs.js +13 -5
  193. package/lib/families/osmosis/specs.js.map +1 -1
  194. package/lib/families/osmosis/speculos-deviceActions.d.ts +1 -4
  195. package/lib/families/osmosis/speculos-deviceActions.d.ts.map +1 -1
  196. package/lib/families/osmosis/speculos-deviceActions.js +2 -4
  197. package/lib/families/osmosis/speculos-deviceActions.js.map +1 -1
  198. package/lib/families/polkadot/platformAdapter.test.d.ts +2 -0
  199. package/lib/families/polkadot/platformAdapter.test.d.ts.map +1 -0
  200. package/lib/families/polkadot/platformAdapter.test.js +51 -0
  201. package/lib/families/polkadot/platformAdapter.test.js.map +1 -0
  202. package/lib/families/polkadot/specs.d.ts.map +1 -1
  203. package/lib/families/polkadot/specs.js +12 -1
  204. package/lib/families/polkadot/specs.js.map +1 -1
  205. package/lib/families/polkadot/speculos-deviceActions.d.ts +1 -4
  206. package/lib/families/polkadot/speculos-deviceActions.d.ts.map +1 -1
  207. package/lib/families/polkadot/speculos-deviceActions.js +2 -4
  208. package/lib/families/polkadot/speculos-deviceActions.js.map +1 -1
  209. package/lib/families/ripple/platformAdapter.test.d.ts +2 -0
  210. package/lib/families/ripple/platformAdapter.test.d.ts.map +1 -0
  211. package/lib/families/ripple/platformAdapter.test.js +51 -0
  212. package/lib/families/ripple/platformAdapter.test.js.map +1 -0
  213. package/lib/families/ripple/specs.d.ts.map +1 -1
  214. package/lib/families/ripple/specs.js +9 -4
  215. package/lib/families/ripple/specs.js.map +1 -1
  216. package/lib/families/ripple/speculos-deviceActions.d.ts +1 -4
  217. package/lib/families/ripple/speculos-deviceActions.d.ts.map +1 -1
  218. package/lib/families/ripple/speculos-deviceActions.js +2 -4
  219. package/lib/families/ripple/speculos-deviceActions.js.map +1 -1
  220. package/lib/families/solana/specs.d.ts.map +1 -1
  221. package/lib/families/solana/specs.js +29 -11
  222. package/lib/families/solana/specs.js.map +1 -1
  223. package/lib/families/solana/speculos-deviceActions.d.ts +0 -5
  224. package/lib/families/solana/speculos-deviceActions.d.ts.map +1 -1
  225. package/lib/families/solana/speculos-deviceActions.js +0 -4
  226. package/lib/families/solana/speculos-deviceActions.js.map +1 -1
  227. package/lib/families/stellar/api/horizon.d.ts.map +1 -1
  228. package/lib/families/stellar/api/horizon.js +15 -10
  229. package/lib/families/stellar/api/horizon.js.map +1 -1
  230. package/lib/families/stellar/specs.d.ts.map +1 -1
  231. package/lib/families/stellar/specs.js +30 -12
  232. package/lib/families/stellar/specs.js.map +1 -1
  233. package/lib/families/stellar/speculos-deviceActions.d.ts +1 -4
  234. package/lib/families/stellar/speculos-deviceActions.d.ts.map +1 -1
  235. package/lib/families/stellar/speculos-deviceActions.js +2 -4
  236. package/lib/families/stellar/speculos-deviceActions.js.map +1 -1
  237. package/lib/families/tezos/bakers.whitelist-default.d.ts.map +1 -1
  238. package/lib/families/tezos/bakers.whitelist-default.js +1 -1
  239. package/lib/families/tezos/bakers.whitelist-default.js.map +1 -1
  240. package/lib/families/tezos/specs.d.ts.map +1 -1
  241. package/lib/families/tezos/specs.js +2 -0
  242. package/lib/families/tezos/specs.js.map +1 -1
  243. package/lib/families/tezos/speculos-deviceActions.d.ts +1 -4
  244. package/lib/families/tezos/speculos-deviceActions.d.ts.map +1 -1
  245. package/lib/families/tezos/speculos-deviceActions.js +2 -2
  246. package/lib/families/tezos/speculos-deviceActions.js.map +1 -1
  247. package/lib/families/tron/specs.d.ts.map +1 -1
  248. package/lib/families/tron/specs.js +49 -17
  249. package/lib/families/tron/specs.js.map +1 -1
  250. package/lib/families/tron/speculos-deviceActions.d.ts +1 -4
  251. package/lib/families/tron/speculos-deviceActions.d.ts.map +1 -1
  252. package/lib/families/tron/speculos-deviceActions.js +2 -4
  253. package/lib/families/tron/speculos-deviceActions.js.map +1 -1
  254. package/lib/hw/getGenuineCheckFromDeviceId.d.ts +22 -0
  255. package/lib/hw/getGenuineCheckFromDeviceId.d.ts.map +1 -0
  256. package/lib/hw/getGenuineCheckFromDeviceId.js +49 -0
  257. package/lib/hw/getGenuineCheckFromDeviceId.js.map +1 -0
  258. package/lib/hw/getGenuineCheckFromDeviceId.test.d.ts +2 -0
  259. package/lib/hw/getGenuineCheckFromDeviceId.test.d.ts.map +1 -0
  260. package/lib/hw/getGenuineCheckFromDeviceId.test.js +84 -0
  261. package/lib/hw/getGenuineCheckFromDeviceId.test.js.map +1 -0
  262. package/lib/hw/getLatestAvailableFirmwareFromDeviceId.d.ts +17 -0
  263. package/lib/hw/getLatestAvailableFirmwareFromDeviceId.d.ts.map +1 -0
  264. package/lib/hw/getLatestAvailableFirmwareFromDeviceId.js +27 -0
  265. package/lib/hw/getLatestAvailableFirmwareFromDeviceId.js.map +1 -0
  266. package/lib/hw/hooks/useGenuineCheck.d.ts +34 -0
  267. package/lib/hw/hooks/useGenuineCheck.d.ts.map +1 -0
  268. package/lib/hw/hooks/useGenuineCheck.js +115 -0
  269. package/lib/hw/hooks/useGenuineCheck.js.map +1 -0
  270. package/lib/hw/hooks/useGenuineCheck.test.d.ts +2 -0
  271. package/lib/hw/hooks/useGenuineCheck.test.d.ts.map +1 -0
  272. package/lib/hw/hooks/useGenuineCheck.test.js +316 -0
  273. package/lib/hw/hooks/useGenuineCheck.test.js.map +1 -0
  274. package/lib/hw/hooks/useGetLatestAvailableFirmware.d.ts +29 -0
  275. package/lib/hw/hooks/useGetLatestAvailableFirmware.d.ts.map +1 -0
  276. package/lib/hw/hooks/useGetLatestAvailableFirmware.js +72 -0
  277. package/lib/hw/hooks/useGetLatestAvailableFirmware.js.map +1 -0
  278. package/lib/hw/hooks/useGetLatestAvailableFirmware.test.d.ts +2 -0
  279. package/lib/hw/hooks/useGetLatestAvailableFirmware.test.d.ts.map +1 -0
  280. package/lib/hw/hooks/useGetLatestAvailableFirmware.test.js +155 -0
  281. package/lib/hw/hooks/useGetLatestAvailableFirmware.test.js.map +1 -0
  282. package/lib/load/speculos.d.ts +1 -0
  283. package/lib/load/speculos.d.ts.map +1 -1
  284. package/lib/load/speculos.js +2 -1
  285. package/lib/load/speculos.js.map +1 -1
  286. package/lib/mock/fixtures/cryptoCurrencies.d.ts +5 -0
  287. package/lib/mock/fixtures/cryptoCurrencies.d.ts.map +1 -0
  288. package/lib/mock/fixtures/cryptoCurrencies.js +91 -0
  289. package/lib/mock/fixtures/cryptoCurrencies.js.map +1 -0
  290. package/lib/platform/converters.test.js +44 -218
  291. package/lib/platform/converters.test.js.map +1 -1
  292. package/lib/platform/logic.d.ts +44 -0
  293. package/lib/platform/logic.d.ts.map +1 -1
  294. package/lib/platform/logic.js +147 -1
  295. package/lib/platform/logic.js.map +1 -1
  296. package/lib/platform/logic.test.d.ts +2 -0
  297. package/lib/platform/logic.test.d.ts.map +1 -0
  298. package/lib/platform/logic.test.js +903 -0
  299. package/lib/platform/logic.test.js.map +1 -0
  300. package/lib/platform/react.d.ts +6 -0
  301. package/lib/platform/react.d.ts.map +1 -1
  302. package/lib/platform/react.js +6 -0
  303. package/lib/platform/react.js.map +1 -1
  304. package/lib/platform/tracking.d.ts +1 -1
  305. package/lib/platform/tracking.d.ts.map +1 -1
  306. package/lib/platform/tracking.test.js +14 -41
  307. package/lib/platform/tracking.test.js.map +1 -1
  308. package/lib/reconciliation.d.ts.map +1 -1
  309. package/lib/reconciliation.js +28 -10
  310. package/lib/reconciliation.js.map +1 -1
  311. package/package.json +19 -20
  312. package/src/__tests__/families/bitcoin/wallet-btc/xpub.syncing.integration.test.ts +2 -2
  313. package/src/__tests__/test-helpers/environment.ts +91 -0
  314. package/src/__tests__/test-helpers/setup.ts +2 -91
  315. package/src/account/importAccounts.integration.test.ts +193 -0
  316. package/src/{__tests__/accounts/importAccounts.ts → account/importAccounts.test.ts} +39 -59
  317. package/src/account/importAccounts.ts +103 -12
  318. package/src/account/serialization.ts +103 -64
  319. package/src/bot/bot-test-context.test.ts +37 -0
  320. package/src/bot/bot-test-context.ts +24 -0
  321. package/src/bot/cli.ts +18 -0
  322. package/src/bot/engine.ts +109 -73
  323. package/src/bot/formatters.ts +40 -14
  324. package/src/bot/index.ts +124 -18
  325. package/src/bot/specs.ts +10 -5
  326. package/src/bot/types.ts +7 -3
  327. package/src/countervalues/logic.integration.test.ts +50 -0
  328. package/src/countervalues/modules/weth.ts +9 -12
  329. package/src/currencies/__snapshots__/sortByMarketcap.test.ts.snap +59 -1
  330. package/src/currencies/sortByMarketcap.test.ts +1 -12
  331. package/src/currencies/sortByMarketcap.ts +2 -22
  332. package/src/env.ts +1 -1
  333. package/src/families/algorand/__snapshots__/bridge.integration.test.ts.snap +733 -8
  334. package/src/families/algorand/specs.ts +26 -16
  335. package/src/families/algorand/speculos-deviceActions.ts +31 -10
  336. package/src/families/bitcoin/__snapshots__/bridge.integration.test.ts.snap +43309 -7957
  337. package/src/families/bitcoin/bridge/mock.ts +7 -1
  338. package/src/families/bitcoin/datasets/bitcoin_cash.ts +73 -13
  339. package/src/families/bitcoin/datasets/dash.ts +29 -17
  340. package/src/families/bitcoin/datasets/decred.ts +42 -12
  341. package/src/families/bitcoin/datasets/digibyte.ts +9 -3
  342. package/src/families/bitcoin/datasets/dogecoin.ts +29 -17
  343. package/src/families/bitcoin/datasets/komodo.ts +22 -22
  344. package/src/families/bitcoin/datasets/litecoin.ts +9 -3
  345. package/src/families/bitcoin/datasets/peercoin.ts +17 -17
  346. package/src/families/bitcoin/datasets/pivx.ts +17 -17
  347. package/src/families/bitcoin/datasets/qtum.ts +40 -40
  348. package/src/families/bitcoin/datasets/stakenet.ts +56 -26
  349. package/src/families/bitcoin/datasets/vertcoin.ts +43 -55
  350. package/src/families/bitcoin/datasets/viacoin.ts +35 -23
  351. package/src/families/bitcoin/datasets/zcash.ts +78 -12
  352. package/src/families/bitcoin/datasets/zencash.ts +56 -10
  353. package/src/families/bitcoin/platformAdapter.test.ts +58 -0
  354. package/src/families/bitcoin/specs.ts +81 -41
  355. package/src/families/bitcoin/speculos-deviceActions.ts +68 -69
  356. package/src/families/cardano/js-estimateMaxSpendable.ts +1 -1
  357. package/src/families/cardano/specs.ts +28 -11
  358. package/src/families/cardano/speculos-deviceActions.ts +65 -66
  359. package/src/families/celo/specs.ts +2 -0
  360. package/src/families/celo/speculos-deviceActions.ts +42 -43
  361. package/src/families/cosmos/__snapshots__/bridge.integration.test.ts.snap +246 -5
  362. package/src/families/cosmos/specs.ts +44 -28
  363. package/src/families/cosmos/speculos-deviceActions.ts +82 -83
  364. package/src/families/crypto_org/specs.ts +3 -0
  365. package/src/families/crypto_org/speculos-deviceActions.ts +58 -59
  366. package/src/families/elrond/specs.ts +21 -4
  367. package/src/families/elrond/speculos-deviceActions.ts +41 -42
  368. package/src/families/ethereum/__snapshots__/bridge.integration.test.ts.snap +90 -90
  369. package/src/families/ethereum/platformAdapter.test.ts +112 -0
  370. package/src/families/ethereum/specs.ts +47 -23
  371. package/src/families/ethereum/speculos-deviceActions.ts +93 -95
  372. package/src/families/filecoin/specs.ts +2 -1
  373. package/src/families/filecoin/speculos-deviceActions.ts +61 -62
  374. package/src/families/hedera/__snapshots__/bridge.integration.test.ts.snap +57 -2
  375. package/src/families/hedera/specs.ts +13 -5
  376. package/src/families/hedera/speculos-deviceActions.ts +59 -60
  377. package/src/families/osmosis/specs.ts +15 -7
  378. package/src/families/osmosis/speculos-deviceActions.ts +82 -83
  379. package/src/families/polkadot/platformAdapter.test.ts +61 -0
  380. package/src/families/polkadot/specs.ts +20 -2
  381. package/src/families/polkadot/speculos-deviceActions.ts +83 -82
  382. package/src/families/ripple/platformAdapter.test.ts +54 -0
  383. package/src/families/ripple/specs.ts +14 -7
  384. package/src/families/ripple/speculos-deviceActions.ts +72 -73
  385. package/src/families/solana/specs.ts +33 -14
  386. package/src/families/solana/speculos-deviceActions.ts +0 -5
  387. package/src/families/stellar/api/horizon.ts +10 -6
  388. package/src/families/stellar/specs.ts +37 -19
  389. package/src/families/stellar/speculos-deviceActions.ts +85 -87
  390. package/src/families/tezos/bakers.whitelist-default.ts +0 -1
  391. package/src/families/tezos/specs.ts +2 -0
  392. package/src/families/tezos/speculos-deviceActions.ts +76 -77
  393. package/src/families/tron/specs.ts +67 -30
  394. package/src/families/tron/speculos-deviceActions.ts +81 -84
  395. package/src/hw/getGenuineCheckFromDeviceId.test.ts +98 -0
  396. package/src/hw/getGenuineCheckFromDeviceId.ts +61 -0
  397. package/src/hw/getLatestAvailableFirmwareFromDeviceId.ts +37 -0
  398. package/src/hw/hooks/useGenuineCheck.test.ts +232 -0
  399. package/src/hw/hooks/useGenuineCheck.ts +138 -0
  400. package/src/hw/hooks/useGetLatestAvailableFirmware.test.ts +111 -0
  401. package/src/hw/hooks/useGetLatestAvailableFirmware.ts +90 -0
  402. package/src/load/speculos.ts +2 -0
  403. package/src/mock/fixtures/cryptoCurrencies.ts +88 -0
  404. package/src/platform/converters.test.ts +49 -282
  405. package/src/platform/logic.test.ts +756 -0
  406. package/src/platform/logic.ts +285 -0
  407. package/src/platform/react.ts +6 -0
  408. package/src/platform/tracking.test.ts +6 -7
  409. package/src/platform/tracking.ts +1 -1
  410. package/src/reconciliation.ts +66 -43
  411. package/lib/__tests__/accounts/importAccounts.d.ts +0 -2
  412. package/lib/__tests__/accounts/importAccounts.d.ts.map +0 -1
  413. package/lib/__tests__/accounts/importAccounts.js.map +0 -1
  414. package/lib/bot/test.bot.d.ts +0 -2
  415. package/lib/bot/test.bot.d.ts.map +0 -1
  416. package/lib/bot/test.bot.js +0 -62
  417. package/lib/bot/test.bot.js.map +0 -1
  418. package/lib/generated/speculos-deviceActions.d.ts +0 -56
  419. package/lib/generated/speculos-deviceActions.d.ts.map +0 -1
  420. package/lib/generated/speculos-deviceActions.js +0 -42
  421. package/lib/generated/speculos-deviceActions.js.map +0 -1
  422. package/src/bot/test.bot.ts +0 -21
  423. package/src/generated/speculos-deviceActions.ts +0 -37
@@ -1,9 +1,6 @@
1
- import winston from "winston";
2
- import { listen } from "@ledgerhq/logs";
1
+ import "./environment";
2
+
3
3
  import BigNumber from "bignumber.js";
4
- import { setSupportedCurrencies } from "../../currencies";
5
- import { setPlatformVersion } from "../../platform/version";
6
- import { EnvName, setEnvUnsafe } from "../../env";
7
4
 
8
5
  jest.setTimeout(360000);
9
6
 
@@ -17,89 +14,3 @@ expect.extend({
17
14
  return { message, pass };
18
15
  },
19
16
  });
20
-
21
- setPlatformVersion("1.1.0");
22
-
23
- setSupportedCurrencies([
24
- "bitcoin",
25
- "ethereum",
26
- "bsc",
27
- "polygon",
28
- "elrond",
29
- "ripple",
30
- "bitcoin_cash",
31
- "litecoin",
32
- "dash",
33
- "ethereum_classic",
34
- "tezos",
35
- "qtum",
36
- "zcash",
37
- "bitcoin_gold",
38
- "stratis",
39
- "dogecoin",
40
- "digibyte",
41
- "komodo",
42
- "pivx",
43
- "zencash",
44
- "vertcoin",
45
- "peercoin",
46
- "viacoin",
47
- "stakenet",
48
- "stealthcoin",
49
- "decred",
50
- "tron",
51
- "stellar",
52
- "cosmos",
53
- "algorand",
54
- "polkadot",
55
- "bitcoin_testnet",
56
- "ethereum_ropsten",
57
- "ethereum_goerli",
58
- "cosmos_testnet",
59
- "crypto_org_croeseid",
60
- "crypto_org",
61
- "filecoin",
62
- "solana",
63
- "celo",
64
- "hedera",
65
- "cardano",
66
- "cardano_testnet",
67
- "osmosis",
68
- "filecoin",
69
- ]);
70
-
71
- for (const k in process.env) setEnvUnsafe(k as EnvName, process.env[k]);
72
-
73
- const { VERBOSE, VERBOSE_FILE } = process.env;
74
- const logger = winston.createLogger({
75
- level: "debug",
76
- transports: [],
77
- });
78
- const { format } = winston;
79
- const { combine, timestamp, json } = format;
80
- const winstonFormat = combine(timestamp(), json());
81
-
82
- if (VERBOSE_FILE) {
83
- logger.add(
84
- new winston.transports.File({
85
- format: winstonFormat,
86
- filename: VERBOSE_FILE,
87
- level: "debug",
88
- })
89
- );
90
- }
91
-
92
- logger.add(
93
- new winston.transports.Console({
94
- format: winstonFormat,
95
- silent: !VERBOSE,
96
- })
97
- );
98
- // eslint-disable-next-line no-unused-vars
99
- listen(({ type, message, ...rest }) => {
100
- logger.log("debug", {
101
- message: type + (message ? ": " + message : ""),
102
- // $FlowFixMe
103
- ...rest,
104
- });
105
- });
@@ -0,0 +1,193 @@
1
+ import "../__tests__/test-helpers/setup";
2
+ import { makeBridgeCacheSystem } from "../bridge/cache";
3
+ import { accountToAccountData } from "../cross";
4
+ import {
5
+ importAccountsMakeItems,
6
+ importAccountsReduce,
7
+ fromAccountRaw,
8
+ syncNewAccountsToImport,
9
+ } from ".";
10
+ import { Account } from "@ledgerhq/types-live";
11
+
12
+ jest.setTimeout(200000);
13
+
14
+ test("importAccounts with a set of real data", async () => {
15
+ const accounts = [
16
+ {
17
+ id: "js:2:algorand:32PI2C5HLHMVUF5KMNURLGCTYVIOVJJ2NLHLZ2PIMK567MKMS4RXBSVWQI:",
18
+ seedIdentifier:
19
+ "32PI2C5HLHMVUF5KMNURLGCTYVIOVJJ2NLHLZ2PIMK567MKMS4RXBSVWQI",
20
+ name: "Algorand legacy 32PI2C5H...RXBSVWQI",
21
+ starred: true,
22
+ used: true,
23
+ derivationMode: "",
24
+ index: 0,
25
+ freshAddress:
26
+ "32PI2C5HLHMVUF5KMNURLGCTYVIOVJJ2NLHLZ2PIMK567MKMS4RXBSVWQI",
27
+ freshAddressPath: "44'/283'/0'/0/0",
28
+ freshAddresses: [],
29
+ blockHeight: 23066613,
30
+ creationDate: "2022-02-04T13:12:58.000Z",
31
+ operationsCount: 184,
32
+ operations: [],
33
+ pendingOperations: [],
34
+ currencyId: "algorand",
35
+ unitMagnitude: 6,
36
+ lastSyncDate: "2022-08-26T09:24:27.076Z",
37
+ balance: "2100190",
38
+ spendableBalance: "190",
39
+ xpub: "32PI2C5HLHMVUF5KMNURLGCTYVIOVJJ2NLHLZ2PIMK567MKMS4RXBSVWQI",
40
+ subAccounts: [],
41
+ algorandResources: { rewards: "190", nbAssets: 20 },
42
+ swapHistory: [],
43
+ },
44
+ {
45
+ id: "js:2:tron:TRbtdwHowocq8ThZbRnTHgK4JG5sx3fFCK:",
46
+ seedIdentifier: "TRbtdwHowocq8ThZbRnTHgK4JG5sx3fFCK",
47
+ name: "Tron legacy TRbtdwHo...5sx3fFCK",
48
+ starred: true,
49
+ used: true,
50
+ derivationMode: "",
51
+ index: 0,
52
+ freshAddress: "TRbtdwHowocq8ThZbRnTHgK4JG5sx3fFCK",
53
+ freshAddressPath: "44'/195'/0'/0/0",
54
+ freshAddresses: [],
55
+ blockHeight: 43642499,
56
+ creationDate: "2022-07-19T15:32:12.000Z",
57
+ operationsCount: 41,
58
+ operations: [],
59
+ pendingOperations: [],
60
+ currencyId: "tron",
61
+ unitMagnitude: 6,
62
+ lastSyncDate: "2022-08-26T09:24:59.492Z",
63
+ balance: "0",
64
+ spendableBalance: "0",
65
+ xpub: "TRbtdwHowocq8ThZbRnTHgK4JG5sx3fFCK",
66
+ subAccounts: [],
67
+ tronResources: {
68
+ frozen: {},
69
+ delegatedFrozen: {},
70
+ votes: [],
71
+ tronPower: 0,
72
+ energy: "0",
73
+ bandwidth: {
74
+ freeUsed: "0",
75
+ freeLimit: "1500",
76
+ gainedUsed: "0",
77
+ gainedLimit: "0",
78
+ },
79
+ unwithdrawnReward: "2730",
80
+ lastVotedDate: "2022-07-22T14:39:51.000Z",
81
+ cacheTransactionInfoById: {},
82
+ },
83
+ swapHistory: [],
84
+ },
85
+ {
86
+ id: "js:2:polkadot:15jLBbe9LD6VSUYFkV5Fmo5LhZU5cns9E6g8qcDv5KrKM1eP:polkadotbip44",
87
+ seedIdentifier: "15jLBbe9LD6VSUYFkV5Fmo5LhZU5cns9E6g8qcDv5KrKM1eP",
88
+ name: "Polkadot polkadotbip44 15jLBbe9...5KrKM1eP",
89
+ starred: true,
90
+ used: true,
91
+ derivationMode: "polkadotbip44",
92
+ index: 0,
93
+ freshAddress: "15jLBbe9LD6VSUYFkV5Fmo5LhZU5cns9E6g8qcDv5KrKM1eP",
94
+ freshAddressPath: "44'/354'/0'/0'/0'",
95
+ freshAddresses: [],
96
+ blockHeight: 11771108,
97
+ creationDate: "2022-02-24T14:39:00.007Z",
98
+ operationsCount: 65,
99
+ operations: [],
100
+ pendingOperations: [],
101
+ currencyId: "polkadot",
102
+ unitMagnitude: 10,
103
+ lastSyncDate: "2022-08-26T09:25:00.713Z",
104
+ balance: "15512511464",
105
+ spendableBalance: "15512511464",
106
+ xpub: "15jLBbe9LD6VSUYFkV5Fmo5LhZU5cns9E6g8qcDv5KrKM1eP",
107
+ polkadotResources: {
108
+ controller: null,
109
+ stash: null,
110
+ nonce: 63,
111
+ lockedBalance: "0",
112
+ unlockedBalance: "0",
113
+ unlockingBalance: "0",
114
+ unlockings: [],
115
+ nominations: [],
116
+ },
117
+ swapHistory: [],
118
+ },
119
+ {
120
+ id: "js:2:bsc:0xa22CA840265d3C5CB1846e419B14c6a6CdD06FAB:",
121
+ seedIdentifier: "0xa22CA840265d3C5CB1846e419B14c6a6CdD06FAB",
122
+ name: "Binance Smart Chain legacy 0xa22CA8...CdD06FAB",
123
+ starred: true,
124
+ used: true,
125
+ derivationMode: "",
126
+ index: 0,
127
+ freshAddress: "0xa22CA840265d3C5CB1846e419B14c6a6CdD06FAB",
128
+ freshAddressPath: "44'/60'/0'/0/0",
129
+ freshAddresses: [],
130
+ blockHeight: 20775454,
131
+ syncHash: "[]_655",
132
+ creationDate: "2022-02-04T13:11:32.001Z",
133
+ operationsCount: 21,
134
+ operations: [],
135
+ pendingOperations: [],
136
+ currencyId: "bsc",
137
+ unitMagnitude: 18,
138
+ lastSyncDate: "2022-08-26T09:25:01.109Z",
139
+ balance: "3128019430408477",
140
+ spendableBalance: "3128019430408477",
141
+ xpub: "0xa22CA840265d3C5CB1846e419B14c6a6CdD06FAB",
142
+ subAccounts: [],
143
+ swapHistory: [],
144
+ },
145
+ ].map(fromAccountRaw);
146
+
147
+ const localCache = {};
148
+ const bridgeCache = makeBridgeCacheSystem({
149
+ saveData(c, d) {
150
+ localCache[c.id] = d;
151
+ return Promise.resolve();
152
+ },
153
+
154
+ getData(c) {
155
+ return Promise.resolve(localCache[c.id]);
156
+ },
157
+ });
158
+
159
+ const result = {
160
+ accounts: accounts.map(accountToAccountData),
161
+ settings: { currenciesSettings: {}, pairExchanges: {} },
162
+ meta: { exporterName: "Test", exporterVersion: "0" },
163
+ };
164
+
165
+ const accountsState = [];
166
+
167
+ const items = importAccountsMakeItems({
168
+ result,
169
+ accounts: accountsState,
170
+ });
171
+ const selectedAccounts = accounts.map((a) => a.id);
172
+ const syncResult = await syncNewAccountsToImport(
173
+ { items, selectedAccounts },
174
+ bridgeCache
175
+ );
176
+ const reduced = importAccountsReduce(accountsState, {
177
+ items,
178
+ selectedAccounts,
179
+ syncResult,
180
+ });
181
+ expect(reduced.length).toEqual(4);
182
+ expect((reduced[0] as AlgorandAccount).algorandResources).toBeDefined();
183
+ expect((reduced[1] as TronAccount).tronResources).toBeDefined();
184
+ expect((reduced[2] as PolkadotAccount).polkadotResources).toBeDefined();
185
+ expect(reduced[0].operations.length).toBeGreaterThan(1);
186
+ expect(reduced[1].operations.length).toBeGreaterThan(1);
187
+ expect(reduced[2].operations.length).toBeGreaterThan(1);
188
+ expect(reduced[3].operations.length).toBeGreaterThan(1);
189
+ });
190
+
191
+ type AlgorandAccount = Account & { algorandResources: any };
192
+ type TronAccount = Account & { tronResources: any };
193
+ type PolkadotAccount = Account & { polkadotResources: any };
@@ -3,16 +3,15 @@ import {
3
3
  importAccountsMakeItems,
4
4
  importAccountsReduce,
5
5
  fromAccountRaw,
6
- } from "../../account";
7
- import { setSupportedCurrencies } from "../../currencies";
8
- import { setPlatformVersion } from "../../platform/version";
6
+ } from ".";
7
+ import { setSupportedCurrencies } from "../currencies";
8
+ import { setPlatformVersion } from "../platform/version";
9
9
 
10
10
  setPlatformVersion("1.1.0");
11
11
 
12
12
  setSupportedCurrencies(["ethereum"]);
13
13
  describe("importAccountsMakeItems", () => {
14
- // TODO we need to change the dataset as we no longer are migrating away from JS to Libcore but kinda the reverse
15
- test.skip("should migrate ethereum accounts", () => {
14
+ test("importing ethereum accounts", () => {
16
15
  const result = {
17
16
  meta: {
18
17
  exporterName: "desktop",
@@ -20,7 +19,7 @@ describe("importAccountsMakeItems", () => {
20
19
  },
21
20
  accounts: [
22
21
  {
23
- id: "libcore:1:ethereum:xpub1:",
22
+ id: "js:1:ethereum:0x01:",
24
23
  name: "Ethereum 1",
25
24
  seedIdentifier: "seed",
26
25
  derivationMode: "",
@@ -31,7 +30,7 @@ describe("importAccountsMakeItems", () => {
31
30
  swapHistory: [],
32
31
  },
33
32
  {
34
- id: "libcore:1:ethereum:xpub2:",
33
+ id: "js:1:ethereum:0x02:",
35
34
  name: "Ethereum 2",
36
35
  seedIdentifier: "seed",
37
36
  derivationMode: "",
@@ -42,7 +41,7 @@ describe("importAccountsMakeItems", () => {
42
41
  swapHistory: [],
43
42
  },
44
43
  {
45
- id: "libcore:1:ethereum:xpub4:",
44
+ id: "js:1:ethereum:0x04:",
46
45
  name: "Ethereum 4",
47
46
  seedIdentifier: "seed",
48
47
  derivationMode: "",
@@ -53,7 +52,7 @@ describe("importAccountsMakeItems", () => {
53
52
  swapHistory: [],
54
53
  },
55
54
  {
56
- id: "libcore:1:ethereum:xpub3:",
55
+ id: "js:1:ethereum:0x03:",
57
56
  name: "ETH3 name edited",
58
57
  seedIdentifier: "seed",
59
58
  derivationMode: "",
@@ -64,7 +63,7 @@ describe("importAccountsMakeItems", () => {
64
63
  swapHistory: [],
65
64
  },
66
65
  {
67
- id: "libcore:1:ethereum:xpub5:",
66
+ id: "js:1:ethereum:0x05:",
68
67
  name: "Ethereum 5",
69
68
  seedIdentifier: "seed",
70
69
  derivationMode: "",
@@ -84,7 +83,7 @@ describe("importAccountsMakeItems", () => {
84
83
  };
85
84
  const accounts = [
86
85
  <AccountRaw>{
87
- id: "ethereumjs:2:ethereum:0x01:",
86
+ id: "js:1:ethereum:0x01:",
88
87
  seedIdentifier: "0x01",
89
88
  name: "Ethereum 1",
90
89
  derivationMode: "",
@@ -101,7 +100,7 @@ describe("importAccountsMakeItems", () => {
101
100
  balance: "51281813126095910",
102
101
  },
103
102
  <AccountRaw>{
104
- id: "ethereumjs:2:ethereum:0x02:",
103
+ id: "js:1:ethereum:0x02:",
105
104
  seedIdentifier: "0x02",
106
105
  name: "Ethereum 2",
107
106
  derivationMode: "",
@@ -118,7 +117,7 @@ describe("importAccountsMakeItems", () => {
118
117
  balance: "1081392000000000",
119
118
  },
120
119
  <AccountRaw>{
121
- id: "libcore:1:ethereum:xpub3:",
120
+ id: "js:1:ethereum:0x03:",
122
121
  seedIdentifier: "seed",
123
122
  name: "Ethereum 3",
124
123
  derivationMode: "",
@@ -141,71 +140,52 @@ describe("importAccountsMakeItems", () => {
141
140
  });
142
141
  expect(items).toMatchObject([
143
142
  {
144
- initialAccountId: "libcore:1:ethereum:xpub4:",
145
- account: {
146
- id: "libcore:1:ethereum:xpub4:",
147
- name: "Ethereum 4",
148
- },
143
+ initialAccountId: "js:1:ethereum:0x04:",
144
+ account: { id: "js:1:ethereum:0x04:", name: "Ethereum 4" },
149
145
  mode: "create",
150
146
  },
151
147
  {
152
- initialAccountId: "libcore:1:ethereum:xpub5:",
153
- account: {
154
- id: "libcore:1:ethereum:xpub5:",
155
- name: "Ethereum 5",
156
- },
148
+ initialAccountId: "js:1:ethereum:0x05:",
149
+ account: { id: "js:1:ethereum:0x05:", name: "Ethereum 5" },
157
150
  mode: "create",
158
151
  },
159
152
  {
160
- initialAccountId: "ethereumjs:2:ethereum:0x01:",
161
- account: {
162
- id: "libcore:1:ethereum:xpub1:",
163
- name: "Ethereum 1",
164
- },
153
+ initialAccountId: "js:1:ethereum:0x03:",
154
+ account: { id: "js:1:ethereum:0x03:", name: "ETH3 name edited" },
165
155
  mode: "update",
166
156
  },
167
157
  {
168
- initialAccountId: "ethereumjs:2:ethereum:0x02:",
169
- account: {
170
- id: "libcore:1:ethereum:xpub2:",
171
- name: "Ethereum 2",
172
- },
173
- mode: "update",
158
+ initialAccountId: "js:1:ethereum:0x01:",
159
+ account: { id: "js:1:ethereum:0x01:", name: "Ethereum 1" },
160
+ mode: "id",
174
161
  },
175
162
  {
176
- initialAccountId: "libcore:1:ethereum:xpub3:",
177
- account: {
178
- id: "libcore:1:ethereum:xpub3:",
179
- name: "ETH3 name edited",
180
- },
181
- mode: "update",
163
+ initialAccountId: "js:1:ethereum:0x02:",
164
+ account: { id: "js:1:ethereum:0x02:", name: "Ethereum 2" },
165
+ mode: "id",
182
166
  },
183
167
  ]);
168
+ const syncResult = {
169
+ failed: {},
170
+ synchronized: {},
171
+ };
172
+ result.accounts.forEach((a) => {
173
+ syncResult.synchronized[a.id] = a;
174
+ });
184
175
  const reduced = importAccountsReduce(accounts, {
185
176
  items,
186
177
  selectedAccounts: [
187
- "libcore:1:ethereum:xpub3:",
188
- "libcore:1:ethereum:xpub2:",
189
- "libcore:1:ethereum:xpub5:",
178
+ "js:1:ethereum:0x03:",
179
+ "js:1:ethereum:0x02:",
180
+ "js:1:ethereum:0x05:",
190
181
  ],
182
+ syncResult,
191
183
  });
192
184
  expect(reduced).toMatchObject([
193
- {
194
- id: "ethereumjs:2:ethereum:0x01:",
195
- name: "Ethereum 1",
196
- },
197
- {
198
- id: "libcore:1:ethereum:xpub2:",
199
- name: "Ethereum 2",
200
- },
201
- {
202
- id: "libcore:1:ethereum:xpub3:",
203
- name: "ETH3 name edited",
204
- },
205
- {
206
- id: "libcore:1:ethereum:xpub5:",
207
- name: "Ethereum 5",
208
- },
185
+ { id: "js:1:ethereum:0x01:", name: "Ethereum 1" },
186
+ { id: "js:1:ethereum:0x02:", name: "Ethereum 2" },
187
+ { id: "js:1:ethereum:0x03:", name: "ETH3 name edited" },
188
+ { id: "js:1:ethereum:0x05:", name: "Ethereum 5" },
209
189
  ]);
210
190
  });
211
191
  });
@@ -5,6 +5,13 @@ import { findAccountMigration, checkAccountSupported } from "./support";
5
5
  import joinSwapHistories from "../exchange/swap/joinSwapHistories";
6
6
  import isEqual from "lodash/isEqual";
7
7
  import type { Account } from "@ledgerhq/types-live";
8
+ import { BridgeCacheSystem } from "../bridge/cache";
9
+ import { getAccountBridge } from "../bridge";
10
+ import { promiseAllBatched } from "../promise";
11
+ import { getEnv } from "../env";
12
+ import { Observable } from "rxjs";
13
+ import { reduce } from "rxjs/operators";
14
+
8
15
  const itemModeDisplaySort = {
9
16
  create: 1,
10
17
  update: 2,
@@ -103,31 +110,115 @@ export const importAccountsMakeItems = ({
103
110
  itemModeDisplaySort[(a as ImportItem).mode] -
104
111
  itemModeDisplaySort[(b as ImportItem).mode]
105
112
  ) as ImportItem[];
113
+
114
+ /**
115
+ * SyncNewAccountsOutput
116
+ * - synchronized: a map of account id to account. the account id are kept as originally set in the items[].account before a possible "remap" of the ids after a sync happened
117
+ * - failed: a map of account id to errors for all possible fails that happened.
118
+ */
119
+ export type SyncNewAccountsOutput = {
120
+ synchronized: Record<string, Account>;
121
+ failed: Record<string, Error>;
122
+ };
123
+
124
+ export type SyncNewAccountsInput = {
125
+ items: ImportItem[];
126
+ selectedAccounts: string[];
127
+ };
128
+
129
+ /**
130
+ *
131
+ * @param items: result of importAccountsMakeItems
132
+ * @param selectedAccounts: user's selected accounts
133
+ * @param bridgeCache: the bridge cache created on user land to prepare currency for a sync
134
+ * @param blacklistedTokenIds: the list of blacklisted token ids to ignore sync with
135
+ * @returns SyncNewAccountsOutput
136
+ */
137
+ export const syncNewAccountsToImport = async (
138
+ { items, selectedAccounts }: SyncNewAccountsInput,
139
+ bridgeCache: BridgeCacheSystem,
140
+ blacklistedTokenIds?: string[]
141
+ ): Promise<SyncNewAccountsOutput> => {
142
+ const selectedItems = items.filter((item) =>
143
+ selectedAccounts.includes(item.account.id)
144
+ );
145
+ const synchronized = {};
146
+ const failed = {};
147
+ await promiseAllBatched(
148
+ getEnv("SYNC_MAX_CONCURRENT"),
149
+ selectedItems,
150
+ async ({ account }) => {
151
+ try {
152
+ const bridge = getAccountBridge(account);
153
+ await bridgeCache.prepareCurrency(account.currency);
154
+ const syncConfig = {
155
+ paginationConfig: {},
156
+ blacklistedTokenIds,
157
+ };
158
+ const observable = bridge.sync(account, syncConfig);
159
+ const reduced: Observable<Account> = observable.pipe(
160
+ reduce((a, f: (_: Account) => Account) => f(a), account)
161
+ );
162
+ const synced = await reduced.toPromise();
163
+ synchronized[account.id] = synced;
164
+ } catch (e) {
165
+ failed[account.id] = e;
166
+ }
167
+ }
168
+ );
169
+ return { synchronized, failed };
170
+ };
171
+
172
+ export type ImportAccountsReduceInput = {
173
+ items: ImportItem[];
174
+ selectedAccounts: string[];
175
+ syncResult: SyncNewAccountsOutput;
176
+ };
177
+
178
+ /**
179
+ *
180
+ * @param existingAccounts
181
+ * @param items: value resulting of importAccountsMakeItems
182
+ * @params selectedAccounts: array of all account ids selected by user for import
183
+ * @param syncedNewAccounts: accounts resulting of syncNewAccountsToImport(). all accounts that would be missing from that list would be ignored to be imported (fresh sync is needed to make sure the accounts are "ready")
184
+ * @returns all accounts
185
+ */
106
186
  export const importAccountsReduce = (
107
187
  existingAccounts: Account[],
108
- {
109
- items,
110
- selectedAccounts,
111
- }: {
112
- items: ImportItem[];
113
- selectedAccounts: string[];
114
- }
188
+ { items, selectedAccounts, syncResult }: ImportAccountsReduceInput
115
189
  ): Account[] => {
116
190
  const accounts = existingAccounts.slice(0);
117
191
  const selectedItems = items.filter((item) =>
118
192
  selectedAccounts.includes(item.account.id)
119
193
  );
120
194
 
121
- for (const { mode, account, initialAccountId } of selectedItems) {
195
+ for (const {
196
+ mode,
197
+ account: { id },
198
+ initialAccountId,
199
+ } of selectedItems) {
200
+ const account = syncResult.synchronized[id];
201
+ if (!account) continue;
122
202
  switch (mode) {
123
- case "create":
124
- accounts.push(account);
203
+ case "create": {
204
+ const exists = accounts.find(
205
+ (a) => a.id === initialAccountId || a.id === id
206
+ );
207
+ if (!exists) {
208
+ // prevent duplicate cases to happen (in case of race condition)
209
+ accounts.push(account);
210
+ }
125
211
  break;
212
+ }
126
213
 
127
214
  case "update": {
128
- const item = accounts.find((a) => a.id === initialAccountId);
215
+ const item = accounts.find(
216
+ (a) => a.id === initialAccountId || a.id === id
217
+ );
129
218
  const i = accounts.indexOf(item as Account);
130
- accounts[i] = account;
219
+ if (i !== -1) {
220
+ accounts[i] = account;
221
+ }
131
222
  break;
132
223
  }
133
224