Skip to content
This repository has been archived by the owner on Jun 16, 2022. It is now read-only.

Commit

Permalink
solana: add backbone for opt in flow
Browse files Browse the repository at this point in the history
  • Loading branch information
konoart committed Nov 11, 2021
1 parent e09bad9 commit e911736
Show file tree
Hide file tree
Showing 8 changed files with 643 additions and 0 deletions.
207 changes: 207 additions & 0 deletions src/renderer/families/solana/OptInFlowModal/Body.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
// @flow
import invariant from "invariant";
import React, { useState, useCallback } from "react";
import { compose } from "redux";
import { connect, useDispatch } from "react-redux";
import { Trans, withTranslation } from "react-i18next";
import { createStructuredSelector } from "reselect";
import { SyncSkipUnderPriority } from "@ledgerhq/live-common/lib/bridge/react";
import Track from "~/renderer/analytics/Track";

import { UserRefusedOnDevice } from "@ledgerhq/errors";

import { getAccountBridge } from "@ledgerhq/live-common/lib/bridge";
import useBridgeTransaction from "@ledgerhq/live-common/lib/bridge/useBridgeTransaction";

import type { StepId, StepProps, St } from "./types";
import type { Account, Operation } from "@ledgerhq/live-common/lib/types";
import type { TFunction } from "react-i18next";
import type { Device } from "@ledgerhq/live-common/lib/hw/actions/types";

import { addPendingOperation } from "@ledgerhq/live-common/lib/account";
import { updateAccountWithUpdater } from "~/renderer/actions/accounts";

import { getCurrentDevice } from "~/renderer/reducers/devices";
import { closeModal, openModal } from "~/renderer/actions/modals";

import Stepper from "~/renderer/components/Stepper";
import StepAsset, { StepAssetFooter } from "./steps/StepAsset";
import GenericStepConnectDevice from "~/renderer/modals/Send/steps/GenericStepConnectDevice";
import StepConfirmation, { StepConfirmationFooter } from "./steps/StepConfirmation";
import logger from "~/logger/logger";

type OwnProps = {|
stepId: StepId,
onClose: () => void,
onChangeStepId: StepId => void,
params: {
account: Account,
parentAccount: ?Account,
},
name: string,
|};

type StateProps = {|
t: TFunction,
device: ?Device,
accounts: Account[],
device: ?Device,
closeModal: string => void,
openModal: string => void,
|};

type Props = OwnProps & StateProps;

const steps: Array<St> = [
{
id: "assets",
label: <Trans i18nKey="solana.optIn.flow.steps.assets.title" />,
component: StepAsset,
noScroll: true,
footer: StepAssetFooter,
},
{
id: "connectDevice",
label: <Trans i18nKey="solana.optIn.flow.steps.connectDevice.title" />,
component: GenericStepConnectDevice,
onBack: ({ transitionTo }: StepProps) => transitionTo("assets"),
},
{
id: "confirmation",
label: <Trans i18nKey="solana.optIn.flow.steps.confirmation.title" />,
component: StepConfirmation,
footer: StepConfirmationFooter,
},
];

const mapStateToProps = createStructuredSelector({
device: getCurrentDevice,
});

const mapDispatchToProps = {
closeModal,
openModal,
};

const Body = ({
t,
stepId,
device,
closeModal,
openModal,
onChangeStepId,
params,
name,
}: Props) => {
const [optimisticOperation, setOptimisticOperation] = useState(null);
const [transactionError, setTransactionError] = useState(null);
const [signed, setSigned] = useState(false);
const dispatch = useDispatch();

const {
transaction,
setTransaction,
updateTransaction,
account,
parentAccount,
status,
bridgeError,
bridgePending,
} = useBridgeTransaction(() => {
const { account } = params;

invariant(account, "solana: account required");

const bridge = getAccountBridge(account, undefined);

const transaction = bridge.createTransaction(account);

return { account, parentAccount: undefined, transaction };
});

const handleCloseModal = useCallback(() => {
closeModal(name);
}, [closeModal, name]);

const handleStepChange = useCallback(e => onChangeStepId(e.id), [onChangeStepId]);

const handleRetry = useCallback(() => {
setTransactionError(null);
onChangeStepId("assets");
}, [onChangeStepId]);

const handleTransactionError = useCallback((error: Error) => {
if (!(error instanceof UserRefusedOnDevice)) {
logger.critical(error);
}
setTransactionError(error);
}, []);

const handleOperationBroadcasted = useCallback(
(optimisticOperation: Operation) => {
if (!account) return;
dispatch(
updateAccountWithUpdater(account.id, account =>
addPendingOperation(account, optimisticOperation),
),
);
setOptimisticOperation(optimisticOperation);
setTransactionError(null);
},
[account, dispatch],
);

const error = transactionError || bridgeError || status.errors.amount;
const warning = status.warnings ? Object.values(status.warnings)[0] : null;

const errorSteps = [];

if (transactionError) {
errorSteps.push(2);
} else if (bridgeError) {
errorSteps.push(0);
}

const stepperProps = {
title: t("solana.optIn.flow.title"),
device,
account,
parentAccount,
transaction,
signed,
stepId,
steps,
errorSteps,
disabledSteps: [],
hideBreadcrumb: !!error || !!warning,
onRetry: handleRetry,
onStepChange: handleStepChange,
onClose: handleCloseModal,
error,
warning,
status,
optimisticOperation,
openModal,
setSigned,
onChangeTransaction: setTransaction,
onUpdateTransaction: updateTransaction,
onOperationBroadcasted: handleOperationBroadcasted,
onTransactionError: handleTransactionError,
t,
bridgePending,
};

return (
<Stepper {...stepperProps}>
<SyncSkipUnderPriority priority={100} />
<Track onUnmount event="CloseModalOptIn" />
</Stepper>
);
};

const C: React$ComponentType<OwnProps> = compose(
connect(mapStateToProps, mapDispatchToProps),
withTranslation(),
)(Body);

export default C;
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
// @flow
import React, { useState, useMemo } from "react";
import { Trans } from "react-i18next";

import type { TokenCurrency } from "@ledgerhq/live-common/lib/types";

import { listTokensForCryptoCurrency } from "@ledgerhq/live-common/lib/currencies";

