Skip to content

[pull] main from MetaMask:main#425

Merged
pull[bot] merged 7 commits into
Reality2byte:mainfrom
MetaMask:main
Dec 19, 2025
Merged

[pull] main from MetaMask:main#425
pull[bot] merged 7 commits into
Reality2byte:mainfrom
MetaMask:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Dec 19, 2025

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

asalsys and others added 7 commits December 19, 2025 00:32
## **Description**

This PR adds tracking for remote feature flags to user traits for
analytics purposes.

**What is the reason for the change?**
We need to capture feature flag values as user traits in our analytics
system to better understand user segmentation and feature adoption.

**What is the improvement/solution?**
Added a `useEffect` in `FeatureFlagOverrideContext` that sends all
remote feature flags to user traits in a single bulk call via
`addTraitsToUser` whenever the flags are received or updated from the
`RemoteFeatureFlagController`.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

Feature: Feature Flag User Traits Tracking

Scenario: Feature flags are added to user traits when received from
remote controller
    Given the app is launched with MetaMetrics enabled
    
    When remote feature flags are fetched from the server
Then all feature flag values are sent to Segment as user traits in a
single bulk call

  Scenario: Feature flags are updated in user traits when they change
    Given the app has already received feature flags
    
    When the remote feature flags are updated with new values
Then the updated feature flag values are sent to Segment as user
traits## **Screenshots/Recordings**

<!-- Not applicable - analytics/internal change with no UI impact -->

### **Before**

N/A - Feature flags were not being tracked as user traits when received
from remote controller.

### **After**

Feature flags from the remote controller are now automatically sent to
user traits via `addTraitsToUser` in bulk whenever they are received or
updated.

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Bulk-send remote feature flags to analytics user traits on
receipt/updates and add tests validating single-call, bulk behavior.
> 
> - **Feature Flags/Analytics**:
> - Add `useEffect` in `app/contexts/FeatureFlagOverrideContext.tsx` to
call `addTraitsToUser(rawFeatureFlags)` whenever remote flags are
received or updated (bulk, single call).
> - **Tests** (`app/contexts/FeatureFlagOverrideContext.test.tsx`):
> - Add “Remote Feature Flag Change Tracking” tests to verify bulk add
on initial load, on updates, no call when empty, and single-call (not
per-flag).
> - Adjust snapshot tests to account for initial bulk call (clearing
mocks) and add a test asserting bulk call on mount; minor test
description tweaks.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
6ebbba8. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

This PR integrates the `@metamask/ramps-controller` package into the
mobile app's Engine. The Ramps Controller will manage on-ramp/off-ramp
state and interactions in a centralized manner.

