Skip to content

Commit e751553

Browse files
authored
release: 7.61.5 (#24224)
# 🚀 v7.61.5 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 - [ ] Mobile Platform This process is a major step forward in ensuring release stability and quality. Let’s stay aligned and make this release a success! 🚀 Feel free to reach out if you have questions or need clarification. Many thanks in advance # Reference - Testing plan sheet - https://docs.google.com/spreadsheets/d/1tsoodlAlyvEUpkkcNcbZ4PM9HuC9cEM80RZeoVv5OCQ/edit?gid=404070372#gid=404070372 <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Release bump to `7.61.5`** > > - Updates `versionName`/`versionCode` in Android, `MARKETING_VERSION`/`CURRENT_PROJECT_VERSION` in iOS, Bitrise env vars, `package.json`, and `CHANGELOG.md` > > **Deeplink robustness and security** > > - Enforces that external transactions cannot use `INTERNAL_ORIGINS` in `handleMetaMaskDeeplink.ts` and `connectWithWC.ts` > - Minor refactor to consistently use `channelId` local variable in deeplink handling > > **Transaction auto-sign flow** > > - In `RootRPCMethodsUI`, only auto-signs for hardware accounts (`ledger` or `qr`); early return for others; maintains Ledger handoff to confirmation flow > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 8eec71f. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
2 parents c191f28 + 8eec71f commit e751553

8 files changed

Lines changed: 59 additions & 29 deletions

File tree

CHANGELOG.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [7.61.5]
11+
12+
### Fixed
13+
14+
- fix: robustness deeplinking ([#24227](https://github.com/MetaMask/metamask-mobile/pull/24227))
15+
- chore: refine hardware signing flow ([#24228](https://github.com/MetaMask/metamask-mobile/pull/24228))
16+
1017
## [7.61.4]
1118

1219
### Fixed
@@ -26,6 +33,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2633
- chore: adds the Tron staking details preview ([#24198](https://github.com/MetaMask/metamask-mobile/pull/24198))
2734
- fix(ramp): use ScrollView from react-native-gesture-handler in PaymentMethodSelectorModal ([#24197](https://github.com/MetaMask/metamask-mobile/pull/24197))
2835
- chore: broadcast staking TRX transaction cp-7.61.3 ([#24196](https://github.com/MetaMask/metamask-mobile/pull/24196))
36+
- chore: connection updates and improvements ([#24215](https://github.com/MetaMask/metamask-mobile/pull/24215))
2937

3038
## [7.61.2]
3139

@@ -9667,7 +9675,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
96679675
- [#957](https://github.com/MetaMask/metamask-mobile/pull/957): fix timeouts (#957)
96689676
- [#954](https://github.com/MetaMask/metamask-mobile/pull/954): Bugfix: onboarding navigation (#954)
96699677

9670-
[Unreleased]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.4...HEAD
9678+
[Unreleased]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.5...HEAD
9679+
[7.61.5]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.4...v7.61.5
96719680
[7.61.4]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.3...v7.61.4
96729681
[7.61.3]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.2...v7.61.3
96739682
[7.61.2]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.1...v7.61.2

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,8 @@ android {
187187
applicationId "io.metamask"
188188
minSdkVersion rootProject.ext.minSdkVersion
189189
targetSdkVersion rootProject.ext.targetSdkVersion
190-
versionName "7.61.4"
191-
versionCode 3335
190+
versionName "7.61.5"
191+
versionCode 3341
192192
testBuildType System.getProperty('testBuildType', 'debug')
193193
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
194194
manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST"

app/components/Nav/Main/RootRPCMethodsUI.js

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,22 @@ const RootRPCMethodsUI = (props) => {
297297
const { id: transactionId } = transactionMeta;
298298

299299
try {
300+
// unified swaps and bridge no longer goes through this path.
301+
// TODO: to remove this in the near future
302+
const isLedgerAccount = isHardwareAccount(
303+
transactionMeta.txParams.from,
304+
[ExtendedKeyringTypes.ledger],
305+
);
306+
307+
const isQRAccount = isHardwareAccount(transactionMeta.txParams.from, [
308+
ExtendedKeyringTypes.qr,
309+
]);
310+
311+
// Only auto-sign for Ledger or QR accounts
312+
if (!isLedgerAccount && !isQRAccount) {
313+
return;
314+
}
315+
300316
Engine.controllerMessenger.subscribeOnceIf(
301317
'TransactionController:transactionFinished',
302318
(transactionMeta) => {
@@ -326,11 +342,6 @@ const RootRPCMethodsUI = (props) => {
326342
// Queue txMetaId to listen for confirmation event
327343
addTransactionMetaIdForListening(transactionMeta.id);
328344

329-
const isLedgerAccount = isHardwareAccount(
330-
transactionMeta.txParams.from,
331-
[ExtendedKeyringTypes.ledger],
332-
);
333-
334345
// As the `TransactionController:unapprovedTransactionAdded` event is emitted
335346
// before the approval request is added to `ApprovalController`, we need to wait
336347
// for the next tick to make sure the approval request is present when auto-approve it

app/core/DeeplinkManager/handlers/legacy/connectWithWC.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { INTERNAL_ORIGINS } from '../../../../constants/transaction';
12
import WC2Manager from '../../../WalletConnect/WalletConnectV2';
23
import extractURLParams from '../../utils/extractURLParams';
34

@@ -13,6 +14,9 @@ export function connectWithWC({
1314
params: ReturnType<typeof extractURLParams>['params'];
1415
}) {
1516
handled();
17+
if (params.channelId && INTERNAL_ORIGINS.includes(params.channelId)) {
18+
throw new Error('External transactions cannot use internal origins');
19+
}
1620

1721
WC2Manager.getInstance()
1822
.then((instance) =>

app/core/DeeplinkManager/handlers/legacy/handleMetaMaskDeeplink.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import extractURLParams from '../../utils/extractURLParams';
1313
import handleRampUrl from './handleRampUrl';
1414
import handleDepositCashUrl from './handleDepositCashUrl';
1515
import { RampType } from '../../../../reducers/fiatOrders/types';
16+
import { INTERNAL_ORIGINS } from '../../../../constants/transaction';
1617

1718
export function handleMetaMaskDeeplink({
1819
instance,
@@ -31,6 +32,11 @@ export function handleMetaMaskDeeplink({
3132
}) {
3233
handled();
3334

35+
const channelId = params?.channelId;
36+
if (channelId && INTERNAL_ORIGINS.includes(channelId)) {
37+
throw new Error('External transactions cannot use internal origins');
38+
}
39+
3440
if (url.startsWith(`${PREFIXES.METAMASK}${ACTIONS.ANDROID_SDK}`)) {
3541
DevLogger.log(
3642
`DeeplinkManager:: metamask launched via android sdk deeplink`,
@@ -52,15 +58,15 @@ export function handleMetaMaskDeeplink({
5258
hideReturnToApp: !!params.hr,
5359
},
5460
);
55-
} else if (params.channelId) {
61+
} else if (channelId) {
5662
// differentiate between deeplink callback and socket connection
5763
if (params.comm === 'deeplinking') {
5864
if (!params.scheme) {
5965
throw new Error(`DeepLinkManager failed to connect - Invalid scheme`);
6066
}
6167

6268
SDKConnect.getInstance().state.deeplinkingService?.handleConnection({
63-
channelId: params.channelId,
69+
channelId,
6470
url,
6571
scheme: params.scheme ?? '',
6672
dappPublicKey: params.pubkey,
@@ -83,7 +89,7 @@ export function handleMetaMaskDeeplink({
8389
});
8490
}
8591
handleDeeplink({
86-
channelId: params.channelId,
92+
channelId,
8793
origin,
8894
url,
8995
protocolVersion,
@@ -113,7 +119,7 @@ export function handleMetaMaskDeeplink({
113119
}
114120

115121
SDKConnect.getInstance().state.deeplinkingService?.handleMessage({
116-
channelId: params.channelId,
122+
channelId,
117123
url,
118124
message: params.message,
119125
dappPublicKey: params.pubkey,

bitrise.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3574,16 +3574,16 @@ app:
35743574
PROJECT_LOCATION_IOS: ios
35753575
- opts:
35763576
is_expand: false
3577-
VERSION_NAME: 7.61.4
3577+
VERSION_NAME: 7.61.5
35783578
- opts:
35793579
is_expand: false
3580-
VERSION_NUMBER: 3335
3580+
VERSION_NUMBER: 3341
35813581
- opts:
35823582
is_expand: false
3583-
FLASK_VERSION_NAME: 7.61.4
3583+
FLASK_VERSION_NAME: 7.61.5
35843584
- opts:
35853585
is_expand: false
3586-
FLASK_VERSION_NUMBER: 3335
3586+
FLASK_VERSION_NUMBER: 3341
35873587
- opts:
35883588
is_expand: false
35893589
ANDROID_APK_LINK: ''

ios/MetaMask.xcodeproj/project.pbxproj

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,7 +1281,7 @@
12811281
CODE_SIGN_IDENTITY = "Apple Development";
12821282
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
12831283
CODE_SIGN_STYLE = Manual;
1284-
CURRENT_PROJECT_VERSION = 3335;
1284+
CURRENT_PROJECT_VERSION = 3341;
12851285
DEAD_CODE_STRIPPING = YES;
12861286
DEBUG_INFORMATION_FORMAT = dwarf;
12871287
DEVELOPMENT_TEAM = 48XVW22RCG;
@@ -1319,7 +1319,7 @@
13191319
"${inherited}",
13201320
);
13211321
LLVM_LTO = YES;
1322-
MARKETING_VERSION = 7.61.4;
1322+
MARKETING_VERSION = 7.61.5;
13231323
ONLY_ACTIVE_ARCH = YES;
13241324
OTHER_CFLAGS = "$(inherited)";
13251325
OTHER_LDFLAGS = (
@@ -1350,7 +1350,7 @@
13501350
CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements;
13511351
CODE_SIGN_IDENTITY = "iPhone Distribution";
13521352
CODE_SIGN_STYLE = Manual;
1353-
CURRENT_PROJECT_VERSION = 3335;
1353+
CURRENT_PROJECT_VERSION = 3341;
13541354
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
13551355
DEVELOPMENT_TEAM = 48XVW22RCG;
13561356
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG;
@@ -1385,7 +1385,7 @@
13851385
"${inherited}",
13861386
);
13871387
LLVM_LTO = YES;
1388-
MARKETING_VERSION = 7.61.4;
1388+
MARKETING_VERSION = 7.61.5;
13891389
ONLY_ACTIVE_ARCH = NO;
13901390
OTHER_CFLAGS = "$(inherited)";
13911391
OTHER_LDFLAGS = (
@@ -1416,7 +1416,7 @@
14161416
CODE_SIGN_IDENTITY = "Apple Development";
14171417
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
14181418
CODE_SIGN_STYLE = Manual;
1419-
CURRENT_PROJECT_VERSION = 3335;
1419+
CURRENT_PROJECT_VERSION = 3341;
14201420
DEAD_CODE_STRIPPING = YES;
14211421
DEBUG_INFORMATION_FORMAT = dwarf;
14221422
DEVELOPMENT_TEAM = 48XVW22RCG;
@@ -1454,7 +1454,7 @@
14541454
"\"$(SRCROOT)/MetaMask/System/Library/Frameworks\"",
14551455
);
14561456
LLVM_LTO = YES;
1457-
MARKETING_VERSION = 7.61.4;
1457+
MARKETING_VERSION = 7.61.5;
14581458
ONLY_ACTIVE_ARCH = YES;
14591459
OTHER_CFLAGS = "$(inherited)";
14601460
OTHER_LDFLAGS = (
@@ -1483,7 +1483,7 @@
14831483
CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements;
14841484
CODE_SIGN_IDENTITY = "iPhone Distribution";
14851485
CODE_SIGN_STYLE = Manual;
1486-
CURRENT_PROJECT_VERSION = 3335;
1486+
CURRENT_PROJECT_VERSION = 3341;
14871487
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
14881488
DEVELOPMENT_TEAM = 48XVW22RCG;
14891489
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG;
@@ -1518,7 +1518,7 @@
15181518
"\"$(SRCROOT)/MetaMask/System/Library/Frameworks\"",
15191519
);
15201520
LLVM_LTO = YES;
1521-
MARKETING_VERSION = 7.61.4;
1521+
MARKETING_VERSION = 7.61.5;
15221522
ONLY_ACTIVE_ARCH = NO;
15231523
OTHER_CFLAGS = "$(inherited)";
15241524
OTHER_LDFLAGS = (
@@ -1646,7 +1646,7 @@
16461646
CODE_SIGN_IDENTITY = "Apple Development";
16471647
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
16481648
CODE_SIGN_STYLE = Manual;
1649-
CURRENT_PROJECT_VERSION = 3335;
1649+
CURRENT_PROJECT_VERSION = 3341;
16501650
DEAD_CODE_STRIPPING = YES;
16511651
DEBUG_INFORMATION_FORMAT = dwarf;
16521652
DEVELOPMENT_TEAM = 48XVW22RCG;
@@ -1684,7 +1684,7 @@
16841684
"\"$(SRCROOT)/MetaMask/System/Library/Frameworks\"",
16851685
);
16861686
LLVM_LTO = YES;
1687-
MARKETING_VERSION = 7.61.4;
1687+
MARKETING_VERSION = 7.61.5;
16881688
ONLY_ACTIVE_ARCH = YES;
16891689
OTHER_CFLAGS = (
16901690
"$(inherited)",
@@ -1716,7 +1716,7 @@
17161716
CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements;
17171717
CODE_SIGN_IDENTITY = "iPhone Distribution";
17181718
CODE_SIGN_STYLE = Manual;
1719-
CURRENT_PROJECT_VERSION = 3335;
1719+
CURRENT_PROJECT_VERSION = 3341;
17201720
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
17211721
DEVELOPMENT_TEAM = 48XVW22RCG;
17221722
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG;
@@ -1751,7 +1751,7 @@
17511751
"\"$(SRCROOT)/MetaMask/System/Library/Frameworks\"",
17521752
);
17531753
LLVM_LTO = YES;
1754-
MARKETING_VERSION = 7.61.4;
1754+
MARKETING_VERSION = 7.61.5;
17551755
ONLY_ACTIVE_ARCH = NO;
17561756
OTHER_CFLAGS = (
17571757
"$(inherited)",

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "metamask",
3-
"version": "7.61.4",
3+
"version": "7.61.5",
44
"private": true,
55
"scripts": {
66
"install:foundryup": "yarn mm-foundryup",

0 commit comments

Comments
 (0)