import Box from "~/renderer/components/Box";
import FirstLetterIcon from "~/renderer/components/FirstLetterIcon";
import Select from "~/renderer/components/Select";
import Text from "~/renderer/components/Text";
import ToolTip from "~/renderer/components/Tooltip";
import ExclamationCircleThin from "~/renderer/icons/ExclamationCircleThin";

const renderItem = ({
data: { id, name },
isDisabled,
data,
}: {
data: TokenCurrency,
isDisabled: boolean,
}) => {
// TODO: make a function for that in common
const tokenParts = id.split("/");
const mintAddress = tokenParts[2];
return (
<Box
key={id}
horizontal
alignItems="center"
color={isDisabled ? "palette.text.shade40" : "palette.text.shade100"}
justifyContent="space-between"
>
<Box horizontal alignItems="center" justifyContent="flex-start">
<FirstLetterIcon
color={isDisabled ? "palette.text.shade40" : "palette.text.shade100"}
label={name}
mr={2}
/>
<Text ff="Inter|Medium">{name}</Text>
<Text fontSize={3} color="palette.text.shade40">
- Token {mintAddress}
</Text>
</Box>
{isDisabled && (
<ToolTip content={<Trans i18nKey="solana.optIn.flow.steps.assets.disabledTooltip" />}>
<Box color="warning">
<ExclamationCircleThin size={16} />
</Box>
</ToolTip>
)}
</Box>
);
};

export default function DelegationSelectorField({ account, transaction, t, onChange }: *) {
const [query, setQuery] = useState("");
const subAccounts = account.subAccounts;
const options = listTokensForCryptoCurrency(account.currency);
const value = useMemo(() => options.find(({ id }) => id === transaction.assetId), [
options,
transaction,
]);

return (
<Box flow={1} mb={4}>
<Select
value={value}
options={options}
getOptionValue={({ name }) => name}
isOptionDisabled={({ id }) => subAccounts.some(({ token }) => token.id === id)}
renderValue={renderItem}
renderOption={renderItem}
onInputChange={setQuery}
inputValue={query}
placeholder={t("solana.optIn.flow.steps.assets.selectLabel")}
noOptionsMessage={({ inputValue }) => t("common.selectNoResults", { query: inputValue })}
onChange={onChange}
/>
</Box>
);
}
49 changes: 49 additions & 0 deletions src/renderer/families/solana/OptInFlowModal/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// @flow

import React, { PureComponent } from "react";
import Modal from "~/renderer/components/Modal";
import Body from "./Body";
import type { StepId } from "./types";
type State = {
stepId: StepId,
};

const INITIAL_STATE = {
stepId: "assets",
};

class OptInModal extends PureComponent<{ name: string }, State> {
state = INITIAL_STATE;

handleReset = () => this.setState({ ...INITIAL_STATE });

handleStepChange = (stepId: StepId) => this.setState({ stepId });

render() {
const { stepId } = this.state;
const { name } = this.props;

const isModalLocked = ["connectDevice", "confirmation"].includes(stepId);

return (
<Modal
name={name}
centered
refocusWhenChange={stepId}
onHide={this.handleReset}
preventBackdropClick={isModalLocked}
render={({ onClose, data }) => (
<Body
stepId={stepId}
name={name}
onClose={onClose}
onChangeStepId={this.handleStepChange}
params={data || {}}
/>
)}
/>
);
}
}

export default OptInModal;
Loading

1 comment on commit e911736

@ledger-live-comment-bot
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cc @konoart

Lint outputs ❌

