Skip to content

[pull] main from MetaMask:main#379

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

[pull] main from MetaMask:main#379
pull[bot] merged 6 commits into
Reality2byte:mainfrom
MetaMask:main

Conversation

@pull

@pull pull Bot commented Dec 4, 2025

Copy link
Copy Markdown

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 : )

weitingsun and others added 6 commits December 3, 2025 23:43
<!--
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**
<img width="1144" height="354" alt="Screenshot 2025-11-26 at 10 53
04 AM"
src="https://github.com/user-attachments/assets/6dbe890a-6fbe-4b31-81bf-e688c28a8149"
/>

1. Add readme for using OTA updates on nightly builds 
2. change EAS update org name from metamask-test to metamask 
3. Add "message" as an input for the workflow
4. Env variables were not getting picked up after pushing EAS updates
5. update update-expo-channel so we now have rc and exp channels for rc
and exp builds

## **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: Added readme for using OTA updates on nightly builds 

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: Fix Env variables not getting picked up 

  Scenario: user pushes EAS updates
    Given the app requires an OTA update 

    When user pushes a new update
    Then env variables should not be changed
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**
<img width="1170" height="2532" alt="File (6)"
src="https://github.com/user-attachments/assets/22f3529d-8a29-448c-af17-4c0bdea7fce6"
/>

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

### **After**

