[pull] main from MetaMask:main#418
Merged
Merged
Conversation
## **Description** This PR fixes sentence case violations in lines 2001-3000 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 ~19 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 2001-3000 ## **Related issues** Fixes: Part of content papercut improvements batch 3 Follows: #23499 (lines 1-1000), #23516 (lines 1001-2000) 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 navigates to token details screens Then "Market cap" should display in sentence case And "Total volume (24h)" should display in sentence case When user imports or hides tokens Then "Imported tokens" and "Hiding tokens" should display in sentence case When user views NFT details Then "Token standard" 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 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. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Converts multiple UI strings to sentence case in locales (primarily en.json) and updates affected tests and snapshots to match. > > - **i18n**: > - Update `locales/languages/en.json` values to sentence case for numerous labels (e.g., `token.market_cap`, `token.total_volume`, `token.volume_to_marketcap`, `asset_details.amount`, `asset_details.lists`, settings entries like "Buy & sell crypto", "Reset region", "Activation keys", "Show hex data", "State logs", "Add network", "Search tokens", etc.). > - Adjust `locales/languages/tl.json` key `search_engine` value to "Search engine". > - **Tests/Snapshots**: > - Align assertions and snapshots across UI tests with new casing, including: > - `AssetOverview/TokenDetails/MarketDetailsList*` and `TokenDetails*`. > - `AssetSearch` and `SearchTokenAutocomplete` placeholders. > - `PredictBuyPreview` mock `groupItemTitle`. > - `Ramp/Aggregator/Views/Settings` (`ActivationKeyForm`, `Settings`) buttons/text. > - `Views/AssetDetails` labels. > - `Views/NetworkSelector` and `Views/Settings` (`AdvancedSettings`, main settings) labels. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 05b0656. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** ### Summary Fixed three UI polish issues in the Send flow Review page to improve visual consistency. ### Changes - Arrow icon size: Updated arrow-right icon between Accounts component from xs to sm - Network picker styling: Changed border radius from pill-shaped (16px) to 4px and updated background color to `bg-muted` - Network fee icon color: Changed tooltip icon from icon-muted to icon-alternative and updated `AlertRow `component to respect explicitly passed `tooltipColor` props ### Technical Notes Modified `AlertRow` component to allow parent components to override tooltip icon color by checking for explicitly passed `tooltipColor` prop before falling back to severity based colors. ## **Changelog** CHANGELOG entry:null ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/MDP-306 ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** | before | after | | -------- | ------- | |  |  | ### **Before** `~` ### **After** `~` ## **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** - [x] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [x] 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] > Polishes the send review UI by enlarging the from→to arrow, reducing the gas token button radius, enabling `AlertRow` tooltip color overrides, and setting the network fee tooltip to alternative color. > > - **Confirmations UI**: > - **`AlertRow`**: Allow explicit `tooltipColor` override; fallback to severity-based color only when not provided. > - **Gas Fee Details**: Set `tooltipColor` to `IconColor.Alternative` for the network fee alert. > - **From/To Row**: Increase arrow icon size from `Xs` to `Sm`. > - **Styles**: Change `selected-gas-fee-token` button `borderRadius` from `16` to `4`. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit e59b444. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** This PR aims to add e2e test to cover the gas station transaction through 7702. <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: 1. What is the reason for the change? 2. What is the improvement/solution? --> ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: null ## **Related issues** Fixes: MetaMask/mobile-planning#2347 ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> ### **After** <!-- [screenshots/recordings] --> ## **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. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Adds an end-to-end test for EIP-7702 gas station flow with gas fee token selection (USDC) and updates components/selectors to use symbol-scoped testIDs. > > - **E2E**: > - Add spec `e2e/specs/.../gas-fee-tokens-eip-7702.spec.ts` to send ETH via EIP-7702, open gas fee token modal, validate DAI/USDC values, select USDC, and confirm transaction with mocks for Sentinel and relay APIs. > - New page object `e2e/pages/Confirmation/GasFeeTokenModal.ts` for interacting with gas fee token items/amounts/balances via dynamic IDs. > - Enhance `TransactionConfirmView` and `RowComponents` to tap/read the gas fee token pill, symbol, and arrow. > - **Selectors**: > - Add `GAS_FEE_TOKEN_PILL` row ID and new `GasFeeTokenSelectorIDs` (`selected-gas-fee-token-symbol`, `-arrow`). > - Add `GasFeeTokenModalSelectorsText` keys for list item, amounts, balance, and fiat amount. > - **Components/Tests**: > - Update `gas-fee-token-list-item.tsx` to suffix testIDs with token symbol for symbol, balance, fiat amount, and token amount. > - Update `selected-gas-fee-token.tsx` to expose symbol via `testID`. > - Adjust unit tests in `gas-fee-token-list-item.test.tsx` to match new dynamic testIDs. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 093d405. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** 1) Back press handler in Login Screen are calling lockApp which reseted the biometric password causing biometric reseted in the scenario in the issue #23292 2) `Biometric choice disable` update upon switch toggle causing inaccurate biometric choice state. This PR fix the back press issue and fix biometric choice to update after unlocked instead of biometric switch update <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: 1. What is the reason for the change? 2. What is the improvement/solution? --> ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: fix biometric sudden reset issue ## **Related issues** Fixes: #23292 ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user back press at unlock screen Given user lock the wallet with biometric set When user trigger back press gesture Then app will send to background When user reopen the app Then user are prompt for biometric ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> ### **After** <!-- [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] > Avoids biometric reset on back press and moves biometry preference persistence to after successful login; updates tests accordingly. > > - **Login flow (`app/components/Views/Login/index.tsx`)**: > - Back press now calls `Authentication.lockApp({ reset: false })` to avoid resetting biometrics. > - `updateBiometryChoice` only updates local state; storage flags are no longer set on toggle. > - Persist biometry preference by calling `updateAuthTypeStorageFlags(biometryChoice)` after `Authentication.userEntryAuth` succeeds. > - **Tests (`app/components/Views/Login/index2.test.tsx`)**: > - Remove direct import and expectation of `updateAuthTypeStorageFlags` on submit; align tests with new persistence timing. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 83294ee. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** Adds exclude labels to trending api. Related: MetaMask/core#7466 ## **Changelog** CHANGELOG entry: Add excludeLabels to trending api. ## **Related issues** Fixes: ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> ### **After** <!-- [screenshots/recordings] --> ## **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. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Exclude `stable_coin` and `blue_chip` via `excludeLabels` in `useTrendingRequest` when calling `getTrendingTokens` (with temporary type assertion). > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 7a71b05. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** Fixed an issue in the Perps Activity view where split stop loss and take profit orders were displayed as multiple separate entries instead of a single aggregated transaction. **Problem:** When HyperLiquid executes a stop loss or take profit order, it may split the order into multiple fills that occur at the same timestamp. Previously, these were shown as separate entries in the activity view, causing users to see partial/incorrect PnL values instead of the true aggregate. For instance, in the slack thread documented in the Jira issue, we were only showing the first entry, rather than the aggregated value from all the entries. **Solution:** Implemented fill aggregation in transactionTransforms.ts that groups close fills by: * Same asset symbol * Same timestamp (truncated to seconds) * Same close direction (Close Long, Close Short, Sell, or Auto-Deleveraging) For aggregated fills: * Sizes are summed * PnLs are summed * Fees are summed * Price is calculated as VWAP (Volume Weighted Average Price) * Stop Loss / Take Profit metadata is preserved from any grouped fill ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: Fixed Perps activity view to show aggregated PnL values for stop loss and take profit orders that execute as multiple fills ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/TAT-2196 ## **Manual testing steps** Hardcode `getEvmAccountFromSelectedAccountGroup` to user's public address, and scroll to Nov 27 activity. Validate on main (before) and on this branch (after). We should be showing the aggregated values. ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <img width="423" height="859" alt="Screenshot 2025-12-16 at 11 58 25 AM" src="https://github.com/user-attachments/assets/14689809-dab5-41ab-8d8b-51042b450e09" /> ### **After** <img width="426" height="776" alt="Screenshot 2025-12-16 at 11 42 24 AM" src="https://github.com/user-attachments/assets/d0b92eef-af99-4820-8372-7302216df826" /> ## **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] > Aggregate close fills (SL/TP/ADL/Sell) by asset+second with VWAP and summed PnL/fees, and dedupe live vs REST trades by seconds; add comprehensive tests. > > - **Perps utils (`transactionTransforms.ts`)**: > - **Aggregation**: Add `aggregateFillsByTimestamp` to group close fills by `symbol+timestamp(second)+direction` with summed `size/pnl/fee`, VWAP `price`, and preserved metadata. > - **Transforms**: `transformFillsToTransactions` now aggregates fills first; supports `Buy/Sell` and `Auto-Deleveraging` flows; retains SL/TP/Liquidation classification. > - **Hook (`usePerpsTransactionHistory.ts`)**: > - **Live/REST merge**: Deduplicate trade transactions by `asset+timestamp(second)`; live fills override REST; leverages new aggregated fills. > - **Tests (`transactionTransforms.test.ts`)**: > - Add extensive unit and integration tests for aggregation (SL/TP splits, VWAP, metadata), Buy/Sell handling, ADL, and edge cases. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 29b28ba. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** Require a full key match for Android and iOS build caches, since the following steps are conditional on `cache-hit`. Without this, we would get strange behavior where the cached builds could conflict with the ongoing build or cause E2Es to be run on old builds. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Remove cache restore fallbacks to require full key matches for Android and iOS E2E build caches. > > - **CI/Workflows**: > - Android (`.github/workflows/build-android-e2e.yml`): > - Remove `restore-keys` from APK/AAB cache restore step to enforce exact cache key match. > - iOS (`.github/workflows/build-ios-e2e.yml`): > - Remove `restore-keys` from app cache restore step to enforce exact cache key match. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit e735f92. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description**
Re-enables the order book entry point from the market details view, now
controlled by a LaunchDarkly feature flag for gradual rollout.
**Feature Flag Support:**
- Order Book visibility is controlled by LaunchDarkly flag
`perps-order-book-enabled`
- Disabled by default - requires remote flag or
`MM_PERPS_ORDER_BOOK_ENABLED="true"` env var to enable
- Supports version-gating via `minimumVersion` field in the flag
configuration
**Documentation:**
- Added comprehensive Perps Feature Flags documentation at
`docs/perps/perps-feature-flags.md`
- Covers architecture, implementation guide, LaunchDarkly configuration,
and troubleshooting
The order book feature allows users to navigate from the market
statistics card to view the full order book depth for a given market.
## **Changelog**
CHANGELOG entry: Re-enabled order book access from perps market details
view
## **Related issues**
Fixes:
## **Manual testing steps**
```gherkin
Feature: Order Book Navigation from Market Details
Scenario: Order Book is hidden when feature flag is disabled
Given MM_PERPS_ORDER_BOOK_ENABLED is not set or set to "false"
And no LaunchDarkly remote flag is configured
When the user opens the Perps market details view
Then the "Order Book" row should NOT be visible in the statistics card
Scenario: Order Book is visible when feature flag is enabled via env var
Given MM_PERPS_ORDER_BOOK_ENABLED is set to "true"
When the user opens the Perps market details view
Then the "Order Book" row should be visible in the statistics card
Scenario: User navigates to order book from market details
Given the Order Book feature flag is enabled
And the user is on the Perps market details view for any market
When user taps the "Order Book" row in the statistics card
Then the user is navigated to the Order Book view for that market
And the order book displays bid/ask depth and spread information
```
## **Screenshots/Recordings**
### **Before**
<!-- Order book row was not visible in the statistics card -->
### **After**
<!-- Order book row is now visible and tappable in the statistics card
-->
## **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]
> Re-enables Order Book entry in Perps Market Details, controlled by a
version-gated LaunchDarkly flag with env fallback, plus tests, mocks,
and docs.
>
> - **Perps UI**:
> - Re-enable Order Book navigation in `PerpsMarketDetailsView` and show
clickable row in `PerpsMarketStatisticsCard` when `onOrderBookPress` is
provided.
> - **Feature Flags**:
> - Add selector `selectPerpsOrderBookEnabledFlag` with version-gated
remote flag (`perpsOrderBookEnabled`) and local fallback
`MM_PERPS_ORDER_BOOK_ENABLED`.
> - Wire selector into `PerpsMarketDetailsView` to conditionally expose
Order Book entry.
> - Update mocks to include `perpsOrderBookEnabled`.
> - **Tests**:
> - Add comprehensive unit tests for `selectPerpsOrderBookEnabledFlag`
covering defaults, remote precedence, version gating, and fallbacks.
> - **Docs**:
> - Add `docs/perps/perps-feature-flags.md` detailing the Perps
feature-flag framework and usage.
> - **Config**:
> - Add `MM_PERPS_ORDER_BOOK_ENABLED` to `.js.env.example`.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
e329129. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** Bumps the Snaps packages to the latest version. This release is a hotfix release that mitigates an issue where lack of persistence during initialization would cause Snaps to lose permissions when restarting the app. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Update @metamask/snaps-controllers from ^17.1.1 to ^17.1.2. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit fe4f7f1. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description**
Temporarily disable Cursor Analysis during holidays. Will re-enable it
afterwards.
## **Changelog**
<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`
If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`
(This helps the Release Engineer do their job more quickly and
accurately)
-->
CHANGELOG entry: null
## **Related issues**
Fixes:
## **Manual testing steps**
```gherkin
Feature: my feature name
Scenario: user [verb for user action]
Given [describe expected initial app state]
When user [verb for user action]
Then [describe expected outcome]
```
## **Screenshots/Recordings**
<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->
### **Before**
<!-- [screenshots/recordings] -->
### **After**
<!-- [screenshots/recordings] -->
## **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.
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Temporarily disables the Cursor Issue Analysis workflow by
short-circuiting the job condition with `false &&`.
>
> - **CI/Workflows**:
> - Temporarily disables `analyze-issue` in
`.github/workflows/cursor-issue-analysis.yml` by prefixing the job `if`
with `false &&`; adds an explanatory comment.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
c2472a2. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
Signed-off-by: dan437 <80175477+dan437@users.noreply.github.com>
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** Reduce CI time by using a shallow Git checkout in the E2E flow, this saves us ~40s in each E2E shard. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Switch E2E workflows to shallow checkout by removing `fetch-depth: 0` from `actions/checkout` steps. > > - **CI/GitHub Actions**: > - Use shallow checkout in E2E workflows by removing full-depth fetch from `actions/checkout` in: > - `/.github/workflows/run-e2e-api-specs.yml` > - `/.github/workflows/run-e2e-workflow.yml` > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 1167f4b. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->
this PR addresses some flakines:
Adding await when calling AppwrightGesture.tap function, without this,
there was a race condition that eventually created flakiness
Fixed account creation test by waiting for some texts to disappear
before moving on
## **Description**
<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->
## **Changelog**
<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`
If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`
(This helps the Release Engineer do their job more quickly and
accurately)
-->
CHANGELOG entry:
## **Related issues**
Fixes:
## **Manual testing steps**
```gherkin
Feature: my feature name
Scenario: user [verb for user action]
Given [describe expected initial app state]
When user [verb for user action]
Then [describe expected outcome]
```
## **Screenshots/Recordings**
<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->
### **Before**
<!-- [screenshots/recordings] -->
### **After**
<!-- [screenshots/recordings] -->
## **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.
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Standardizes awaiting element handles and enhances tap retry logic,
adds account syncing wait, and adjusts modal handling/selectors to
stabilize e2e/performance tests.
>
> - **E2E framework**
> - **Tap retry**: Broaden retry condition and improve logging in
`AppwrightGestures.tap`.
> - **Flows**
> - Default `dismissModals` set to `false` in `login` and
`importSRPFlow`; remove fixed sleep; add
`AccountListComponent.waitForSyncingToComplete()` during SRP import.
> - **Screen objects**
> - Consistently `await` element handles before
`AppwrightGestures.tap/typeText` across many screens (e.g.,
`LoginScreen`, `WalletActionModal`, `NetworksScreen`, `AmountScreen`,
Perps/Predict views, etc.).
> - Increase visibility timeout in `AddAccountModal.isVisible`; selector
tweaks (e.g., `BridgeScreen.getNetworkButton` uses catch-all on
Android).
> - **Performance tests**
> - Remove extra predictions modal dismissal; align with new login
defaults; minor timing/visibility adjustments.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
052e414. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** * fix: fox animation raise up issue during keyboard open * Problem: On some Android devices (notably Xiaomi), the fox animation on the login screen would move up when the keyboard opens due to the default adjustResize behavior in AndroidManifest.xml. * Solution: Integrated react-native-keyboard-controller library to control the soft input mode at runtime: On Login screen mount (Android only): We set SOFT_INPUT_ADJUST_PAN instead of the default adjustResize. This prevents the window from resizing when the keyboard opens, keeping the fox animation in its original position. On Login screen unmount: We call KeyboardController.setDefaultMode() to restore the original soft input behavior for other screens. * Jira: https://consensyssoftware.atlassian.net/browse/SL-344 * Github: #23227 <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: 1. What is the reason for the change? 2. What is the improvement/solution? --> ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: fix: fox animation raise up issue during keyboard open. ## **Related issues** Fixes: * fox animation raise up issue during keyboard open. ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> <img width="362" height="777" alt="Screenshot 2025-11-26 at 1 09 02 PM" src="https://github.com/user-attachments/assets/5ae70e5c-1d36-41ce-bd1f-84ad15479d0a" /> ### **After** <!-- [screenshots/recordings] --> <img width="395" height="792" alt="Screenshot 2025-11-26 at 1 15 32 PM" src="https://github.com/user-attachments/assets/8d1f2778-8a4d-4d7d-bb52-f2b80277c030" /> https://github.com/user-attachments/assets/bd5a3fcf-a24b-4f84-a871-54521543574e ## **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** - [x] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [x] 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] > Replaces Login’s keyboard handling with react-native-keyboard-controller (wrapped in KeyboardProvider) and sets platform-specific bottomOffset, with updated tests/mocks and dependency additions. > > - **Login view (`app/components/Views/Login/index.tsx`)**: > - Replace `react-native-keyboard-aware-scroll-view` usage with `react-native-keyboard-controller` (`KeyboardProvider`, `KeyboardAwareScrollView`). > - Configure `bottomOffset` (`50` on Android, `0` on iOS) and simplify props; wrap screen in `KeyboardProvider`. > - **Tests**: > - Mock `react-native-keyboard-controller` in `index.test.tsx` and global `app/util/test/testSetup.js`. > - Add tests asserting `bottomOffset` per platform; update snapshots to reflect new layout. > - **Dependencies**: > - Add `react-native-keyboard-controller` to `package.json`/`yarn.lock` and iOS `Podfile.lock` (pods for `react-native-keyboard-controller`). > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 6850922. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: hieu-w <maestrokoder@gmail.com>
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** Removing `SwapsLiveness` deprecating service in preparation of the Swaps module removal. <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: 1. What is the reason for the change? 2. What is the improvement/solution? --> ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: null ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/SWAPS-3581 ## **Manual testing steps** ```gherkin No business logic is affected, just ensure no regressions exist on swaps and that entry points to swaps screen are not affected (eg from asset page and browser url bar). ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> ### **After** <!-- [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] > Remove SwapsLiveness module, strip swaps liveness selectors/props, and update UI/tests to no longer depend on them. > > - **State/Selectors**: > - Remove `selectIsBridgeEnabledSource`, `selectIsBridgeEnabledDest`, and `selectIsSwapsLive` from `app/core/redux/slices/bridge`. > - **UI**: > - Delete `app/components/UI/Swaps/SwapsLiveness.ts` and remove its usage from `app/components/Nav/Main/index.js`. > - Update `app/components/Views/Asset/index.js` and `app/components/Views/confirmations/legacy/SendFlow/Amount/index.js` to remove `swapsIsLive` props/conditions. > - **Tests**: > - Adjust mocks in `TradeWalletActions.test.tsx` and `WalletActions.test.tsx` to drop removed selectors and use existing ones (e.g., `selectIsSwapsEnabled`). > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 705377f. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 : )