Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
d55db0f
ci(INFRA-3595): Phase 3 — Namespace cache and GRADLE_USER_HOME fix fo…
alucardzom May 7, 2026
b701393
fix: show sort direction in filter bar in trending list (#29809)
sahar-fehri May 7, 2026
3c59b56
perf(accessibility): fix iOS accessibility in Predict components and …
javiergarciavera May 7, 2026
ec11b69
chore: align data fetch on stocks (#29795)
juanmigdr May 7, 2026
3e1cdcf
feat: replace assets state references for card (#29722)
bergarces May 7, 2026
99ff9c5
feat: replace assets state references confirmations (#29726)
bergarces May 7, 2026
b1d52ef
test: adds a retry to transaction finalized event checks (#29855)
christopherferreira9 May 7, 2026
37918d8
test: 2/3 Remove wdio folder: Migrate helpers out of wdio folder into…
cortisiko May 7, 2026
4bcdf93
chore: remove sites arrow (#29861)
juanmigdr May 7, 2026
c8800ec
test: add submit swap flag (#29869)
pnarayanaswamy May 7, 2026
69ab778
test: add nightly run flow for system tests (#29484)
pnarayanaswamy May 7, 2026
a515319
fix(rewards): Ondo token case inconsistency (#29871)
sophieqgu May 7, 2026
8203379
feat: add segment events for tabs UI (#29767)
vinnyhoward May 7, 2026
14422ab
chore: bullets sync during swipe and full-width sources sheet (#29851)
zone-live May 7, 2026
d0e444a
feat: swap add warning msg when EVM native reserve (#29712)
maxime-oe May 7, 2026
4711432
fix(perps): Mobile decimals on open orders (#29799)
abretonc7s May 7, 2026
3fe0354
ci: Add new translation workflow for releases (#29495)
Gudahtt May 7, 2026
d63cea6
refactor(perps): use MMDS HeaderStandard (#29703)
brianacnguyen May 7, 2026
89911ca
refactor(rewards): use MMDS HeaderStandard (#29706)
brianacnguyen May 7, 2026
229b997
refactor(trending): use MMDS HeaderStandard (#29707)
brianacnguyen May 7, 2026
dcaa40a
refactor(predict): use MMDS HeaderStandard (#29704)
brianacnguyen May 7, 2026
d4722b8
feat(STX-532): set gasIncluded to true on solana quote requests (#29692)
rarquevaux May 7, 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
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,7 @@ tests/websocket/ @MetaMask/qa
.github/workflows/run-performance-e2e.yml @MetaMask/qa
.github/workflows/run-performance-e2e-experimental.yml @MetaMask/qa
.github/workflows/run-performance-e2e-release.yml @MetaMask/qa
.github/workflows/run-system-tests.yml @MetaMask/qa
.github/scripts/e2e-*.mjs @MetaMask/qa
.github/scripts/collect-qa-stats.mjs @MetaMask/qa
.github/scripts/generate-regression-slack-summary.mjs @MetaMask/qa
Expand Down
26 changes: 20 additions & 6 deletions .github/workflows/build-android-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-android-build' || 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-lg' }} # Optimized for lg runner (48GB) with conservative memory settings
timeout-minutes: 40
env:
GRADLE_USER_HOME: /home/admin/_work/.gradle
GRADLE_USER_HOME: ${{ inputs.runner_provider == 'namespace' && '/home/runner/_work/.gradle' || '/home/admin/_work/.gradle' }}
CACHE_GENERATION: v1 # Increment this to bust the cache (v1, v2, v3, etc.)
YARN_ENABLE_GLOBAL_CACHE: 'true' # Enable Yarn global cache for faster installs
outputs:
Expand All @@ -50,7 +50,20 @@ jobs:
- name: Checkout repo
uses: actions/checkout@v6

- name: Configure Namespace cache
if: ${{ inputs.runner_provider == 'namespace' }}
uses: namespacelabs/nscloud-cache-action@15799a6b54e5765f85b2aac25b3f0df43ed571c0 # v1
with:
path: |
~/.cache/yarn
.metamask
node_modules
.yarn/cache
${{ env.GRADLE_USER_HOME }}/caches
${{ env.GRADLE_USER_HOME }}/wrapper

- name: Restore .metamask folder (Foundry download cache for install:foundryup)
if: ${{ inputs.runner_provider != 'namespace' }}
uses: actions/cache@v4
with:
path: .metamask
Expand Down Expand Up @@ -105,6 +118,7 @@ jobs:
fi

- name: Restore APKs matching fingerprint from branch cache
if: ${{ inputs.runner_provider != 'namespace' }}
id: apk-cache-restore
# This action automatically updates the cache at the end of the workflow
uses: cirruslabs/cache@bba69c6578b863ad0398ad40567bd2ef70290fe0 # v4
Expand All @@ -121,7 +135,7 @@ jobs:
key: android-apk-${{ github.ref_name }}-${{ inputs.build_type }}-${{ env.CACHE_GENERATION }}-${{ steps.generate-fingerprint.outputs.fingerprint }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}

- name: Restore APKs matching fingerprint from main cache
if: ${{ steps.apk-cache-restore.outputs.cache-hit != 'true' && github.ref_name != 'main' }}
if: ${{ inputs.runner_provider != 'namespace' && steps.apk-cache-restore.outputs.cache-hit != 'true' && github.ref_name != 'main' }}
id: apk-cache-restore-main
# This will only restore the cache, not update it
uses: cirruslabs/cache/restore@bba69c6578b863ad0398ad40567bd2ef70290fe0 # v4
Expand All @@ -141,7 +155,7 @@ jobs:
id: gradle-cache-restore
# This action automatically updates the cache at the end of the workflow
uses: cirruslabs/cache@bba69c6578b863ad0398ad40567bd2ef70290fe0 # v4
if: ${{ steps.apk-cache-restore.outputs.cache-hit != 'true' && steps.apk-cache-restore-main.outputs.cache-hit != 'true' }}
if: ${{ inputs.runner_provider != 'namespace' && steps.apk-cache-restore.outputs.cache-hit != 'true' && steps.apk-cache-restore-main.outputs.cache-hit != 'true' }}
env:
GRADLE_CACHE_VERSION: 1
with:
Expand All @@ -159,7 +173,7 @@ jobs:
- name: Restore Gradle dependencies from main cache
# This will only restore the cache, not update it
uses: cirruslabs/cache/restore@bba69c6578b863ad0398ad40567bd2ef70290fe0 # v4
if: ${{ steps.apk-cache-restore.outputs.cache-hit != 'true' && steps.apk-cache-restore-main.outputs.cache-hit != 'true' && steps.gradle-cache-restore.outputs.cache-hit != 'true' && github.ref_name != 'main' }}
if: ${{ inputs.runner_provider != 'namespace' && steps.apk-cache-restore.outputs.cache-hit != 'true' && steps.apk-cache-restore-main.outputs.cache-hit != 'true' && steps.gradle-cache-restore.outputs.cache-hit != 'true' && github.ref_name != 'main' }}
env:
GRADLE_CACHE_VERSION: 1
with:
Expand All @@ -175,7 +189,7 @@ jobs:
key: gradle-main-${{ env.GRADLE_CACHE_VERSION }}-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}

- name: Build Android E2E APKs
if: ${{ steps.apk-cache-restore.outputs.cache-hit != 'true' && steps.apk-cache-restore-main.outputs.cache-hit != 'true' }}
if: ${{ inputs.runner_provider == 'namespace' || (steps.apk-cache-restore.outputs.cache-hit != 'true' && steps.apk-cache-restore-main.outputs.cache-hit != 'true') }}
run: |
echo "🏗 Building Android E2E APKs..."
export NODE_OPTIONS="--max-old-space-size=4096"
Expand Down Expand Up @@ -218,7 +232,7 @@ jobs:
MM_PREDICT_GTM_MODAL_ENABLED: 'false'

- name: Repack APK with JS updates using @expo/repack-app
if: ${{ steps.apk-cache-restore.outputs.cache-hit == 'true' || steps.apk-cache-restore-main.outputs.cache-hit == 'true' }}
if: ${{ inputs.runner_provider != 'namespace' && (steps.apk-cache-restore.outputs.cache-hit == 'true' || steps.apk-cache-restore-main.outputs.cache-hit == 'true') }}
run: |
echo "📦 Repacking APK with updated JavaScript bundle using @expo/repack-app..."
# Use the optimized repack script which uses @expo/repack-app
Expand Down
88 changes: 88 additions & 0 deletions .github/workflows/crowdin-rc-download-translations.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
name: Crowdin Download Approved RC Translations

on:
workflow_dispatch:

jobs:
find-rc-branches:
name: Find release candidate branches
if: ${{ github.ref_name == 'main' }}
runs-on: ubuntu-latest
permissions:
pull-requests: read
outputs:
branches: ${{ steps.find-branches.outputs.branches }}
steps:
- name: Find release candidate branches
id: find-branches
uses: actions/github-script@v9
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { data: prs } = await github.rest.pulls.list({
owner: context.repo.owner,
repo: context.repo.repo,
base: 'stable',
state: 'open',
});

const releaseBranchRegex = /^release\/[0-9]+\.[0-9]+\.[0-9]+$/;

const branches = prs
.map((pr) => pr.head.ref)
.filter((branchName) => releaseBranchRegex.test(branchName));

core.info(`Found release branches: ${branches.join(',')}`);
core.setOutput('branches', JSON.stringify(branches));


download-translations:
name: Download translations
# Use `!cancelled()` to ensure this runs even when `find-rc-branches` is skipped
if: ${{ !cancelled() }}
needs: [find-rc-branches]
runs-on: ubuntu-latest
timeout-minutes: 3

strategy:
matrix:
# If run on `main`, we download translations for all RCs
# If run on a non-default branch, we just download translations for that individual branch
branch: >-
${{
github.ref_name == 'main' &&
fromJson(needs.find-rc-branches.outputs.branches) ||
fromJson(format('[{0}]', github.ref_name))
}}

steps:
- name: Checkout
uses: actions/checkout@v3
with:
ref: ${{ matrix.branch }}
# Use PAT to ensure that the commit later can trigger status check workflows
token: ${{ secrets.METAMASKBOT_CROWDIN_TOKEN }}

- name: crowdin download approved translations
uses: crowdin/github-action@a3160b9e5a9e00739392c23da5e580c6cabe526d
with:
upload_sources: false
upload_translations: false # disabled to prevent translations overwriting Blends translations
download_translations: true # created separate action to pull down completed translations
export_only_approved: true

crowdin_branch_name: ${{ matrix.branch }}
pull_request_base_branch_name: ${{ matrix.branch }}
localization_branch_name: l10n_crowdin_translations_${{ matrix.branch }}
pull_request_title: 'chore: New Crowdin Translations for ${{ matrix.branch }}'
skip_ref_checkout: true
# This will be in dry-run mode until after we've tested this on `main`
dryrun_action: true

github_user_name: metamaskbot
github_user_email: metamaskbot@users.noreply.github.com
env:
GITHUB_TOKEN: ${{ secrets.METAMASKBOT_CROWDIN_TOKEN }}
GITHUB_ACTOR: metamaskbot
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
33 changes: 33 additions & 0 deletions .github/workflows/crowdin-rc-upload-sources.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: Crowdin Upload RC Sources

on:
workflow_dispatch:

jobs:
upload-sources:
runs-on: ubuntu-latest
timeout-minutes: 3

steps:
- name: Checkout
uses: actions/checkout@v3
with:
# Use PAT to ensure that the commit later can trigger status check workflows
token: ${{ secrets.METAMASKBOT_CROWDIN_TOKEN }}

- name: crowdin upload sources
uses: crowdin/github-action@a3160b9e5a9e00739392c23da5e580c6cabe526d
with:
crowdin_branch_name: ${{ github.ref_name }}
upload_sources: true
upload_translations: false # disabled to prevent translations overwriting Blends translations
download_translations: false # created separate action to pull down completed translations
# This will be in dry-run mode until after we've tested this on `main`
dryrun_action: true
github_user_name: metamaskbot
github_user_email: metamaskbot@users.noreply.github.com
env:
GITHUB_TOKEN: ${{ secrets.METAMASKBOT_CROWDIN_TOKEN }}
GITHUB_ACTOR: metamaskbot
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
Loading
Loading