**Changes include:**
- Added `@metamask/ramps-controller` as a dependency
- Created initialization functions for `RampsController` and
`RampsService`
- Created messengers for both `RampsController` and `RampsService` 
- Added Redux selectors for accessing Ramps Controller state
(`selectRampsControllerState`, `selectGeolocation`)
- Registered both controllers in the Engine
- Updated Engine types to include Ramps Controller actions, events, and
state
- Added comprehensive unit tests for all new code

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes:
[TRAM-2831](https://consensyssoftware.atlassian.net/browse/TRAM-2831)

## **Manual testing steps**

This feature is integration only and can only really be tested via dev
logs etc.

Feature: Ramps Controller Integration

  Scenario: App starts with RampsController initialized
    Given the app has not been launched
    
    When user launches the app
    Then the RampsController should be initialized in the Engine
    And the RampsService should be initialized in the Engine
    And the RampsController state should contain geolocation as null

## **Screenshots/Recordings**

### **Before**

N/A - Internal infrastructure change with no UI impact

### **After**

N/A - Internal infrastructure change with no UI impact

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I've included tests if applicable
- [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

[TRAM-2831]:
https://consensyssoftware.atlassian.net/browse/TRAM-2831?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Integrates `@metamask/ramps-controller` into Engine with
controller/service inits, messengers, selectors, types, and tests, plus
related constants/fixtures/env updates.
> 
> - **Engine**:
> - Register `RampsController` and `RampsService`; expose in
`Engine.context` and state; include in initialization map and state
selectors.
> - Add init modules
`controllers/ramps-controller/ramps-controller-init.ts` and
`ramps-service-init.ts` (with `getRampsEnvironment`).
> - Update `BACKGROUND_STATE_CHANGE_EVENT_NAMES` and
`STATELESS_NON_CONTROLLER_NAMES` to include ramps; export in
`Engine.state` getters.
> - **Messengers**:
> - Add `getRampsControllerMessenger` (delegates
`RampsService:getGeolocation`) and `getRampsServiceMessenger`; register
in `CONTROLLER_MESSENGERS`.
> - **Selectors**:
> - Add `selectRampsControllerState` and `selectGeolocation` under
`app/selectors/rampsController`.
> - **Types**:
> - Extend Engine actions/events/state and controller names to include
ramps controller/service.
> - **Tests/Fixtures**:
> - Add unit tests for ramps controller/service inits and messengers;
update `Engine.test.ts` to expect ramps; add selector tests.
> - Update initial background state and logs snapshots to include
`RampsController: { geolocation: null }`.
> - **Tooling/Deps**:
>   - Add dependency `@metamask/ramps-controller` and lockfile changes.
> - Update `babel.config.tests.js` to not inline env vars for ramps
files.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
4088ebd. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

Add metric name indicator shortcuts (Vol, OI, Funding) to asset row
subtitles in the Perps home screen to reflect the current sorting
mechanism.

**What changed:**
- Asset rows now display the metric label alongside the value (e.g.,
"$1.2B Vol" instead of just "$1.2B")
- Labels are capitalized: Vol, OI, Funding
- Price change metric doesn't show a label since the % suffix already
indicates the metric

## **Changelog**

CHANGELOG entry: Added indicator name shortcuts in Perps asset pills to
reflect sorting mechanism

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/TAT-2177

## **Manual testing steps**

```gherkin
Feature: Perps home screen metric indicators

  Scenario: User views asset rows with volume sorting
    Given user has the Perps home screen open
    And markets are sorted by volume (default)

    When user views the asset rows
    Then each row displays the volume value with "Vol" suffix (e.g., "$1.2B Vol")

  Scenario: User changes sorting to Open Interest
    Given user has the Perps home screen open

    When user changes sorting to Open Interest
    Then each row displays the OI value with "OI" suffix (e.g., "$25M OI")

  Scenario: User changes sorting to Funding Rate
    Given user has the Perps home screen open

    When user changes sorting to Funding Rate
    Then each row displays the funding rate with "Funding" suffix (e.g., "0.01% Funding")

  Scenario: User changes sorting to Price Change
    Given user has the Perps home screen open

    When user changes sorting to Price Change
    Then each row displays only the percentage (e.g., "+2.5%") without additional label
```

## **Screenshots/Recordings**

### **Before**

<!-- Asset rows show only values like "$1.2B" without metric indicator
-->
<img width="1206" height="2622" alt="Simulator Screenshot -
iPhone16Pro-Delta - 2025-12-18 at 12 13 30"
src="https://github.com/user-attachments/assets/91cfcc0a-280f-41e9-a2e0-4dfb306d5365"
/>

### **After**

<!-- Asset rows now show values with metric indicator like "$1.2B Vol"
-->


https://github.com/user-attachments/assets/6911f453-d660-4a7e-ba30-fd80acb680d9



## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Adds localized metric labels (Vol, OI, Funding) to Perps market row
subtitles and updates tests accordingly.
> 
> - **Perps UI**:
> - `PerpsMarketRowItem.tsx`: Append localized metric indicators to the
secondary value (e.g., `"$1.2B Vol"`, `"0.0500% Funding"`, `"25M OI"`);
uses `strings('perps.sort.*_short')`; adds `numberOfLines` to trim text.
> - **Tests**:
> - Update `PerpsMarketRowItem.test.tsx` expectations to include metric
labels across scenarios (volume ranges, zero values, funding rate cases,
live updates).
> - **i18n**:
> - `locales/languages/en.json`: Add `perps.sort.volume_short` (Vol),
`perps.sort.funding_rate_short` (Funding),
`perps.sort.open_interest_short` (OI).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
1a6143b. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

Position Size field in the asset details screen was showing 3 decimals
for USD values (e.g., `$10.103`) instead of the standard 2 decimals used
for fiat currency display.

Changed the formatting config from `PRICE_RANGES_UNIVERSAL`
(significant-digit based) to `PRICE_RANGES_MINIMAL_VIEW` (fixed 2
decimals), aligning with how the Margin field is already formatted.

## **Changelog**

CHANGELOG entry: Fixed position size USD display showing 3 decimals
instead of 2

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/TAT-2184

## **Manual testing steps**

```gherkin
Feature: Position Size USD Display

  Scenario: user views position size in USD
    Given user has an open position on any market
    And user is on the asset details screen

    When user taps the swap icon on the Size field to toggle to USD display
    Then position size should display with 2 decimal places (e.g., $10.10 not $10.103)
```

## **Screenshots/Recordings**

### **Before**

<img width="1206" height="2622" alt="Simulator Screenshot -
iPhone16Pro-Delta - 2025-12-18 at 12 16 01"
src="https://github.com/user-attachments/assets/5f484111-b288-4f8a-a817-ffded81fdfae"
/>

### **After**

<img width="1206" height="2622" alt="Simulator Screenshot -
iPhone16Pro-Beta - 2025-12-18 at 12 16 18"
src="https://github.com/user-attachments/assets/a10336e4-db61-4a27-ab12-da37e46da92c"
/>

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Switch USD size display in `PerpsPositionCard` to minimal fiat
formatting (2-decimal) by using `PRICE_RANGES_MINIMAL_VIEW`.
> 
> - **UI (Perps)**:
> - Update USD size formatting in
`app/components/UI/Perps/components/PerpsPositionCard/PerpsPositionCard.tsx`
to use `PRICE_RANGES_MINIMAL_VIEW` when `showSizeInUSD` is active,
ensuring 2-decimal fiat display.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
05c0374. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

Fix text truncation in the Perps market header for hip-3 markets (like
XYZ100). The market name was being clamped/cut off when displayed
alongside the leverage badge due to missing flex constraints in the flex
row layout.

Added `flexShrink: 1` to the asset name text style and `flexShrink: 0`
to the leverage badge style to ensure proper layout behavior.

## **Changelog**

CHANGELOG entry: Fixed market name text being truncated in Perps header
for hip-3 markets

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/TAT-2194

## **Manual testing steps**

```gherkin
Feature: Perps market header display

  Scenario: user views hip-3 market header
    Given user is on the Perps trading section

    When user navigates to a hip-3 market page (e.g., XYZ100)
    Then the header shows the full market name "XYZ100-USD" without truncation
    And the leverage badge "20x" is fully visible next to the market name
```

## **Screenshots/Recordings**

### **Before**

<!-- Market name "XYZ100-USD" text is clamped/truncated by the leverage
badge -->

### **After**

<!-- Market name displays fully alongside the leverage badge -->
<img width="1206" height="2622" alt="Simulator Screenshot -
iPhone16Pro-Gamma - 2025-12-18 at 19 44 41"
src="https://github.com/user-attachments/assets/33f898b8-8764-46c2-8f45-3642fc5caa4f"
/>

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Set `flexShrink: 1` on `assetName` and `flexShrink: 0` on
`maxLeverage` to fix market name truncation alongside the leverage
badge.
> 
> - **Perps UI layout**:
> - **Market Header (`PerpsMarketHeader.styles.ts`)**: Add `flexShrink:
1` to `assetName` to allow text to shrink instead of truncating.
> - **Leverage Badge (`PerpsLeverage.styles.ts`)**: Add `flexShrink: 0`
to `maxLeverage` to prevent the badge from compressing.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
fb18ca0. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
#24048)

## **Description**

Fixed an issue where the MUSD CTA was incorrectly displaying when a
single unsupported chain (like BSC) was selected in the network filter.

The bug occurred because when a non-buyable chain was selected, the code
was still showing the CTA if mUSD was buyable on *any* chain (e.g.,
Mainnet or Linea), rather than hiding it completely. This was confusing
for users since they couldn't actually buy mUSD on the selected chain.

**Changes:**
- When a non-buyable chain is selected (BSC, Polygon, Arbitrum, etc.),
the CTA now correctly hides
- When a buyable chain is selected but mUSD is not available in the
user's region for that specific chain, the CTA now correctly hides

## **Changelog**

CHANGELOG entry: Fixed mUSD CTA incorrectly appearing on unsupported
chains like BSC

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/MUSD-124

## **Manual testing steps**

```gherkin
Feature: MUSD CTA visibility

  Scenario: user selects BSC network
    Given user is on the token list view
    And user does not have any MUSD balance
    And user does not have any token balance

    When user selects BSC as the only network filter
    Then the MUSD CTA should not be displayed

  Scenario: user selects Linea network
    Given user is on the token list view
    And user does not have any MUSD balance
    And user does not have any token balance
    And mUSD is buyable in user's region on Linea

    When user selects Linea as the only network filter
    Then the MUSD CTA should be displayed with network icon

  Scenario: user selects Mainnet network
    Given user is on the token list view
    And user does not have any MUSD balance
    And user does not have any token balance
    And mUSD is buyable in user's region on Mainnet

    When user selects Mainnet as the only network filter
    Then the MUSD CTA should be displayed with network icon

  Scenario: user selects all networks
    Given user is on the token list view
    And user does not have any MUSD balance
    And user does not have any token balance
    And mUSD is buyable in user's region

    When user has all networks selected
    Then the MUSD CTA should be displayed without network icon

  Scenario: user selects Linea network
    Given user is on the token list view
    And user does not have any MUSD balance
    And user does has token balance

    When user selects any network filter
    Then the MUSD CTA should be displayed with network icon
    Then the MUSD CTA should direct to BuyWithToken component on the chain of token being converted (soon to be constrained to that chain specifically in. separate pr)
```

## **Screenshots/Recordings**

### **Before**

<!-- [screenshots/recordings] -->

### **After**


https://github.com/user-attachments/assets/45040e69-f737-4112-baad-36f0390c3453

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Updates the mUSD CTA to show/hide and route per selected chain and
regional availability, with a new feature flag, network badge, and
supporting hooks/tests.
> 
> - **Earn UI – mUSD CTA**:
> - Integrates `useMusdCtaVisibility` to conditionally render CTA; hides
on non-buyable/unsupported chains and when mUSD isn’t buyable in-region.
> - Shows network badge for single supported selections using
`BadgeWrapper` and `getNetworkImageSource`; aligns avatar layout.
> - Adjusts buy flow to use `selectedChainId` (fallback to
`MUSD_CONVERSION_DEFAULT_CHAIN_ID`).
> - **Hooks/Logic**:
>   - Adds `useHasMusdBalance` to detect mUSD balances across chains.
> - Adds `useMusdCtaVisibility` to compute `shouldShowCta`,
`showNetworkIcon`, and `selectedChainId` based on feature flag, selected
networks, ramp token availability, and balances.
> - Introduces `MUSD_BUYABLE_CHAIN_IDS` (excludes BSC) and uses
`MUSD_TOKEN_ASSET_ID_BY_CHAIN` for routing.
> - **Feature Flags/Config**:
> - Adds env flag `MM_MUSD_CTA_ENABLED` and selector
`selectIsMusdCtaEnabledFlag`.
> - **Tests**:
> - Extensive new tests for `useHasMusdBalance`, `useMusdCtaVisibility`,
and updated CTA tests for visibility, routing, and network badge
behavior.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
cd04745. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

This PR fixes sentence case violations in lines 6001-7000 of the
`locales/languages/en.json` file as part of ongoing content papercut
improvements. The changes convert Title Case strings to sentence case
following standard capitalization conventions.

**What is the reason for the change?**
Content consistency and adherence to proper sentence case formatting
across the app.

**What is the improvement/solution?**
Updated ~31 locale keys from Title Case to sentence case, and updated
all affected test files to match the new casing.

## **Changelog**

CHANGELOG entry: Fixed sentence case violations in English locale
strings lines 6001-7000

## **Related issues**

Fixes: Part of content papercut improvements batch 7
Follows: #23499 (lines 1-1000), #23516 (lines 1001-2000), #23957 (lines
2001-3000), #23994 (lines 3001-4000), #23996 (lines 4001-5000), #24049
(lines 5001-6000)
Related: #23272 (original comprehensive PR)

## **Manual testing steps**

```gherkin
Feature: Locale string display

  Scenario: user views UI elements with updated locale strings
    Given the app is running with the updated locale file

    When user views QR code options
    Then "Text" and "QR code" should display in sentence case

    When user views gas fee warnings
    Then "Max priority fee" and "Max fee" should display in sentence case

    When user views confirm screens
    Then "Get signature" should display in sentence case
    And "Standard account" should display in sentence case

    When user views bridge transaction details
    Then "Estimated time", "Quote details", "Network fee" should display in sentence case
    And "Price impact", "Minimum received" should display in sentence case
    And "View on block explorer", "Transaction details" should display in sentence case

    When user views wallet recovery
    Then "Wallet recovery", "Log in with social accounts", "Set up" should display in sentence case

    When user views multichain account screens
    Then "Account details", "Account name", "Account address" should display in sentence case
    And "Wallet name", "Reveal recovery phrase" should display in sentence case
    And "Edit account name", "Remove account", "Share address" should display in sentence case

    When user views Card screens
    Then "Enable card", "Enable assets" should display in sentence case
    And "Verification not approved", "Verification required" should display in sentence case

    When user views Rewards screens
    Then "Unknown error", "Season summary coming soon", "Rewards settings" should display in sentence case
```

## **Screenshots/Recordings**

N/A - This is a content-only change with no visual differences beyond
text casing

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

---

## **Technical Details**

### Changes Made:
- **Locale file**: Updated ~31 keys in `locales/languages/en.json`
(lines 6001-7000)
- **Test files**: Updated 12 test files to match new casing
- **Snapshots**: Regenerated 1 snapshot file to match new casing

### Affected Areas:
- QR code display options (Text, QR code)
- Gas fee validation messages (Max priority fee, Max fee)
- Confirm/Signature flows (Get signature, Standard account)
- Bridge transaction details (Estimated time, Quote details, Network
fee, Price impact, etc.)
- View on block explorer links
- Wallet recovery and setup flows
- Multichain account management (Account details, names, addresses,
removal, sharing)
- Card verification statuses and enablement
- Rewards authentication and settings

### Validation:
- All affected unit tests pass
- No old Title Case strings remain in updated snapshot files
- Changes are purely cosmetic (text casing only)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Converts various Title Case strings to sentence case in
`locales/languages/en.json` and updates affected tests/snapshots to
match.
> 
> - **Localization**:
> - Convert multiple strings to sentence case in
`locales/languages/en.json` (e.g., `Share address`, `Account details`,
`Verification not approved`, `View on block explorer`, `Network fee`,
`Price impact`, `Estimated time`, etc.).
> - **Tests/Snapshots**:
>   - Update assertions and snapshot text to match new casing across:
>     - `app/components/Nav/App/App.test.tsx` (`Share address`)
> - Bridge: `BlockExplorersModal.test.tsx`,
`QuoteDetailsCard.test.tsx.snap` (tooltips/text)
>     - Card: `CardHome.test.tsx` (KYC titles/messages)
>     - Navbar: `index.test.jsx` (titles like `Account details`)
> - Confirmations: footer/info/switch-account-type rows and modal tests
(`Get signature`, `Standard account`)
>     - Rewards: `RewardsNavigator.test.tsx` (`Authentication failed`)
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
a10cb71. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@pull pull Bot locked and limited conversation to collaborators Dec 19, 2025
@pull pull Bot added the ⤵️ pull label Dec 19, 2025
@pull pull Bot merged commit 0ae171a into Reality2byte:main Dec 19, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants