Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
247 commits
Select commit Hold shift + click to select a range
7d8ae22
feat(predict): expand extended sports leagues cp-8.6.0 (#33943)
ghgoodreau Jul 30, 2026
0b058b1
feat(wallet): hide the Money card while the onboarding checklist show…
vinnyhoward Jul 30, 2026
79d4f44
fix(predict): route funding Track to redesigned activity details and …
vinnyhoward Jul 30, 2026
e14b6b5
perf: memoize PriceChart priceList map out of render body (#33895)
cursor[bot] Jul 30, 2026
9f2c44e
feat(perps): add account bottom sheet and polish Pro market view (#34…
aganglada Jul 30, 2026
7d31fad
feat: MUSD-1229 Update money-acount-balance-service cp-8.6.0 (#34084)
Matt561 Jul 30, 2026
0553859
feat: initialise new defi controller (#34000)
bergarces Jul 30, 2026
d4b2aed
feat(tooling): integrate daily anonymizer for usage metrics collectio…
NicolasMassart Jul 31, 2026
c0e74da
test(e2e): migrate wallet/ smoke specs to Appium (MMQA-2006) (#34077)
vivek-consensys Jul 31, 2026
1aa13f3
fix(assets): stable FlashList keys in SearchTokenResults (#33814)
cursor[bot] Jul 31, 2026
48a7fbf
feat(perps): wire Pro order form to state and submission (#33950)
geositta Jul 31, 2026
18737cb
fix(assets): memoize selectTokensByAddress for referential stability …
cursor[bot] Jul 31, 2026
2f7c0a4
chore: wire stellar asset component with stellar asset selector (#34048)
stanleyyconsensys Jul 31, 2026
0ad0074
chore: removes quickbuy keyboard abtest and feature flag cp-8.6.0 (#3…
joaosantos15 Jul 31, 2026
37b7180
feat(perps): add About section on Lite market details (#33999)
michalconsensys Jul 31, 2026
ea168fb
feat: integrate money account utils (#33849)
Jwhiles Jul 31, 2026
7c1237a
feat(confirmations): show metamask pay quote errors in alert (#32932)
matthewwalsh0 Jul 31, 2026
030600b
refactor: cp-8.6.0 split getMetaMaskPayProperties into focused proper…
OGPoyraz Jul 31, 2026
8b1c03a
feat(money): add `moneyAccountBalanceSource` to the feature-flag regi…
ffmcgee725 Jul 31, 2026
949640a
fix(perps): polish Pro trading layout and available balance (#34115)
aganglada Jul 31, 2026
d21fe1b
test(e2e): migrate Background Events Snap smoke to Appium (#34101)
cmd-ob Jul 31, 2026
6bf386b
refactor(pay): extract custom-amount inline components (#34092)
matthewwalsh0 Jul 31, 2026
cde69d0
fix: TSA-962 skip top traders fetch while wallet is locked cp-8.6.0 (…
joaosantos15 Jul 31, 2026
55373dc
test(e2e): restore serial session reuse for collapsed Snap Appium sui…
cmd-ob Jul 31, 2026
3c3df92
feat: show CDN fallback for gas fee token icons (CONF-1739) (#34040)
dan437 Jul 31, 2026
7e6129a
feat(ci): reuse fingerprint + JS repack for performance BS builds (MM…
javiergarciavera Jul 31, 2026
faaf120
feat(perps): wire Pro positions panel actions and filters (#34112)
michalconsensys Jul 31, 2026
7b83cbf
fix: browser back from Market Insights news returns to Market Insight…
joaosantos15 Jul 31, 2026
a16ab5d
test: migrate confirmation send tests to appium (#34069)
pnarayanaswamy Jul 31, 2026
dbad661
feat: add homepage balance breakdown experiment (#33981)
PatrykLucka Jul 31, 2026
d4875f9
chore(navbar): remove un-used navbar functions (#34087)
weitingsun Jul 31, 2026
a92a78a
test: MMQA - 2026 - [Mobile] Remove anti-patterns from performance/mm…
LeVinhGithub Jul 31, 2026
6509733
feat(predict): make sports feed filters follow active tab cp-8.6.0 (#…
caieu Jul 31, 2026
2b98e96
test(e2e): migrate Image Snap smoke to Appium (#34124)
cmd-ob Jul 31, 2026
9b2ba6b
test(e2e): migrate Get File Snap smoke to Appium (#34123)
cmd-ob Jul 31, 2026
7c0d60c
fix: report the real network name in Blockaid false-positive reports …
adonesky1 Jul 31, 2026
b6c1f97
feat(metamask-pay): track quote errors in transaction events (#33332)
matthewwalsh0 Jul 31, 2026
2b8c995
chore: bump snap-account-service (report migration error) cp-8.6.0 (#…
ccharly Jul 31, 2026
df8adc8
feat(money): add device-tilt parallax to Money card thumbnails (MUSD-…
Kureev Jul 31, 2026
d16b6f6
test(e2e): migrate Network Access Snap smoke to Appium (#34131)
cmd-ob Aug 1, 2026
76e46de
test(e2e): migrate Dialog Snap smoke to Appium (#34120)
cmd-ob Aug 1, 2026
d6f7187
test(e2e): stop forcing native context in Appium Assertions (#34165)
cmd-ob Aug 1, 2026
9ddf0a3
fix(browser): keep dapps in-app via WebView source.uri (#33879)
joaoloureirop Aug 1, 2026
ee7fac8
fix: MUSD-1240 [Bug] Money Home "7% APY" text cut off on Google Pixel…
Matt561 Aug 1, 2026
5b0ba41
fix(agentic-cli): abort CLI wait when Mobile cancels QR login (#33964)
tylerc-consensys Aug 3, 2026
06d0978
fix(stellar): XLM spendable balance with mask when privacy mode is on…
stanleyyconsensys Aug 3, 2026
07a78ab
test(appium): session reuse + soft reload and smoke shard rebalance (…
cmd-ob Aug 3, 2026
920629a
feat(ci): add @metamaskbot create-testflight-build-{exp,rc} PR comman…
joaosantos15 Aug 3, 2026
2d40b62
test(e2e): migrate Ethereum Provider Snap smoke to Appium (#34121)
cmd-ob Aug 3, 2026
e9c5bd3
test(e2e): migrate Get Entropy Snap smoke to Appium (#34122)
cmd-ob Aug 3, 2026
7cd818f
test(e2e): migrate Manage State Snap smoke to Appium (#34127)
cmd-ob Aug 3, 2026
4dac5cf
test(e2e): migrate Name Lookup Snap smoke to Appium (#34130)
cmd-ob Aug 3, 2026
597f88a
test(e2e): migrate Preinstalled Snap smoke to Appium (#34132)
cmd-ob Aug 3, 2026
b42b349
chore: revert add @metamaskbot create-testflight-build PR command (#3…
joaosantos15 Aug 3, 2026
78e4026
test(e2e): migrate BIP-32 Snap smoke to Appium (#34102)
cmd-ob Aug 3, 2026
5884d18
ci(e2e): run Appium iOS on PRs that change smoke-appium (#34164)
cmd-ob Aug 3, 2026
98587ce
test(e2e): migrate Snap Management smoke to Appium (#34128)
cmd-ob Aug 3, 2026
8b44ec0
test(e2e): migrate BIP-44 Snap smoke to Appium (#34103)
cmd-ob Aug 3, 2026
fdb1979
test(e2e): migrate Interactive UI Snap smoke to Appium (#34169)
cmd-ob Aug 3, 2026
fcd4b89
feat: prefetch Money Account deposit quotes while typing (#33512)
pedronfigueiredo Aug 3, 2026
7555702
test: migrate api-specs from Detox to Appium (MMQA-1988) (#34119)
vivek-consensys Aug 3, 2026
9e6a9dd
test(e2e): remove unused Detox smoke performance suite (#34183)
vivek-consensys Aug 3, 2026
d8a7453
fix(card): hide change asset on card dashboard when money account is …
ffmcgee725 Aug 3, 2026
6c348c9
feat: add visual test agent (#33858)
cryptotavares Aug 3, 2026
330651e
feat(analytics): fire App Opened on cold start with type and source p…
vinnyhoward Aug 3, 2026
ccb432a
feat(onboarding): skip checklist Notifications step after the OS push…
vinnyhoward Aug 3, 2026
5a5bb05
fix(card): defer home data fetch and fix Money loading flash (#34021)
Brunonascdev Aug 3, 2026
61245b1
fix(ci): pass test-source-prefix for Appium Playwright health report …
cmd-ob Aug 3, 2026
7521a28
fix(predict): block duplicate order submission during in-flight place…
ghgoodreau Aug 3, 2026
72da947
feat(perf): track RC performance results in Sentry and Slack (observe…
javiergarciavera Aug 3, 2026
6f1fab5
fix: round down money account Max/withdraw amounts past balance cp-8.…
jpuri Aug 3, 2026
beb4eba
fix(perf): prefer fresh BrowserStack APK URLs (#34211)
javiergarciavera Aug 3, 2026
fe4deaf
fix(perps): route funding Track to redesigned activity details and sh…
vinnyhoward Aug 3, 2026
53b3b1e
test(e2e): migrate JSX + Multichain Provider Snap smokes to Appium (#…
cmd-ob Aug 3, 2026
3aa4425
fix(bridge): restore hardware wallet post-trade modal after swap (#33…
bfullam Aug 3, 2026
46d1eff
chore(predict): remove world cup related files and components (#33625)
caieu Aug 3, 2026
4b8732a
ci: exclude Android native build intermediates from E2E yarn cache (#…
andrepimenta Aug 3, 2026
a05fe09
chore: bump `@metamask/phishing-controller` to 17.3.1 (#34158)
adonesky1 Aug 3, 2026
c767daf
refactor(card): remove Immersve program-ID selector and temporary ove…
Brunonascdev Aug 3, 2026
7e62a68
perf(useTokenLogo): stabilize default Set params and memoize handlers…
cursor[bot] Aug 3, 2026
bbd9ec9
fix: fail fast in set-secrets-from-config.js when ALL_SECRETS is miss…
tommasini Aug 3, 2026
4f6fb34
chore(confirmations): remove unreachable dead code and unused barrels…
brianacnguyen Aug 4, 2026
a7847f8
fix: apply top safe-area inset to Add Device back button on iOS (#34185)
grvgoel81 Aug 4, 2026
9d5ca90
fix(sentry): use a single clock domain for span start and end times (…
smgv Aug 4, 2026
a39af59
refactor(react-compiler issue): migrate ImportFromSecretRecoveryPhras…
smgv Aug 4, 2026
8dead5a
feat(perps): switch market when tapping a Pro positions/orders row (#…
michalconsensys Aug 4, 2026
269c726
test(e2e): migrate remaining Perps Detox smokes to Appium (#34201)
cmd-ob Aug 4, 2026
1bb13fe
feat: enable max-amount withdraw to Money Account vault via post-Rela…
OGPoyraz Aug 4, 2026
53a3ca5
test(e2e): Android WebView CDP scroll for Appium snaps (#34235)
cmd-ob Aug 4, 2026
45de229
test: multichain tests Appium migration (#34151)
davibroc Aug 4, 2026
67486d2
chore(e2e): Appium docs SSOT + ban new UnifiedGestures imports (#34237)
cmd-ob Aug 4, 2026
0d5d443
release: Bump main version to 8.7.0 (#34242)
metamask-ci[bot] Aug 4, 2026
5e77eb4
test: fix predict flaky cv test (#34241)
racitores Aug 4, 2026
1d20f11
test: reduce Predict unit/CV overlap (MMQA-2104) (#34197)
racitores Aug 4, 2026
52bf22d
fix: Monad send native reduced amount ux glitch (#34150)
maxime-oe Aug 4, 2026
0eeac7e
chore(assets): stable FlashList keys in ConfirmAddAsset (#34238)
cursor[bot] Aug 4, 2026
f0b7e08
fix(perps): fill limit price on Pro order book row tap (#34202)
michalconsensys Aug 4, 2026
9aaa205
fix(money): open support from the Money kebab menu without dismissing…
Kureev Aug 4, 2026
2e2a747
chore(earn): remove unreachable dead code (#34030)
brianacnguyen Aug 4, 2026
a050a94
feat(confirmations): block MM Pay CTAs until pay amount lands (#33983)
dan437 Aug 4, 2026
f525a7e
fix: support Perps withdrawals for externally delegated accounts (#34…
pedronfigueiredo Aug 4, 2026
6a4593f
feat: defi positions v2 controller (#33488)
bergarces Aug 4, 2026
20bbba0
fix: unblock Money Account rows while quotes load (#34244)
pedronfigueiredo Aug 4, 2026
d9475c6
chore(e2e): remove TestHelpers debt + split WalletView (MMQA-2173) (#…
cmd-ob Aug 4, 2026
3a5a4b3
fix: pressing on swaps search result not selecting token (#34212)
infiniteflower Aug 4, 2026
f931cf3
chore(core-platform): remove unreachable dead code (#34034)
brianacnguyen Aug 4, 2026
a9ee088
feat(perps): move market About section below Stats cp-8.6.0 (#34252)
michalconsensys Aug 4, 2026
001906c
refactor(confirmations): migrate staking and TemplateRenderer Text to…
brianacnguyen Aug 4, 2026
060d0b3
test: assert Whats New Link Clicked feature and action props (#34214)
hjetpoluru Aug 4, 2026
76d81ba
fix(money): tilt the Money card on both axes with card_tilt_v1.4 (MUS…
Kureev Aug 4, 2026
beba8bf
fix(locales): replace ampersands with "and" in user-facing strings (#…
alidotforrest Aug 4, 2026
d157a0d
fix: TSA-970 header layout shift on Follow Trading screens cp-8.6.0 (…
joaosantos15 Aug 4, 2026
5929b35
perf(add-asset): virtualize the AddAsset network list bottom sheet (#…
cursor[bot] Aug 4, 2026
5d35d85
refactor(perps): migrate Adjust Margin to MMDS Slider and HelpText (#…
brianacnguyen Aug 4, 2026
175b2cb
fix: Refine right transition animation to improve perceived performan…
amandaye0h Aug 4, 2026
68f4d4c
fix: deep links foreground notifications (#33662)
kirillzyusko Aug 4, 2026
2c3f5da
fix: swap ARC prevent native pre-select (#32212)
maxime-oe Aug 4, 2026
af58537
chore(ramp): adopt core-owned Headless Buy default redirect URL (#34207)
saustrie-consensys Aug 4, 2026
9c4db58
chore(navigation): land v6-safe prep for React Navigation 7 (phase 1)…
weitingsun Aug 4, 2026
aef49db
ci: add extra shard for cv test (#34239)
racitores Aug 4, 2026
77785f8
chore: remove unused failing workflow (#34275)
Gudahtt Aug 4, 2026
39bec91
feat: add defi controller v2 flag to homepage (#34288)
bergarces Aug 4, 2026
f7bc233
fix(perps): correct Pro copy for size label, order pills, and side fi…
aganglada Aug 4, 2026
6bdff52
fix: patch smart-transactions-controller to add the tx-sentinel robin…
rarquevaux Aug 4, 2026
0aa5ae3
refactor(perps): migrate leverage bottom sheet to MMDS slider layout …
brianacnguyen Aug 4, 2026
de179f5
feat: consolidate scam questionnaire analytics events (#34219)
imblue-dabadee Aug 4, 2026
643bcb2
chore: performance tests refactor (#34163)
jvbriones Aug 4, 2026
33392ef
fix(activity): show swap and bridge activity correctly on token detai…
vinnyhoward Aug 4, 2026
83ca9f1
chore(navigation): de-brittle native-stack test mocks for v7 prep (#3…
weitingsun Aug 4, 2026
817b1a8
fix(TMCU-1045): Remove useElevatedSurface shim from Core UX bottom sh…
georgewrmarshall Aug 4, 2026
fa9363f
feat: add SRP tagging at login time (#34300)
mathieuartu Aug 4, 2026
056ac5a
chore(navigation): declare modal presentation for RootModalFlow and C…
weitingsun Aug 4, 2026
3f41326
chore: New Crowdin Translations by GitHub Action cp-8.6.0 (#34020)
metamask-ci[bot] Aug 4, 2026
a647251
chore(stellar): stellar preparation PR - 2 (#34233)
stanleyyconsensys Aug 4, 2026
05fd4b7
fix(perps): prevent invalid asset errors after device lock (#34256)
abretonc7s Aug 5, 2026
727a2cd
feat(predict): add Trade Considered analytics event (#34217)
ghgoodreau Aug 5, 2026
df8985d
fix(TMCU-1046): remove useElevatedSurface shim from onboarding Bottom…
georgewrmarshall Aug 5, 2026
61d6e3a
fix(confirmations): remove redundant useElevatedSurface from MMDS Bot…
georgewrmarshall Aug 5, 2026
6aa19e4
fix: update Agent CLI QR login copy (#34174)
tylerc-consensys Aug 5, 2026
229f2d9
test: fixing seedless performance tests (#34200)
javiergarciavera Aug 5, 2026
df8b73d
fix: TSA-969 header layout shift on What's Happening detail view (#34…
joaosantos15 Aug 5, 2026
b3c38c0
fix(snaps): Ensure `fontWeight` is properly inherited (#34319)
FrederikBolding Aug 5, 2026
a5df6a2
test(e2e): migrate token-approve confirmations to Appium (MMQA-2189) …
vivek-consensys Aug 5, 2026
ce6aa5e
chore(assets): memoize PriceChartContext provider value (#34318)
cursor[bot] Aug 5, 2026
1cc15e4
fix(assets): remove useElevatedSurface shim from Assets MMDS BottomSh…
georgewrmarshall Aug 5, 2026
0d3113d
fix(login): end Login User Interaction on biometric unlock (#33960)
tylerc-consensys Aug 5, 2026
80e0c1e
fix: TSA-971 filter sheet last option hidden by the Android nav bar c…
joaosantos15 Aug 5, 2026
0d123d0
chore: track asset_id on token watchlisted (#34262)
juanmigdr Aug 5, 2026
e98bb97
fix: apply Max path for money account deposit prefills cp-8.6.0 (#34327)
jpuri Aug 5, 2026
4a61f75
feat(perps): add order edit trading and stream foundations (#34323)
aganglada Aug 5, 2026
e004618
feat: add QuickNode failover URLs for zkSync Era and MegaETH (#34215)
cryptodev-2s Aug 5, 2026
29ede59
fix: merge foreign EIP-7702 auths in Gas Station publish hook cp-8.6.…
jpuri Aug 5, 2026
e8fa218
refactor(perps): unify market headers and slide-up market list (#34282)
aganglada Aug 5, 2026
e70fe74
fix(walletconnect): match WC metadata to permission origin on connect…
joaoloureirop Aug 5, 2026
7e5c07e
test(appium): stabilize multi-SRP account list and Snap OK alert dism…
cursor[bot] Aug 5, 2026
c65cefa
feat(perps): Pro open-order price and size edit (#34342)
aganglada Aug 5, 2026
84dbf63
test: Migrate network expansion E2E tests to Appium (#34199)
davibroc Aug 5, 2026
4dbe117
fix: skip gas sponsorship reserve warning for MM Pay transactions cp-…
jpuri Aug 5, 2026
b4d369a
feat: bump defi v2 controller (#34265)
bergarces Aug 5, 2026
7374ec2
feat: mirror token watchlist add/remove to Price Alerts (#34343)
salimtb Aug 5, 2026
b0be128
fix: MMQA-remove-system-tags-from-performance (#34341)
javiergarciavera Aug 5, 2026
5ba24a9
feat(predict): add Trade Completed analytics event (#34218)
ghgoodreau Aug 5, 2026
0dbe233
fix: stop MM Pay Max from stranding Loading on dust or unchanged amou…
jpuri Aug 5, 2026
a692f4f
feat: add Homepage search entrypoint, swap Explore tab icon, instrume…
vinnyhoward Aug 5, 2026
a64aa86
fix: skip money account total insufficient alert on Max deposits cp-8…
jpuri Aug 5, 2026
3828f7a
fix(walletconnect): restore per-session channel id as the Snap reques…
adonesky1 Aug 5, 2026
cfec3ee
feat: gate scam questionnaire behind LaunchDarkly remote flag (#34297)
imblue-dabadee Aug 5, 2026
852346e
feat(appium): per-phase timing telemetry for smoke tests (#34335)
cmd-ob Aug 5, 2026
035e30b
feat(card): show Immersve region legal docs on SignUp and Card Home (…
wachunei Aug 5, 2026
92d334a
fix: clear Transak token on wallet setup (#31522)
amitabh94 Aug 5, 2026
bc3233b
fix(perps): remove useElevatedSurface shim from Perps BottomSheets (T…
georgewrmarshall Aug 5, 2026
ef05471
perf: remove whole-state passthrough inputs from account token select…
cursor[bot] Aug 5, 2026
1e84a54
fix(predict): accept valid no-op payment routes (#34350)
caieu Aug 5, 2026
308df1f
fix(ci): use cherry-pick version from PR title for release labels (#…
sleepytanya Aug 5, 2026
b568871
ci: gate expo dev builds on native fingerprint changes (#34249)
tommasini Aug 5, 2026
2046e6a
fix(activity): align perps filter labels and pluralize the Orders buc…
vinnyhoward Aug 5, 2026
8869f68
test: skip Appium MMConnect multichain browser connect suite (#34354)
vivek-consensys Aug 6, 2026
a8e4256
test(appium): harden session reuse against soft-reload device failure…
cmd-ob Aug 6, 2026
bd03cfa
fix: cp-8.6.0 Fix re-selecting selected token in pay-with-modal (#34337)
OGPoyraz Aug 6, 2026
dd2f1d8
fix: show informative error for Ledger V3 typed data signing (#31677)
dawnseeker8 Aug 6, 2026
cb85dc0
fix: keep SRP backspace focus at end of previous word (#34383)
grvgoel81 Aug 6, 2026
756511f
refactor(confirmations): migrate banners to MMDS BannerAlert (#34374)
brianacnguyen Aug 6, 2026
1b9305d
fix(perps): remove local env fallback for Pro mode feature flag (#34390)
aganglada Aug 6, 2026
d42ec59
feat: add somnia support (#34146)
maxime-oe Aug 6, 2026
c85973a
test: skip Appium token approve smoke suites (#34387)
vivek-consensys Aug 6, 2026
756e897
test(e2e): Android WebView CDP paths for tap, fill, read, select, blu…
cmd-ob Aug 6, 2026
4e92741
fix(perps): correct mode-aware navigation and market switching (#34326)
michalconsensys Aug 6, 2026
dedf813
test: Migrate network abstraction E2E tests to appium (#34353)
davibroc Aug 6, 2026
9488fc9
feat(agentic-cli): use push onboarding bottom sheet for CLI login nud…
tylerc-consensys Aug 6, 2026
6ab2ede
fix(money): adjust earnings tooltip sheet spacing, close button and b…
Kureev Aug 6, 2026
09a8115
feat(ramps): instrument Buy E2E CUF with Sentry performance tracing (…
roz0n Aug 6, 2026
158d891
fix(perps): repair Pro order form keyboard and input issues (#34227)
geositta Aug 6, 2026
3909cf8
fix(money): realign Money account header spacing with Home (MUSD-1245…
Kureev Aug 6, 2026
c53f811
fix(card): add cross-device guardrail that prevents a single money ac…
ffmcgee725 Aug 6, 2026
5626d70
test: fix appium stale webview cdp cache (#34400)
davibroc Aug 6, 2026
a2a221b
fix: cp-8.6.0 Fix unintentional `no_pay_token_quotes` alert triggers …
OGPoyraz Aug 6, 2026
be84d92
feat(perps): update mobile to latest perps controller version (#34385)
abretonc7s Aug 6, 2026
2d1c72a
refactor(ramps): move provider-compatibility switch to RampsControlle…
saustrie-consensys Aug 6, 2026
f6a29a0
fix(perps): make Pro order book numbers readable at any price scale (…
michalconsensys Aug 6, 2026
96ae46f
fix: keep QuickBuy quick-amount K/M suffixes visible at large font si…
joaosantos15 Aug 6, 2026
128ed36
feat(perps): add market filter toggle to Orders tab (#34351)
michalconsensys Aug 6, 2026
d8911c8
fix(appium): restore phase timing capture across Playwright use() (#3…
cmd-ob Aug 6, 2026
e95d2e8
chore: deprecate non-EVM pre-Unified Send Flow code (#34397)
ulissesferreira Aug 6, 2026
388e5ed
fix: update `selectedSelectedInternalAccount` to not capture exceptio…
hmalik88 Aug 6, 2026
f3ae029
feat: Swaps CTA button AB test (#34306)
infiniteflower Aug 6, 2026
acd6d5f
refactor(confirmations): migrate BottomSheet components to MMDS (#34308)
brianacnguyen Aug 6, 2026
9c38522
fix(NetworkListBottomSheet): wrap FlashList in Box for better bottom …
Prithpal-Sooriya Aug 6, 2026
d530f7a
fix: wallet activity notif settings first account toggle (#34247)
zelkibuilds Aug 6, 2026
e31f16b
fix(predict): keep PWAT auto-select on betslip reopen (#34371)
caieu Aug 6, 2026
70d360f
refactor(confirmations): migrate alert-modal buttons to MMDS Button (…
brianacnguyen Aug 6, 2026
4328148
test(e2e): migrate confirmations transactions smokes to Appium (MMQA-…
vivek-consensys Aug 6, 2026
0b21fe8
fix(social): remove useElevatedSurface shim from Social & AI BottomSh…
georgewrmarshall Aug 6, 2026
4fdb11e
fix(ci): make artifact availability, not run completion, decide reusa…
tommasini Aug 6, 2026
4a7825c
fix(activity): restore the block-explorer sheet for cross-chain bridg…
vinnyhoward Aug 6, 2026
85d5c92
fix(activity): replace "Swap again" with "Lend again" on lending acti…
vinnyhoward Aug 6, 2026
c10041b
feat: MUSD-1256 Update money deposit footer CTA button padding on tok…
Matt561 Aug 6, 2026
a8829c8
chore: remove unmountOnBlur option (#34363)
weitingsun Aug 6, 2026
85d96b7
chore: upgrade design system packages (v58.0.0) (#34430)
georgewrmarshall Aug 7, 2026
15be657
fix(ci): stop .gitignore edits from invalidating every cached native …
tommasini Aug 7, 2026
6c2388b
fix(ci): stop E2E gating logic from invalidating the native fingerpri…
tommasini Aug 7, 2026
c977ad5
fix(ci): re-check for a reusable Android build before starting the co…
tommasini Aug 7, 2026
cc8432d
fix(activity): correct the Network row on MetaMask Pay funding activi…
vinnyhoward Aug 7, 2026
e3517cc
feat: move seedless Appium coverage to CV/unit (#34172)
grvgoel81 Aug 7, 2026
f6f1daa
fix(perps): polish Pro market UI and order form interactions cp-8.7.0…
aganglada Aug 7, 2026
c179e48
feat(perps): add Lite/Pro mode selection bottom sheet cp-8.7.0 (#34395)
michalconsensys Aug 7, 2026
95866e1
chore(runway): cherry-pick fix(social-leaderboard): keep QuickBuy Sel…
runway-github[bot] Aug 7, 2026
6d23e24
[skip ci] Bump version number to 6396
metamaskbot Aug 7, 2026
c322747
chore(runway): cherry-pick fix(settings): update notifications settin…
runway-github[bot] Aug 7, 2026
bac0ad4
chore(runway): cherry-pick fix(perps): fix truncated market names and…
runway-github[bot] Aug 7, 2026
d244fbc
[skip ci] Bump version number to 6399
metamaskbot Aug 7, 2026
c0d10cf
chore(runway): cherry-pick fix: hide foreground wallet_activity notif…
runway-github[bot] Aug 7, 2026
ecb19cd
[skip ci] Bump version number to 6400
metamaskbot Aug 7, 2026
824b243
chore(runway): cherry-pick feat: add Pro only reduce only validation …
runway-github[bot] Aug 7, 2026
2bf9347
[skip ci] Bump version number to 6405
metamaskbot Aug 7, 2026
e82aa46
release: release-changelog/8.7.0 (#34443)
metamask-ci[bot] Aug 8, 2026
7a2e8ab
[skip ci] Bump version number to 6409
metamaskbot Aug 8, 2026
b9819c5
chore(runway): cherry-pick fix(perps): commit cleaned USD amount on b…
runway-github[bot] Aug 9, 2026
e255c5b
[skip ci] Bump version number to 6418
metamaskbot Aug 9, 2026
901a677
merge stable and fix conflicts
tommasini Aug 11, 2026
534bd69
[skip ci] Bump version number to 6430
metamaskbot Aug 11, 2026
3aa5e73
fix: duplication of selectors (#34614)
tommasini Aug 11, 2026
f5850e1
[skip ci] Bump version number to 6440
metamaskbot Aug 11, 2026
ed45e99
release: revert run-performance-e2e.yml to what it was when this rele…
HowardBraham Aug 11, 2026
7f909a5
[skip ci] Bump version number to 6441
metamaskbot Aug 11, 2026
ab0a662
chore(runway): cherry-pick chore: point to v1 of stable-sync github t…
runway-github[bot] Aug 11, 2026
82cf06d
[skip ci] Bump version number to 6442
metamaskbot Aug 11, 2026
f790d1f
chore(runway): cherry-pick ci(release): apply build numbers at build …
runway-github[bot] Aug 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .depcheckrc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ ignores:
# ESBuild is used for AI E2E script compilation
- 'esbuild'
- 'esbuild-register'
# Used via `node -r @babel/register` in package.json scripts (not an import)
- '@babel/register'
# tsx runs all scripts/tooling/*.ts files directly (CLI wrapper, MCP server, yarn pre/post hooks, report CLI)
- 'tsx'
# agent-device is used as a CLI (`yarn agent-device`), not imported
Expand Down Expand Up @@ -152,6 +154,9 @@ ignores:
# Used in Yarn plugin for preview builds
- '@yarnpkg/core'

# Consumed by the Yarn plugin and agent hooks, outside of app source
- '@metamask/tooling-insight'

# Babel plugins referenced in babel.config.js by their short name (without
# the `babel-plugin-` prefix). Babel resolves them correctly at build time
# but depcheck doesn't recognize the indirect reference. See babel.config.js
Expand Down
9 changes: 0 additions & 9 deletions .detoxrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,6 @@ module.exports = {
retries: process.env.CI ? 1 : 0,
},
configurations: {
'ios.sim.apiSpecs': {
device: 'ios.simulator',
app: process.env.CI ? `ios.${process.env.METAMASK_BUILD_TYPE}.release` : 'ios.debug',
testRunner: {
args: {
"$0": "node tests/smoke/api-specs/run-api-spec-tests.js",
},
},
},
'android.emu.main': {
device: 'android.emulator',
app: 'android.debug',
Expand Down
5 changes: 5 additions & 0 deletions .e2e.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ export PREBUILT_ANDROID_TEST_APK_PATH='build/MetaMask-Test.apk'
# export SKIP_APP_REINSTALL=true
export SKIP_APP_REINSTALL=false

# Playwright Appium: reuse one WebDriver session per worker (emulator/simulator).
# Default is on when unset. Set false to force per-test deleteSession (rollback).
# BrowserStack ignores this and never reuses sessions.
# export APPIUM_SESSION_REUSE=false

export TEST_SRP_1=
export TEST_SRP_2=
export TEST_SRP_3=
Expand Down
53 changes: 49 additions & 4 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,6 @@ const utilNumberImportBurndownFiles = [
'app/components/UI/Stake/components/StakingBalance/StakingBanners/ClaimBanner/ClaimBanner.tsx',
'app/components/UI/Stake/components/StakingConfirmation/TokenValueStack/TokenValueStack.test.tsx',
'app/components/UI/Stake/components/StakingConfirmation/TokenValueStack/TokenValueStack.tsx',
'app/components/UI/Stake/components/StakingConfirmation/YouReceiveCard/YouReceiveCard.test.tsx',
'app/components/UI/Stake/components/StakingConfirmation/YouReceiveCard/YouReceiveCard.tsx',
'app/components/UI/Stake/hooks/useBalance.ts',
'app/components/UI/UrlAutocomplete/Result.tsx',
'app/components/Views/GasEducationCarousel/index.js',
Expand All @@ -98,9 +96,7 @@ const utilNumberImportBurndownFiles = [
'app/components/Views/confirmations/components/info/typed-sign-v3v4/simulation/components/native-value-display/native-value-display.tsx',
'app/components/Views/confirmations/components/info/typed-sign-v3v4/simulation/components/value-display/value-display.tsx',
'app/components/Views/confirmations/components/transactions/custom-amount/custom-amount.tsx',
'app/components/Views/confirmations/context/send-context/utils.ts',
'app/components/Views/confirmations/external/staking/hooks/useStakingDetails.ts',
'app/components/Views/confirmations/hooks/earn/useCustomAmount.tsx',
'app/components/Views/confirmations/hooks/gas/useCancelSpeedupGas/useCancelSpeedupGas.ts',
'app/components/Views/confirmations/hooks/send/useBalance.ts',
'app/components/Views/confirmations/hooks/send/useCurrencyConversions.ts',
Expand Down Expand Up @@ -263,6 +259,55 @@ module.exports = {
],
},
},
// MMQA-2174 / MMQA-2173: re-apply after *.{ts,tsx} override which replaces no-restricted-syntax
{
files: ['tests/page-objects/**/*.{js,ts}', 'tests/flows/**/*.{js,ts}'],
excludedFiles: [
'tests/page-objects/**/*.test.ts',
'tests/page-objects/**/*.test.js',
'tests/flows/**/*.test.ts',
'tests/flows/**/*.test.js',
],
rules: {
// UnifiedGestures Identifier stays out of this error list so legacy PO
// usages remain warn-only via no-restricted-imports (MMQA-2174).
'no-restricted-syntax': [
'error',
{
selector: 'WithStatement',
message: 'With statements are not allowed',
},
{
selector: 'SequenceExpression',
message: 'Sequence expressions are not allowed',
},
],
},
},
{
files: ['tests/smoke-appium/**/*.{js,ts}', 'tests/smoke/**/*.{js,ts}'],
excludedFiles: [
'tests/smoke-appium/**/*.test.ts',
'tests/smoke/**/*.test.ts',
],
rules: {
'no-restricted-syntax': [
'error',
{
selector: 'WithStatement',
message: 'With statements are not allowed',
},
{
selector: 'SequenceExpression',
message: 'Sequence expressions are not allowed',
},
{
selector: "Identifier[name='UnifiedGestures']",
message: 'Use Gestures instead of UnifiedGestures.',
},
],
},
},
{
files: ['*.js', '*.jsx'],
parser: '@babel/eslint-parser',
Expand Down
6 changes: 1 addition & 5 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ scripts/build.sh @MetaMask/mobile-pla
fingerprint.config.js @MetaMask/mobile-platform
builds.yml @MetaMask/mobile-platform
.github/workflows/generate-build-version.yml @MetaMask/mobile-platform
.github/workflows/commit-build-version.yml @MetaMask/mobile-platform
.github/workflows/push-eas-update.yml @MetaMask/mobile-admins
.github/workflows/build-and-upload-to-testflight.yml @MetaMask/mobile-admins
.github/workflows/upload-to-testflight.yml @MetaMask/mobile-admins
Expand Down Expand Up @@ -373,18 +372,15 @@ tests/websocket/ @MetaMask/qa
.github/workflows/run-appium-smoke-tests-ios.yml @MetaMask/qa
.github/workflows/run-e2e-workflow.yml @MetaMask/qa
.github/workflows/run-e2e-api-specs.yml @MetaMask/qa
.github/workflows/run-e2e-smoke-tests-android.yml @MetaMask/qa
.github/workflows/run-e2e-smoke-tests-android-flask.yml @MetaMask/qa
.github/workflows/run-e2e-smoke-tests-ios.yml @MetaMask/qa
.github/workflows/run-e2e-smoke-tests-ios-flask.yml @MetaMask/qa
.github/workflows/rerun-ci-on-skipped-e2e-labels.yml @MetaMask/qa
.github/workflows/update-e2e-fixtures.yml @MetaMask/qa
.github/workflows/qa-stats.yml @MetaMask/qa
.github/workflows/flaky-test-report.yml @MetaMask/qa
.github/workflows/performance-test-runner.yml @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-performance-e2e-manual.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
Expand Down
128 changes: 110 additions & 18 deletions .github/actions/find-reusable-build/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ description: >-
`event: pull_request` to let the fingerprint itself act as the cross-PR
deduplication key.

Each tier is swept once per run status (`success`, `in_progress`, `failure`,
then `completed`) so that one crowded page of recent runs cannot consume the
candidate window. A donor only needs to have uploaded its artifacts, not to
have finished: the native build publishes the app roughly 25-35 minutes before
the run completes, since E2E tests keep the run alive well past that point.

inputs:
fingerprint:
description: 'The @expo/fingerprint hash the candidate must match'
Expand Down Expand Up @@ -44,17 +50,23 @@ inputs:
required: false
default: 'build-source-hash'
max-candidates-per-branch:
description: 'How many recent runs to inspect per branch-scoped tier (same-branch, base-branch)'
description: >-
How many recent runs to inspect per branch-scoped tier (same-branch,
base-branch), per conclusion sweep. Because sweeps filter server-side on
run conclusion, this budget is spent on terminal runs rather than on
in-flight ones — which matters most for the base-branch tier, where `main`
CI runs longer than the merge cadence, so a large share of the newest runs
are always still building.
required: false
default: '10'
max-candidates-cross-pr:
description: >-
How many recent `pull_request`-event runs (across all branches) to inspect
in the cross-PR tier. The fingerprint filter is highly discriminating, so
the practical cost is one `listCommitStatusesForRef` call per candidate
until a run-specific status match is found.
in the cross-PR tier, per conclusion sweep. The fingerprint filter is highly
discriminating, so the practical cost is one `listCommitStatusesForRef` call
per candidate until a run-specific status match is found.
required: false
default: '30'
default: '50'
main-branch-only:
description: >-
When true, only search the base branch (typically `main`) for reusable
Expand Down Expand Up @@ -147,7 +159,7 @@ runs:
: requiredArtifacts;

const maxCandidates = Number(MAX_CANDIDATES) || 10;
const maxCandidatesCrossPr = Number(MAX_CANDIDATES_CROSS_PR) || 30;
const maxCandidatesCrossPr = Number(MAX_CANDIDATES_CROSS_PR) || 50;
const currentRunId = String(CURRENT_RUN_ID);

// Three-tier discovery:
Expand Down Expand Up @@ -248,48 +260,128 @@ runs:
const seenRunIds = new Set();
seenRunIds.add(currentRunId);

for (const tier of tiers) {
core.info(`Searching tier: ${tier.label}`);
let runs;
// Rate-limit accounting. The `/rate_limit` endpoint is itself free, so
// reading it before and after the search costs nothing and tells us how
// much of the hourly core budget one lookup actually consumes.
async function readRateLimit() {
try {
const { data } = await github.rest.rateLimit.get();
return data.resources.core;
} catch (err) {
core.info(`rateLimit.get failed: ${err.message}`);
return null;
}
}

const rateLimitBefore = await readRateLimit();

async function logRateLimit() {
const after = await readRateLimit();
if (!after) return;
const used = rateLimitBefore ? rateLimitBefore.remaining - after.remaining : null;
const resetAt = new Date(after.reset * 1000).toISOString();
core.info(
`Rate limit (core): ${after.remaining}/${after.limit} remaining, ` +
`${used === null ? 'unknown' : used} request(s) used by this lookup, resets at ${resetAt}`,
);
if (after.remaining < after.limit * 0.1) {
core.warning(
`GitHub API core rate limit is low: ${after.remaining}/${after.limit} remaining until ${resetAt}`,
);
}
}

// Each tier is swept once per run status below, applied server-side via
// the `status` filter so that a single crowded page of recent runs can't
// consume a tier's candidate window. On a busy repo the newest runs are
// dominated by in-flight runs and by runs that concurrency cancelled
// mid-build; sweeping per status keeps each category's budget separate.
//
// Order matters, and it is deliberately not "terminal states first":
//
// success - a fully green run is the most conservative donor.
// in_progress - a run only needs to have *uploaded* its artifacts to be
// a valid donor; it does not need to have finished. The
// native build completes roughly 25-35 minutes before the
// run itself does, because E2E tests keep the run alive
// long after the `.app` is published. Skipping these runs
// discarded a complete, verified build for that entire
// window - measured at 8 of 18 cold-fingerprint rebuilds,
// one of them with a donor that had been ready 32 minutes.
// `hasAllArtifacts` below is what makes this safe: a run
// mid-upload simply fails that check and is skipped.
// failure - a run can fail on a job unrelated to the native build
// while still holding complete artifacts.
// completed - last resort; picks up cancelled, timed-out and neutral
// runs, preserving reach.
//
// `queued` is intentionally not swept: such runs cannot have artifacts yet,
// so they would only cost API calls.
const statusSweeps = ['success', 'in_progress', 'failure', 'completed'];

async function listCandidates(tier, status) {
try {
const { data } = await github.rest.actions.listWorkflowRuns({
owner: context.repo.owner,
repo: context.repo.repo,
workflow_id: WORKFLOW_FILE,
status,
...tier.params,
});
runs = data.workflow_runs || [];
return data.workflow_runs || [];
} catch (err) {
core.warning(`listWorkflowRuns failed for tier "${tier.label}": ${err.message}`);
continue;
core.warning(
`listWorkflowRuns failed for tier "${tier.label}" (status=${status}): ${err.message}`,
);
return [];
}
}

async function findMatch(tier, runs) {
for (const run of runs) {
const runIdStr = String(run.id);
if (seenRunIds.has(runIdStr)) continue;
seenRunIds.add(runIdStr);

if (tier.skipHeadBranch && run.head_branch === tier.skipHeadBranch) continue;

if (run.status !== 'completed') continue;

// Deliberately no `run.status === 'completed'` gate: artifact
// availability, not run completion, is what makes a donor usable, and
// `hasAllArtifacts` verifies that below.
if (!(await hasRunFingerprintStatus(run.head_sha, run.id))) {
core.info(`Run ${run.id} has no run-specific ${STATUS_CONTEXT} status matching fingerprint ${TARGET_FINGERPRINT}`);
continue;
}

if (!(await hasAllArtifacts(run.id))) continue;

return run;
}
return null;
}

for (const tier of tiers) {
core.info(`Searching tier: ${tier.label}`);

for (const status of statusSweeps) {
const runs = await listCandidates(tier, status);
core.info(` sweep status=${status}: ${runs.length} run(s) returned`);

const match = await findMatch(tier, runs);
if (!match) continue;

core.info(
`Match: tier="${tier.label}" run=${run.id} sha=${run.head_sha} branch=${run.head_branch} url=${run.html_url}`,
`Match: tier="${tier.label}" status=${status} run=${match.id} sha=${match.head_sha} branch=${match.head_branch} url=${match.html_url}`,
);
core.setOutput('found', 'true');
core.setOutput('run-id', runIdStr);
core.setOutput('source-sha', run.head_sha);
core.setOutput('source-branch', run.head_branch || '');
core.setOutput('run-id', String(match.id));
core.setOutput('source-sha', match.head_sha);
core.setOutput('source-branch', match.head_branch || '');
await logRateLimit();
return;
}
}

core.info('No reusable build found across any tier');
await logRateLimit();
setNotFound();
14 changes: 12 additions & 2 deletions .github/actions/setup-e2e-env/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -325,12 +325,22 @@ runs:
if: ${{ inputs.runner_provider != 'namespace' && inputs.runner_provider != 'bitrise' }}
uses: actions/cache@v4
with:
# NOTE: actions/cache archives directories recursively and does NOT
# honour `!` exclusion patterns for directory contents (resolvePaths
# runs with implicitDescendants: false). Gradle/CMake intermediates
# that Android native builds write inside node_modules (~4-5 GB
# uncompressed) are instead deleted by the "Clean native build
# intermediates from node_modules" step in build-android-e2e.yml
# before the post-job save runs.
path: |
node_modules
.yarn/install-state.gz
key: ${{ inputs.cache-prefix }}-yarn-v2-${{ inputs.platform }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }}
# v3: bump to drop existing entries polluted with those build
# intermediates — a cache hit is never re-saved, so without the bump
# the fat archives would keep being served forever.
key: ${{ inputs.cache-prefix }}-yarn-v3-${{ inputs.platform }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }}
restore-keys: |
${{ inputs.cache-prefix }}-yarn-v2-${{ inputs.platform }}-${{ runner.os }}-
${{ inputs.cache-prefix }}-yarn-v3-${{ inputs.platform }}-${{ runner.os }}-
continue-on-error: true

- name: Install JavaScript dependencies with retry
Expand Down
4 changes: 2 additions & 2 deletions .github/actions/smart-e2e-selection/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -155,8 +155,8 @@ runs:
echo "SKIPPED=true" >> "$GITHUB_OUTPUT"
echo "SKIP_REASON=PR targets a release or stable branch (release/* or stable)" >> "$GITHUB_OUTPUT"
echo "ai_confidence=100" >> "$GITHUB_OUTPUT"
# Release/stable target → the scheduled performance workflow covers these branches.
# No need to also trigger the PR performance job.
# Release/stable target → performance runs are label-only. Return []
# so AI output cannot automatically trigger the PR performance job.
echo "ai_performance_test_tags=[]" >> "$GITHUB_OUTPUT"
else
echo "✅ Running AI analysis for PR #$PR_NUMBER"
Expand Down
2 changes: 1 addition & 1 deletion .github/guidelines/E2E_DECISION_TREE.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ Runs only when all of the following are true:

## (Exceptional) force Appium iOS smoke tests on PRs

Appium iOS smoke tests are skipped on PRs by default (they still run on every `main` push/schedule). To also run them on a PR, add the `run-appium-ios-tests` label. Smart E2E Selection still controls which suites run. CI re-runs automatically when the label is added or removed.
Appium iOS smoke tests are skipped on PRs by default (they still run on every `main` push/schedule). They also run automatically on a PR when shared smoke infra or Appium specs change (`tests/page-objects/**`, `tests/selectors/**`, `tests/locators/**`, `tests/framework/**`, `tests/smoke-appium/**`). To force them on any other PR, add the `run-appium-ios-tests` label. Smart E2E Selection still controls which suites run. CI re-runs automatically when the label is added or removed.

## E2E flakiness detection in PRs

Expand Down
Loading
Loading