diff --git a/CHANGELOG.md b/CHANGELOG.md index 6115fbf3b01..27b0473025e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,11 @@ ## Current Main Branch -## 7.27.0 - Jul 5, 2024 +## 7.27.1 - Jul 25, 2024 +### Fixed +- [#10438](https://github.com/MetaMask/metamask-mobile/pull/10438): cherry-pick: update @blockaid/ppom_release package to version 1.5.1 (#10435) #10438 + +## 7.27.0 - Jul 19, 2024 ### Added - [#7759](https://github.com/MetaMask/metamask-mobile/pull/7759): feat: upgrade react-native-webview (#7759) - [#10000](https://github.com/MetaMask/metamask-mobile/pull/10000): feat: support security alerts API (#10000) diff --git a/android/app/build.gradle b/android/app/build.gradle index 429dc64a6a0..dd178dfb5c7 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -173,8 +173,8 @@ android { applicationId "io.metamask" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1364 - versionName "7.27.0" + versionCode 1369 + versionName "7.27.1" testBuildType System.getProperty('testBuildType', 'debug') missingDimensionStrategy 'react-native-camera', 'general' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/components/UI/HardwareWallet/AccountSelector/index.tsx b/app/components/UI/HardwareWallet/AccountSelector/index.tsx index ab2378c90c0..2fc53f4b141 100644 --- a/app/components/UI/HardwareWallet/AccountSelector/index.tsx +++ b/app/components/UI/HardwareWallet/AccountSelector/index.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useState, useMemo } from 'react'; -import { View, Text, FlatList, TouchableOpacity } from 'react-native'; +import { View, Text, FlatList, TouchableOpacity, Platform } from 'react-native'; import Icon from 'react-native-vector-icons/FontAwesome'; import CheckBox from '@react-native-community/checkbox'; import { useSelector } from 'react-redux'; @@ -13,6 +13,11 @@ import { createStyle } from './styles'; import AccountDetails from '../AccountDetails'; import StyledButton from '../../../UI/StyledButton'; import { selectProviderConfig } from '../../../../selectors/networkController'; +import generateTestId from '../../../../../wdio/utils/generateTestId'; +import { + ACCOUNT_SELECTOR_NEXT_BUTTON, + ACCOUNT_SELECTOR_PREVIOUS_BUTTON, +} from '../../../../../wdio/screen-objects/testIDs/Components/AccountSelector.testIds'; interface ISelectQRAccountsProps { accounts: IAccount[]; @@ -110,13 +115,21 @@ const AccountSelector = (props: ISelectQRAccountsProps) => { )} /> - + {strings('account_selector.prev')} - + {strings('account_selector.next')} diff --git a/app/components/Views/ConnectQRHardware/Instruction/index.tsx b/app/components/Views/ConnectQRHardware/Instruction/index.tsx index ea931184878..b35b1df7cf4 100644 --- a/app/components/Views/ConnectQRHardware/Instruction/index.tsx +++ b/app/components/Views/ConnectQRHardware/Instruction/index.tsx @@ -2,7 +2,7 @@ /* eslint @typescript-eslint/no-require-imports: "off" */ import React from 'react'; -import { View, Text, Image, ScrollView } from 'react-native'; +import { View, Text, Image, ScrollView, Platform } from 'react-native'; import { strings } from '../../../../../locales/i18n'; import { KEYSTONE_LEARN_MORE, @@ -12,6 +12,8 @@ import { import { useTheme } from '../../../../util/theme'; import { createStyles } from './styles'; import StyledButton from '../../../UI/StyledButton'; +import generateTestId from '../../../../../wdio/utils/generateTestId'; +import { QR_CONTINUE_BUTTON } from '../../../../../wdio/screen-objects/testIDs/Components/ConnectQRHardware.testIds'; interface IConnectQRInstructionProps { // TODO: Replace "any" with type @@ -109,6 +111,7 @@ const ConnectQRInstruction = (props: IConnectQRInstructionProps) => { type={'confirm'} onPress={onConnect} style={styles.button} + {...generateTestId(Platform, QR_CONTINUE_BUTTON)} > {strings('connect_qr_hardware.button_continue')} diff --git a/app/components/Views/ConnectQRHardware/__snapshots__/index.test.tsx.snap b/app/components/Views/ConnectQRHardware/__snapshots__/index.test.tsx.snap new file mode 100644 index 00000000000..2fde2ffa4be --- /dev/null +++ b/app/components/Views/ConnectQRHardware/__snapshots__/index.test.tsx.snap @@ -0,0 +1,414 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ConnectQRHardware renders correctly to match snapshot 1`] = ` +[ + + + +  + + + +  + + + + + + + + Connect a QR-based hardware wallet + + + + Connect an airgapped hardware wallet that communicates through QR-codes. + + + How it works? + + + Officially supported airgapped hardware wallets include: + + + Keystone + + + + Learn more + + + Tutorial + + + + 1. Unlock your Keystone + + + 2. Tap the ··· Menu, then go to Sync + + + + + + + + + Continue + + + + + , + , + , +] +`; diff --git a/app/components/Views/ConnectQRHardware/index.test.tsx b/app/components/Views/ConnectQRHardware/index.test.tsx new file mode 100644 index 00000000000..b58b01e16fc --- /dev/null +++ b/app/components/Views/ConnectQRHardware/index.test.tsx @@ -0,0 +1,250 @@ +import React from 'react'; +import renderWithProvider from '../../../util/test/renderWithProvider'; +import Engine from '../../../core/Engine'; +import ConnectQRHardware from './index'; +import { fireEvent } from '@testing-library/react-native'; +import { QR_CONTINUE_BUTTON } from '../../../../wdio/screen-objects/testIDs/Components/ConnectQRHardware.testIds'; +import { backgroundState } from '../../../util/test/initial-root-state'; +import { act } from '@testing-library/react-hooks'; +import PAGINATION_OPERATIONS from '../../../constants/pagination'; +import { + ACCOUNT_SELECTOR_NEXT_BUTTON, + ACCOUNT_SELECTOR_PREVIOUS_BUTTON, +} from '../../../../wdio/screen-objects/testIDs/Components/AccountSelector.testIds'; + +const mockedNavigate = jest.fn(); + +const mockPage0Accounts = [ + { + address: '0x4x678901234567890123456789012345678901210', + balance: '0x0', + index: 0, + }, + { + address: '0xa1e359811322d97991e03f863a0c30c2cf029cd24', + balance: '0x0', + index: 1, + }, + { + address: '0xc1e359811322d97991e03f863a0c30c2cf029ce22', + balance: '0x0', + index: 2, + }, + { + address: '0xd0a1e359811322d97991e03f863a0c30c2cf029c1', + balance: '0x0', + index: 3, + }, + { + address: '0x4a1e359811322d97991e03f863a0c30c2cf029c13', + balance: '0x0', + index: 4, + }, +]; + +const mockPage1Accounts = [ + { + address: '0x12345678901234567890123456789012345678902', + balance: '0x0', + index: 5, + }, + { + address: '0x25678901234567890123456789012345678901231', + balance: '0x0', + index: 6, + }, + { + address: '0x3b678901234567890123456789012345678901202', + balance: '0x0', + index: 7, + }, + { + address: '0x42345678901234567890123456789012345678904', + balance: '0x0', + index: 8, + }, + { + address: '0x52345678901234567890123456789012345678904', + balance: '0x0', + index: 9, + }, +]; + +jest.mock('@react-navigation/native', () => { + const actualNav = jest.requireActual('@react-navigation/native'); + return { + ...actualNav, + useNavigation: () => ({ + navigate: mockedNavigate, + setOptions: jest.fn(), + }), + }; +}); + +jest.mock('../../../core/Engine', () => ({ + context: { + KeyringController: { + state: { + keyrings: [], + }, + getAccounts: jest.fn(), + getOrAddQRKeyring: jest.fn(), + withKeyring: jest.fn(), + connectQRHardware: jest.fn(), + }, + AccountTrackerController: { + syncBalanceWithAddresses: jest.fn(), + }, + }, + controllerMessenger: { + subscribe: jest.fn(), + unsubscribe: jest.fn(), + }, +})); +const MockEngine = jest.mocked(Engine); + +const mockInitialState = { + engine: { + backgroundState: { + ...backgroundState, + }, + }, +}; + +describe('ConnectQRHardware', () => { + const mockKeyringController = MockEngine.context.KeyringController; + mockKeyringController.connectQRHardware.mockImplementation((page) => { + switch (page) { + case PAGINATION_OPERATIONS.GET_NEXT_PAGE: + return Promise.resolve(mockPage1Accounts); + + case PAGINATION_OPERATIONS.GET_PREVIOUS_PAGE: + return Promise.resolve(mockPage0Accounts); + + default: + // return account lists in first page. + return Promise.resolve(mockPage0Accounts); + } + }); + + const mockAccountTrackerController = + MockEngine.context.AccountTrackerController; + mockAccountTrackerController.syncBalanceWithAddresses.mockImplementation( + (addresses) => + Promise.resolve( + addresses.map((address) => ({ + [address]: { + balance: '0x0', + }, + })), + ), + ); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('renders correctly to match snapshot', () => { + mockKeyringController.getAccounts.mockResolvedValue([]); + const wrapper = renderWithProvider( + , + { state: mockInitialState }, + ); + + expect(wrapper).toMatchSnapshot(); + }); + + it('renders first page correctly when user clicks `continue` button', async () => { + mockKeyringController.getAccounts.mockResolvedValue([]); + + const { getByTestId, getByText } = renderWithProvider( + , + { state: mockInitialState }, + ); + + const button = getByTestId(QR_CONTINUE_BUTTON); + + expect(button).toBeDefined(); + + await act(async () => { + fireEvent.press(button); + }); + + expect(mockKeyringController.connectQRHardware).toHaveBeenCalledTimes(1); + expect(mockKeyringController.connectQRHardware).toHaveBeenCalledWith( + PAGINATION_OPERATIONS.GET_FIRST_PAGE, + ); + + mockPage0Accounts.forEach((account) => { + expect(getByText(account.address)).toBeDefined(); + }); + }); + + it('renders next page correctly when user clicks `Next Page` button', async () => { + mockKeyringController.getAccounts.mockResolvedValue([]); + + const { getByTestId, getByText } = renderWithProvider( + , + { state: mockInitialState }, + ); + + const button = getByTestId(QR_CONTINUE_BUTTON); + expect(button).toBeDefined(); + + await act(async () => { + fireEvent.press(button); + }); + + const nextButton = getByTestId(ACCOUNT_SELECTOR_NEXT_BUTTON); + expect(nextButton).toBeDefined(); + await act(async () => { + fireEvent.press(nextButton); + }); + + expect(mockKeyringController.connectQRHardware).toHaveBeenCalledTimes(2); + expect(mockKeyringController.connectQRHardware).toHaveBeenCalledWith( + PAGINATION_OPERATIONS.GET_NEXT_PAGE, + ); + + mockPage1Accounts.forEach((account) => { + expect(getByText(account.address)).toBeDefined(); + }); + }); + + it('renders previous page correctly when user clicks `Previous Page` button', async () => { + mockKeyringController.getAccounts.mockResolvedValue([]); + + const { getByTestId, getByText } = renderWithProvider( + , + { state: mockInitialState }, + ); + + const button = getByTestId(QR_CONTINUE_BUTTON); + expect(button).toBeDefined(); + + await act(async () => { + fireEvent.press(button); + }); + + const nextButton = getByTestId(ACCOUNT_SELECTOR_NEXT_BUTTON); + expect(nextButton).toBeDefined(); + await act(async () => { + fireEvent.press(nextButton); + }); + + const prevButton = getByTestId(ACCOUNT_SELECTOR_PREVIOUS_BUTTON); + expect(prevButton).toBeDefined(); + await act(async () => { + fireEvent.press(prevButton); + }); + + expect(mockKeyringController.connectQRHardware).toHaveBeenCalledTimes(3); + expect(mockKeyringController.connectQRHardware).toHaveBeenCalledWith( + PAGINATION_OPERATIONS.GET_PREVIOUS_PAGE, + ); + + mockPage0Accounts.forEach((account) => { + expect(getByText(account.address)).toBeDefined(); + }); + }); +}); diff --git a/app/components/Views/ConnectQRHardware/index.tsx b/app/components/Views/ConnectQRHardware/index.tsx index 09507a2e0e1..3f1c05f579d 100644 --- a/app/components/Views/ConnectQRHardware/index.tsx +++ b/app/components/Views/ConnectQRHardware/index.tsx @@ -30,15 +30,16 @@ import { useMetrics } from '../../../components/hooks/useMetrics'; import type { MetaMaskKeyring as QRKeyring } from '@keystonehq/metamask-airgapped-keyring'; import { KeyringTypes } from '@metamask/keyring-controller'; import { HardwareDeviceTypes } from '../../../constants/keyringTypes'; +import { ThemeColors } from '@metamask/design-tokens/dist/types/js/themes/types'; +import PAGINATION_OPERATIONS from '../../../constants/pagination'; interface IConnectQRHardwareProps { // TODO: Replace "any" with type // eslint-disable-next-line @typescript-eslint/no-explicit-any navigation: any; } -// TODO: Replace "any" with type -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const createStyles = (colors: any) => + +const createStyles = (colors: ThemeColors) => StyleSheet.create({ container: { flex: 1, @@ -71,7 +72,7 @@ const createStyles = (colors: any) => error: { ...fontStyles.normal, fontSize: 14, - color: colors.red, + color: colors.error, }, text: { color: colors.text.default, @@ -219,7 +220,7 @@ const ConnectQRHardware = ({ navigation }: IConnectQRHardwareProps) => { }); resetError(); const [qrInteractions, connectQRHardwarePromise] = - await initiateQRHardwareConnection(0); + await initiateQRHardwareConnection(PAGINATION_OPERATIONS.GET_FIRST_PAGE); qrInteractionsRef.current = qrInteractions; const firstPageAccounts = await connectQRHardwarePromise; @@ -263,7 +264,7 @@ const ConnectQRHardware = ({ navigation }: IConnectQRHardwareProps) => { const nextPage = useCallback(async () => { resetError(); const [qrInteractions, connectQRHardwarePromise] = - await initiateQRHardwareConnection(1); + await initiateQRHardwareConnection(PAGINATION_OPERATIONS.GET_NEXT_PAGE); qrInteractionsRef.current = qrInteractions; const nextPageAccounts = await connectQRHardwarePromise; @@ -275,7 +276,9 @@ const ConnectQRHardware = ({ navigation }: IConnectQRHardwareProps) => { const prevPage = useCallback(async () => { resetError(); const [qrInteractions, connectQRHardwarePromise] = - await initiateQRHardwareConnection(-1); + await initiateQRHardwareConnection( + PAGINATION_OPERATIONS.GET_PREVIOUS_PAGE, + ); qrInteractionsRef.current = qrInteractions; const previousPageAccounts = await connectQRHardwarePromise; diff --git a/app/components/Views/LedgerSelectAccount/index.tsx b/app/components/Views/LedgerSelectAccount/index.tsx index 3e495e93bdf..0ba03ccba33 100644 --- a/app/components/Views/LedgerSelectAccount/index.tsx +++ b/app/components/Views/LedgerSelectAccount/index.tsx @@ -21,9 +21,9 @@ import { useDispatch } from 'react-redux'; import { KeyringController } from '@metamask/keyring-controller'; import { StackNavigationProp } from '@react-navigation/stack'; import createStyles from './index.styles'; -import OperationTypes from '../../../core/Ledger/types'; import { HardwareDeviceTypes } from '../../../constants/keyringTypes'; import MaterialIcon from 'react-native-vector-icons/MaterialIcons'; +import PAGINATION_OPERATIONS from '../../../constants/pagination'; const LedgerSelectAccount = () => { const navigation = useNavigation>(); @@ -68,21 +68,21 @@ const LedgerSelectAccount = () => { device_type: HardwareDeviceTypes.LEDGER, }); const _accounts = await getLedgerAccountsByOperation( - OperationTypes.GET_FIRST_PAGE, + PAGINATION_OPERATIONS.GET_FIRST_PAGE, ); setAccounts(_accounts); }, [trackEvent]); const nextPage = useCallback(async () => { const _accounts = await getLedgerAccountsByOperation( - OperationTypes.GET_NEXT_PAGE, + PAGINATION_OPERATIONS.GET_NEXT_PAGE, ); setAccounts(_accounts); }, []); const prevPage = useCallback(async () => { const _accounts = await getLedgerAccountsByOperation( - OperationTypes.GET_PREVIOUS_PAGE, + PAGINATION_OPERATIONS.GET_PREVIOUS_PAGE, ); setAccounts(_accounts); }, []); diff --git a/app/core/Ledger/types.ts b/app/constants/pagination.ts similarity index 51% rename from app/core/Ledger/types.ts rename to app/constants/pagination.ts index c3f62ae8d93..b33c3e7a394 100644 --- a/app/core/Ledger/types.ts +++ b/app/constants/pagination.ts @@ -1,7 +1,7 @@ -enum OperationTypes { +enum PAGINATION_OPERATIONS { GET_FIRST_PAGE = 0, GET_NEXT_PAGE = 1, GET_PREVIOUS_PAGE = -1, } -export default OperationTypes; +export default PAGINATION_OPERATIONS; diff --git a/app/core/Ledger/Ledger.test.ts b/app/core/Ledger/Ledger.test.ts index e078666d087..96872ad06d2 100644 --- a/app/core/Ledger/Ledger.test.ts +++ b/app/core/Ledger/Ledger.test.ts @@ -11,7 +11,7 @@ import { import Engine from '../../core/Engine'; import { SignTypedDataVersion } from '@metamask/keyring-controller'; import type BleTransport from '@ledgerhq/react-native-hw-transport-ble'; -import OperationTypes from './types'; +import PAGINATION_OPERATIONS from '../../constants/pagination'; jest.mock('../../core/Engine', () => ({ context: { @@ -165,15 +165,17 @@ describe('Ledger core', () => { describe('getLedgerAccountsByOperation', () => { it('calls ledgerKeyring.getNextPage on ledgerKeyring', async () => { - await getLedgerAccountsByOperation(OperationTypes.GET_NEXT_PAGE); + await getLedgerAccountsByOperation(PAGINATION_OPERATIONS.GET_NEXT_PAGE); expect(ledgerKeyring.getNextPage).toHaveBeenCalled(); }); it('calls getPreviousPage on ledgerKeyring', async () => { - await getLedgerAccountsByOperation(OperationTypes.GET_PREVIOUS_PAGE); + await getLedgerAccountsByOperation( + PAGINATION_OPERATIONS.GET_PREVIOUS_PAGE, + ); expect(ledgerKeyring.getPreviousPage).toHaveBeenCalled(); }); it('calls getFirstPage on ledgerKeyring', async () => { - await getLedgerAccountsByOperation(OperationTypes.GET_FIRST_PAGE); + await getLedgerAccountsByOperation(PAGINATION_OPERATIONS.GET_FIRST_PAGE); expect(ledgerKeyring.getFirstPage).toHaveBeenCalled(); }); }); diff --git a/app/core/Ledger/Ledger.ts b/app/core/Ledger/Ledger.ts index d5ca3aacc5f..51064530854 100644 --- a/app/core/Ledger/Ledger.ts +++ b/app/core/Ledger/Ledger.ts @@ -7,7 +7,7 @@ import { LedgerMobileBridge, } from '@metamask/eth-ledger-bridge-keyring'; import LEDGER_HD_PATH from './constants'; -import OperationTypes from './types'; +import PAGINATION_OPERATIONS from '../../constants/pagination'; /** * Perform an operation with the Ledger keyring. @@ -110,9 +110,9 @@ export const getLedgerAccountsByOperation = async ( try { const accounts = await withLedgerKeyring(async (keyring: LedgerKeyring) => { switch (operation) { - case OperationTypes.GET_PREVIOUS_PAGE: + case PAGINATION_OPERATIONS.GET_PREVIOUS_PAGE: return await keyring.getPreviousPage(); - case OperationTypes.GET_NEXT_PAGE: + case PAGINATION_OPERATIONS.GET_NEXT_PAGE: return await keyring.getNextPage(); default: return await keyring.getFirstPage(); diff --git a/app/util/test/initial-background-state.json b/app/util/test/initial-background-state.json index 94d866b69b4..15436c76c9f 100644 --- a/app/util/test/initial-background-state.json +++ b/app/util/test/initial-background-state.json @@ -259,4 +259,4 @@ "isProfileSyncingEnabled": true, "isProfileSyncingUpdateLoading": false } -} \ No newline at end of file +} diff --git a/bitrise.yml b/bitrise.yml index a50deed8300..f6f8ebba4c6 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -1451,16 +1451,16 @@ app: PROJECT_LOCATION_IOS: ios - opts: is_expand: false - VERSION_NAME: 7.27.0 + VERSION_NAME: 7.27.1 - opts: is_expand: false - VERSION_NUMBER: 1364 + VERSION_NUMBER: 1369 - opts: is_expand: false - FLASK_VERSION_NAME: 7.27.0 + FLASK_VERSION_NAME: 7.27.1 - opts: is_expand: false - FLASK_VERSION_NUMBER: 1364 + FLASK_VERSION_NUMBER: 1369 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/e2e/specs/browser/browser-tests.spec.js b/e2e/specs/browser/browser-tests.spec.js index b5d27bb88be..07361e61440 100644 --- a/e2e/specs/browser/browser-tests.spec.js +++ b/e2e/specs/browser/browser-tests.spec.js @@ -69,7 +69,7 @@ describe(SmokeCore('Browser Tests'), () => { it('should tap on the test dapp in favorites on the home page', async () => { await Browser.tapHomeButton(); // Wait for page to load - await TestHelpers.delay(1000); + await TestHelpers.delay(3000); await Browser.tapDappInFavorites(); await Assertions.checkIfTextIsDisplayed('metamask.github.io'); // } diff --git a/e2e/specs/wallet/portfolio-connect-account.spec.js b/e2e/specs/quarantine/portfolio-connect-account.failing.js similarity index 100% rename from e2e/specs/wallet/portfolio-connect-account.spec.js rename to e2e/specs/quarantine/portfolio-connect-account.failing.js index d66af7a65ee..70bf066fa6b 100644 --- a/e2e/specs/wallet/portfolio-connect-account.spec.js +++ b/e2e/specs/quarantine/portfolio-connect-account.failing.js @@ -50,8 +50,8 @@ describe(SmokeCore('Connect account to Portfolio'), () => { /* eslint-disable no-console */ console.log('The Portfolio privacy modal is not visible'); } - await PortfolioHomePage.tapConnectMetaMask(); await device.disableSynchronization(); + await PortfolioHomePage.tapConnectMetaMask(); await ConnectModal.tapConnectButton(); await device.enableSynchronization(); }); diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 71e832ca7f0..92abade2385 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1249,7 +1249,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMaskDebug.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1364; + CURRENT_PROJECT_VERSION = 1369; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1286,7 +1286,7 @@ "${inherited}", ); LLVM_LTO = YES; - MARKETING_VERSION = 7.27.0; + MARKETING_VERSION = 7.27.1; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = ( @@ -1314,7 +1314,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1364; + CURRENT_PROJECT_VERSION = 1369; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1349,7 +1349,7 @@ "${inherited}", ); LLVM_LTO = YES; - MARKETING_VERSION = 7.27.0; + MARKETING_VERSION = 7.27.1; ONLY_ACTIVE_ARCH = NO; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = ( @@ -1377,7 +1377,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMaskDebug.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1364; + CURRENT_PROJECT_VERSION = 1369; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1410,7 +1410,7 @@ ); LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift$(inherited)"; LLVM_LTO = YES; - MARKETING_VERSION = 7.27.0; + MARKETING_VERSION = 7.27.1; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = ( @@ -1438,7 +1438,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1364; + CURRENT_PROJECT_VERSION = 1369; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1469,7 +1469,7 @@ ); LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift$(inherited)"; LLVM_LTO = YES; - MARKETING_VERSION = 7.27.0; + MARKETING_VERSION = 7.27.1; ONLY_ACTIVE_ARCH = NO; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = ( @@ -1600,7 +1600,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMaskDebug.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1364; + CURRENT_PROJECT_VERSION = 1369; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1637,7 +1637,7 @@ "\"$(SRCROOT)/MetaMask/System/Library/Frameworks\"", ); LLVM_LTO = YES; - MARKETING_VERSION = 7.27.0; + MARKETING_VERSION = 7.27.1; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ( "$(inherited)", @@ -1668,7 +1668,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1364; + CURRENT_PROJECT_VERSION = 1369; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1703,7 +1703,7 @@ "\"$(SRCROOT)/MetaMask/System/Library/Frameworks\"", ); LLVM_LTO = YES; - MARKETING_VERSION = 7.27.0; + MARKETING_VERSION = 7.27.1; ONLY_ACTIVE_ARCH = NO; OTHER_CFLAGS = ( "$(inherited)", diff --git a/wdio/screen-objects/testIDs/Components/AccountSelector.testIds.js b/wdio/screen-objects/testIDs/Components/AccountSelector.testIds.js new file mode 100644 index 00000000000..c5f81bd4f0a --- /dev/null +++ b/wdio/screen-objects/testIDs/Components/AccountSelector.testIds.js @@ -0,0 +1,2 @@ +export const ACCOUNT_SELECTOR_NEXT_BUTTON = 'account-selector-next-button'; +export const ACCOUNT_SELECTOR_PREVIOUS_BUTTON = 'account-selector-previous-button'; diff --git a/wdio/screen-objects/testIDs/Components/ConnectQRHardware.testIds.js b/wdio/screen-objects/testIDs/Components/ConnectQRHardware.testIds.js new file mode 100644 index 00000000000..e41efc1d945 --- /dev/null +++ b/wdio/screen-objects/testIDs/Components/ConnectQRHardware.testIds.js @@ -0,0 +1 @@ +export const QR_CONTINUE_BUTTON = 'qr-continue-button';