Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
e0cb4d3
fix: add missing prop to fix TokenListItem test (#25559)
georgeweiler Feb 3, 2026
e6e0330
feat: reward season 2 status banner (#25522)
VGR-GIT Feb 3, 2026
4e705b6
feat(perps): improve load time with non-blocking price prewarm (#25501)
abretonc7s Feb 3, 2026
33436d5
feat: support rewards opt-in for all accounts (#24450)
sophieqgu Feb 3, 2026
2276a93
chore: moves Identity, Multihain-Accounts and Notifications specs (#2…
christopherferreira9 Feb 3, 2026
2bade8e
fix: Expose getGeolocation on RampsController messenger (#25547)
georgeweiler Feb 3, 2026
53fddbf
refactor(ramps): Move Ramps hydration into Ramps component (#25521)
georgeweiler Feb 3, 2026
0e511de
feat(ramps): migrate ramps region from string to object (#25557)
georgeweiler Feb 3, 2026
bfcddb9
refactor: filter analytics event undefined values (#25453)
NicolasMassart Feb 3, 2026
efc0ef9
test: fix unstable RemoteImage test (#25321)
GeorgeGkas Feb 3, 2026
dc1e059
refactor(predict): migrate PredictController from Engine.context to m…
matallui Feb 3, 2026
797a654
fix: disable swap max button on native assets when stx is disabled (#…
GeorgeGkas Feb 3, 2026
d166445
fix: order book live price header (#25577)
aganglada Feb 3, 2026
3a690b4
feat(rewards): season 2 snapshots v1 (#25576)
VGR-GIT Feb 3, 2026
b566864
fix: Android ANR bug cp-7.64.0 (#25551)
weitingsun Feb 3, 2026
a6e8590
fix(transactions): Auto-scroll Activity tab when new transaction adde…
vinnyhoward Feb 3, 2026
275dfaf
fix(analytics): cp-7.63.1 correct capitalization in Deep link event n…
NicolasMassart Feb 3, 2026
b78edac
test: adds iOS flask e2e tests (#24447)
christopherferreira9 Feb 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 19 additions & 4 deletions .github/workflows/build-ios-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,21 @@ name: Build iOS E2E Apps

on:
workflow_call:
outputs:
app-uploaded:
description: 'Whether the app was successfully uploaded'
value: ${{ jobs.build-ios-apps.outputs.app-uploaded }}
inputs:
build_type:
description: 'The type of build to perform'
required: false
default: 'main'
type: string
metamask_environment:
description: 'The environment to build for'
required: false
default: 'qa'
type: string

permissions:
contents: read
Expand All @@ -20,8 +35,8 @@ jobs:
XCODE_BUILD_SETTINGS: 'COMPILER_INDEX_STORE_ENABLE=NO'
GITHUB_CI: 'true' # This ensures it's available during pod install
PLATFORM: ios
METAMASK_ENVIRONMENT: qa
METAMASK_BUILD_TYPE: main
METAMASK_ENVIRONMENT: ${{ inputs.metamask_environment }}
METAMASK_BUILD_TYPE: ${{ inputs.build_type }}
IS_TEST: true
E2E: 'true'
IGNORE_BOXLOGS_DEVELOPMENT: true
Expand Down Expand Up @@ -226,7 +241,7 @@ jobs:
id: upload-app
uses: actions/upload-artifact@v4
with:
name: MetaMask.app
name: ${{ inputs.build_type }}-${{ inputs.metamask_environment }}-MetaMask.app
path: ios/build/Build/Products/Release-iphonesimulator/MetaMask.app
retention-days: 7
if-no-files-found: error
Expand All @@ -239,7 +254,7 @@ jobs:
if: ${{ steps.cache-restore.outputs.cache-hit == 'true' || steps.cache-restore-main.outputs.cache-hit == 'true' }}
uses: actions/upload-artifact@v4
with:
name: index.js.map
name: ${{ inputs.build_type }}-${{ inputs.metamask_environment }}-index.js.map
path: sourcemaps/ios/index.js.map
retention-days: 7
if-no-files-found: error
Expand Down
30 changes: 27 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,23 @@ jobs:
}}
secrets: inherit

e2e-smoke-tests-ios-flask:
name: 'iOS Flask E2E Smoke Tests'
if: ${{ github.event_name != 'merge_group' && needs.needs_e2e_build.outputs.ios_changed == 'true' }}
permissions:
contents: read
id-token: write
needs: [needs_e2e_build, ios-tests-ready, smart-e2e-selection]
uses: ./.github/workflows/run-e2e-smoke-tests-ios-flask.yml
with:
changed_files: ${{ needs.needs_e2e_build.outputs.changed_files }}
selected_tags: >-
${{
(needs.smart-e2e-selection.outputs.ai_confidence >= 80 && needs.smart-e2e-selection.outputs.ai_e2e_test_tags) ||
'["ALL"]'
}}
secrets: inherit

js-bundle-size-check:
runs-on: ubuntu-latest
steps:
Expand Down Expand Up @@ -604,6 +621,7 @@ jobs:
- e2e-smoke-tests-android
- e2e-smoke-tests-ios
- e2e-smoke-tests-android-flask
- e2e-smoke-tests-ios-flask
steps:
- run: |
# Check if all non-E2E jobs passed
Expand All @@ -629,9 +647,15 @@ jobs:
exit 1
fi

FLASK_RESULT="${{ needs.e2e-smoke-tests-android-flask.result }}"
if [[ "$FLASK_RESULT" == "failure" ]] || [[ "$FLASK_RESULT" == "cancelled" ]]; then
echo "Android Flask E2E tests failed (result: $FLASK_RESULT)"
ANDROID_FLASK_RESULT="${{ needs.e2e-smoke-tests-android-flask.result }}"
if [[ "$ANDROID_FLASK_RESULT" == "failure" ]] || [[ "$ANDROID_FLASK_RESULT" == "cancelled" ]]; then
echo "Android Flask E2E tests failed (result: $ANDROID_FLASK_RESULT)"
exit 1
fi

IOS_FLASK_RESULT="${{ needs.e2e-smoke-tests-ios-flask.result }}"
if [[ "$IOS_FLASK_RESULT" == "failure" ]] || [[ "$IOS_FLASK_RESULT" == "cancelled" ]]; then
echo "iOS Flask E2E tests failed (result: $IOS_FLASK_RESULT)"
exit 1
fi
fi
Expand Down
167 changes: 167 additions & 0 deletions .github/workflows/run-e2e-smoke-tests-ios-flask.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
name: iOS Flask E2E Smoke Tests

on:
workflow_call:
inputs:
selected_tags:
description: 'JSON array of selected tags from Smart E2E selection'
required: false
type: string
default: '["ALL"]'
changed_files:
description: 'Changed files'
required: false
type: string
default: ''

permissions:
contents: read
id-token: write

jobs:
repack-ios-flask-apps:
if: contains(fromJson(inputs.selected_tags), 'ALL') || contains(fromJson(inputs.selected_tags), 'FlaskBuildTests')
name: 'Repack iOS Flask Apps'
runs-on: ghcr.io/cirruslabs/macos-runner:sequoia
permissions:
contents: read
id-token: write
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup iOS Environment
timeout-minutes: 15
uses: MetaMask/github-tools/.github/actions/setup-e2e-env@v1
with:
platform: ios
setup-simulator: false

- name: Install dependencies
uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 #v3.0.2
with:
timeout_minutes: 10
max_attempts: 3
retry_wait_seconds: 30
command: yarn install --immutable

- name: Setup project
run: yarn setup:github-ci --no-build-android

- name: Download Main iOS App artifacts
uses: actions/download-artifact@v4
with:
path: artifacts/
pattern: main-*-MetaMask.app

- name: Setup Main iOS App artifacts
run: |
mkdir -p ios/build/Build/Products/Release-iphonesimulator/
cp -R artifacts/main-qa-MetaMask.app ios/build/Build/Products/Release-iphonesimulator/MetaMask.app

- name: Repack Main iOS App
run: node scripts/repack.js
env:
PLATFORM: ios
METAMASK_ENVIRONMENT: e2e
METAMASK_BUILD_TYPE: flask
IS_TEST: 'true'
E2E: 'true'
IGNORE_BOXLOGS_DEVELOPMENT: 'true'
GITHUB_CI: 'true'
CI: 'true'
NODE_OPTIONS: '--max-old-space-size=8192'
BRIDGE_USE_DEV_APIS: 'true'
RAMP_INTERNAL_BUILD: 'true'
SEEDLESS_ONBOARDING_ENABLED: 'true'
MM_NOTIFICATIONS_UI_ENABLED: 'true'
MM_SECURITY_ALERTS_API_ENABLED: 'true'
FEATURES_ANNOUNCEMENTS_ACCESS_TOKEN: ${{ secrets.FEATURES_ANNOUNCEMENTS_ACCESS_TOKEN }}
FEATURES_ANNOUNCEMENTS_SPACE_ID: ${{ secrets.FEATURES_ANNOUNCEMENTS_SPACE_ID }}
SEGMENT_WRITE_KEY_QA: ${{ secrets.SEGMENT_WRITE_KEY_QA }}
SEGMENT_WRITE_KEY_FLASK: ${{ secrets.SEGMENT_WRITE_KEY_FLASK }}
SEGMENT_PROXY_URL_QA: ${{ secrets.SEGMENT_PROXY_URL_QA }}
SEGMENT_PROXY_URL_FLASK: ${{ secrets.SEGMENT_PROXY_URL_FLASK }}
SEGMENT_DELETE_API_SOURCE_ID_QA: ${{ secrets.SEGMENT_DELETE_API_SOURCE_ID_QA }}
SEGMENT_DELETE_API_SOURCE_ID_FLASK: ${{ secrets.SEGMENT_DELETE_API_SOURCE_ID_FLASK }}
SEGMENT_REGULATIONS_ENDPOINT_QA: ${{ secrets.SEGMENT_REGULATIONS_ENDPOINT_QA }}
SEGMENT_REGULATIONS_ENDPOINT_FLASK: ${{ secrets.SEGMENT_REGULATIONS_ENDPOINT_FLASK }}
MM_SENTRY_DSN_TEST: ${{ secrets.MM_SENTRY_DSN_TEST }}
MM_SENTRY_AUTH_TOKEN: ${{ secrets.MM_SENTRY_AUTH_TOKEN }}
MAIN_IOS_GOOGLE_CLIENT_ID_UAT: ${{ secrets.MAIN_IOS_GOOGLE_CLIENT_ID_UAT }}
FLASK_IOS_GOOGLE_CLIENT_ID_PROD: ${{ secrets.FLASK_IOS_GOOGLE_CLIENT_ID_PROD }}
MAIN_IOS_GOOGLE_REDIRECT_URI_UAT: ${{ secrets.MAIN_IOS_GOOGLE_REDIRECT_URI_UAT }}
FLASK_IOS_GOOGLE_REDIRECT_URI_PROD: ${{ secrets.FLASK_IOS_GOOGLE_REDIRECT_URI_PROD }}
MAIN_ANDROID_APPLE_CLIENT_ID_UAT: ${{ secrets.MAIN_ANDROID_APPLE_CLIENT_ID_UAT }}
FLASK_ANDROID_APPLE_CLIENT_ID_PROD: ${{ secrets.FLASK_ANDROID_APPLE_CLIENT_ID_PROD }}
MAIN_ANDROID_GOOGLE_CLIENT_ID_UAT: ${{ secrets.MAIN_ANDROID_GOOGLE_CLIENT_ID_UAT }}
FLASK_ANDROID_GOOGLE_CLIENT_ID_PROD: ${{ secrets.FLASK_ANDROID_GOOGLE_CLIENT_ID_PROD }}
MAIN_ANDROID_GOOGLE_SERVER_CLIENT_ID_UAT: ${{ secrets.MAIN_ANDROID_GOOGLE_SERVER_CLIENT_ID_UAT }}
FLASK_ANDROID_GOOGLE_SERVER_CLIENT_ID_PROD: ${{ secrets.FLASK_ANDROID_GOOGLE_SERVER_CLIENT_ID_PROD }}
GOOGLE_SERVICES_B64_IOS: ${{ secrets.GOOGLE_SERVICES_B64_IOS }}
GOOGLE_SERVICES_B64_ANDROID: ${{ secrets.GOOGLE_SERVICES_B64_ANDROID }}
MM_INFURA_PROJECT_ID: ${{ secrets.MM_INFURA_PROJECT_ID }}

- name: Upload Repacked iOS Flask App
uses: actions/upload-artifact@v4
with:
name: flask-e2e-MetaMask.app
path: ios/build/Build/Products/Release-iphonesimulator/MetaMask.app
retention-days: 1

flask-ios-smoke:
if: contains(fromJson(inputs.selected_tags), 'ALL') || contains(fromJson(inputs.selected_tags), 'FlaskBuildTests')
needs: [repack-ios-flask-apps]
strategy:
matrix:
split: [1, 2, 3]
fail-fast: false
uses: ./.github/workflows/run-e2e-workflow.yml
with:
test-suite-name: flask-ios-smoke-${{ matrix.split }}
platform: ios
test_suite_tag: 'FlaskBuildTests'
split_number: ${{ matrix.split }}
total_splits: 3
changed_files: ${{ inputs.changed_files }}
build_type: 'flask'
metamask_environment: 'e2e'
secrets: inherit

report-ios-smoke-tests:
name: Report iOS Flask Smoke Tests
runs-on: ubuntu-latest
if: ${{ !cancelled() && (contains(fromJson(inputs.selected_tags), 'ALL') || contains(fromJson(inputs.selected_tags), 'FlaskBuildTests')) }}
needs:
- flask-ios-smoke
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'

- name: Download shards test artifacts (XMLs + Screenshots)
uses: actions/download-artifact@v4
continue-on-error: true
with:
path: all-test-artifacts/
pattern: 'test-e2e-*-ios-*'

- name: Post Test Report
uses: dorny/test-reporter@dc3a92680fcc15842eef52e8c4606ea7ce6bd3f3
with:
name: 'iOS Flask E2E Smoke Test Results'
path: 'all-test-artifacts/**/junit.xml'
reporter: 'jest-junit'
fail-on-error: false
list-suites: 'failed'
list-tests: 'failed'

- name: Upload all test artifacts (XMLs + Screenshots)
uses: actions/upload-artifact@v4
with:
name: e2e-smoke-ios-flask-all-test-artifacts
path: all-test-artifacts/
24 changes: 24 additions & 0 deletions .github/workflows/run-e2e-smoke-tests-ios.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ jobs:
split_number: ${{ matrix.split }}
total_splits: 4
changed_files: ${{ inputs.changed_files }}
build_type: 'main'
metamask_environment: 'qa'
secrets: inherit

trade-ios-smoke:
Expand All @@ -49,6 +51,8 @@ jobs:
split_number: ${{ matrix.split }}
total_splits: 1
changed_files: ${{ inputs.changed_files }}
build_type: 'main'
metamask_environment: 'qa'
secrets: inherit

perps-ios-smoke:
Expand All @@ -65,6 +69,8 @@ jobs:
split_number: ${{ matrix.split }}
total_splits: 1
changed_files: ${{ inputs.changed_files }}
build_type: 'main'
metamask_environment: 'qa'
secrets: inherit

wallet-platform-ios-smoke:
Expand All @@ -81,6 +87,8 @@ jobs:
split_number: ${{ matrix.split }}
total_splits: 2
changed_files: ${{ inputs.changed_files }}
build_type: 'main'
metamask_environment: 'qa'
secrets: inherit

identity-ios-smoke:
Expand All @@ -97,6 +105,8 @@ jobs:
split_number: ${{ matrix.split }}
total_splits: 2
changed_files: ${{ inputs.changed_files }}
build_type: 'main'
metamask_environment: 'qa'
secrets: inherit

accounts-ios-smoke:
Expand All @@ -113,6 +123,8 @@ jobs:
split_number: ${{ matrix.split }}
total_splits: 1
changed_files: ${{ inputs.changed_files }}
build_type: 'main'
metamask_environment: 'qa'
secrets: inherit

network-abstraction-ios-smoke:
Expand All @@ -129,6 +141,8 @@ jobs:
split_number: ${{ matrix.split }}
total_splits: 2
changed_files: ${{ inputs.changed_files }}
build_type: 'main'
metamask_environment: 'qa'
secrets: inherit

network-expansion-ios-smoke:
Expand All @@ -145,6 +159,8 @@ jobs:
split_number: ${{ matrix.split }}
total_splits: 2
changed_files: ${{ inputs.changed_files }}
build_type: 'main'
metamask_environment: 'qa'
secrets: inherit

prediction-market-ios-smoke:
Expand All @@ -161,6 +177,8 @@ jobs:
split_number: ${{ matrix.split }}
total_splits: 1
changed_files: ${{ inputs.changed_files }}
build_type: 'main'
metamask_environment: 'qa'
secrets: inherit

card-ios-smoke:
Expand All @@ -177,6 +195,8 @@ jobs:
split_number: ${{ matrix.split }}
total_splits: 1
changed_files: ${{ inputs.changed_files }}
build_type: 'main'
metamask_environment: 'qa'
secrets: inherit

ramps-ios-smoke:
Expand All @@ -193,6 +213,8 @@ jobs:
split_number: ${{ matrix.split }}
total_splits: 1
changed_files: ${{ inputs.changed_files }}
build_type: 'main'
metamask_environment: 'qa'
secrets: inherit

multichain-api-ios-smoke:
Expand All @@ -209,6 +231,8 @@ jobs:
split_number: ${{ matrix.split }}
total_splits: 1
changed_files: ${{ inputs.changed_files }}
build_type: 'main'
metamask_environment: 'qa'
secrets: inherit

report-ios-smoke-tests:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/run-e2e-workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ jobs:
test-apk-target-path: ${{ steps.determine-target-paths.outputs.test-apk-target-path }}

env:
PREBUILT_IOS_APP_PATH: artifacts/MetaMask.app
PREBUILT_IOS_APP_PATH: artifacts/${{ inputs.build_type }}-${{ inputs.metamask_environment }}-MetaMask.app
METAMASK_ENVIRONMENT: ${{ inputs.metamask_environment }}
METAMASK_BUILD_TYPE: ${{ inputs.build_type }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Expand Down
2 changes: 1 addition & 1 deletion android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionName "7.65.0"
versionCode 3418
versionCode 3607
testBuildType System.getProperty('testBuildType', 'debug')
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST"
Expand Down
Loading
Loading