@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.
- package/lib/account/helpers.d.ts +10 -0
- package/lib/account/helpers.d.ts.map +1 -1
- package/lib/account/helpers.js +43 -16
- package/lib/account/helpers.js.map +1 -1
- package/lib/bridge/generic-alpaca/estimateMaxSpendable.js +1 -1
- package/lib/bridge/generic-alpaca/estimateMaxSpendable.js.map +1 -1
- package/lib/bridge/generic-alpaca/prepareTransaction.d.ts.map +1 -1
- package/lib/bridge/generic-alpaca/prepareTransaction.js +45 -37
- package/lib/bridge/generic-alpaca/prepareTransaction.js.map +1 -1
- package/lib/bridge/generic-alpaca/signOperation.d.ts.map +1 -1
- package/lib/bridge/generic-alpaca/signOperation.js +20 -0
- package/lib/bridge/generic-alpaca/signOperation.js.map +1 -1
- package/lib/bridge/generic-alpaca/utils.js +1 -1
- package/lib/bridge/generic-alpaca/utils.js.map +1 -1
- package/lib/config/index.d.ts +2 -2
- package/lib/config/index.d.ts.map +1 -1
- package/lib/config/index.js.map +1 -1
- package/lib/dada-client/hooks/useDrawerConfiguration.d.ts +19 -0
- package/lib/dada-client/hooks/useDrawerConfiguration.d.ts.map +1 -0
- package/lib/dada-client/hooks/useDrawerConfiguration.js +45 -0
- package/lib/dada-client/hooks/useDrawerConfiguration.js.map +1 -0
- package/lib/e2e/data/deviceLabelsData.d.ts +8 -0
- package/lib/e2e/data/deviceLabelsData.d.ts.map +1 -1
- package/lib/e2e/data/deviceLabelsData.js +62 -2
- package/lib/e2e/data/deviceLabelsData.js.map +1 -1
- package/lib/e2e/deviceInteraction/ButtonDeviceSimulator.d.ts +3 -0
- package/lib/e2e/deviceInteraction/ButtonDeviceSimulator.d.ts.map +1 -0
- package/lib/e2e/deviceInteraction/ButtonDeviceSimulator.js +26 -0
- package/lib/e2e/deviceInteraction/ButtonDeviceSimulator.js.map +1 -0
- package/lib/e2e/deviceInteraction/TouchDeviceSimulator.d.ts +4 -0
- package/lib/e2e/deviceInteraction/TouchDeviceSimulator.d.ts.map +1 -0
- package/lib/e2e/deviceInteraction/TouchDeviceSimulator.js +50 -0
- package/lib/e2e/deviceInteraction/TouchDeviceSimulator.js.map +1 -0
- package/lib/e2e/enum/Account.d.ts +2 -4
- package/lib/e2e/enum/Account.d.ts.map +1 -1
- package/lib/e2e/enum/Account.js +5 -8
- package/lib/e2e/enum/Account.js.map +1 -1
- package/lib/e2e/enum/Device.d.ts +1 -0
- package/lib/e2e/enum/Device.d.ts.map +1 -1
- package/lib/e2e/enum/Device.js +1 -0
- package/lib/e2e/enum/Device.js.map +1 -1
- package/lib/e2e/enum/DeviceLabels.d.ts +10 -2
- package/lib/e2e/enum/DeviceLabels.d.ts.map +1 -1
- package/lib/e2e/enum/DeviceLabels.js +9 -1
- package/lib/e2e/enum/DeviceLabels.js.map +1 -1
- package/lib/e2e/families/algorand.d.ts.map +1 -1
- package/lib/e2e/families/algorand.js +10 -2
- package/lib/e2e/families/algorand.js.map +1 -1
- package/lib/e2e/families/aptos.d.ts +2 -1
- package/lib/e2e/families/aptos.d.ts.map +1 -1
- package/lib/e2e/families/aptos.js +12 -4
- package/lib/e2e/families/aptos.js.map +1 -1
- package/lib/e2e/families/bitcoin.d.ts.map +1 -1
- package/lib/e2e/families/bitcoin.js +25 -15
- package/lib/e2e/families/bitcoin.js.map +1 -1
- package/lib/e2e/families/cardano.d.ts.map +1 -1
- package/lib/e2e/families/cardano.js +122 -46
- package/lib/e2e/families/cardano.js.map +1 -1
- package/lib/e2e/families/celo.d.ts.map +1 -1
- package/lib/e2e/families/celo.js +11 -1
- package/lib/e2e/families/celo.js.map +1 -1
- package/lib/e2e/families/cosmos.d.ts.map +1 -1
- package/lib/e2e/families/cosmos.js +16 -3
- package/lib/e2e/families/cosmos.js.map +1 -1
- package/lib/e2e/families/evm.d.ts +1 -2
- package/lib/e2e/families/evm.d.ts.map +1 -1
- package/lib/e2e/families/evm.js +28 -13
- package/lib/e2e/families/evm.js.map +1 -1
- package/lib/e2e/families/hedera.d.ts.map +1 -1
- package/lib/e2e/families/hedera.js +3 -2
- package/lib/e2e/families/hedera.js.map +1 -1
- package/lib/e2e/families/kaspa.d.ts +2 -1
- package/lib/e2e/families/kaspa.d.ts.map +1 -1
- package/lib/e2e/families/kaspa.js +12 -4
- package/lib/e2e/families/kaspa.js.map +1 -1
- package/lib/e2e/families/multiversX.d.ts.map +1 -1
- package/lib/e2e/families/multiversX.js +11 -1
- package/lib/e2e/families/multiversX.js.map +1 -1
- package/lib/e2e/families/near.d.ts.map +1 -1
- package/lib/e2e/families/near.js +15 -4
- package/lib/e2e/families/near.js.map +1 -1
- package/lib/e2e/families/osmosis.d.ts.map +1 -1
- package/lib/e2e/families/osmosis.js +11 -1
- package/lib/e2e/families/osmosis.js.map +1 -1
- package/lib/e2e/families/polkadot.d.ts.map +1 -1
- package/lib/e2e/families/polkadot.js +10 -2
- package/lib/e2e/families/polkadot.js.map +1 -1
- package/lib/e2e/families/solana.d.ts.map +1 -1
- package/lib/e2e/families/solana.js +16 -3
- package/lib/e2e/families/solana.js.map +1 -1
- package/lib/e2e/families/stellar.d.ts.map +1 -1
- package/lib/e2e/families/stellar.js +10 -2
- package/lib/e2e/families/stellar.js.map +1 -1
- package/lib/e2e/families/sui.d.ts +2 -1
- package/lib/e2e/families/sui.d.ts.map +1 -1
- package/lib/e2e/families/sui.js +11 -3
- package/lib/e2e/families/sui.js.map +1 -1
- package/lib/e2e/families/tezos.d.ts.map +1 -1
- package/lib/e2e/families/tezos.js +12 -3
- package/lib/e2e/families/tezos.js.map +1 -1
- package/lib/e2e/families/tron.d.ts.map +1 -1
- package/lib/e2e/families/tron.js +10 -2
- package/lib/e2e/families/tron.js.map +1 -1
- package/lib/e2e/families/xrp.d.ts.map +1 -1
- package/lib/e2e/families/xrp.js +10 -2
- package/lib/e2e/families/xrp.js.map +1 -1
- package/lib/e2e/index.d.ts +4 -2
- package/lib/e2e/index.d.ts.map +1 -1
- package/lib/e2e/models/Transaction.d.ts +0 -5
- package/lib/e2e/models/Transaction.d.ts.map +1 -1
- package/lib/e2e/models/Transaction.js +1 -9
- package/lib/e2e/models/Transaction.js.map +1 -1
- package/lib/e2e/speculos.d.ts +13 -4
- package/lib/e2e/speculos.d.ts.map +1 -1
- package/lib/e2e/speculos.js +141 -75
- package/lib/e2e/speculos.js.map +1 -1
- package/lib/e2e/speculosAppVersion.d.ts +1 -0
- package/lib/e2e/speculosAppVersion.d.ts.map +1 -1
- package/lib/e2e/speculosAppVersion.js +9 -1
- package/lib/e2e/speculosAppVersion.js.map +1 -1
- package/lib/exchange/index.d.ts.map +1 -1
- package/lib/exchange/index.js +4 -15
- package/lib/exchange/index.js.map +1 -1
- package/lib/exchange/swap/getCompleteSwapHistory.d.ts +1 -1
- package/lib/exchange/swap/getCompleteSwapHistory.d.ts.map +1 -1
- package/lib/exchange/swap/getCompleteSwapHistory.js +5 -5
- package/lib/exchange/swap/getCompleteSwapHistory.js.map +1 -1
- package/lib/exchange/swap/hooks/useSelectableCurrencies.d.ts.map +1 -1
- package/lib/exchange/swap/hooks/useSelectableCurrencies.js +16 -4
- package/lib/exchange/swap/hooks/useSelectableCurrencies.js.map +1 -1
- package/lib/featureFlags/defaultFeatures.d.ts +3 -0
- package/lib/featureFlags/defaultFeatures.d.ts.map +1 -1
- package/lib/featureFlags/defaultFeatures.js +2 -1
- package/lib/featureFlags/defaultFeatures.js.map +1 -1
- package/lib/featureFlags/useFeature.d.ts +1 -1
- package/lib/featureFlags/useFeature.d.ts.map +1 -1
- package/lib/generated/specs.d.ts +1 -1
- package/lib/load/speculos.d.ts.map +1 -1
- package/lib/load/speculos.js +1 -0
- package/lib/load/speculos.js.map +1 -1
- package/lib/market/hooks/useLargeMoverChartData.d.ts +1 -2
- package/lib/market/hooks/useLargeMoverChartData.d.ts.map +1 -1
- package/lib/market/hooks/useLargeMoverChartData.js.map +1 -1
- package/lib/market/hooks/useLargeMoverCurrencies.d.ts +1 -2
- package/lib/market/hooks/useLargeMoverCurrencies.d.ts.map +1 -1
- package/lib/market/hooks/useLargeMoverCurrencies.js +1 -3
- package/lib/market/hooks/useLargeMoverCurrencies.js.map +1 -1
- package/lib/market/utils/currencyFormatter.d.ts +1 -1
- package/lib/market/utils/currencyFormatter.d.ts.map +1 -1
- package/lib/market/utils/currencyFormatter.js +1 -1
- package/lib/market/utils/currencyFormatter.js.map +1 -1
- package/lib/modularDrawer/hooks/modules/useLeftApyModule.d.ts +1 -1
- package/lib/modularDrawer/hooks/modules/useLeftMarketTrendModule.d.ts +1 -1
- package/lib/modularDrawer/hooks/modules/useRightMarketTrendModule.d.ts +1 -1
- package/lib/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.d.ts +1 -2
- package/lib/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.d.ts.map +1 -1
- package/lib/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.js +3 -0
- package/lib/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.js.map +1 -1
- package/lib/modularDrawer/hooks/useRightBalanceAsset.d.ts +1 -1
- package/lib/wallet-api/constants.d.ts +2 -2
- package/lib-es/account/helpers.d.ts +10 -0
- package/lib-es/account/helpers.d.ts.map +1 -1
- package/lib-es/account/helpers.js +26 -0
- package/lib-es/account/helpers.js.map +1 -1
- package/lib-es/bridge/generic-alpaca/estimateMaxSpendable.js +1 -1
- package/lib-es/bridge/generic-alpaca/estimateMaxSpendable.js.map +1 -1
- package/lib-es/bridge/generic-alpaca/prepareTransaction.d.ts.map +1 -1
- package/lib-es/bridge/generic-alpaca/prepareTransaction.js +45 -37
- package/lib-es/bridge/generic-alpaca/prepareTransaction.js.map +1 -1
- package/lib-es/bridge/generic-alpaca/signOperation.d.ts.map +1 -1
- package/lib-es/bridge/generic-alpaca/signOperation.js +17 -0
- package/lib-es/bridge/generic-alpaca/signOperation.js.map +1 -1
- package/lib-es/bridge/generic-alpaca/utils.js +1 -1
- package/lib-es/bridge/generic-alpaca/utils.js.map +1 -1
- package/lib-es/config/index.d.ts +2 -2
- package/lib-es/config/index.d.ts.map +1 -1
- package/lib-es/config/index.js.map +1 -1
- package/lib-es/dada-client/hooks/useDrawerConfiguration.d.ts +19 -0
- package/lib-es/dada-client/hooks/useDrawerConfiguration.d.ts.map +1 -0
- package/lib-es/dada-client/hooks/useDrawerConfiguration.js +38 -0
- package/lib-es/dada-client/hooks/useDrawerConfiguration.js.map +1 -0
- package/lib-es/e2e/data/deviceLabelsData.d.ts +8 -0
- package/lib-es/e2e/data/deviceLabelsData.d.ts.map +1 -1
- package/lib-es/e2e/data/deviceLabelsData.js +62 -2
- package/lib-es/e2e/data/deviceLabelsData.js.map +1 -1
- package/lib-es/e2e/deviceInteraction/ButtonDeviceSimulator.d.ts +3 -0
- package/lib-es/e2e/deviceInteraction/ButtonDeviceSimulator.d.ts.map +1 -0
- package/lib-es/e2e/deviceInteraction/ButtonDeviceSimulator.js +18 -0
- package/lib-es/e2e/deviceInteraction/ButtonDeviceSimulator.js.map +1 -0
- package/lib-es/e2e/deviceInteraction/TouchDeviceSimulator.d.ts +4 -0
- package/lib-es/e2e/deviceInteraction/TouchDeviceSimulator.d.ts.map +1 -0
- package/lib-es/e2e/deviceInteraction/TouchDeviceSimulator.js +41 -0
- package/lib-es/e2e/deviceInteraction/TouchDeviceSimulator.js.map +1 -0
- package/lib-es/e2e/enum/Account.d.ts +2 -4
- package/lib-es/e2e/enum/Account.d.ts.map +1 -1
- package/lib-es/e2e/enum/Account.js +5 -8
- package/lib-es/e2e/enum/Account.js.map +1 -1
- package/lib-es/e2e/enum/Device.d.ts +1 -0
- package/lib-es/e2e/enum/Device.d.ts.map +1 -1
- package/lib-es/e2e/enum/Device.js +1 -0
- package/lib-es/e2e/enum/Device.js.map +1 -1
- package/lib-es/e2e/enum/DeviceLabels.d.ts +10 -2
- package/lib-es/e2e/enum/DeviceLabels.d.ts.map +1 -1
- package/lib-es/e2e/enum/DeviceLabels.js +9 -1
- package/lib-es/e2e/enum/DeviceLabels.js.map +1 -1
- package/lib-es/e2e/families/algorand.d.ts.map +1 -1
- package/lib-es/e2e/families/algorand.js +11 -3
- package/lib-es/e2e/families/algorand.js.map +1 -1
- package/lib-es/e2e/families/aptos.d.ts +2 -1
- package/lib-es/e2e/families/aptos.d.ts.map +1 -1
- package/lib-es/e2e/families/aptos.js +12 -4
- package/lib-es/e2e/families/aptos.js.map +1 -1
- package/lib-es/e2e/families/bitcoin.d.ts.map +1 -1
- package/lib-es/e2e/families/bitcoin.js +27 -17
- package/lib-es/e2e/families/bitcoin.js.map +1 -1
- package/lib-es/e2e/families/cardano.d.ts.map +1 -1
- package/lib-es/e2e/families/cardano.js +121 -45
- package/lib-es/e2e/families/cardano.js.map +1 -1
- package/lib-es/e2e/families/celo.d.ts.map +1 -1
- package/lib-es/e2e/families/celo.js +12 -2
- package/lib-es/e2e/families/celo.js.map +1 -1
- package/lib-es/e2e/families/cosmos.d.ts.map +1 -1
- package/lib-es/e2e/families/cosmos.js +17 -4
- package/lib-es/e2e/families/cosmos.js.map +1 -1
- package/lib-es/e2e/families/evm.d.ts +1 -2
- package/lib-es/e2e/families/evm.d.ts.map +1 -1
- package/lib-es/e2e/families/evm.js +25 -9
- package/lib-es/e2e/families/evm.js.map +1 -1
- package/lib-es/e2e/families/hedera.d.ts.map +1 -1
- package/lib-es/e2e/families/hedera.js +2 -1
- package/lib-es/e2e/families/hedera.js.map +1 -1
- package/lib-es/e2e/families/kaspa.d.ts +2 -1
- package/lib-es/e2e/families/kaspa.d.ts.map +1 -1
- package/lib-es/e2e/families/kaspa.js +12 -4
- package/lib-es/e2e/families/kaspa.js.map +1 -1
- package/lib-es/e2e/families/multiversX.d.ts.map +1 -1
- package/lib-es/e2e/families/multiversX.js +12 -2
- package/lib-es/e2e/families/multiversX.js.map +1 -1
- package/lib-es/e2e/families/near.d.ts.map +1 -1
- package/lib-es/e2e/families/near.js +16 -5
- package/lib-es/e2e/families/near.js.map +1 -1
- package/lib-es/e2e/families/osmosis.d.ts.map +1 -1
- package/lib-es/e2e/families/osmosis.js +12 -2
- package/lib-es/e2e/families/osmosis.js.map +1 -1
- package/lib-es/e2e/families/polkadot.d.ts.map +1 -1
- package/lib-es/e2e/families/polkadot.js +11 -3
- package/lib-es/e2e/families/polkadot.js.map +1 -1
- package/lib-es/e2e/families/solana.d.ts.map +1 -1
- package/lib-es/e2e/families/solana.js +17 -4
- package/lib-es/e2e/families/solana.js.map +1 -1
- package/lib-es/e2e/families/stellar.d.ts.map +1 -1
- package/lib-es/e2e/families/stellar.js +11 -3
- package/lib-es/e2e/families/stellar.js.map +1 -1
- package/lib-es/e2e/families/sui.d.ts +2 -1
- package/lib-es/e2e/families/sui.d.ts.map +1 -1
- package/lib-es/e2e/families/sui.js +12 -4
- package/lib-es/e2e/families/sui.js.map +1 -1
- package/lib-es/e2e/families/tezos.d.ts.map +1 -1
- package/lib-es/e2e/families/tezos.js +12 -3
- package/lib-es/e2e/families/tezos.js.map +1 -1
- package/lib-es/e2e/families/tron.d.ts.map +1 -1
- package/lib-es/e2e/families/tron.js +11 -3
- package/lib-es/e2e/families/tron.js.map +1 -1
- package/lib-es/e2e/families/xrp.d.ts.map +1 -1
- package/lib-es/e2e/families/xrp.js +11 -3
- package/lib-es/e2e/families/xrp.js.map +1 -1
- package/lib-es/e2e/index.d.ts +4 -2
- package/lib-es/e2e/index.d.ts.map +1 -1
- package/lib-es/e2e/models/Transaction.d.ts +0 -5
- package/lib-es/e2e/models/Transaction.d.ts.map +1 -1
- package/lib-es/e2e/models/Transaction.js +0 -7
- package/lib-es/e2e/models/Transaction.js.map +1 -1
- package/lib-es/e2e/speculos.d.ts +13 -4
- package/lib-es/e2e/speculos.d.ts.map +1 -1
- package/lib-es/e2e/speculos.js +134 -71
- package/lib-es/e2e/speculos.js.map +1 -1
- package/lib-es/e2e/speculosAppVersion.d.ts +1 -0
- package/lib-es/e2e/speculosAppVersion.d.ts.map +1 -1
- package/lib-es/e2e/speculosAppVersion.js +7 -0
- package/lib-es/e2e/speculosAppVersion.js.map +1 -1
- package/lib-es/exchange/index.d.ts.map +1 -1
- package/lib-es/exchange/index.js +4 -15
- package/lib-es/exchange/index.js.map +1 -1
- package/lib-es/exchange/swap/getCompleteSwapHistory.d.ts +1 -1
- package/lib-es/exchange/swap/getCompleteSwapHistory.d.ts.map +1 -1
- package/lib-es/exchange/swap/getCompleteSwapHistory.js +5 -5
- package/lib-es/exchange/swap/getCompleteSwapHistory.js.map +1 -1
- package/lib-es/exchange/swap/hooks/useSelectableCurrencies.d.ts.map +1 -1
- package/lib-es/exchange/swap/hooks/useSelectableCurrencies.js +18 -6
- package/lib-es/exchange/swap/hooks/useSelectableCurrencies.js.map +1 -1
- package/lib-es/featureFlags/defaultFeatures.d.ts +3 -0
- package/lib-es/featureFlags/defaultFeatures.d.ts.map +1 -1
- package/lib-es/featureFlags/defaultFeatures.js +2 -1
- package/lib-es/featureFlags/defaultFeatures.js.map +1 -1
- package/lib-es/featureFlags/useFeature.d.ts +1 -1
- package/lib-es/featureFlags/useFeature.d.ts.map +1 -1
- package/lib-es/generated/specs.d.ts +1 -1
- package/lib-es/load/speculos.d.ts.map +1 -1
- package/lib-es/load/speculos.js +1 -0
- package/lib-es/load/speculos.js.map +1 -1
- package/lib-es/market/hooks/useLargeMoverChartData.d.ts +1 -2
- package/lib-es/market/hooks/useLargeMoverChartData.d.ts.map +1 -1
- package/lib-es/market/hooks/useLargeMoverChartData.js.map +1 -1
- package/lib-es/market/hooks/useLargeMoverCurrencies.d.ts +1 -2
- package/lib-es/market/hooks/useLargeMoverCurrencies.d.ts.map +1 -1
- package/lib-es/market/hooks/useLargeMoverCurrencies.js +1 -3
- package/lib-es/market/hooks/useLargeMoverCurrencies.js.map +1 -1
- package/lib-es/market/utils/currencyFormatter.d.ts +1 -1
- package/lib-es/market/utils/currencyFormatter.d.ts.map +1 -1
- package/lib-es/market/utils/currencyFormatter.js +1 -1
- package/lib-es/market/utils/currencyFormatter.js.map +1 -1
- package/lib-es/modularDrawer/hooks/modules/useLeftApyModule.d.ts +1 -1
- package/lib-es/modularDrawer/hooks/modules/useLeftMarketTrendModule.d.ts +1 -1
- package/lib-es/modularDrawer/hooks/modules/useRightMarketTrendModule.d.ts +1 -1
- package/lib-es/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.d.ts +1 -2
- package/lib-es/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.d.ts.map +1 -1
- package/lib-es/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.js +3 -0
- package/lib-es/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.js.map +1 -1
- package/lib-es/modularDrawer/hooks/useRightBalanceAsset.d.ts +1 -1
- package/lib-es/wallet-api/constants.d.ts +2 -2
- package/package.json +55 -55
- package/src/account/helpers.test.ts +209 -0
- package/src/account/helpers.ts +34 -0
- package/src/bridge/cache.test.ts +2 -2
- package/src/bridge/generic-alpaca/estimateMaxSpendable.ts +1 -1
- package/src/bridge/generic-alpaca/prepareTransaction.ts +69 -46
- package/src/bridge/generic-alpaca/signOperation.ts +20 -0
- package/src/bridge/generic-alpaca/tests/prepareTransaction.test.ts +109 -191
- package/src/bridge/generic-alpaca/utils.test.ts +15 -12
- package/src/bridge/generic-alpaca/utils.ts +1 -1
- package/src/config/index.ts +2 -4
- package/src/currencies/sortByMarketcap.test.ts +10 -7
- package/src/dada-client/hooks/useDrawerConfiguration.ts +65 -0
- package/src/e2e/data/deviceLabelsData.ts +70 -2
- package/src/e2e/deviceInteraction/ButtonDeviceSimulator.ts +23 -0
- package/src/e2e/deviceInteraction/TouchDeviceSimulator.ts +52 -0
- package/src/e2e/enum/Account.ts +1 -16
- package/src/e2e/enum/Device.ts +1 -0
- package/src/e2e/enum/DeviceLabels.ts +9 -1
- package/src/e2e/families/algorand.ts +10 -4
- package/src/e2e/families/aptos.ts +12 -4
- package/src/e2e/families/bitcoin.ts +25 -18
- package/src/e2e/families/cardano.ts +137 -50
- package/src/e2e/families/celo.ts +11 -2
- package/src/e2e/families/cosmos.ts +15 -9
- package/src/e2e/families/evm.ts +28 -11
- package/src/e2e/families/hedera.ts +2 -1
- package/src/e2e/families/kaspa.ts +12 -4
- package/src/e2e/families/multiversX.ts +11 -2
- package/src/e2e/families/near.ts +15 -6
- package/src/e2e/families/osmosis.ts +11 -2
- package/src/e2e/families/polkadot.ts +10 -3
- package/src/e2e/families/solana.ts +15 -9
- package/src/e2e/families/stellar.ts +10 -3
- package/src/e2e/families/sui.ts +12 -4
- package/src/e2e/families/tezos.ts +11 -3
- package/src/e2e/families/tron.ts +10 -3
- package/src/e2e/families/xrp.ts +10 -3
- package/src/e2e/models/Transaction.ts +0 -13
- package/src/e2e/speculos.ts +160 -89
- package/src/e2e/speculosAppVersion.ts +8 -0
- package/src/exchange/index.ts +4 -15
- package/src/exchange/swap/getCompleteSwapHistory.ts +5 -5
- package/src/exchange/swap/hooks/useFromState.test.ts +11 -4
- package/src/exchange/swap/hooks/useReverseAccounts.test.ts +11 -4
- package/src/exchange/swap/hooks/useSelectableCurrencies.test.ts +14 -8
- package/src/exchange/swap/hooks/useSelectableCurrencies.ts +23 -6
- package/src/exchange/swap/hooks/useToState.test.ts +11 -4
- package/src/exchange/swap/hooks/useUpdateMaxAmount.test.ts +11 -4
- package/src/exchange/swap/utils/index.test.ts +10 -4
- package/src/families/algorand/bridge.integration.test.ts +1 -1
- package/src/families/bitcoin/__snapshots__/bridge.integration.test.ts.snap +3 -3
- package/src/families/cardano/bridge.integration.test.ts +1 -1
- package/src/families/cosmos/datasets/__snapshots__/cosmos.integration.test.ts.snap +25 -2
- package/src/families/evm/bridge.integration.test.ts +1 -1
- package/src/families/hedera/__snapshots__/bridge.integration.test.ts.snap +25 -5
- package/src/families/icon/bridge.integration.test.ts +1 -1
- package/src/families/multiversx/bridge.integration.test.ts +1 -2
- package/src/families/near/bridge.integration.test.ts +1 -1
- package/src/families/solana/bridge.integration.test.ts +1 -1
- package/src/families/sui/bridge.integration.test.ts +1 -1
- package/src/families/ton/bridge.integration.test.ts +1 -1
- package/src/featureFlags/defaultFeatures.ts +2 -1
- package/src/load/speculos.ts +1 -0
- package/src/market/hooks/useLargeMoverChartData.ts +1 -2
- package/src/market/hooks/useLargeMoverCurrencies.ts +3 -6
- package/src/market/utils/currencyFormatter.ts +2 -2
- package/src/modularDrawer/hooks/useCurrenciesUnderFeatureFlag.ts +3 -0
- package/lib/e2e/enum/Nft.d.ts +0 -15
- package/lib/e2e/enum/Nft.d.ts.map +0 -1
- package/lib/e2e/enum/Nft.js +0 -25
- package/lib/e2e/enum/Nft.js.map +0 -1
- package/lib-es/e2e/enum/Nft.d.ts +0 -15
- package/lib-es/e2e/enum/Nft.d.ts.map +0 -1
- package/lib-es/e2e/enum/Nft.js +0 -21
- package/lib-es/e2e/enum/Nft.js.map +0 -1
- package/src/e2e/enum/Nft.ts +0 -57
package/src/e2e/speculos.ts
CHANGED
|
@@ -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
|
|
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 {
|
|
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
|
|
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.
|
|
509
|
-
|
|
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¤tscreenonly=true`,
|
|
517
|
+
),
|
|
533
518
|
);
|
|
519
|
+
return response.data.events.map(event => event.text).join(" ");
|
|
534
520
|
}
|
|
535
521
|
|
|
536
|
-
async function
|
|
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¤tscreenonly=true`,
|
|
541
530
|
),
|
|
542
531
|
);
|
|
543
|
-
|
|
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
|
|
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
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
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.
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
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.
|
|
614
|
-
|
|
615
|
-
|
|
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
|
-
|
|
618
|
-
|
|
619
|
-
|
|
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
|
-
|
|
624
|
-
|
|
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
|
-
|
|
636
|
-
|
|
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
|
-
|
|
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
|
|
748
|
-
const
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|
package/src/exchange/index.ts
CHANGED
|
@@ -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
|
-
|
|
44
|
-
|
|
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
|
-
|
|
49
|
-
|
|
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 {
|
|
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
|
|
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
|
|
18
|
-
|
|
19
|
-
|
|
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
|
|
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
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
34
|
-
|
|
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 {
|
|
2
|
-
import { findCryptoCurrencyById
|
|
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 =
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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;
|