Command failed with exit code 2: yarn flow
Launching Flow server for /home/runner/work/ledger-live-desktop/ledger-live-desktop
Spawned flow server (pid=37274)
Logs will go to /tmp/flow/zShomezSrunnerzSworkzSledger-live-desktopzSledger-live-desktop.log
Monitor logs will go to /tmp/flow/zShomezSrunnerzSworkzSledger-live-desktopzSledger-live-desktop.monitor_log
Started a new flow server: -Please wait. Server is starting up
Please wait. Server is initializing (starting up)
Please wait. Server is initializing (parsed files 0)
Please wait. Server is initializing (parsed files 1000)
Please wait. Server is initializing (parsed files 2000)
Please wait. Server is initializing (parsed files 2000)
Please wait. Server is initializing (parsed files 3000)
Please wait. Server is initializing (parsed files 3000)
Please wait. Server is initializing (parsed files 3000)
Please wait. Server is initializing (parsed files 4000)
Please wait. Server is initializing (parsed files 4000)
Please wait. Server is initializing (parsed files 5000)
Please wait. Server is initializing (parsed files 5000)
Please wait. Server is initializing (parsed files 6000)
Please wait. Server is initializing (parsed files 6000)
Please wait. Server is initializing (parsed files 8000)
Please wait. Server is initializing (parsed files 9000)
Please wait. Server is initializing (parsed files 11000)
Please wait. Server is initializing (parsed files 11000)
Please wait. Server is initializing (parsed files 11000)
Please wait. Server is initializing (parsed files 11000)
Please wait. Server is initializing (parsed files 11000)
Please wait. Server is initializing (parsed files 13000)
Please wait. Server is initializing (parsed files 13000)
Please wait. Server is initializing (parsed files 14000)
Please wait. Server is initializing (parsed files 15000)
Please wait. Server is initializing (parsed files 15000)
Please wait. Server is initializing (parsed files 16000)
Please wait. Server is initializing (parsed files 16000)
Please wait. Server is initializing (parsed files 17000)
Please wait. Server is initializing (parsed files 17000)
Please wait. Server is initializing (parsed files 17000)
Please wait. Server is initializing (parsed files 19000)
Please wait. Server is initializing (parsed files 20000)
Please wait. Server is initializing (parsed files 20000)
Please wait. Server is initializing (parsed files 20000)
Please wait. Server is initializing (parsed files 21000)
Please wait. Server is initializing (parsed files 23000)
Please wait. Server is initializing (parsed files 23000)
Please wait. Server is initializing (parsed files 23000)
Please wait. Server is initializing (parsed files 23000)
Please wait. Server is initializing (parsed files 26000)
Please wait. Server is initializing (parsed files 28000)
Please wait. Server is initializing (parsed files 28000)
Please wait. Server is initializing (parsed files 30000)
Please wait. Server is initializing (parsed files 31000)
Please wait. Server is initializing (parsed files 31000)
Please wait. Server is initializing (parsed files 31000)
Please wait. Server is initializing (parsed files 32000)
Please wait. Server is initializing (parsed files 32000)
Please wait. Server is initializing (parsed files 32000)
Please wait. Server is initializing (parsed files 33000)
Please wait. Server is initializing (parsed files 33000)
Please wait. Server is initializing (parsed files 34000)
Please wait. Server is initializing (parsed files 35000)
Please wait. Server is initializing (parsed files 36000)
Please wait. Server is initializing (parsed files 38000)
Please wait. Server is initializing (parsed files 38000)
Please wait. Server is initializing (parsed files 39000)
Please wait. Server is initializing (parsed files 39000)
Please wait. Server is initializing (parsed files 43000)
Please wait. Server is initializing (parsed files 46000)
Please wait. Server is initializing (parsed files 46000)
Please wait. Server is initializing (parsed files 47000)
Please wait. Server is initializing (parsed files 47000)
Please wait. Server is initializing (parsed files 48000)
Please wait. Server is initializing (parsed files 48000)
Please wait. Server is initializing (parsed files 50000)
Please wait. Server is initializing (parsed files 50000)
Please wait. Server is initializing (parsed files 52000)
Please wait. Server is initializing (parsed files 52000)
Please wait. Server is initializing (parsed files 53000)
Please wait. Server is initializing (parsed files 53000)
Please wait. Server is initializing (parsed files 53000)
Please wait. Server is initializing (parsed files 54000)
Please wait. Server is initializing (parsed files 54000)
Please wait. Server is initializing (parsed files 55000)
Please wait. Server is initializing (parsed files 55000)
Please wait. Server is initializing (parsed files 56000)
Please wait. Server is initializing (parsed files 56000)
Please wait. Server is initializing (parsed files 57000)
Please wait. Server is initializing (parsed files 57000)
Please wait. Server is initializing (parsed files 57000)
Please wait. Server is initializing (parsed files 57000)
Please wait. Server is initializing (parsed files 57000)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (parsed files 57266)
Please wait. Server is initializing (resolving dependencies)
Please wait. Server is initializing (resolving dependencies)
Please wait. Server is initializing (resolving dependencies)
Please wait. Server is initializing (resolving dependencies)
Please wait. Server is initializing (resolving dependencies)
Please wait. Server is initializing (waiting for Watchman - giving up in 119 seconds)
Please wait. Server is initializing (waiting for Watchman - giving up in 119 seconds)
Please wait. Server is initializing (parsed files 0/0 (0.0%))
Please wait. Server is initializing (calculating dependencies)
Please wait. Server is initializing (merged files 0/1231 (0.0%))
Please wait. Server is initializing (merged files 137/1231 (11.1%))
Please wait. Server is initializing (merged files 350/1231 (28.4%))
Please wait. Server is initializing (merged files 373/1231 (30.3%))
Please wait. Server is initializing (merged files 373/1231 (30.3%))
Please wait. Server is initializing (merged files 387/1231 (31.4%))
Please wait. Server is initializing (merged files 427/1231 (34.7%))
Please wait. Server is initializing (merged files 455/1231 (37.0%))
Please wait. Server is initializing (merged files 498/1231 (40.5%))
Please wait. Server is initializing (merged files 509/1231 (41.3%))
Please wait. Server is initializing (merged files 509/1231 (41.3%))
Please wait. Server is initializing (merged files 529/1231 (43.0%))
Please wait. Server is initializing (merged files 529/1231 (43.0%))
Please wait. Server is initializing (merged files 588/1231 (47.8%))
Please wait. Server is initializing (merged files 588/1231 (47.8%))
Please wait. Server is initializing (merged files 633/1231 (51.4%))
Please wait. Server is initializing (merged files 633/1231 (51.4%))
Please wait. Server is initializing (merged files 649/1231 (52.7%))
Please wait. Server is initializing (merged files 681/1231 (55.3%))
Please wait. Server is initializing (merged files 681/1231 (55.3%))
Please wait. Server is initializing (merged files 681/1231 (55.3%))
Please wait. Server is initializing (merged files 681/1231 (55.3%))
Please wait. Server is initializing (merged files 681/1231 (55.3%))
Please wait. Server is initializing (merged files 747/1231 (60.7%))
Please wait. Server is initializing (merged files 796/1231 (64.7%))
Please wait. Server is initializing (merged files 796/1231 (64.7%))
Please wait. Server is initializing (merged files 796/1231 (64.7%))
Please wait. Server is initializing (merged files 836/1231 (67.9%))
Please wait. Server is initializing (merged files 872/1231 (70.8%))
Please wait. Server is initializing (merged files 902/1231 (73.3%))
Please wait. Server is initializing (merged files 943/1231 (76.6%))
Please wait. Server is initializing (merged files 943/1231 (76.6%))
Please wait. Server is initializing (merged files 971/1231 (78.9%))
Please wait. Server is initializing (merged files 971/1231 (78.9%))
Please wait. Server is initializing (merged files 1018/1231 (82.7%))
Please wait. Server is initializing (merged files 1030/1231 (83.7%))
Please wait. Server is initializing (merged files 1053/1231 (85.5%))
Please wait. Server is initializing (merged files 1078/1231 (87.6%))
Please wait. Server is initializing (merged files 1089/1231 (88.5%))
Please wait. Server is initializing (merged files 1096/1231 (89.0%))
Please wait. Server is initializing (merged files 1114/1231 (90.5%))
Please wait. Server is initializing (merged files 1123/1231 (91.2%))
Please wait. Server is initializing (merged files 1147/1231 (93.2%))
Please wait. Server is initializing (merged files 1175/1231 (95.5%))
Please wait. Server is initializing (merged files 1200/1231 (97.5%))
Please wait. Server is initializing (merged files 1224/1231 (99.4%))
Please wait. Server is initializing (finishing up)
Please wait. Server is handling a request (starting up)
Please wait. Server is handling a request (collating errors)
error Command failed with exit code 2.
$ /home/runner/work/ledger-live-desktop/ledger-live-desktop/node_modules/.bin/flow
Error -------------------------------------------------------- src/renderer/families/solana/OptInFlowModal/types.js:8:34

Cannot resolve module @ledgerhq/live-common/lib/families/solana/types.

8| import type { Transaction } from "@ledgerhq/live-common/lib/families/solana/types";
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Found 1 error
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.Command failed with exit code 1: yarn lint
error Command failed with exit code 1.
$ eslint src tools