![1764793549869](https://github.com/user-attachments/assets/e3e30ea2-7d56-4efc-8ac3-cb6aebf60dcd)

<!-- [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
- [ ] I’ve included tests if applicable
- [ ] 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]
> Wires EAS OTA publishing through build.sh with message input and envs,
enables exp/rc update channels, switches Expo owner to metamask, and
adds docs for nightly OTA updates.
> 
> - **Workflows**:
> - **push-eas-update.yml**: Rename to EXP build; add `inputs.message`
and propagate as `UPDATE_MESSAGE`; switch environment to `build-exp`;
inject required env vars/secrets; replace inline `eas update` with `yarn
build:expo-update:main:exp`; improve config logging and summaries.
> - **ci.yml**: Increase Node heap for iOS bundle generation via
`NODE_OPTIONS`.
> - **Build/Scripts**:
> - **`scripts/build.sh`**: Add `buildExpoUpdate()` to sign and run `eas
update` (uses `EXPO_CHANNEL`, `EXPO_KEY_PRIV`, `UPDATE_MESSAGE`); add
`PLATFORM=expo-update` path; skip `update-expo-channel` when running
Expo updates.
>   - **`package.json`**: Add `build:expo-update:main:*` scripts.
> - **`scripts/update-expo-channel.js`**: Support `exp` and `rc` configs
(channels `exp`/`rc`), refactor `getConfigForEnvironment(env)`, and only
apply for `exp`/`rc`.
> - **Config**:
>   - **`app.config.js`**: Change Expo `owner` to `metamask`.
> - **Docs**:
> - Add `docs/nightly-ota-updates.md` with guidance for OTA on nightly
builds.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
3440eb8. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: sethkfman <seth.kaufman@consensys.net>
## **Description**

Enlarge question mark icon in lend header

## **Changelog**

CHANGELOG entry:null

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/MDP-399

## **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](https://github.com/user-attachments/assets/67582d5f-2e2f-4169-885a-63adf7a01337)
|
![after](https://github.com/user-attachments/assets/daad1e91-84bc-4d7a-8041-7b97eb2edff5)
|

### **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]
> Sets the staking header’s question icon to large by adding
`size={IconSize.Lg}` to the `Icon` in `getStakingNavbar`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
7a71bce. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

Refine styles for lend UI

## **Changelog**

CHANGELOG entry:null

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/MDP-598

## **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**

No Positions
| before    | after |
| -------- | ------- |
|
![before](https://github.com/user-attachments/assets/e6afdd13-df87-4ab2-a79b-09da3d11343f)
|
![after](https://github.com/user-attachments/assets/8014f518-eef9-4b4a-b086-f635a96cd6a0)
|

Active Positions
| before    | after |
| -------- | ------- |
|
![before](https://github.com/user-attachments/assets/93a5dedd-15e7-4fa8-8721-0523061ac66c)
|
![after](https://github.com/user-attachments/assets/b26aa56b-39d0-41f8-99e7-4d2390e8c610)
|

### **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]
> Theme-enable Earn lending components, add a styled buttons container
when positions exist, and update empty state/background spacing with
snapshot updates.
> 
> - **UI (Earn)**:
>   - `EarnLendingBalance`
> - Integrate theming: pass `theme` to `styleSheet` via `useTheme` and
`useStyles`.
> - Add `styles.buttonsContainer` (background, padding, radius, margin)
applied when `userHasLendingPositions`.
> - Minor layout tweaks: remove top padding from `container`; adjust
spacing.
>   - `EmptyStateCta`
> - Update container styling to `colors.background.section` and add top
margin.
> - **Tests**:
> - Update snapshots to reflect new themed backgrounds, margins, and
button container styling.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
047ea4a. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
… tests and workflows (#23630)

## **Description**

Removing the rest of the `MM_REMOVE_GLOBAL_NETWORK_SELECTOR` feature
flags from E2E tests and workfolows

Previous PRs relating to this feature flag removal:
[chore: remove MM_REMOVE_GLOBAL_NETWORK_SELECTOR from hooks, lists, and
control bars](#22574)
[chore: remove global network selector feature flag from selectors and
polling](#22463)
[chore: Remove MM_REMOVE_GLOBAL_NETWORK_SELECTOR feature flag from
component level](#22067)

## **Changelog**

CHANGELOG entry:null

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/MUL-1132

## **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**

`~`

## **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]
> Removes the MM_REMOVE_GLOBAL_NETWORK_SELECTOR flag from workflows and
env, and refactors E2E tests to drop conditional paths, unify network
selection, and delete obsolete specs.
> 
> - **CI Workflows**:
> - Remove `MM_REMOVE_GLOBAL_NETWORK_SELECTOR` env from
`github/workflows/**` (`build-android-e2e.yml`, `build-ios-e2e.yml`,
`run-e2e-smoke-tests-android-flask.yml`, `run-e2e-workflow.yml`).
> - **Env Examples**:
> - Delete `MM_REMOVE_GLOBAL_NETWORK_SELECTOR` from `.js.env.example`
and its comments.
> - **E2E Tests**:
> - Consolidate tests by removing conditional gating on
`MM_REMOVE_GLOBAL_NETWORK_SELECTOR` and duplicative suites:
> -
`e2e/specs/confirmations-redesigned/.../per-dapp-selected-network.spec.ts`:
drop flag checks, remove `NetworkEducationModal` usage, unify network
change via `WalletView.tapTokenNetworkFilter()`.
> - `e2e/specs/networks/add-popular-networks.spec.ts`: simplify to a
single smoke test using the multi-selector; remove regression variant
and `NetworkAddedBottomSheet` flow.
> -
`e2e/specs/quarantine/.../permission-system-add-non-permitted.failing.js`:
remove flag branches and unused imports; standardize flows to token
network filter; keep permitted/non-permitted chain tests.
> - `e2e/specs/settings/addressbook-send-add-contact.spec.ts`: remove
flag-gated tests; always run "different network" contact flow.
>   - Remove obsolete specs:
>     - `e2e/specs/networks/networks-search.spec.ts` (deleted).
>     - `e2e/specs/settings/fiat-on-testnets.spec.ts` (deleted).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
5932ffa. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…60.3 (#23642)

## **Description**

This PR fixes an issue where the deeplink interstitial modal was
incorrectly appearing when barebones deeplinks (links without pathnames
and query parameters) opened the MetaMask app.

**Problem:**
Third-party applications, especially those using WalletConnect, commonly
deeplink back into MetaMask using barebones URLs like `metamask://` or
`link.metamask.io/`. These links are intentionally minimal and serve
only to open the app without navigating to a specific action. However,
the current implementation was processing these links through the full
deeplink handling flow, which triggered the interstitial modal and
signature verification checks unnecessarily.

**Solution:**
Added an early return in `handleUniversalLink` to skip processing when a
validated URL has no pathname and no query parameters. This prevents the
interstitial modal from appearing and avoids unnecessary signature
verification for these barebones deeplinks, providing a smoother user
experience when third-party apps redirect users back to MetaMask.

**Technical Changes:**
- Added early return logic in `handleUniversalLink` to detect and skip
barebones deeplinks
- Updated tests to verify skip behavior for links without pathname/query
params
- Ensured `hasSignature` is not called when processing is skipped

## **Changelog**

CHANGELOG entry: Fixed unexpected interstitial modal from appearing for
barebones deeplinks

## **Related issues**

Fixes: #23641

This fix prevents the deeplink interstitial from appearing when
barebones (links without pathnames and query params) deeplinks opens the
app. This is a common use case from third party apps especially when
using WC. Apps usually deeplink back into metamask via `metamask://`

## **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] -->
From @v-goyal -
https://consensys.slack.com/archives/C8RSKCNCD/p1764729786354199?thread_ts=1764724329.879139&cid=C8RSKCNCD

### **After**

<!-- [screenshots/recordings] -->
This video shows the fix using the Interface app and includes a smoke
test with a few other deeplinks

https://github.com/user-attachments/assets/c5eeb33b-4523-4f6a-b90d-0d94608e55a9

## **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]
> Skip handling deeplinks with no pathname or query (e.g., metamask://,
link.metamask.io[/]) to prevent interstitial and signature checks; add
targeted tests.
> 
> - **Core – Deeplink handling**:
> - In
`app/core/DeeplinkManager/handlers/legacy/handleUniversalLink.ts`, add
early return to `handled()` and skip processing when the validated URL
has no pathname and no query, preventing interstitial/signature flows
for barebones links.
> - **Tests**:
>   - In `__tests__/handleUniversalLink.test.ts`:
>     - Import `verifySignature` namespace to spy on `hasSignature`.
> - Add cases verifying skip behavior for links without path/query and
that `hasSignature` is not called when skipped.
>     - Minor: update `describe` name to `handleUniversalLink`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
2d09a02. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
#23466)

## **Description**

The Perps tab on the home screen was displaying "Available balance"
instead of "Total balance". Total balance includes margin locked in
trades and should match the primary balance shown in the Perps home
view.

Changed `PerpsTabControlBar` to use `totalBalance` instead of
`availableBalance` for consistency with the Perps home view.

## **Changelog**

CHANGELOG entry: Fixed Perps tab to display total balance instead of
available balance

## **Related issues**

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

## **Manual testing steps**

```gherkin
Feature: Perps tab balance display

  Scenario: User views total balance in Perps tab
    Given user has open positions in Perps with margin locked

    When user views the Perps tab on home screen
    Then the balance shown matches the total balance in Perps home view
    And the label reads "Total Balance" instead of "Available Balance"
```

## **Screenshots/Recordings**

### **Before**

- Label: "Available balance"
- Value: Shows withdrawable funds only
<img width="418" height="848" alt="image"
src="https://github.com/user-attachments/assets/d49b0b18-c762-4880-a545-0ba9cf6d132f"
/>

### **After**

- Label: "Total Balance"
- Value: Shows total account value (includes margin locked in trades)



https://github.com/user-attachments/assets/c04940c0-71ba-4ce9-9a2c-9ed726f87dfc


## **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]
> PerpsTabControlBar now displays and animates against `totalBalance`
with updated label and tests reflecting the change.
> 
> - **UI (PerpsTabControlBar)**
> - Display `totalBalance` instead of `availableBalance` for balance
pill.
>   - Update label to `strings('perps.total_balance')`.
> - Drive balance pulse animation and zero/empty checks from
`totalBalance`.
> - **Tests**
>   - Update mocks, assertions, and edge cases to use `totalBalance`.
> - Verify animations trigger on `totalBalance` changes and errors are
logged.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
51afbe2. 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 4, 2025
@pull pull Bot added the ⤵️ pull label Dec 4, 2025
@pull pull Bot merged commit e85bc15 into Reality2byte:main Dec 4, 2025
1 of 11 checks passed
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.

4 participants