Skip to content

Commit 470307e

Browse files
authored
release: 7.72.0 (#27990)
# 🚀 v7.72.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 - [x] Assets - [x] Bots Team - [x] Card - [x] Confirmations - [x] Core Platform - [x] Design System - [x] Earn - [x] Engagement - [x] Mobile Platform - [x] Mobile UX - [x] Money Movement - [x] Networks - [x] Onboarding - [x] Perps - [x] Predict - [x] Product Safety - [x] Rewards - [x] Social & AI - [x] Swaps and Bridge - [x] team-network-enablement - [x] team-ramp - [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
2 parents 94b8df3 + 5ad0a71 commit 470307e

1,080 files changed

Lines changed: 54860 additions & 30469 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.

.agents/skills/e2e-test/SKILL.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,10 @@ Step 5 → Iterate (fix → lint → run) until green
8989

9090
Documentation is split by **action**. Open only the reference that matches what you are doing.
9191

92-
| Action | File | When to open it |
93-
| --------------------------------------------- | ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
94-
| **Writing or updating a spec** | [references/writing-tests.md](references/writing-tests.md) | New spec file, spec structure, FixtureBuilder patterns, smoke/regression templates. |
95-
| **Page Objects and selectors** | [references/page-objects.md](references/page-objects.md) | Create or update POM classes, selector/testId conventions, Matchers/Gestures/Assertions API. |
96-
| **API and feature flag mocking** | [references/mocking.md](references/mocking.md) | testSpecificMock, setupRemoteFeatureFlagsMock, setupMockRequest, shared mock files. |
92+
| Action | File | When to open it |
93+
| --------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
94+
| **Writing or updating a spec** | [references/writing-tests.md](references/writing-tests.md) | New spec file, spec structure, FixtureBuilder patterns, smoke/regression templates. |
95+
| **Page Objects and selectors** | [references/page-objects.md](references/page-objects.md) | Create or update POM classes, selector/testId conventions, Matchers/Gestures/Assertions API. |
96+
| **API and feature flag mocking** | [references/mocking.md](references/mocking.md) | testSpecificMock, setupRemoteFeatureFlagsMock, setupMockRequest, shared mock files. |
9797
| **MetaMetrics / analytics expectations** | [tests/docs/analytics-e2e.md](../../../tests/docs/analytics-e2e.md) | `analyticsExpectations` on `withFixtures`, declarative checks, presets in `tests/helpers/analytics/expectations/`. |
98-
| **Running tests, debugging, fixing failures** | [references/running-tests.md](references/running-tests.md) | Build check, detox run commands, lint/tsc, common failures table, retry patterns, iteration loop. |
98+
| **Running tests, debugging, fixing failures** | [references/running-tests.md](references/running-tests.md) | Build check, detox run commands, lint/tsc, common failures table, retry patterns, iteration loop. |
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
---
2+
name: repo-skill-authoring
3+
description: Create and update repo-local skills that follow the MetaMask Mobile standard. Use for new repo-local skills, skill entrypoints, or harness shims in this repository.
4+
---
5+
6+
# Repo Skill Authoring
7+
8+
Canonical guidance for creating and updating repo-local skills in MetaMask Mobile.
9+
10+
## Purpose
11+
12+
Use this standard when the repo needs a reusable agent workflow with stable instructions, validation, or harness shims.
13+
14+
Do not create a skill when one of these is enough:
15+
16+
- `AGENTS.md` or a narrow `tests/AGENTS.md` pointer
17+
- Existing product or engineering docs in `docs/`
18+
- A one-off prompt that does not need to be reused
19+
20+
Create a skill when the work is repeated, fragile, or benefits from a shared workflow across agents.
21+
22+
## When To Use This vs Native Skill Creator
23+
24+
Use the native or harness-provided `skill-creator` guidance for general skill design principles or when creating a skill outside this repository.
25+
26+
Use `repo-skill-authoring` for any MetaMask Mobile repo-local skill that should live in `.agents/skills/`, `.claude/`, or other repo-owned harness folders.
27+
28+
If both apply, use native `skill-creator` for general design guidance, and use this skill as the source of truth for repository-specific structure, naming, and entrypoints.
29+
30+
## Harness Entrypoints
31+
32+
Use these entrypoints:
33+
34+
- Codex skill entrypoint: `.agents/skills/repo-skill-authoring/SKILL.md` (`$repo-skill-authoring`)
35+
- Claude skill entrypoint: `.claude/skills/repo-skill-authoring/SKILL.md`
36+
37+
## Repo Skill Shape
38+
39+
Required shape for a repo-local skill:
40+
41+
```text
42+
.agents/skills/<skill-name>/SKILL.md
43+
.agents/skills/<skill-name>/agents/openai.yaml
44+
```
45+
46+
Optional shape, when the workflow needs it:
47+
48+
```text
49+
.agents/skills/<skill-name>/scripts/
50+
.agents/skills/<skill-name>/references/
51+
.agents/skills/<skill-name>/assets/
52+
.claude/skills/<skill-name>/SKILL.md
53+
```
54+
55+
Keep `.agents/skills/<name>/SKILL.md` as the single source of truth. Any harness-specific shim should point directly to it.
56+
57+
## Naming And Trigger Rules
58+
59+
- Skill folder names use lowercase letters, digits, and hyphens only.
60+
- The folder name and `SKILL.md` frontmatter `name` must match exactly.
61+
- The Codex `description` must say what the skill does and when to use it.
62+
- Prefer names that describe the reusable workflow, not the implementation detail.
63+
- Keep the skill focused on repo-local conventions that are not already handled by generic guidance.
64+
65+
## Agent Execution Standard
66+
67+
For agent implementation and review tasks, follow this workflow:
68+
69+
1. Define the user/problem shape.
70+
- Write down the jobs the skill should handle.
71+
- Prefer concrete trigger phrases and in-scope task examples.
72+
2. Split the content deliberately.
73+
- Put the canonical workflow, conventions, and examples in this `SKILL.md`.
74+
- Add `scripts/` only when deterministic validation or repeated logic is worth the maintenance cost.
75+
- Add `references/` only when detailed content should be loaded on demand instead of sitting in the skill body.
76+
3. Add the skill entrypoint.
77+
- Include frontmatter `name` and `description`.
78+
- Keep this file readable by both agents and humans.
79+
4. Add the minimum harness shims required.
80+
- Add `.claude/skills/<name>/SKILL.md` when Claude needs a pointer.
81+
- Point every shim directly back to `.agents/skills/<name>/SKILL.md`.
82+
5. Sanity check the result.
83+
- Confirm the skill and any shims all point to the same workflow.
84+
85+
Authoring principle:
86+
87+
- Keep the repo skill as the canonical artifact. Avoid extra pointer layers unless they materially improve discovery or ergonomics.
88+
89+
Required agent response sections:
90+
91+
1. `Implementation Checklist`
92+
2. `Files To Add Or Modify`
93+
3. `Validation`
94+
4. `Assumptions`
95+
96+
## Minimal Examples
97+
98+
### Canonical Repo Skill
99+
100+
```md
101+
---
102+
name: topic
103+
description: Create and update the repo-local topic workflow. Use for new skill content or harness shims in this repository.
104+
---
105+
106+
# Topic
107+
108+
## Purpose
109+
110+
Explain when this repo-local skill is needed and when existing repo docs are enough.
111+
112+
## Agent Execution Standard
113+
114+
1. Discover current implementation.
115+
2. Apply repo-specific workflow.
116+
3. Confirm any shims stay aligned.
117+
```
118+
119+
### Claude Skill Shim
120+
121+
```md
122+
---
123+
name: topic
124+
summary: Create or update the repo-local topic workflow.
125+
---
126+
127+
Follow `.agents/skills/topic/SKILL.md`.
128+
```
129+
130+
### agents/openai.yaml
131+
132+
```yaml
133+
interface:
134+
display_name: 'Topic'
135+
short_description: 'Create and validate the repo-local topic workflow.'
136+
default_prompt: 'Use $topic to create or update the canonical repo-local topic workflow.'
137+
```
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
interface:
2+
display_name: "Repo Skill Authoring"
3+
short_description: "Create and validate repo-local skills."
4+
default_prompt: "Use $repo-skill-authoring to create or update the canonical repo-local skill and any necessary harness shims."

.android.env.example

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@ export MM_FOX_CODE="EXAMPLE_FOX_CODE"
22
export MM_BRANCH_KEY_TEST=
33
export MM_BRANCH_KEY_LIVE=
44
export METAMASK_BUILD_TYPE=
5+
export MM_BRAZE_API_KEY_ANDROID=
6+
export MM_BRAZE_SDK_ENDPOINT="sdk.iad-07.braze.com"
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
name: repo-skill-authoring
3+
summary: Create or update repo-local skills using the repository standard.
4+
---
5+
6+
Follow `.agents/skills/repo-skill-authoring/SKILL.md`.

.cursor/rules/unit-testing-guidelines.mdc

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,66 @@ See [PR #25548](https://github.com/MetaMask/metamask-mobile/pull/25548) for refa
234234
- **Mock all external dependencies** including APIs, services, hooks
235235
- **Use realistic mock data** that reflects real usage
236236

237+
### Theme Mocking Rules
238+
239+
- **Prefer shared `mockTheme` from `app/util/theme`** instead of hard-coded color literals in tests.
240+
- **Never hardcode design token hex values** in assertions or theme mocks (enforced by `@metamask/design-tokens/color-no-hex`).
241+
- **Avoid local hex color objects** for `useTheme`, `useStyles`, or tailwind mock color functions.
242+
- **If a test only needs a specific theme field**, derive it from `mockTheme` (or spread `mockTheme` and override minimally).
243+
244+
```ts
245+
// ✅ CORRECT: use shared mockTheme for useTheme mocks
246+
import { mockTheme } from '../../util/theme';
247+
248+
jest.mock('../../util/theme', () => ({
249+
useTheme: () => mockTheme,
250+
}));
251+
```
252+
253+
```ts
254+
// ✅ CORRECT: return { styles, theme } for useStyles mocks
255+
import { mockTheme } from '../../util/theme';
256+
257+
jest.mock('../../../../../component-library/hooks', () => ({
258+
useStyles: jest.fn((styleFn, vars) => ({
259+
styles: styleFn({ theme: mockTheme, vars }),
260+
theme: mockTheme,
261+
})),
262+
}));
263+
```
264+
265+
```ts
266+
// ✅ CORRECT: mock useTailwind with the right shape
267+
jest.mock('@metamask/design-system-twrnc-preset', () => ({
268+
useTailwind: () => ({
269+
// Most components only need tw.style(...)
270+
style: jest.fn(() => ({})),
271+
}),
272+
}));
273+
```
274+
275+
```ts
276+
// ✅ ALSO CORRECT: match real useTailwind() return type (callable function + helpers)
277+
import { mockTheme } from '../../util/theme';
278+
279+
jest.mock('@metamask/design-system-twrnc-preset', () => ({
280+
useTailwind: () => {
281+
const tw = () => ({});
282+
tw.style = jest.fn(() => ({}));
283+
return tw;
284+
},
285+
}));
286+
```
287+
288+
```ts
289+
// ❌ AVOID: local hex color mocks
290+
const mockColors = {
291+
text: { default: '#000000' },
292+
background: { default: '#FFFFFF' },
293+
border: { muted: '#E5E7EB' },
294+
};
295+
```
296+
237297
```ts
238298
// ✅ CORRECT
239299
import { apiService } from '../services/api';

.eslintrc.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,12 +181,67 @@ module.exports = {
181181
},
182182
{
183183
files: [
184+
// @MetaMask/card
184185
'app/components/UI/Card/**/*.{js,jsx,ts,tsx}',
186+
// @MetaMask/core-platform
185187
'app/components/Snaps/**/*.{js,jsx,ts,tsx}',
188+
// @MetaMask/predict
186189
'app/components/UI/Predict/**/*.{js,jsx,ts,tsx}',
190+
// @MetaMask/ramp
187191
'app/components/UI/Ramp/**/*.{js,jsx,ts,tsx}',
192+
// @MetaMask/rewards
188193
'app/components/UI/Rewards/**/*.{js,jsx,ts,tsx}',
194+
// @MetaMask/perps
189195
'app/components/UI/Perps/**/*.{js,jsx,ts,tsx}',
196+
// @MetaMask/metamask-earn
197+
'app/components/UI/Earn/**/*.{js,jsx,ts,tsx}',
198+
'app/components/UI/Stake/**/*.{js,jsx,ts,tsx}',
199+
// @MetaMask/metamask-assets
200+
'app/components/UI/Assets/**/*.{js,jsx,ts,tsx}',
201+
'app/components/UI/Tokens/**/*.{js,jsx,ts,tsx}',
202+
'app/components/UI/AssetOverview/**/*.{js,jsx,ts,tsx}',
203+
'app/components/UI/Collectibles/**/*.{js,jsx,ts,tsx}',
204+
'app/components/UI/CollectibleContractElement/**/*.{js,jsx,ts,tsx}',
205+
'app/components/UI/CollectibleContractInformation/**/*.{js,jsx,ts,tsx}',
206+
'app/components/UI/CollectibleContractOverview/**/*.{js,jsx,ts,tsx}',
207+
'app/components/UI/CollectibleContracts/**/*.{js,jsx,ts,tsx}',
208+
'app/components/UI/CollectibleDetectionModal/**/*.{js,jsx,ts,tsx}',
209+
'app/components/UI/CollectibleMedia/**/*.{js,jsx,ts,tsx}',
210+
'app/components/UI/CollectibleModal/**/*.{js,jsx,ts,tsx}',
211+
'app/components/UI/CollectibleOverview/**/*.{js,jsx,ts,tsx}',
212+
'app/components/UI/ConfirmAddAsset/**/*.{js,jsx,ts,tsx}',
213+
'app/components/UI/DeFiPositions/**/*.{js,jsx,ts,tsx}',
214+
'app/components/UI/TokenDetails/**/*.{js,jsx,ts,tsx}',
215+
'app/components/Views/AddAsset/**/*.{js,jsx,ts,tsx}',
216+
'app/components/Views/Asset/**/*.{js,jsx,ts,tsx}',
217+
'app/components/Views/AssetDetails/**/*.{js,jsx,ts,tsx}',
218+
'app/components/Views/AssetHideConfirmation/**/*.{js,jsx,ts,tsx}',
219+
'app/components/Views/AssetOptions/**/*.{js,jsx,ts,tsx}',
220+
'app/components/Views/Collectible/**/*.{js,jsx,ts,tsx}',
221+
'app/components/Views/CollectibleView/**/*.{js,jsx,ts,tsx}',
222+
'app/components/Views/DetectedTokens/**/*.{js,jsx,ts,tsx}',
223+
'app/components/Views/NFTAutoDetectionModal/**/*.{js,jsx,ts,tsx}',
224+
'app/components/Views/NftDetails/**/*.{js,jsx,ts,tsx}',
225+
// @MetaMask/mobile-core-ux
226+
'app/components/Views/AccountActions/**/*.{js,jsx,ts,tsx}',
227+
'app/components/Views/AccountSelector/**/*.{js,jsx,ts,tsx}',
228+
'app/components/Views/AccountsMenu/**/*.{js,jsx,ts,tsx}',
229+
'app/components/Views/AddressQRCode/**/*.{js,jsx,ts,tsx}',
230+
'app/components/Views/EditAccountName/**/*.{js,jsx,ts,tsx}',
231+
'app/components/Views/LockScreen/**/*.{js,jsx,ts,tsx}',
232+
'app/components/Views/Login/**/*.{js,jsx,ts,tsx}',
233+
'app/components/Views/MultichainTransactionsView/**/*.{js,jsx,ts,tsx}',
234+
'app/components/Views/NetworkConnect/**/*.{js,jsx,ts,tsx}',
235+
'app/components/Views/NetworkSelector/**/*.{js,jsx,ts,tsx}',
236+
'app/components/Views/QRAccountDisplay/**/*.{js,jsx,ts,tsx}',
237+
'app/components/Views/QRScanner/**/*.{js,jsx,ts,tsx}',
238+
'app/components/Views/Settings/**/*.{js,jsx,ts,tsx}',
239+
'app/components/Views/TermsAndConditions/**/*.{js,jsx,ts,tsx}',
240+
'app/components/Views/UnifiedTransactionsView/**/*.{js,jsx,ts,tsx}',
241+
'app/components/UI/MultichainTransactionListItem/**/*.{js,jsx,ts,tsx}',
242+
'app/components/UI/TransactionActionModal/**/*.{js,jsx,ts,tsx}',
243+
'app/components/UI/TransactionElement/**/*.{js,jsx,ts,tsx}',
244+
'app/components/UI/Transactions/**/*.{js,jsx,ts,tsx}',
190245
],
191246
rules: {
192247
'@metamask/design-tokens/color-no-hex': 'error',

.github/CODEOWNERS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ app/core/Engine/messengers/earn-controller-messenger @MetaMask/metamask-earn
154154
app/selectors/earnController @MetaMask/metamask-earn
155155
**/Earn/** @MetaMask/metamask-earn
156156
**/earn/** @MetaMask/metamask-earn
157+
**/Money/** @MetaMask/metamask-earn
158+
**/money/** @MetaMask/metamask-earn
157159

158160
# Rewards Team
159161
app/core/Engine/controllers/rewards-controller @MetaMask/rewards
@@ -164,6 +166,7 @@ app/selectors/featureFlagController/rewards @MetaMask/rewards
164166
**/rewards/** @MetaMask/rewards
165167

166168
# Perps Team
169+
scripts/perps/agentic/teams/perps/ @MetaMask/perps
167170
app/components/UI/Perps/ @MetaMask/perps
168171
app/components/UI/WalletAction/*perps* @MetaMask/perps
169172
app/core/Engine/controllers/perps-controller @MetaMask/perps
@@ -187,6 +190,7 @@ app/core/DeeplinkManager/handlers/legacy/handlePredictUrl.ts @MetaMask/predict
187190
app/components/hooks/useIsOriginalNativeTokenSymbol @MetaMask/metamask-assets
188191
app/components/hooks/useTokenBalancesController @MetaMask/metamask-assets
189192
app/components/hooks/useTokenBalance.tsx @MetaMask/metamask-assets
193+
app/components/hooks/useTokensData @MetaMask/metamask-assets
190194
app/components/hooks/useSafeChains.ts @MetaMask/metamask-assets
191195
app/components/UI/Assets @MetaMask/metamask-assets
192196
app/components/UI/AssetOverview @MetaMask/metamask-assets

0 commit comments

Comments
 (0)