/home/runner/work/ledger-live-desktop/ledger-live-desktop/src/main/updater/updater.spec.js
12:1 warning Skipped test suite jest/no-disabled-tests

/home/runner/work/ledger-live-desktop/ledger-live-desktop/src/renderer/components/SelectAccountAndCurrency.js
110:6 warning React Hook useCallback has a missing dependency: 'flow'. Either include it or remove the dependency array react-hooks/exhaustive-deps

/home/runner/work/ledger-live-desktop/ledger-live-desktop/src/renderer/components/ToastOverlay/index.js
29:5 warning React Hook useCallback has a missing dependency: 'dispatch'. Either include it or remove the dependency array react-hooks/exhaustive-deps

/home/runner/work/ledger-live-desktop/ledger-live-desktop/src/renderer/families/solana/SendRecipientFields.js
4:10 error 'BigNumber' is defined but never used no-unused-vars
5:10 error 'Trans' is defined but never used no-unused-vars
6:15 error 'TFunction' is defined but never used no-unused-vars
7:43 error '/home/runner/work/ledger-live-desktop/ledger-live-desktop/node_modules/@ledgerhq/live-common/lib/types/index.js' imported multiple times import/no-duplicates
12:40 error '/home/runner/work/ledger-live-desktop/ledger-live-desktop/node_modules/@ledgerhq/live-common/lib/types/index.js' imported multiple times import/no-duplicates

✖ 8 problems (5 errors, 3 warnings)
1 error and 0 warnings potentially fixable with the --fix option.

info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.error Command failed with exit code 255.

Tests outputs ❌

FAIL src/generate-cryptoassets-md.test.js
● generate cryptoassets.md

expect(received).toBe(expected) // Object.is equality

- Expected  - 13
+ Received  +  3

@@ -99,11 +99,11 @@
  | filecoin | FIL | NO | filecoin |
  | lisk | LSK | NO | lisk |
  | stacks | STX | NO | stacks |
  | æternity | AE | NO | aeternity |

- ## Tokens (9516)
+ ## Tokens (9506)
  | parent currency | ticker | contract | name | status | ledger id |
  |--|--|--|--|--|--|
  | Algorand | ARCC | MESEJMPXKL7YUWEQGNRCKSLMQDKHOHWIZ3RBWP7BV4JDMUJXFUVQZWUBJM | Asia Reserve Currency Coin | countervalues disabled | algorand/asa/163650 |
  | Algorand | VAL 1 | GNRGAOG65JPGWVIK2Q45R4XLLVIMF7AWVBK5TEBGWRRAZ3EHPQIN44EGFA | Credit Opportunities Fund I | countervalues disabled | algorand/asa/2838934 |
  | Algorand | HDL | K3NSXYMHPRCK7PMYT3QUQXUGPZJ4MKWJXW2HJRYPVMQUMKJAOJEIEO4HK4 | HEADLINE | countervalues disabled | algorand/asa/137594422 |
@@ -271,15 +271,13 @@
  | Binance Smart Chain | DOP | 0x844FA82f1E54824655470970F7004Dd90546bB28 | Dopple Token |  | bsc/bep20/dopple_token |
  | Binance Smart Chain | DRS | 0xc8E8ecB2A5B5d1eCFf007BF74d15A86434aA0c5C | DragonSlayer |  | bsc/bep20/dragonslayer |
  | Binance Smart Chain | DDIM | 0xc9132C76060F6b319764Ea075973a650A1a53bC9 | DuckDaoDime | countervalues disabled | bsc/bep20/duckdaodime |
  | Binance Smart Chain | DUSK | 0xB2BD0749DBE21f623d9BABa856D3B0f0e1BFEc9C | Dusk Network |  | bsc/bep20/dusk_network |
  | Binance Smart Chain | DVI | 0x758FB037A375F17c7e195CC634D77dA4F554255B | Dvision |  | bsc/bep20/dvision |
- | Binance Smart Chain | EVDC | 0xC3B4C4eF3fE02aD91cB57efda593ed07A9278cc0 | EV Direct Currency |  | bsc/bep20/ev_direct_currency |
  | Binance Smart Chain | EZ | 0x5512014efa6Cd57764Fa743756F7a6Ce3358cC83 | Easy V2 | countervalues disabled | bsc/bep20/easy_v2 |
  | Binance Smart Chain | ELTB | 0x380291A9A8593B39f123cF39cc1cc47463330b1F | Elite Swap Binance Token | countervalues disabled | bsc/bep20/elite_swap_binance_token |
  | Binance Smart Chain | EPS | 0xA7f552078dcC247C2684336020c03648500C6d9F | Ellipsis | countervalues disabled | bsc/bep20/ellipsis |
- | Binance Smart Chain | EMPIRE | 0x293C3Ee9ABaCb08BB8ceD107987F00EfD1539288 | Empire Token |  | bsc/bep20/empire_token |
  | Binance Smart Chain | EMP | 0x86A45b508a375ac8f0FD387e7532B70f71291152 | Empiricus Token |  | bsc/bep20/empiricus_token |
  | Binance Smart Chain | ECC | 0x8D047F4F57A190C96c8b9704B39A1379E999D82B | Etherconnect Coin |  | bsc/bep20/etherconnect_coin |
  | Binance Smart Chain | XED | 0x5621b5A3f4a8008c4CCDd1b942B121c8B1944F1f | Exeedme |  | bsc/bep20/exeedme |
  | Binance Smart Chain | EXF | 0x6306e883493824Ccf606D90E25F68a28e47b98a3 | Extend Finance | countervalues disabled | bsc/bep20/extend_finance |
  | Binance Smart Chain | FLOKI | 0x2B3F34e9D4b127797CE6244Ea341a83733ddd6E4 | FLOKI |  | bsc/bep20/floki |
