Skip to content

Commit 13e2756

Browse files
release: 7.64.0 (#25409)
# 🚀 v7.64.0 Testing & Release Quality Process Hi Team, As part of our new **MetaMask Release Quality Process**, here’s a quick overview of the key processes, testing strategies, and milestones to ensure a smooth and high-quality deployment. --- ## 📋 Key Processes ### Testing Strategy - **Developer Teams:** Conduct regression and exploratory testing for your functional areas, including automated and manual tests for critical workflows. - **QA Team:** Focus on exploratory testing across the wallet, prioritize high-impact areas, and triage any Sentry errors found during testing. - **Customer Success Team:** Validate new functionalities and provide feedback to support release monitoring. ### GitHub Signoff - Each team must **sign off on the Release Candidate (RC)** via GitHub by the end of the validation timeline (**Tuesday EOD PT**). - Ensure all tests outlined in the Testing Plan are executed, and any identified issues are addressed. ### Issue Resolution - **Resolve all Release Blockers** (Sev0 and Sev1) by **Tuesday EOD PT**. - For unresolved blockers, PRs may be reverted, or feature flags disabled to maintain release quality and timelines. ### Cherry-Picking Criteria - Only **critical fixes** meeting outlined criteria will be cherry-picked. - Developers must ensure these fixes are thoroughly reviewed, tested, and merged by **Tuesday EOD PT**. --- ## 🗓️ Timeline and Milestones 1. **Today (Friday):** Begin Release Candidate validation. 2. **Tuesday EOD PT:** Finalize RC with all fixes and cherry-picks. 3. **Wednesday:** Buffer day for final checks. 4. **Thursday:** Submit release to app stores and begin rollout to 1% of users. 5. **Monday:** Scale deployment to 10%. 6. **Tuesday:** Full rollout to 100%. --- ## ✅ Signoff Checklist Each team is responsible for signing off via GitHub. Use the checkbox below to track signoff completion: # Team sign-off checklist - [x] Accounts Framework - [x] Assets - [x] Bots Team - [x] Card - [x] Confirmations - [x] Core Platform - [x] Design System - [x] Earn - [x] Mobile Platform - [x] Mobile UX - [x] Network Enablement - [x] Onboarding - [x] Perps - [x] Predict - [x] Product Safety - [x] Ramp - [x] Rewards - [x] Shield - [x] Swaps and Bridge - [ ] team-new-networks - [x] Transactions - [x] Wallet Integrations This process is a major step forward in ensuring release stability and quality. Let’s stay aligned and make this release a success! 🚀 Feel free to reach out if you have questions or need clarification. Many thanks in advance # Reference - Testing plan sheet - https://docs.google.com/spreadsheets/d/1tsoodlAlyvEUpkkcNcbZ4PM9HuC9cEM80RZeoVv5OCQ/edit?gid=404070372#gid=404070372 <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Medium risk due to broad CI/workflow and build automation changes (new outputs, event-condition logic, build triggers/notifications) plus app config changes that could affect pipelines and debug networking; runtime product code changes appear limited and mostly additive. > > **Overview** > Cuts the `7.64.0` release by bumping Android version (`versionName`/`versionCode`) and adding a full `7.64.0` section to `CHANGELOG.md` (updating the compare links accordingly). > > Updates CI/test automation: expands Smart E2E selection to also emit *performance test tags* and display them in step summaries/comments; migrates various E2E tool paths from `e2e/tools` to `tests/tools`, adjusts Detox to run smoke API specs from `tests/smoke/api-specs`, and temporarily broadens tag sharding search base to repo root. > > Improves release/build workflows by adding a reusable `build.yml`, making Bitrise BrowserStack build workflows accept an overridable `branch_name`, hardening `ci.yml` for `merge_group` events (skip some jobs and treat `skipped` appropriately), and adding Slack notifications for RC builds (with Node setup + dependency install to support the new script). > > Housekeeping/config updates include new Cursor rules/docs, adding `.env` to `.gitignore`, depcheck ignore list tweaks, appium/appwright patches for chromedriver auto-download/webviews, `push-eas-update` env flag adjustments (including disabling LavaMoat in CI), Android debug network security config for user cert trust, a new optional `infuraNetworkClientId` on network banner actions, and removal of several legacy approval/action modules and associated tests/snapshots. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit e935da4. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
2 parents a2360c2 + 732e6db commit 13e2756

1,468 files changed

Lines changed: 78635 additions & 64887 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.cursor/BUGBOT.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,11 @@ Use the rules in the [unit testing guidelines](rules/unit-testing-guidelines.mdc
2121
- Check for proper imports and framework utilities from `tests/framework/index.ts`
2222

2323
Use the rules in the [e2e-testing-guidelines](rules/e2e-testing-guidelines.mdc) to enforce the test quality and bug detection.
24+
25+
### 3. Initial Setup - Component View Tests
26+
27+
- **ALWAYS** load and reference [component-view-testing](rules/component-view-testing.mdc)
28+
- Verify test file naming pattern: `**/*.view.test.{ts,tsx,js,jsx}`
29+
- Check for proper use of presets and renderers from `app/util/test/component-view/`
30+
31+
Use the rules in the [component-view-testing](rules/component-view-testing.mdc) to enforce the test quality and bug detection.

.cursor/commands/create-deeplink-handler.md

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -161,21 +161,21 @@ export const PREFIXES = {
161161
import { handle{PascalCaseName}Url } from './handle{PascalCaseName}Url';
162162
```
163163

164-
#### Step D: Add to SUPPORTED_ACTIONS enum
164+
#### Step D: Add to SUPPORTED_ACTIONS object
165165

166166
**File:** `app/core/DeeplinkManager/handlers/legacy/handleUniversalLink.ts`
167167

168168
```typescript
169-
enum SUPPORTED_ACTIONS {
169+
const SUPPORTED_ACTIONS = {
170170
// ... existing actions
171-
{UPPER_SNAKE_CASE} = ACTIONS.{UPPER_SNAKE_CASE},
172-
}
171+
{UPPER_SNAKE_CASE}: ACTIONS.{UPPER_SNAKE_CASE},
172+
} as const;
173173
```
174174

175175
#### Step E: Add switch case (CRITICAL - Most commonly forgotten!)
176176

177177
**File:** `app/core/DeeplinkManager/handlers/legacy/handleUniversalLink.ts`
178-
**Location:** Inside the switch statement (around line 254+)
178+
**Location:** Inside the switch (action) block (around line 358)
179179

180180
```typescript
181181
switch (action) {
@@ -203,6 +203,32 @@ const WHITELISTED_ACTIONS: SUPPORTED_ACTIONS[] = [
203203
];
204204
```
205205

206+
#### Step G: Add to SUPPORTED_ACTIONS array (for isSupportedAction)
207+
208+
**File:** `app/core/DeeplinkManager/types/deepLink.types.ts`
209+
210+
Add the new action to the `SUPPORTED_ACTIONS` array so `isSupportedAction(action)` returns true and analytics route is not INVALID.
211+
212+
```typescript
213+
export const SUPPORTED_ACTIONS = [
214+
// ... existing actions
215+
ACTIONS.{UPPER_SNAKE_CASE},
216+
] as const satisfies readonly ACTIONS[];
217+
```
218+
219+
#### Step H: Map action to route (for analytics)
220+
221+
**File:** `app/core/DeeplinkManager/util/deeplinks/deepLinkAnalytics.ts`
222+
223+
In `mapSupportedActionToRoute`, add a case for the new action returning the appropriate `DeepLinkRoute`. If the action needs its own route: add a new value to `DeepLinkRoute` in `app/core/DeeplinkManager/types/deepLinkAnalytics.types.ts` and optionally add an entry in `routeExtractors` in deepLinkAnalytics.ts.
224+
225+
```typescript
226+
case ACTIONS.{UPPER_SNAKE_CASE}:
227+
return DeepLinkRoute.{ROUTE_OR_EXISTING}; // e.g. DeepLinkRoute.REWARDS or new enum value
228+
```
229+
230+
**Note:** Skipping Steps G and H still allows navigation to work, but analytics will record the route as INVALID.
231+
206232
**After completing all integration steps (full mode only), verify the handler is fully connected by:**
207233

208234
- Checking that all files were actually modified (not just showing snippets)
@@ -239,8 +265,7 @@ adb shell am start -W -a android.intent.action.VIEW \
239265

240266
Remind user to manually update:
241267

242-
- `docs/readme/deeplinking.md` - Add to Supported Actions table
243-
- `docs/deeplink-test-urls.md` - Add test URLs
268+
- `docs/readme/deeplinking.md` - Add to Supported Actions table and document test URLs (e.g. in a Test URLs section) if applicable
244269

245270
## Naming Conventions
246271

@@ -261,10 +286,10 @@ Remind user to manually update:
261286
- [ ] All user information collected interactively (including integration mode)
262287
- [ ] Handler file created with proper structure
263288
- [ ] Test file created with all test cases
264-
- [ ] **Full mode:** All integration steps (A-F) actually performed in code files
289+
- [ ] **Full mode:** All integration steps (A–H) actually performed in code files
265290
- [ ] **Full mode:** Handler verified to be hooked up and ready to use
266291
- [ ] **Snippets mode:** Integration snippets provided for all steps
267-
- [ ] **Snippets mode:** User reminded which files to modify
292+
- [ ] **Snippets mode:** User reminded which files to modify (including Steps G and H)
268293
- [ ] Test commands provided
269294
- [ ] Documentation reminders included
270295
- [ ] Switch case step emphasized as critical
@@ -278,3 +303,5 @@ Remind user to manually update:
278303
@app/core/DeeplinkManager/handlers/legacy/handlePerpsUrl.ts
279304
@app/core/DeeplinkManager/handlers/legacy/handleRewardsUrl.ts
280305
@app/core/DeeplinkManager/handlers/legacy/handlePredictUrl.ts
306+
@app/core/DeeplinkManager/types/deepLink.types.ts
307+
@app/core/DeeplinkManager/util/deeplinks/deepLinkAnalytics.ts

.cursor/rules/component-view-testing.mdc

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,29 @@ alwaysApply: false
1010

1111
Follow these rules for all component-view tests. Nested, component-specific rules may also apply.
1212

13-
- **Mock policy**
14-
- Only mock `../../../core/Engine`, `../../../core/Engine/Engine`, and `react-native-device-info`.
15-
- No mocking of hooks or selectors; drive behavior via Redux state.
16-
- Enforced by runtime guard in `app/util/test/testSetup.js` and ESLint override in `.eslintrc.js`.
17-
18-
- **Framework usage (REQUIRED)**
19-
- Use presets: `initialStateBridge`, `initialStateWallet`.
20-
- Use renderers: `renderBridgeView`, `renderWalletView`.
21-
- Use `stateFixture.ts` helpers for overrides (e.g., quotes, feature flags).
22-
- Prefer `deterministicFiat: true` for exact fiat assertions.
23-
24-
- **Navigation tests**
25-
- Use `renderScreenWithRoutes` and build `state` via the preset + minimal overrides.
26-
- Assert using route names from `app/constants/navigation/Routes.ts`.
27-
28-
- **Test structure**
29-
- AAA pattern with blank lines between sections.
30-
- Action-oriented names (no “should”).
31-
- One behavior per test; robust assertions over brittle formatting.
13+
## Mock Policy - MANDATORY
14+
15+
- Only mock `../../../core/Engine`, `../../../core/Engine/Engine`, and `react-native-device-info`.
16+
- No mocking of hooks or selectors; drive behavior via Redux state.
17+
- Enforced by runtime guard in `app/util/test/testSetup.js` and ESLint override in `.eslintrc.js`.
18+
19+
## Framework Usage - MANDATORY
20+
21+
- Use presets: `initialStateBridge`, `initialStateWallet`.
22+
- Use renderers: `renderBridgeView`, `renderWalletView`.
23+
- Use `stateFixture.ts` helpers for overrides (e.g., quotes, feature flags).
24+
- Prefer `deterministicFiat: true` for exact fiat assertions.
25+
26+
## Navigation Tests
27+
28+
- Use `renderScreenWithRoutes` and build `state` via the preset + minimal overrides.
29+
- Assert using route names from `app/constants/navigation/Routes.ts`.
30+
31+
## Test Structure - MANDATORY
32+
33+
- AAA pattern with blank lines between sections.
34+
- Action-oriented names (no "should").
35+
- One behavior per test; robust assertions over brittle formatting.
3236

3337
- **Execution**
3438
- Prefer `--coverage=false` during iteration for speed.

0 commit comments

Comments
 (0)