Skip to content

Commit ceb964b

Browse files
authored
feat: 7.46.0 (#14866)
# 🚀 v7.46.0 Testing & Release Quality Process Hi Team, As part of our new **MetaMask Release Quality Process**, here’s a quick overview of the key processes, testing strategies, and milestones to ensure a smooth and high-quality deployment. --- ## 📋 Key Processes ### Testing Strategy - **Developer Teams:** Conduct regression and exploratory testing for your functional areas, including automated and manual tests for critical workflows. - **QA Team:** Focus on exploratory testing across the wallet, prioritize high-impact areas, and triage any Sentry errors found during testing. - **Customer Success Team:** Validate new functionalities and provide feedback to support release monitoring. ### GitHub Signoff - Each team must **sign off on the Release Candidate (RC)** via GitHub by the end of the validation timeline (**Tuesday EOD PT**). - Ensure all tests outlined in the Testing Plan are executed, and any identified issues are addressed. ### Issue Resolution - **Resolve all Release Blockers** (Sev0 and Sev1) by **Tuesday EOD PT**. - For unresolved blockers, PRs may be reverted, or feature flags disabled to maintain release quality and timelines. ### Cherry-Picking Criteria - Only **critical fixes** meeting outlined criteria will be cherry-picked. - Developers must ensure these fixes are thoroughly reviewed, tested, and merged by **Tuesday EOD PT**. --- ## 🗓️ Timeline and Milestones 1. **Today (Friday):** Begin Release Candidate validation. 2. **Tuesday EOD PT:** Finalize RC with all fixes and cherry-picks. 3. **Wednesday:** Buffer day for final checks. 4. **Thursday:** Submit release to app stores and begin rollout to 1% of users. 5. **Monday:** Scale deployment to 10%. 6. **Tuesday:** Full rollout to 100%. --- ## ✅ Signoff Checklist Each team is responsible for signing off via GitHub. Use the checkbox below to track signoff completion: # Team sign-off checklist - [x] Accounts - [x] Assets - [x] Confirmations - [x] Earn - [x] Hardware Wallets - [x] Identity - [ ] Mobile Platform (pending incident resolution) - [x] Portfolio - [x] Product Safety - [x] Ramp - [x] SDK - [x] Snaps Platform - [x] Solana - [x] Swaps and Bridge - [x] Transactions - [x] Wallet Framework - [x] Wallet UX This process is a major step forward in ensuring release stability and quality. Let’s stay aligned and make this release a success! 🚀 Feel free to reach out if you have questions or need clarification. Many thanks in advance # Reference - Testing plan sheet - https://docs.google.com/spreadsheets/d/1tsoodlAlyvEUpkkcNcbZ4PM9HuC9cEM80RZeoVv5OCQ/edit?usp=sharing
2 parents 2551cd9 + 7d47469 commit ceb964b

999 files changed

Lines changed: 37889 additions & 22990 deletions

File tree

Some content is hidden

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

.github/CODEOWNERS

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,13 @@ app/components/UI/Ramp/ @MetaMask/ramp
4040
app/reducers/fiatOrders/ @MetaMask/ramp
4141

4242
# Confirmation Team
43-
app/components/Views/confirmations @MetaMask/confirmations
44-
app/core/Engine/controllers/gas-fee-controller @MetaMask/confirmations
45-
app/core/Engine/controllers/transaction-controller @MetaMask/confirmations
46-
app/core/Analytics/events/confirmations @MetaMask/confirmations
47-
ppom @MetaMask/confirmations
43+
app/components/Views/confirmations @MetaMask/confirmations
44+
app/core/Engine/controllers/gas-fee-controller @MetaMask/confirmations
45+
app/core/Engine/controllers/signature-controller @MetaMask/confirmations
46+
app/core/Engine/controllers/transaction-controller @MetaMask/confirmations
47+
app/core/Analytics/events/confirmations @MetaMask/confirmations
48+
ppom @MetaMask/confirmations
49+
app/selectors/featureFlagController/confirmations/ @MetaMask/confirmations
4850

4951
# All below files are maintained by the SDK team because they contain SDK related code, WalletConnect integrations, or critical SDK flows.
5052
app/actions/sdk @MetaMask/sdk-devs
@@ -101,13 +103,13 @@ app/components/UI/TemplateRenderer @MetaMask/confirmations @MetaMask/snaps-dev
101103
# Wallet API Platform Team
102104
app/core/RPCMethods/ @MetaMask/wallet-api-platform-engineers
103105

104-
# Staking Team
105-
app/components/UI/Stake @MetaMask/metamask-staking
106-
app/core/Engine/controllers/earn-controller @MetaMask/metamask-staking
107-
app/core/Engine/messengers/earn-controller-messenger @MetaMask/metamask-staking
108-
app/selectors/earnController @MetaMask/metamask-staking
109-
**/Earn/** @MetaMask/metamask-staking
110-
**/earn/** @MetaMask/metamask-staking
106+
# Earn Team
107+
app/components/UI/Stake @MetaMask/metamask-earn
108+
app/core/Engine/controllers/earn-controller @MetaMask/metamask-earn
109+
app/core/Engine/messengers/earn-controller-messenger @MetaMask/metamask-earn
110+
app/selectors/earnController @MetaMask/metamask-earn
111+
**/Earn/** @MetaMask/metamask-earn
112+
**/earn/** @MetaMask/metamask-earn
111113

112114
# Assets Team
113115
app/components/hooks/useIsOriginalNativeTokenSymbol @MetaMask/metamask-assets
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
name: Automated RCA
2+
3+
on:
4+
issues:
5+
types: [closed]
6+
7+
permissions:
8+
issues: write
9+
contents: read
10+
11+
jobs:
12+
automated-rca:
13+
uses: MetaMask/github-tools/.github/workflows/post-gh-rca.yml@115cc6dce7aa32c85cbd77a19e9c04db85fb7920
14+
with:
15+
google-form-base-url: 'https://docs.google.com/forms/d/e/1FAIpQLSdnPbJISzFlR_aQD2uRpnMKSoGAopuTd_yeZK7J4Q5GzgbsOA/viewform?usp=pp_url&entry.340898780='
16+
repo-owner: ${{ github.repository_owner }}
17+
repo-name: ${{ github.event.repository.name }}
18+
issue-number: ${{ github.event.issue.number }}
19+
issue-labels: '["Sev0-urgent", "Sev1-high"]'

.github/workflows/changelog-check.yml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,17 @@ on:
66

77
jobs:
88
check-changelog:
9-
uses: MetaMask/github-tools/.github/workflows/changelog-check.yml@fd5f71cd6cb3c64e4fab7db56ce6b53c75732f95
9+
# Asking engineers to update CHANGELOG.md increases the potential for
10+
# conflicts across all pull requests.
11+
# Disable this workflow until we can refine the new changelog process.
12+
if: false
13+
14+
uses: MetaMask/github-tools/.github/workflows/changelog-check.yml@91e349d177db2c569e03c7aa69d2acb404b62f75
1015
with:
1116
base-branch: ${{ github.event.pull_request.base.ref }}
1217
head-ref: ${{ github.head_ref }}
1318
labels: ${{ toJSON(github.event.pull_request.labels) }}
19+
pr-number: ${{ github.event.pull_request.number }}
1420
repo: ${{ github.repository }}
1521
secrets:
1622
gh-token: ${{ secrets.PR_TOKEN }}
17-
18-

.iyarc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +0,0 @@
1-
# Advisory exclusions
2-
GHSA-h9w6-f932-gq62

CHANGELOG.md

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,59 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

88
## [Unreleased]
9+
- fix(bridge): show "Auto" slippage for Solana swaps
10+
11+
## [7.46.0]
12+
13+
### Added
14+
15+
- feat(bridge): implement quote expiration handling in Bridge feature ([#14872](https://github.com/MetaMask/metamask-mobile/pull/14872))
16+
- feat(bridge): use dynamic slippage for single-chain Solana swaps ([#14805](https://github.com/MetaMask/metamask-mobile/pull/14805))
17+
- feat(bridge): enhance bridging with network fee estimation and UI improvements ([#14786](https://github.com/MetaMask/metamask-mobile/pull/14786))
18+
- feat(ramp): auto-select region ([#14780](https://github.com/MetaMask/metamask-mobile/pull/14780))
19+
- feat(bridge): add solana chain support and improve bridge state management ([#14713](https://github.com/MetaMask/metamask-mobile/pull/14713))
20+
- feat(bridge): add error handling and input management for bridge quotes ([#14693](https://github.com/MetaMask/metamask-mobile/pull/14693))
21+
- feat(multi-srp): enable multi-srp in main and beta ([#14558](https://github.com/MetaMask/metamask-mobile/pull/14558))
22+
- feat(ramp): Update ramp data flow to fetch cryptos before payment methods ([#14437](https://github.com/MetaMask/metamask-mobile/pull/14437))
23+
- feat(bridge): add destination account picker ([#14656](https://github.com/MetaMask/metamask-mobile/pull/14656))
24+
- feat(bridge): add Solana assets to bridge token pickers ([#14365](https://github.com/MetaMask/metamask-mobile/pull/14365))
25+
- feat: add AppMetadataController controller ([#14513](https://github.com/MetaMask/metamask-mobile/pull/14513))
26+
- feat(bridge): implement bridge quote fetching ([#14413](https://github.com/MetaMask/metamask-mobile/pull/14413))
27+
- feat(multi-srp): add e2e tests ([#14583](https://github.com/MetaMask/metamask-mobile/pull/14583))
28+
- feat(bridge): fetch token metadata for Bridge token pickers if not already available ([#14699](https://github.com/MetaMask/metamask-mobile/pull/14699))
29+
- feat(bridge): use `BridgeStatusController` for EVM and Solana Bridge transaction submission ([#14708](https://github.com/MetaMask/metamask-mobile/pull/14708))
30+
- feat: real time dapp scanning BrowserTab ([#14515](https://github.com/MetaMask/metamask-mobile/pull/14515))
31+
- feat(multi-srp): add new srp pills labels ([#14829](https://github.com/MetaMask/metamask-mobile/pull/14829))
32+
- feat: feat: AccountConnect and AccountApproval use dapp scanning ([#14514](https://github.com/MetaMask/metamask-mobile/pull/14514/))
33+
34+
### Changed
35+
36+
- feat(bridge): Handle Solana vs EVM swap and bridge routing ([#14614](https://github.com/MetaMask/metamask-mobile/pull/14614))
37+
- fix(multi-srp): allow a user to select srp when creating a multichain account ([#14644](https://github.com/MetaMask/metamask-mobile/pull/14644))
38+
- fix(multi-srp): display errors only after all the words are have been entered ([#14607](https://github.com/MetaMask/metamask-mobile/pull/14607))
39+
- feat: update address truncation format from 4 to 5 characters to match extension ([#14744](https://github.com/MetaMask/metamask-mobile/pull/14744))
40+
- fix(multi-srp): display errors only after all the words are have been entered ([#14607](https://github.com/MetaMask/metamask-mobile/pull/14607))
41+
- fix(wallet-ux): increased touchable area for account picker so it is easier to select ([#14762](https://github.com/MetaMask/metamask-mobile/pull/14762))
42+
- fix(multi-srp): display alternative text color when in dark mode([#14718](https://github.com/MetaMask/metamask-mobile/pull/14718))
43+
44+
### Fixed
45+
46+
- fix(bridge): keyboard not appearing when error banner is displayed ([#14862](https://github.com/MetaMask/metamask-mobile/pull/14862))
47+
- fix(bridge): fix not switching networks when selecting source token ([#14712](https://github.com/MetaMask/metamask-mobile/pull/14712))
48+
- fix: updates a padding style specifically for Android devices ([#14725](https://github.com/MetaMask/metamask-mobile/pull/14725))
49+
- fix(bridge): enhance UI/UX with improved input handling and layout adjustments ([#14781](https://github.com/MetaMask/metamask-mobile/pull/14781))
50+
- fix(swaps): set default slippage when source or destination token is not stablecoin ([#14730](https://github.com/MetaMask/metamask-mobile/pull/14730))
51+
- fix(bridge): fix transaction history for EVM and Solana bridge transactions ([#14759](https://github.com/MetaMask/metamask-mobile/pull/14759))
52+
- fix(bridge): change networks properly when user switches between source and destination tokens ([#14812](https://github.com/MetaMask/metamask-mobile/pull/14812))
53+
- fix(bridge): fix(bridge): update quote details card toggle to handle same chain swaps and improve slippage button layout ([#15153](https://github.com/MetaMask/metamask-mobile/pull/15153))
54+
- fix(confirmations): fix the send crash when user puts unexpected address into recipient input([#15308](https://github.com/MetaMask/metamask-mobile/pull/15308))
55+
56+
## [7.45.2]
57+
58+
### Fixed
59+
60+
- fix: 15108 create a wrapper for toChecksumAddress to prevent app crash ([#15202](https://github.com/MetaMask/metamask-mobile/pull/15202))
61+
- chore(runway): cherry-pick fix: base-x audit issue ([#15216](https://github.com/MetaMask/metamask-mobile/pull/15216))
962

1063
## [7.45.1]
1164

@@ -186,7 +239,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
186239
- fix: Revert "chore: upgrade Xcode 16 on bitrise.yml" ([#14012](https://github.com/MetaMask/metamask-mobile/pull/14012))
187240
- fix(bridge): hide staked native assets from token selectors ([#14457](https://github.com/MetaMask/metamask-mobile/pull/14457))
188241

189-
190242
## [7.43.0]
191243

192244
### Added
@@ -5353,7 +5405,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
53535405
- [#957](https://github.com/MetaMask/metamask-mobile/pull/957): fix timeouts (#957)
53545406
- [#954](https://github.com/MetaMask/metamask-mobile/pull/954): Bugfix: onboarding navigation (#954)
53555407

5356-
[Unreleased]: https://github.com/MetaMask/metamask-mobile/compare/v7.45.1...HEAD
5408+
[Unreleased]: https://github.com/MetaMask/metamask-mobile/compare/v7.46.0...HEAD
5409+
[7.46.0]: https://github.com/MetaMask/metamask-mobile/compare/v7.45.1...v7.46.0
53575410
[7.45.1]: https://github.com/MetaMask/metamask-mobile/compare/v7.45.0...v7.45.1
53585411
[7.45.0]: https://github.com/MetaMask/metamask-mobile/compare/v7.44.0...v7.45.0
53595412
[7.44.0]: https://github.com/MetaMask/metamask-mobile/compare/v7.43.0...v7.44.0

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,8 @@ android {
178178
applicationId "io.metamask"
179179
minSdkVersion rootProject.ext.minSdkVersion
180180
targetSdkVersion rootProject.ext.targetSdkVersion
181-
versionName "7.45.2"
182-
versionCode 1810
181+
versionName "7.46.0"
182+
versionCode 1846
183183
testBuildType System.getProperty('testBuildType', 'debug')
184184
missingDimensionStrategy 'react-native-camera', 'general'
185185
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

app/actions/identity/index.test.ts

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1+
import { BACKUPANDSYNC_FEATURES } from '@metamask/profile-sync-controller/user-storage';
12
import {
23
performSignIn,
34
performSignOut,
4-
disableProfileSyncing,
5-
enableProfileSyncing,
5+
setIsBackupAndSyncFeatureEnabled,
66
syncInternalAccountsWithUserStorage,
77
} from '.';
88
import Engine from '../../core/Engine';
@@ -15,8 +15,7 @@ jest.mock('../../core/Engine', () => ({
1515
performSignOut: jest.fn(),
1616
},
1717
UserStorageController: {
18-
enableProfileSyncing: jest.fn(),
19-
disableProfileSyncing: jest.fn(),
18+
setIsBackupAndSyncFeatureEnabled: jest.fn(),
2019
syncInternalAccountsWithUserStorage: jest.fn(),
2120
},
2221
},
@@ -52,29 +51,37 @@ describe('Identity actions', () => {
5251
expect(result).toBeUndefined();
5352
});
5453

55-
it('enables profile syncing successfully', async () => {
54+
it('enables backup and sync features successfuly', async () => {
5655
(
57-
Engine.context.UserStorageController.enableProfileSyncing as jest.Mock
56+
Engine.context.UserStorageController
57+
.setIsBackupAndSyncFeatureEnabled as jest.Mock
5858
).mockResolvedValue(undefined);
5959

60-
const result = await enableProfileSyncing();
60+
const result = await setIsBackupAndSyncFeatureEnabled(
61+
BACKUPANDSYNC_FEATURES.main,
62+
true,
63+
);
6164

6265
expect(
63-
Engine.context.UserStorageController.enableProfileSyncing,
64-
).toHaveBeenCalled();
66+
Engine.context.UserStorageController.setIsBackupAndSyncFeatureEnabled,
67+
).toHaveBeenCalledWith(BACKUPANDSYNC_FEATURES.main, true);
6568
expect(result).toBeUndefined();
6669
});
6770

68-
it('disables profile syncing successfully', async () => {
71+
it('disables backup and sync features successfuly', async () => {
6972
(
70-
Engine.context.UserStorageController.disableProfileSyncing as jest.Mock
73+
Engine.context.UserStorageController
74+
.setIsBackupAndSyncFeatureEnabled as jest.Mock
7175
).mockResolvedValue(undefined);
7276

73-
const result = await disableProfileSyncing();
77+
const result = await setIsBackupAndSyncFeatureEnabled(
78+
BACKUPANDSYNC_FEATURES.main,
79+
false,
80+
);
7481

7582
expect(
76-
Engine.context.UserStorageController.disableProfileSyncing,
77-
).toHaveBeenCalled();
83+
Engine.context.UserStorageController.setIsBackupAndSyncFeatureEnabled,
84+
).toHaveBeenCalledWith(BACKUPANDSYNC_FEATURES.main, false);
7885
expect(result).toBeUndefined();
7986
});
8087

app/actions/identity/index.ts

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { getErrorMessage } from '@metamask/utils';
22
import Engine from '../../core/Engine';
3+
import { BACKUPANDSYNC_FEATURES } from '@metamask/profile-sync-controller/user-storage';
34

45
export const performSignIn = async () => {
56
try {
@@ -17,17 +18,15 @@ export const performSignOut = () => {
1718
}
1819
};
1920

20-
export const enableProfileSyncing = async () => {
21-
try {
22-
await Engine.context.UserStorageController.enableProfileSyncing();
23-
} catch (error) {
24-
return getErrorMessage(error);
25-
}
26-
};
27-
28-
export const disableProfileSyncing = async () => {
21+
export const setIsBackupAndSyncFeatureEnabled = async (
22+
feature: keyof typeof BACKUPANDSYNC_FEATURES,
23+
enabled: boolean,
24+
) => {
2925
try {
30-
await Engine.context.UserStorageController.disableProfileSyncing();
26+
await Engine.context.UserStorageController.setIsBackupAndSyncFeatureEnabled(
27+
feature,
28+
enabled,
29+
);
3130
} catch (error) {
3231
return getErrorMessage(error);
3332
}

app/component-library/components-temp/Contracts/ContractBoxBase/__snapshots__/ContractBoxBase.test.tsx.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ exports[`Component ContractBoxBase should render correctly 1`] = `
5252
<Text
5353
variant="sBodyMD"
5454
>
55-
0x2990...a21a
55+
0x29900...da21a
5656
</Text>
5757
</Component>
5858
</View>

0 commit comments

Comments
 (0)