@@ -409,11 +407,10 @@
  | Binance Smart Chain | RPG | 0xc2098a8938119A52B1F7661893c0153A6CB116d5 | Rangers Protocol Gas |  | bsc/bep20/rangers_protocol_gas |
  | Binance Smart Chain | RAVEN | 0xcD7C5025753a49f1881B31C48caA7C517Bb46308 | Raven Protocol | countervalues disabled | bsc/bep20/raven_protocol |
  | Binance Smart Chain | REEF | 0xF21768cCBC73Ea5B6fd3C687208a7c2def2d966e | Reef.finance | countervalues disabled | bsc/bep20/reef.finance |
  | Binance Smart Chain | FINE | 0x4e6415a5727ea08aAE4580057187923aeC331227 | Refinable | countervalues disabled | bsc/bep20/refinable |
  | Binance Smart Chain | RGP | 0xFA262F303Aa244f9CC66f312F0755d89C3793192 | RigelToken | countervalues disabled | bsc/bep20/rigeltoken |
- | Binance Smart Chain | SHIB | 0x2859e4544C4bB03966803b044A93563Bd2D0DD4D | SHIBA INU |  | bsc/bep20/shiba_inu |
  | Binance Smart Chain | SWG | 0xe792f64C582698b8572AAF765bDC426AC3aEfb6B | SWGToken |  | bsc/bep20/swgtoken |
  | Binance Smart Chain | SWINGBY | 0x71DE20e0C4616E7fcBfDD3f875d568492cBE4739 | SWINGBY token |  | bsc/bep20/swingby_token |
  | Binance Smart Chain | SAFEMOON | 0x8076C74C5e3F5852037F31Ff0093Eeb8c8ADd8D3 | SafeMoon | countervalues disabled | bsc/bep20/safemoon |
  | Binance Smart Chain | SFP | 0xD41FDb03Ba84762dD66a0af1a6C8540FF1ba5dfb | SafePal Token | countervalues disabled | bsc/bep20/safepal_token |
  | Binance Smart Chain | SAKE | 0x8BD778B12b15416359A227F0533Ce2D91844e1eD | SakeToken | countervalues disabled | bsc/bep20/saketoken |
@@ -441,11 +438,10 @@
  | Binance Smart Chain | SWAMP | 0xc5A49b4CBe004b6FD55B30Ba1dE6AC360FF9765d | Swampy |  | bsc/bep20/swampy |
  | Binance Smart Chain | SWFTC | 0xE64E30276C2F826FEbd3784958d6Da7B55DfbaD3 | SwftCoin | countervalues disabled | bsc/bep20/swftcoin |
  | Binance Smart Chain | SXP | 0x47BEAd2563dCBf3bF2c9407fEa4dC236fAbA485A | Swipe | countervalues disabled | bsc/bep20/swipe |
  | Binance Smart Chain | SWTH | 0x250b211EE44459dAd5Cd3bCa803dD6a7EcB5d46C | Switcheo Token |  | bsc/bep20/switcheo_token |
  | Binance Smart Chain | THUGS | 0xE10e9822A5de22F8761919310DDA35CD997d63c0 | THUGS | countervalues disabled | bsc/bep20/thugs |
- | Binance Smart Chain | TIKI | 0x9b76D1B12Ff738c113200EB043350022EBf12Ff0 | TIKI |  | bsc/bep20/tiki |
  | Binance Smart Chain | TOZ | 0xcF0Bea8B08fd28E339EFF49F717A828f79F7F5eC | TOZEX | countervalues disabled | bsc/bep20/tozex |
  | Binance Smart Chain | TRX | 0x85EAC5Ac2F758618dFa09bDbe0cf174e7d574D5B | TRON | countervalues disabled | bsc/bep20/tron |
  | Binance Smart Chain | TRONPAD | 0x1Bf7AedeC439D6BFE38f8f9b20CF3dc99e3571C4 | TRONPAD.network |  | bsc/bep20/tronpad.network |
  | Binance Smart Chain | TACO | 0x9066e87Bac891409D690cfEfA41379b34af06391 | Taco | countervalues disabled | bsc/bep20/taco |
  | Binance Smart Chain | TEN | 0xdFF8cb622790b7F92686c722b02CaB55592f152C | Tenet |  | bsc/bep20/tenet |
@@ -1560,11 +1556,11 @@
  | Ethereum | CPAY | 0x0Ebb614204E47c09B6C3FeB9AAeCad8EE060E23E | CPAY |  | ethereum/erc20/cpay |
  | Ethereum | CPC | 0xfAE4Ee59CDd86e3Be9e8b90b53AA866327D7c090 | CPChain |  | ethereum/erc20/cpchain |
  | Ethereum | CPLO | 0x7064aAb39A0Fcf7221c3396719D0917a65E35515 | CPOLLO |  | ethereum/erc20/cpollo |
  | Ethereum | CPROP | 0x0FB843D37AA2A99db8D81aF9fe2F0A6485c7c002 | CPROP |  | ethereum/erc20/cprop |
  | Ethereum | CPU | 0x6D52DfeFb16BB9Cdc78bfCA09061e44574886626 | CPUcoin |  | ethereum/erc20/cpucoin |
- | Ethereum | CRC | 0xFB19C03a02a519a44542343803F3D42578CBc243 | CR Coin | countervalues disabled | ethereum/erc20/cr_coin |
+ | Ethereum | CRC | 0xFB19C03a02a519a44542343803F3D42578CBc243 | CR Coin |  | ethereum/erc20/cr_coin |
  | Ethereum | CR7 | 0x7F585B9130c64e9e9F470b618A7badD03D79cA7E | CR7Coin |  | ethereum/erc20/cr7coin |
  | Ethereum | CRAD | 0x608f006B6813f97097372d0d31Fb0F11d1CA3E4e | CRAD CASH |  | ethereum/erc20/crad_cash |
  | Ethereum | CRB | 0xAef38fBFBF932D1AeF3B808Bc8fBd8Cd8E1f8BC5 | CRB |  | ethereum/erc20/crb |
  | Ethereum | CRED | 0x672a1AD4f667FB18A333Af13667aa0Af1F5b5bDD | CRED |  | ethereum/erc20/cred |
  | Ethereum | CREDIT | 0xC4cB5793BD58BaD06bF51FB37717b86B02CBe8A4 | CREDIT |  | ethereum/erc20/credit |
