Skip to content

Commit

Permalink
Merge branch 'master' into lf/fix/deposit-erc20
Browse files Browse the repository at this point in the history
  • Loading branch information
LuizAsFight committed May 27, 2024
2 parents 5dfade5 + 9ffddf7 commit d7c58a5
Show file tree
Hide file tree
Showing 7 changed files with 177 additions and 17 deletions.
2 changes: 2 additions & 0 deletions .changeset/orange-bottles-leave.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
---
---
5 changes: 5 additions & 0 deletions .changeset/tricky-socks-pump.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"fuels-wallet": patch
---

vault crash on export seed auth fail
62 changes: 61 additions & 1 deletion packages/app/playwright/crx/utils/popup.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type { Page } from '@playwright/test';

import { getByAriaLabel, hasText, waitAriaLabel } from '../../commons';
import { getByAriaLabel, hasText, visit, waitAriaLabel } from '../../commons';
import type { MockData } from '../../mocks';

export async function getAccountByName(popupPage: Page, name: string) {
const accounts = await getWalletAccounts(popupPage);
Expand Down Expand Up @@ -58,3 +59,62 @@ export async function waitAccountPage(popupPage: Page, name: string) {
export async function waitWalletToLoad(popupPage: Page) {
await popupPage.waitForSelector('[data-account-name]');
}

export async function createAccount(popupPage: Page) {
await waitWalletToLoad(popupPage);
const accounts = await getWalletAccounts(popupPage);
await getByAriaLabel(popupPage, 'Accounts').click();
await getByAriaLabel(popupPage, 'Add account').click();
await waitAccountPage(popupPage, `Account ${accounts.length + 1}`);
}

export async function createAccountFromPrivateKey(
popupPage: Page,
privateKey: string,
name: string
) {
await waitWalletToLoad(popupPage);
await getByAriaLabel(popupPage, 'Accounts').click();
await getByAriaLabel(popupPage, 'Import from private key').click();
await getByAriaLabel(popupPage, 'Private Key').fill(privateKey);
if (name) {
await getByAriaLabel(popupPage, 'Account Name').clear();
await getByAriaLabel(popupPage, 'Account Name').fill(name);
}
await getByAriaLabel(popupPage, 'Import').click();
await waitAccountPage(popupPage, name);
}

export async function getClipboardText(popupPage: Page): Promise<string> {
try {
const text = await popupPage.evaluate(() => navigator.clipboard.readText());
console.log('Clipboard text:', text); // log the text to the console
return text;
} catch (error) {
console.error('Failed to read clipboard contents:', error);
return ''; // Return empty string or handle the error as needed
}
}

export async function getAddressForAccountNumber(
popupPage: Page,
accountName: string,
accountNumber: number
): Promise<string> {
await getByAriaLabel(popupPage, 'Accounts').click();

// Construct the XPath selector dynamically based on the order of the account in the list
const xpathSelector = `/html/body/div[2]/div/div/div/div/article[${accountNumber}]/div[1]/div[2]/div/div/button`;

// Click on the element
await popupPage.click(`xpath=${xpathSelector}`);

await getByAriaLabel(popupPage, accountName).click({
position: {
x: 10,
y: 10,
},
});

return getClipboardText(popupPage);
}
86 changes: 84 additions & 2 deletions packages/app/playwright/e2e/Accounts.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,29 @@ import test, { chromium, expect } from '@playwright/test';
import {
getButtonByText,
getByAriaLabel,
getElementByText,
getInputByName,
hasAriaLabel,
hasText,
reload,
visit,
waitUrl,
} from '../commons';

import {
createAccount,
createAccountFromPrivateKey,
getAddressForAccountNumber,
} from '../crx/utils';

import type { MockData } from '../mocks';
import { WALLET_PASSWORD, mockData } from '../mocks';

test.describe('Account', () => {
test.describe('New Accounts', () => {
let browser: Browser;
let page: Page;
let data: MockData;
let mnemonic: string | undefined;

test.beforeAll(async () => {
browser = await chromium.launch();
Expand All @@ -26,7 +35,7 @@ test.describe('Account', () => {

test.beforeEach(async () => {
await visit(page, '/');
data = await mockData(page, 2);
data = await mockData(page, 2, undefined, mnemonic);
await reload(page);
});

Expand Down Expand Up @@ -152,3 +161,76 @@ test.describe('Account', () => {
await hasText(page, data.accounts[0].privateKey);
});
});

test.describe('Existing Accounts', () => {
let browser: Browser;
let page: Page;
let _data: MockData;
const mnemonic =
'laundry feature kiss addict increase wolf monkey abstract hammer remove mass matter';

test.beforeAll(async () => {
browser = await chromium.launch();
page = await browser.newPage();
});

test.beforeEach(async () => {
await visit(page, '/');
_data = await mockData(page, 2, undefined, mnemonic);
await reload(page);
});

test('can add accounts using correct derivation path after importing from private key', async () => {
// at this point 2 accounts have already been created
const fuelAddress1 =
'fuel1kfnz04g7k8wjw22s03s3kk46wxr63he3v5v6kyrv76m7wzh7x9jqvqffua';
const fuelAddress2 =
'fuel1kyxzyv5z39fuxnr6k9ncxujxn4y07fu6pf73vslmemgpex325vrsytpqks';
const fuelAddress3 =
'fuel152720qgc5wthxu4g7a2g6s7xy9d8wjgtffl489k706xyd2fas0wqyv0vsw';
const fuelPrivKey =
'0x7f802a2a277872af1204140bd2c77c2193309c366e3c71ff1c4c31cea0a53f38';
const fuelAddPriv =
'fuel1szu0uagadwpgl0fuz2thrtzn7artghvhexg5d9at4t76nzeesqasrdmjxy';

// import account from private key
await createAccountFromPrivateKey(page, fuelPrivKey, 'Account 3');

// Create the 4th account
await createAccount(page);

const wal1Account1: string = await getAddressForAccountNumber(
page,
'Account 1',
1
);

const wal1Account2: string = await getAddressForAccountNumber(
page,
'Account 2',
2
);

const wal1Account3: string = await getAddressForAccountNumber(
page,
'Account 3',
3
);

const wal1Account4: string = await getAddressForAccountNumber(
page,
'Account 4',
4
);

// Checks
// saved wal 1 add account 1 = wal 3 add account 1
expect(wal1Account1).toBe(fuelAddress1);
// saved wal 1 add account 2 = wal 3 add account 2
expect(wal1Account2).toBe(fuelAddress2);
// saved wal 2 add account = wal 3 add account 3
expect(wal1Account3).toBe(fuelAddPriv);
// saved wal 1 add account 3 = wal 3 add account 4
expect(wal1Account4).toBe(fuelAddress3);
});
});
19 changes: 13 additions & 6 deletions packages/app/playwright/mocks/database.ts
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ export function createAccount(wallet: WalletManagerAccount, index = 0) {
balance: '0',
balanceSymbol: 'ETH',
balances: [],
name: `Account ${index}`,
name: `Account ${index + 1}`,
publicKey: wallet.publicKey,
isHidden: false,
isCurrent: index === 0,
Expand All @@ -132,9 +132,15 @@ export function createAccount(wallet: WalletManagerAccount, index = 0) {
export function createAccounts(manager: WalletManager, numberOfAccounts = 1) {
return Promise.all(
new Array(numberOfAccounts).fill(0).map(async (_, index) => {
const walletAccount = await manager.addAccount();
const account = createAccount(walletAccount, index);
return account;
let walletAccount = null;
if (index === 0) {
walletAccount = await manager.getAccounts()[0];
} else {
walletAccount = await manager.addAccount();
}

const accounts = createAccount(walletAccount, index);
return accounts;
})
);
}
Expand Down Expand Up @@ -176,10 +182,11 @@ export async function serializeVault(
export async function mockData(
page: Page,
numberOfAccounts = 1,
networks: Array<NetworkData> = DEFAULT_NETWORKS
networks: Array<NetworkData> = DEFAULT_NETWORKS,
seedPhrase?: string
) {
await visit(page, '/');
const mnemonic = Mnemonic.generate(16);
const mnemonic = seedPhrase || Mnemonic.generate(16);
const manager = await createManager(mnemonic);
const accounts = await createAccounts(manager, numberOfAccounts);
const vault = await serializeVault(manager);
Expand Down
18 changes: 11 additions & 7 deletions packages/app/src/systems/Settings/hooks/useExportVault.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,19 @@ export function useExportVault() {
const isUnlockOpened = useSelector(service, selectors.isUnlockOpened);

async function exportVault(password: string) {
if (await VaultService.isLocked()) {
await VaultService.unlock({ password });
}
const [vault] = await VaultService.getVaults();

service.send({
type: 'EXPORT_VAULT',
input: {
password,
vaultId: vault.vaultId,
},
});
vault &&
service.send({
type: 'EXPORT_VAULT',
input: {
password,
vaultId: vault.vaultId,
},
});
}

return {
Expand Down
2 changes: 1 addition & 1 deletion pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit d7c58a5

Please sign in to comment.