diff --git a/apps/ledger-live-desktop/tests/enum/Account.ts b/apps/ledger-live-desktop/tests/enum/Account.ts index 7009d6eb1ae5..7dc573fdbe52 100644 --- a/apps/ledger-live-desktop/tests/enum/Account.ts +++ b/apps/ledger-live-desktop/tests/enum/Account.ts @@ -253,7 +253,7 @@ export class Account { static readonly ADA_1 = new Account( Currency.ADA, "Cardano 1", - " addr1q9q9q55zyew785z6c2lnrhnzghy038r6mepmqn6v28kupk5ug4c7v5lwwfjwgn4mnpzgmhrhp8xry804kuvfh6ru2ews8d5td8", + "addr1q9q9q55zyew785z6c2lnrhnzghy038r6mepmqn6v28kupk5ug4c7v5lwwfjwgn4mnpzgmhrhp8xry804kuvfh6ru2ews8d5td8", undefined, 0, ); diff --git a/apps/ledger-live-desktop/tests/enum/DeviceLabels.ts b/apps/ledger-live-desktop/tests/enum/DeviceLabels.ts index a76287ddf8ce..aca88be4e025 100644 --- a/apps/ledger-live-desktop/tests/enum/DeviceLabels.ts +++ b/apps/ledger-live-desktop/tests/enum/DeviceLabels.ts @@ -38,4 +38,7 @@ export enum DeviceLabels { MAKE_SURE_TO_USE = "Make sure to use", YOUR_CRYPTO_ACCOUNTS = "Your crypto accounts", TURN_ON_SYNC = "Turn on sync?", + NEW_ORDINARY_TRANSACTION = "New ordinary transaction", + SEND_TO_ADDRESS_2 = "Send to address (2/2)", + CONFIRM_TRANSACTION = "Confirm transaction", } diff --git a/apps/ledger-live-desktop/tests/families/algorand.ts b/apps/ledger-live-desktop/tests/families/algorand.ts new file mode 100644 index 000000000000..bd2a9ae0e914 --- /dev/null +++ b/apps/ledger-live-desktop/tests/families/algorand.ts @@ -0,0 +1,20 @@ +import { expect } from "@playwright/test"; +import { Transaction } from "tests/models/Transaction"; +import { + pressBoth, + pressUntilTextFound, + containsSubstringInEvent, +} from "@ledgerhq/live-common/e2e/speculos"; +import { DeviceLabels } from "tests/enum/DeviceLabels"; + +export async function sendAlgorand(tx: Transaction) { + const events = await pressUntilTextFound(DeviceLabels.CAPS_APPROVE); + const isAmountCorrect = containsSubstringInEvent(tx.amount, events); + expect(isAmountCorrect).toBeTruthy(); + + //Todo: Ractivate after QAA-319 + //const isAddressCorrect = containsSubstringInEvent(tx.accountToCredit.address, events); + //expect(isAddressCorrect).toBeTruthy(); + + await pressBoth(); +} diff --git a/apps/ledger-live-desktop/tests/families/bitcoin.ts b/apps/ledger-live-desktop/tests/families/bitcoin.ts new file mode 100644 index 000000000000..47093d7ca0eb --- /dev/null +++ b/apps/ledger-live-desktop/tests/families/bitcoin.ts @@ -0,0 +1,36 @@ +import { expect } from "@playwright/test"; +import { Currency } from "tests/enum/Currency"; +import { Transaction } from "tests/models/Transaction"; +import { + pressBoth, + pressUntilTextFound, + waitFor, + containsSubstringInEvent, +} from "@ledgerhq/live-common/e2e/speculos"; +import { DeviceLabels } from "tests/enum/DeviceLabels"; + +export async function sendBTCBasedCoin(tx: Transaction) { + let deviceLabel: string; + + switch (tx.accountToDebit.currency) { + case Currency.BTC: + deviceLabel = DeviceLabels.CONTINUE; + break; + case Currency.DOGE: + case Currency.BCH: + deviceLabel = DeviceLabels.ACCEPT; + break; + default: + throw new Error(`Not a BTC-based coin: ${tx.accountToDebit.currency}`); + } + + const events = await pressUntilTextFound(deviceLabel); + const isAmountCorrect = containsSubstringInEvent(tx.amount, events); + expect(isAmountCorrect).toBeTruthy(); + const isAddressCorrect = containsSubstringInEvent(tx.accountToCredit.address, events); + expect(isAddressCorrect).toBeTruthy(); + await pressBoth(); + await waitFor(DeviceLabels.CONFIRM); + await pressUntilTextFound(DeviceLabels.ACCEPT); + await pressBoth(); +} diff --git a/apps/ledger-live-desktop/tests/families/cardano.ts b/apps/ledger-live-desktop/tests/families/cardano.ts new file mode 100644 index 000000000000..c8e39613caf1 --- /dev/null +++ b/apps/ledger-live-desktop/tests/families/cardano.ts @@ -0,0 +1,28 @@ +import { expect } from "@playwright/test"; +import { Transaction } from "tests/models/Transaction"; +import { + pressBoth, + pressUntilTextFound, + containsSubstringInEvent, + waitFor, +} from "@ledgerhq/live-common/e2e/speculos"; +import { DeviceLabels } from "tests/enum/DeviceLabels"; + +export async function sendCardano(tx: Transaction) { + await waitFor(DeviceLabels.NEW_ORDINARY_TRANSACTION); + await pressBoth(); + await pressUntilTextFound(DeviceLabels.SEND_TO_ADDRESS_2); + await pressBoth(); + const events = await pressUntilTextFound(DeviceLabels.SEND); + const isAmountCorrect = containsSubstringInEvent(tx.amount, events); + expect(isAmountCorrect).toBeTruthy(); + await pressBoth(); + await waitFor(DeviceLabels.TRANSACTION_FEE); + await pressBoth(); + await waitFor(DeviceLabels.CONFIRM_TRANSACTION); + await pressBoth(); + + //Todo: Ractivate after QAA-319 + //const isAddressCorrect = containsSubstringInEvent(tx.accountToCredit.address, events); + //expect(isAddressCorrect).toBeTruthy(); +} diff --git a/apps/ledger-live-desktop/tests/families/cosmos.ts b/apps/ledger-live-desktop/tests/families/cosmos.ts new file mode 100644 index 000000000000..3c6279a8170a --- /dev/null +++ b/apps/ledger-live-desktop/tests/families/cosmos.ts @@ -0,0 +1,28 @@ +import { expect } from "@playwright/test"; +import { Delegate } from "tests/models/Delegate"; +import { Transaction } from "tests/models/Transaction"; +import { + pressBoth, + pressUntilTextFound, + waitFor, + containsSubstringInEvent, +} from "@ledgerhq/live-common/e2e/speculos"; +import { DeviceLabels } from "tests/enum/DeviceLabels"; + +export async function delegateCosmos(delegatingAccount: Delegate) { + await waitFor(DeviceLabels.PLEASE_REVIEW); + const events = await pressUntilTextFound(DeviceLabels.CAPS_APPROVE); + const isAmountCorrect = containsSubstringInEvent(delegatingAccount.amount, events); + expect(isAmountCorrect).toBeTruthy(); + await pressBoth(); +} + +export async function sendCosmos(tx: Transaction) { + const events = await pressUntilTextFound(DeviceLabels.CAPS_APPROVE); + const isAmountCorrect = containsSubstringInEvent(tx.amount, events); + expect(isAmountCorrect).toBeTruthy(); + const isAddressCorrect = containsSubstringInEvent(tx.accountToCredit.address, events); + expect(isAddressCorrect).toBeTruthy(); + + await pressBoth(); +} diff --git a/apps/ledger-live-desktop/tests/families/evm.ts b/apps/ledger-live-desktop/tests/families/evm.ts new file mode 100644 index 000000000000..314f09373f78 --- /dev/null +++ b/apps/ledger-live-desktop/tests/families/evm.ts @@ -0,0 +1,18 @@ +import { expect } from "@playwright/test"; +import { Transaction } from "tests/models/Transaction"; +import { + pressBoth, + pressUntilTextFound, + containsSubstringInEvent, +} from "@ledgerhq/live-common/e2e/speculos"; +import { DeviceLabels } from "tests/enum/DeviceLabels"; + +export async function sendEVM(tx: Transaction) { + const events = await pressUntilTextFound(DeviceLabels.ACCEPT); + const isAmountCorrect = containsSubstringInEvent(tx.amount, events); + expect(isAmountCorrect).toBeTruthy(); + const isAddressCorrect = containsSubstringInEvent(tx.accountToCredit.address, events); + expect(isAddressCorrect).toBeTruthy(); + + await pressBoth(); +} diff --git a/apps/ledger-live-desktop/tests/families/near.ts b/apps/ledger-live-desktop/tests/families/near.ts new file mode 100644 index 000000000000..3cf2b2fac1ff --- /dev/null +++ b/apps/ledger-live-desktop/tests/families/near.ts @@ -0,0 +1,20 @@ +import { expect } from "@playwright/test"; +import { Delegate } from "tests/models/Delegate"; +import { + pressBoth, + pressUntilTextFound, + waitFor, + containsSubstringInEvent, +} from "@ledgerhq/live-common/e2e/speculos"; +import { DeviceLabels } from "tests/enum/DeviceLabels"; + +export async function delegateNear(delegatingAccount: Delegate) { + await waitFor(DeviceLabels.VIEW_HEADER); + const events = await pressUntilTextFound(DeviceLabels.CONTINUE_TO_ACTION); + const isProviderCorrect = containsSubstringInEvent(delegatingAccount.provider, events); + expect(isProviderCorrect).toBeTruthy(); + await pressBoth(); + await waitFor(DeviceLabels.VIEW_ACTION); + await pressUntilTextFound(DeviceLabels.SIGN); + await pressBoth(); +} diff --git a/apps/ledger-live-desktop/tests/families/polkadot.ts b/apps/ledger-live-desktop/tests/families/polkadot.ts new file mode 100644 index 000000000000..1bd049d350c4 --- /dev/null +++ b/apps/ledger-live-desktop/tests/families/polkadot.ts @@ -0,0 +1,18 @@ +import { expect } from "@playwright/test"; +import { Transaction } from "tests/models/Transaction"; +import { + pressBoth, + pressUntilTextFound, + containsSubstringInEvent, +} from "@ledgerhq/live-common/e2e/speculos"; +import { DeviceLabels } from "tests/enum/DeviceLabels"; + +export async function sendPolkadot(tx: Transaction) { + const events = await pressUntilTextFound(DeviceLabels.CAPS_APPROVE); + const isAmountCorrect = containsSubstringInEvent(tx.amount, events); + expect(isAmountCorrect).toBeTruthy(); + const isAddressCorrect = containsSubstringInEvent(tx.accountToCredit.address, events); + expect(isAddressCorrect).toBeTruthy(); + + await pressBoth(); +} diff --git a/apps/ledger-live-desktop/tests/families/solana.ts b/apps/ledger-live-desktop/tests/families/solana.ts new file mode 100644 index 000000000000..1ea252ccd0c3 --- /dev/null +++ b/apps/ledger-live-desktop/tests/families/solana.ts @@ -0,0 +1,25 @@ +import { expect } from "@playwright/test"; +import { + pressBoth, + pressUntilTextFound, + waitFor, + containsSubstringInEvent, +} from "@ledgerhq/live-common/e2e/speculos"; +import { DeviceLabels } from "tests/enum/DeviceLabels"; +import { Transaction } from "tests/models/Transaction"; + +export async function delegateSolana() { + await waitFor(DeviceLabels.DELEGATE_FROM); + await pressUntilTextFound(DeviceLabels.APPROVE); + await pressBoth(); +} + +export async function sendSolana(tx: Transaction) { + const events = await pressUntilTextFound(DeviceLabels.APPROVE); + const isAmountCorrect = containsSubstringInEvent(tx.amount, events); + expect(isAmountCorrect).toBeTruthy(); + const isAddressCorrect = containsSubstringInEvent(tx.accountToCredit.address, events); + expect(isAddressCorrect).toBeTruthy(); + + await pressBoth(); +} diff --git a/apps/ledger-live-desktop/tests/families/stellar.ts b/apps/ledger-live-desktop/tests/families/stellar.ts new file mode 100644 index 000000000000..8389ffd5d425 --- /dev/null +++ b/apps/ledger-live-desktop/tests/families/stellar.ts @@ -0,0 +1,20 @@ +import { expect } from "@playwright/test"; +import { Transaction } from "tests/models/Transaction"; +import { + pressBoth, + pressUntilTextFound, + containsSubstringInEvent, +} from "@ledgerhq/live-common/e2e/speculos"; +import { DeviceLabels } from "tests/enum/DeviceLabels"; + +export async function sendStellar(tx: Transaction) { + const events = await pressUntilTextFound(DeviceLabels.SIGN); + const isAmountCorrect = containsSubstringInEvent(tx.amount, events); + expect(isAmountCorrect).toBeTruthy(); + + //Todo: Ractivate after QAA-319 + //const isAddressCorrect = containsSubstringInEvent(tx.accountToCredit.address, events); + //expect(isAddressCorrect).toBeTruthy(); + + await pressBoth(); +} diff --git a/apps/ledger-live-desktop/tests/families/tron.ts b/apps/ledger-live-desktop/tests/families/tron.ts new file mode 100644 index 000000000000..2e48c9ba0767 --- /dev/null +++ b/apps/ledger-live-desktop/tests/families/tron.ts @@ -0,0 +1,18 @@ +import { expect } from "@playwright/test"; +import { Transaction } from "tests/models/Transaction"; +import { + pressBoth, + pressUntilTextFound, + containsSubstringInEvent, +} from "@ledgerhq/live-common/e2e/speculos"; +import { DeviceLabels } from "tests/enum/DeviceLabels"; + +export async function sendTron(tx: Transaction) { + const events = await pressUntilTextFound(DeviceLabels.SIGN); + const isAmountCorrect = containsSubstringInEvent(tx.amount, events); + expect(isAmountCorrect).toBeTruthy(); + const isAddressCorrect = containsSubstringInEvent(tx.accountToCredit.address, events); + expect(isAddressCorrect).toBeTruthy(); + + await pressBoth(); +} diff --git a/apps/ledger-live-desktop/tests/families/xrp.ts b/apps/ledger-live-desktop/tests/families/xrp.ts new file mode 100644 index 000000000000..b1c2aa9859d8 --- /dev/null +++ b/apps/ledger-live-desktop/tests/families/xrp.ts @@ -0,0 +1,18 @@ +import { expect } from "@playwright/test"; +import { Transaction } from "tests/models/Transaction"; +import { + pressBoth, + pressUntilTextFound, + containsSubstringInEvent, +} from "@ledgerhq/live-common/e2e/speculos"; +import { DeviceLabels } from "tests/enum/DeviceLabels"; + +export async function sendXRP(tx: Transaction) { + const events = await pressUntilTextFound(DeviceLabels.SIGN); + const isAmountCorrect = containsSubstringInEvent(tx.amount, events); + expect(isAmountCorrect).toBeTruthy(); + const isAddressCorrect = containsSubstringInEvent(tx.accountToCredit.address, events); + expect(isAddressCorrect).toBeTruthy(); + + await pressBoth(); +} diff --git a/apps/ledger-live-desktop/tests/page/modal/send.modal.ts b/apps/ledger-live-desktop/tests/page/modal/send.modal.ts index acd0af18873a..292b45699f58 100644 --- a/apps/ledger-live-desktop/tests/page/modal/send.modal.ts +++ b/apps/ledger-live-desktop/tests/page/modal/send.modal.ts @@ -2,13 +2,13 @@ import { expect } from "@playwright/test"; import { Modal } from "../../component/modal.component"; import { step } from "tests/misc/reporters/step"; import { Transaction } from "../../models/Transaction"; +import { Currency } from "tests/enum/Currency"; export class SendModal extends Modal { private drowdownAccount = this.page.locator('[data-testid="modal-content"] svg').nth(1); readonly recipientInput = this.page.getByPlaceholder("Enter"); readonly tagInput = this.page.getByPlaceholder("Optional"); readonly continueButton = this.page.getByRole("button", { name: "continue" }); - private totalDebitValue = this.page.locator("text=Total to debit"); private checkDeviceLabel = this.page.locator( "text=Double-check the transaction details on your Ledger device before signing.", ); @@ -52,13 +52,19 @@ export class SendModal extends Modal { await this.fillRecipientInfo(tx); await this.continueButton.click(); await this.cryptoAmountField.fill(tx.amount); - await this.feeStrategy(tx.speed).click(); + if ( + tx.accountToDebit.currency == Currency.sepETH && + tx.accountToDebit.currency == Currency.POL && + tx.accountToDebit.currency == Currency.DOGE && + tx.accountToDebit.currency == Currency.BCH + ) { + await this.feeStrategy(tx.speed).click(); + } await this.countinueSendAmount(); } @step("Verify tx information before confirming") async expectTxInfoValidity(tx: Transaction) { - await expect(this.totalDebitValue).toBeVisible(); const displayedReceiveAddress = await this.recipientAddressDisplayedValue.innerText(); expect(displayedReceiveAddress).toEqual(tx.accountToCredit.address); diff --git a/apps/ledger-live-desktop/tests/page/speculos.page.ts b/apps/ledger-live-desktop/tests/page/speculos.page.ts index bb64553da851..4681469b3b1d 100644 --- a/apps/ledger-live-desktop/tests/page/speculos.page.ts +++ b/apps/ledger-live-desktop/tests/page/speculos.page.ts @@ -14,6 +14,17 @@ import { DeviceLabels } from "tests/enum/DeviceLabels"; import { Currency } from "tests/enum/Currency"; import { Swap } from "tests/models/Swap"; import { extractNumberFromString } from "tests/utils/textParserUtils"; +import { sendBTCBasedCoin } from "tests/families/bitcoin"; +import { sendEVM } from "tests/families/evm"; +import { sendPolkadot } from "tests/families/polkadot"; +import { sendAlgorand } from "tests/families/algorand"; +import { sendTron } from "tests/families/tron"; +import { sendStellar } from "tests/families/stellar"; +import { sendCardano } from "tests/families/cardano"; +import { sendXRP } from "tests/families/xrp"; +import { delegateNear } from "tests/families/near"; +import { delegateCosmos, sendCosmos } from "tests/families/cosmos"; +import { delegateSolana, sendSolana } from "tests/families/solana"; export class SpeculosPage extends AppPage { @step("Verify receive address correctness on device") async expectValidAddressDevice(account: Account) { @@ -49,99 +60,59 @@ export class SpeculosPage extends AppPage { await pressBoth(); } - @step("Send method - EVM") - async sendEVM(tx: Transaction) { - const events = await pressUntilTextFound(DeviceLabels.ACCEPT); - const isAmountCorrect = containsSubstringInEvent(tx.amount, events); - expect(isAmountCorrect).toBeTruthy(); - const isAddressCorrect = containsSubstringInEvent(tx.accountToCredit.address, events); - expect(isAddressCorrect).toBeTruthy(); - - await pressBoth(); - } - - @step("Send method - BTC-based coin") - async sendBTCBasedCoin(tx: Transaction) { - let deviceLabel: string; - - switch (tx.accountToDebit.currency) { - case Currency.BTC: - deviceLabel = DeviceLabels.CONTINUE; - break; - case Currency.DOGE: - deviceLabel = DeviceLabels.ACCEPT; - break; - default: - throw new Error(`Not a BTC-based coin: ${tx.accountToDebit.currency}`); - } - - const events = await pressUntilTextFound(deviceLabel); - const isAmountCorrect = containsSubstringInEvent(tx.amount, events); - expect(isAmountCorrect).toBeTruthy(); - const isAddressCorrect = containsSubstringInEvent(tx.accountToCredit.address, events); - expect(isAddressCorrect).toBeTruthy(); - await pressBoth(); - await waitFor(DeviceLabels.CONFIRM); - await pressUntilTextFound(DeviceLabels.ACCEPT); - await pressBoth(); - } - @step("Sign Send Transaction") async signSendTransaction(tx: Transaction) { const currencyName = tx.accountToDebit.currency; switch (currencyName) { case Currency.sepETH: - await this.sendEVM(tx); + case Currency.POL: + await sendEVM(tx); break; - case Currency.BTC: case Currency.DOGE: - await this.sendBTCBasedCoin(tx); + case Currency.BCH: + await sendBTCBasedCoin(tx); + break; + case Currency.DOT: + await sendPolkadot(tx); + break; + case Currency.ALGO: + await sendAlgorand(tx); + break; + case Currency.SOL: + await sendSolana(tx); + break; + case Currency.TRX: + await sendTron(tx); + break; + case Currency.XLM: + await sendStellar(tx); + break; + case Currency.ATOM: + await sendCosmos(tx); + break; + case Currency.ADA: + await sendCardano(tx); + break; + case Currency.XRP: + await sendXRP(tx); break; default: throw new Error(`Unsupported currency: ${currencyName}`); } } - @step("Delegate Method - Solana") - async delegateSolana() { - await waitFor(DeviceLabels.DELEGATE_FROM); - await pressUntilTextFound(DeviceLabels.APPROVE); - await pressBoth(); - } - - @step("Delegate Method - Near") - async delegateNear(delegatingAccount: Delegate) { - await waitFor(DeviceLabels.VIEW_HEADER); - const events = await pressUntilTextFound(DeviceLabels.CONTINUE_TO_ACTION); - const isProviderCorrect = containsSubstringInEvent(delegatingAccount.provider, events); - expect(isProviderCorrect).toBeTruthy(); - await pressBoth(); - await waitFor(DeviceLabels.VIEW_ACTION); - await pressUntilTextFound(DeviceLabels.SIGN); - await pressBoth(); - } - - @step("Delegate Method - Cosmos") - async delegateCosmos(delegatingAccount: Delegate) { - await waitFor(DeviceLabels.PLEASE_REVIEW); - const events = await pressUntilTextFound(DeviceLabels.CAPS_APPROVE); - const isAmountCorrect = containsSubstringInEvent(delegatingAccount.amount, events); - expect(isAmountCorrect).toBeTruthy(); - await pressBoth(); - } - @step("Sign Delegation Transaction") async signDelegationTransaction(delegatingAccount: Delegate) { const currencyName = delegatingAccount.account.currency.name; switch (currencyName) { case Account.SOL_1.currency.name: - await this.delegateSolana(); + await delegateSolana(); break; case Account.NEAR_1.currency.name: - await this.delegateNear(delegatingAccount); + await delegateNear(delegatingAccount); break; case Account.ATOM_1.currency.name: - await this.delegateCosmos(delegatingAccount); + await delegateCosmos(delegatingAccount); break; default: throw new Error(`Unsupported currency: ${currencyName}`); diff --git a/apps/ledger-live-desktop/tests/specs/speculos/send.tx.spec.ts b/apps/ledger-live-desktop/tests/specs/speculos/send.tx.spec.ts index cdb5b54295c9..16a478efc13f 100644 --- a/apps/ledger-live-desktop/tests/specs/speculos/send.tx.spec.ts +++ b/apps/ledger-live-desktop/tests/specs/speculos/send.tx.spec.ts @@ -147,10 +147,50 @@ const transactionE2E = [ transaction: new Transaction(Account.sep_ETH_1, Account.sep_ETH_2, "0.00001", Fee.SLOW), xrayTicket: "B2CQA-2574", }, + { + transaction: new Transaction(Account.POL_1, Account.POL_2, "0.001", Fee.SLOW), + xrayTicket: "B2CQA-2807", + }, { transaction: new Transaction(Account.DOGE_1, Account.DOGE_2, "0.01", Fee.SLOW), xrayTicket: "B2CQA-2573", }, + { + transaction: new Transaction(Account.BCH_1, Account.BCH_2, "0.0001", Fee.SLOW), + xrayTicket: "2808", + }, + { + transaction: new Transaction(Account.DOT_1, Account.DOT_2, "0.0001", Fee.SLOW), + xrayTicket: "2809", + }, + { + transaction: new Transaction(Account.ALGO_1, Account.ALGO_2, "0.001", Fee.SLOW), + xrayTicket: "2810", + }, + { + transaction: new Transaction(Account.SOL_1, Account.SOL_2, "0.000001", Fee.SLOW), + xrayTicket: "2811", + }, + { + transaction: new Transaction(Account.TRX_1, Account.TRX_2, "0.01", Fee.SLOW), + xrayTicket: "2812", + }, + { + transaction: new Transaction(Account.XLM_1, Account.XLM_2, "0.0001", Fee.SLOW), + xrayTicket: "2813", + }, + { + transaction: new Transaction(Account.ATOM_1, Account.ATOM_2, "0.0001", Fee.SLOW), + xrayTicket: "2814", + }, + { + transaction: new Transaction(Account.ADA_1, Account.ADA_1, "1", Fee.SLOW), + xrayTicket: "2815", + }, + { + transaction: new Transaction(Account.XRP_1, Account.XRP_2, "0.0001", Fee.SLOW), + xrayTicket: "2816", + }, ]; const tokenTransactionInvalid = [ diff --git a/libs/ledger-live-common/src/e2e/speculos.ts b/libs/ledger-live-common/src/e2e/speculos.ts index 25a492b06abf..349058d3de86 100644 --- a/libs/ledger-live-common/src/e2e/speculos.ts +++ b/libs/ledger-live-common/src/e2e/speculos.ts @@ -358,7 +358,7 @@ export async function pressBoth() { export async function pressUntilTextFound( targetText: string, - maxAttempts: number = 10, + maxAttempts: number = 15, ): Promise { const speculosApiPort = getEnv("SPECULOS_API_PORT");