@@ -3486,12 +3482,11 @@
  | Ethereum | LEC | 0xFa30e62EEDcf80D47d42947fBCc034beeD5C09FE | LOVEEARTH COIN |  | ethereum/erc20/loveearth_coin |
  | Ethereum | LQTY | 0x6DEA81C8171D0bA574754EF6F8b412F2Ed88c54D | LQTY | countervalues disabled | ethereum/erc20/lqty |
  | Ethereum | LTCBEAR | 0xB422e605fBd765B80D2C4b5d8196C2f94144438B | LTCBEAR | delisted, countervalues disabled | ethereum/erc20/ltcbear |
  | Ethereum | LTCBULL | 0xDB61354E9cf2217a29770E9811832B360a8DAad3 | LTCBULL | delisted, countervalues disabled | ethereum/erc20/ltcbull |
  | Ethereum | LTCHEDGE | 0xD0C64D6c0E9aA53fFFd8B80313e035f7B83083F3 | LTCHEDGE | delisted, countervalues disabled | ethereum/erc20/ltchedge |
- | Ethereum | LTO | 0xd01409314aCb3b245CEa9500eCE3F6Fd4d70ea30 | LTO Network Token |  | ethereum/erc20/lto_network_token |
- | Ethereum | LTO | 0x3DB6Ba6ab6F95efed1a6E794caD492fAAabF294D | LTO Network Token (OLD) | delisted, countervalues disabled | ethereum/erc20/lto_network_token_ |
+ | Ethereum | LTO | 0x3DB6Ba6ab6F95efed1a6E794caD492fAAabF294D | LTO Network Token |  | ethereum/erc20/lto_network_token |
  | Ethereum | LUCK | 0xFB12e3CcA983B9f59D90912Fd17F8D745A8B2953 | LUCK | delisted, countervalues disabled | ethereum/erc20/luck |
  | Ethereum | LUCKY | 0xE478d4F4a87D4D641AF97ca0b5Cc3dB61e266357 | LUCKY |  | ethereum/erc20/lucky |
  | Ethereum | LUC | 0x5dbe296F97B23C4A6AA6183D73e574D02bA5c719 | LUCToken |  | ethereum/erc20/luctoken |
  | Ethereum | LYXE | 0xA8b919680258d369114910511cc87595aec0be6D | LUKSO | delisted, countervalues disabled | ethereum/erc20/lukso |
  | Ethereum | LULZ | 0x89A64014d429509CfFdA1AEBc7eB36B9435794BD | LULZ |  | ethereum/erc20/lulz |
@@ -3872,11 +3867,10 @@
  | Ethereum | MNC | 0xBac7A1798350cdf2Dbfe0c210C2C9861223f4B31 | Moneynet Coin |  | ethereum/erc20/moneynet_coin |
  | Ethereum | MON | 0xcaCc19C5Ca77E06D6578dEcaC80408Cc036e0499 | MonfterToken |  | ethereum/erc20/monftertoken |
  | Ethereum | MKT | 0x16558553E4647ca500c3718C56C356eDB6F9b11C | Monkey King Token | delisted, countervalues disabled | ethereum/erc20/monkey_king_token |
  | Ethereum | MC | 0xA38b7EE9dF79955b90cC4E2dE90421f6Baa83A3D | MonkeyCoin |  | ethereum/erc20/monkeycoin |
  | Ethereum | MNS | 0x53884b61963351C283118a8E1Fc05BA464a11959 | Monnos Token |  | ethereum/erc20/monnos_token |
- | Ethereum | MONOKEINU | 0x4da08a1Bff50BE96bdeD5C7019227164b49C2bFc | Mononoke Inu |  | ethereum/erc20/mononoke_inu |
  | Ethereum | JUICE | 0x889eFB523cc39590B8483EB9491890AC71407f64 | Moon Juice |  | ethereum/erc20/moon_juice |
  | Ethereum | MYFI | 0x1Efb2286BF89F01488C6B2a22B2556C0f45e972b | Moon YFI |  | ethereum/erc20/moon_yfi |
  | Ethereum | MOONCAT | 0x98968f0747E0A261532cAcC0BE296375F5c08398 | MoonCats | delisted, countervalues disabled | ethereum/erc20/mooncats |
  | Ethereum | UMOON | 0x683239A4caB49642c6E025cF81D283f9c87bC07D | MoonCats | delisted, countervalues disabled | ethereum/erc20/mooncats_ |
  | Ethereum | MD | 0xCB696c86917175DfB4F0037DDc4f2e877a9F081A | MoonDayPlus.com |  | ethereum/erc20/moondayplus.com |
@@ -4880,11 +4874,10 @@
  | Ethereum | ESPI | 0x35a79FCEb867EE3392ED0C8DEdd8Dc2f6124c9Cd | SPIDER ECOLOGY |  | ethereum/erc20/spider_ecology |
  | Ethereum | SHOPX | 0x7BEF710a5759d197EC0Bf621c3Df802C2D60D848 | SPLYT SHOPX | countervalues disabled | ethereum/erc20/splyt_shopx |
  | Ethereum | SPUNK | 0x97Aa8e14db0bc073cC7e2d42AC715427717d6042 | SPUNKS |  | ethereum/erc20/spunks |
  | Ethereum | SPICE | 0x0324dd195D0Cd53F9F07bEe6a48eE7a20bad738f | SPiCE VC Token | countervalues disabled | ethereum/erc20/spice_vc_token |
  | Ethereum | SRH | 0xc350e846e2C57F9EecE90FEBc253d14C8080871B | SRH |  | ethereum/erc20/srh |
- | Ethereum | SSV | 0x9D65fF81a3c488d585bBfb0Bfe3c7707c7917f54 | SSV Token |  | ethereum/erc20/ssv_token |
  | Ethereum | STA | 0x06874F973Dc3c96dc22A10eF0D0609F877f335EA | STA | countervalues disabled | ethereum/erc20/sta |
  | Ethereum | STA | 0xD7d05bDa4bf5876bA1254b3Eaaf8b47D2F5676eb | STABLE Asset | countervalues disabled | ethereum/erc20/stable_asset |
  | Ethereum | STB | 0x09BcA6eBAb05Ee2ae945BE4edA51393d94Bf7b99 | STABLE Token |  | ethereum/erc20/stable_token |
  | Ethereum | STACS | 0x286708f069225905194673755F12359e6afF6FE1 | STACS |  | ethereum/erc20/stacs |
  | Ethereum | STAKE | 0x0Ae055097C6d159879521C384F1D2123D1f195e6 | STAKE | delisted, countervalues disabled | ethereum/erc20/stake |
@@ -4920,11 +4913,10 @@
  | Ethereum | SAFEEARTH | 0xE6F1966d04CfcB9cd1B1dC4E8256D8b501b11CbA | SafeEarth | countervalues disabled | ethereum/erc20/safeearth |
  | Ethereum | SMI | 0xCd7492db29E2ab436e819b249452EE1bbDf52214 | SafeMoon Inu | countervalues disabled | ethereum/erc20/safemoon_inu |
  | Ethereum | SAFEMUSK | 0x59f59809E60FA9b3D47Eb883B58f27CB65C1fF36 | SafeMusk | countervalues disabled | ethereum/erc20/safemusk |
  | Ethereum | SSGT | 0x2ECc48ba346A73d7d55aa5a46b5E314d9DAA6161 | SafeSwap |  | ethereum/erc20/safeswap |
  | Ethereum | SAITAMA | 0x8B3192f5eEBD8579568A2Ed41E6FEB402f93f73F | Saitama Inu |  | ethereum/erc20/saitama_inu |
- | Ethereum | SAJA | 0x698C6aC9CA5f16cAbC5a636D3a619329c0958cBA | Saja |  | ethereum/erc20/saja |
  | Ethereum | SAK3 | 0xe9F84dE264E91529aF07Fa2C746e934397810334 | Sake |  | ethereum/erc20/sake |
  | Ethereum | SAKE | 0x066798d9ef0833ccc719076Dab77199eCbd178b0 | SakeToken | countervalues disabled | ethereum/erc20/saketoken |
  | Ethereum | SAHU | 0x2B1Fe2cea92436E8C34B7C215Af66Aaa2932a8b2 | Sakhalin Husky |  | ethereum/erc20/sakhalin_husky |
  | Ethereum | SKB | 0x4aF328C52921706dCB739F25786210499169AFe6 | Sakura Bloom |  | ethereum/erc20/sakura_bloom |
  | Ethereum | SIH | 0x6D728fF862Bfe74be2aba30537E992A24F259a22 | Salient Investment Holding |  | ethereum/erc20/salient_investment_holding |
@@ -5600,11 +5592,10 @@
  | Ethereum | TRUSD | 0xDD436a0Dce9244B36599AE7b22f0373b4e33992d | TrustUSD |  | ethereum/erc20/trustusd |
  | Ethereum | TRV | 0x72955eCFf76E48F2C8AbCCe11d54e5734D6f3657 | TrustVerse |  | ethereum/erc20/trustverse |
  | Ethereum | TDH | 0x2a1dbabe65c595B0022e75208C34014139d5d357 | TrustedHealth |  | ethereum/erc20/trustedhealth |
  | Ethereum | TLN | 0x679131F591B4f369acB8cd8c51E68596806c3916 | Trustlines Network Token |  | ethereum/erc20/trustlines_network_token |
  | Ethereum | TKINU | 0xda23d301761E4e2bF474951f978f6DFB6F3C9F14 | Tsuki Inu | countervalues disabled | ethereum/erc20/tsuki_inu |
- | Ethereum | TZKI | 0xF527d24391C767B86b8e91385e1cE9C54D230A2B | Tsuzuki Inu |  | ethereum/erc20/tsuzuki_inu |
  | Ethereum | TUDA | 0x5E3002dff591C5e75Bb9DEdae268049742E6b13a | TudaToken |  | ethereum/erc20/tudatoken |
  | Ethereum | TXT | 0xA2428b6d1cfFA89760d797A9b5a26342CdF4545F | TuneTrade Token |  | ethereum/erc20/tunetrade_token |
  | Ethereum | TNI | 0xa5a2Af22EAc6f050227d844B108c2B2A011FD329 | Tunnel |  | ethereum/erc20/tunnel |
  | Ethereum | TUR | 0x1600c2E08ACB830f2a4eE4d34b48594DAde48651 | Turex |  | ethereum/erc20/turex |
  | Ethereum | TWEE | 0x2b6fF53Fc2493CcD5202D80a6C439741414C5Ff2 | Tweebaa |  | ethereum/erc20/tweebaa |
@@ -5985,11 +5976,10 @@
  | Ethereum | WIFI | 0xe202873079913858f9Ba8795BA957A4Ad561ca24 | Wifi Coin |  | ethereum/erc20/wifi_coin |
  | Ethereum | WILD | 0x08A75dbC7167714CeaC1a8e43a8d643A4EDd625a | Wild Credit | countervalues disabled | ethereum/erc20/wild_credit |
  | Ethereum | WBTC | 0x88C7385A403008B63Dc028Ba5acBAd3edb1D1Fa9 | WildBitsTakeControl | delisted, countervalues disabled | ethereum/erc20/wildbitstakecontrol |
  | Ethereum | WILD | 0x2a3bFF78B79A009976EeA096a51A948a3dC00e34 | Wilder |  | ethereum/erc20/wilder |
  | Ethereum | WCO | 0xd44bb6663936CAb1310584A277f7DAa6943d4904 | Winco |  | ethereum/erc20/winco |
- | Ethereum | WINRY | 0x1a87077C4F834884691B8ba4fc808D2eC93A9F30 | Winry Inu |  | ethereum/erc20/winry_inu |
  | Ethereum | WXT | 0xa02120696c7B8fE16C09C749E4598819b2B0E915 | Wirex Token |  | ethereum/erc20/wirex_token |
  | Ethereum | WISE | 0x66a0f676479Cee1d7373f3DC2e2952778BfF5bd6 | Wise Token |  | ethereum/erc20/wise_token |
  | Ethereum | WITCH | 0xdc524e3c6910257744C1F93Cf15E9F472b5bD236 | Witch Token |  | ethereum/erc20/witch_token |
  | Ethereum | WIX | 0x7bA19B7F7d106A9a1e0985397B94F38EEe0b555e | Wixlar |  | ethereum/erc20/wixlar |
  | Ethereum | WIZ | 0x018a6106Cb540AF1ae6DA985361Afd5E176D1c00 | Wiz Coin | countervalues disabled | ethereum/erc20/wiz_coin |

  16 |   const existing = fs.readFileSync(outputFile, "utf-8");
  17 |   fs.writeFileSync(outputFile, md);
> 18 |   expect(existing).toBe(md);
     |                    ^
  19 | });
  20 |
  21 | function gen() {

  at Object.<anonymous> (src/generate-cryptoassets-md.test.js:18:20)

Test Suites: 1 failed, 1 skipped, 1 of 2 total
Tests: 1 failed, 5 skipped, 6 total
Snapshots: 0 total
Time: 1.885 s
Ran all test suites matching /src/i.
error Command failed with exit code 1.

Tests outputs ❌

PASS tests/specs/firmwareupdate.spec.js (104.061 s)
PASS tests/specs/updater.spec.js (138.657 s)
PASS tests/specs/global.spec.js (161.97 s)
PASS tests/specs/accounts/subaccount.spec.js (245.137 s)
PASS tests/specs/settings/passwordlock.spec.js (150.637 s)
PASS tests/specs/walletconnect.spec.js (119.808 s)
PASS tests/specs/manager.spec.js (97.106 s)
PASS tests/specs/swap.spec.js (72.482 s)
PASS tests/specs/settings/settings.spec.js (81.118 s)
PASS tests/specs/settings/developermode.spec.js (368.146 s)
PASS tests/specs/accounts/ethereum.spec.js (391.228 s)
PASS tests/specs/accounts/bitcoin.spec.js (355.404 s)
PASS tests/specs/accounts/cosmos.spec.js (363.607 s)
FAIL tests/specs/USBTroubleshooting/windows.spec.js (146.154 s)
● USBTroubleshooting-windows › goes to USBTroubleshooting screen from manager

Expected image to match or be a close match to snapshot but was 3.053792317708333% different from snapshot (24016 differing pixels).
See diff for details: /home/runner/work/ledger-live-desktop/ledger-live-desktop/tests/specs/__image_snapshots__/__diff_output__/USBTroubleshooting-windows-noHelpPopup-diff.png

  10 |     await app.client.pause(2000);
  11 |     // There should be no help component on load
> 12 |     expect(await app.client.screenshot()).toMatchImageSnapshot({
     |                                           ^
  13 |       customSnapshotIdentifier: `USBTroubleshooting-${platform}-noHelpPopup`,
  14 |     });
  15 |     await app.client.pause(5000); // Wait for the timeout to complete

  at Object.<anonymous> (tests/specs/USBTroubleshooting/common.js:12:43)
      at runMicrotasks (<anonymous>)

› 1 snapshot failed.
FAIL tests/specs/USBTroubleshooting/linux.spec.js (143.866 s)
● USBTroubleshooting-linux › access the USBTroubleshooting solutions

Expected image to match or be a close match to snapshot but was 2.1485646565755205% different from snapshot (16897 differing pixels).
See diff for details: /home/runner/work/ledger-live-desktop/ledger-live-desktop/tests/specs/__image_snapshots__/__diff_output__/USBTroubleshooting-linux-solution-6-diff.png

  39 |     // three cases.
  40 |     await app.client.pause(500); // Wait for the assets to load, sometimes it takes a second.
> 41 |     expect(await app.client.screenshot()).toMatchImageSnapshot({
     |                                           ^
  42 |       customSnapshotIdentifier: `USBTroubleshooting-${platform}-solution-${solutionCount}`,
  43 |     });
  44 |     const deviceOption = platform === "linux" ? "nanoS" : platform === "mac" ? "nanoX" : "blue";

  at Object.<anonymous> (tests/specs/USBTroubleshooting/common.js:41:43)

› 1 snapshot failed.
PASS tests/specs/USBTroubleshooting/mac.spec.js (162.009 s)
PASS tests/specs/accounts/tezos.spec.js (391.829 s)
PASS tests/specs/accounts/xrp.spec.js (384.929 s)
PASS tests/specs/accounts/global.spec.js (331.909 s)
PASS tests/specs/onboarding/nanoX.spec.js (349.458 s)
PASS tests/specs/onboarding/nanoS.spec.js (334.61 s)
PASS tests/specs/onboarding/blue.spec.js (296.429 s)

Summary of all failing tests
FAIL tests/specs/USBTroubleshooting/windows.spec.js (146.154 s)
● USBTroubleshooting-windows › goes to USBTroubleshooting screen from manager

Expected image to match or be a close match to snapshot but was 3.053792317708333% different from snapshot (24016 differing pixels).
See diff for details: /home/runner/work/ledger-live-desktop/ledger-live-desktop/tests/specs/__image_snapshots__/__diff_output__/USBTroubleshooting-windows-noHelpPopup-diff.png

  10 |     await app.client.pause(2000);
  11 |     // There should be no help component on load
> 12 |     expect(await app.client.screenshot()).toMatchImageSnapshot({
     |                                           ^
  13 |       customSnapshotIdentifier: `USBTroubleshooting-${platform}-noHelpPopup`,
  14 |     });
  15 |     await app.client.pause(5000); // Wait for the timeout to complete

  at Object.<anonymous> (tests/specs/USBTroubleshooting/common.js:12:43)
      at runMicrotasks (<anonymous>)

FAIL tests/specs/USBTroubleshooting/linux.spec.js (143.866 s)
● USBTroubleshooting-linux › access the USBTroubleshooting solutions

Expected image to match or be a close match to snapshot but was 2.1485646565755205% different from snapshot (16897 differing pixels).
See diff for details: /home/runner/work/ledger-live-desktop/ledger-live-desktop/tests/specs/__image_snapshots__/__diff_output__/USBTroubleshooting-linux-solution-6-diff.png

  39 |     // three cases.
  40 |     await app.client.pause(500); // Wait for the assets to load, sometimes it takes a second.
> 41 |     expect(await app.client.screenshot()).toMatchImageSnapshot({
     |                                           ^
  42 |       customSnapshotIdentifier: `USBTroubleshooting-${platform}-solution-${solutionCount}`,
  43 |     });
  44 |     const deviceOption = platform === "linux" ? "nanoS" : platform === "mac" ? "nanoX" : "blue";

  at Object.<anonymous> (tests/specs/USBTroubleshooting/common.js:41:43)

Snapshot Summary
› 2 snapshots failed from 2 test suites. Inspect your code changes or run yarn run spectron -u to update them.

Test Suites: 2 failed, 20 passed, 22 total
Tests: 2 failed, 415 passed, 417 total
Snapshots: 2 failed, 349 passed, 351 total
Time: 1371.41 s
Ran all test suites matching /tests/specs/.*.spec.js/i.
error Command failed with exit code 1.

Diff output ❌

USBTroubleshooting-linux-solution-6

USBTroubleshooting-windows-noHelpPopup

Suggested snapshots to update

Please sign in to comment.