Skip to content

Commit a2360c2

Browse files
release: 7.63.1 (#25572)
# 🚀 v7.63.1 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
2 parents 6814278 + 9c56a0e commit a2360c2

38 files changed

Lines changed: 3518 additions & 1447 deletions

CHANGELOG.md

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

88
## [Unreleased]
99

10+
## [7.63.1]
11+
12+
### Fixed
13+
14+
- fix: Android ANR bug (#25596)
15+
- fix(analytics): cp-7.63.1 correct capitalization in Deep link event name (#25599)
16+
- feat(perps): sdk reconnect on native socket event (#25022) (#25573)
17+
1018
## [7.63.0]
1119

1220
### Added
@@ -10202,7 +10210,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1020210210
- [#957](https://github.com/MetaMask/metamask-mobile/pull/957): fix timeouts (#957)
1020310211
- [#954](https://github.com/MetaMask/metamask-mobile/pull/954): Bugfix: onboarding navigation (#954)
1020410212

10205-
[Unreleased]: https://github.com/MetaMask/metamask-mobile/compare/v7.63.0...HEAD
10213+
[Unreleased]: https://github.com/MetaMask/metamask-mobile/compare/v7.63.1...HEAD
10214+
[7.63.1]: https://github.com/MetaMask/metamask-mobile/compare/v7.63.0...v7.63.1
1020610215
[7.63.0]: https://github.com/MetaMask/metamask-mobile/compare/v7.62.2...v7.63.0
1020710216
[7.62.2]: https://github.com/MetaMask/metamask-mobile/compare/v7.62.1...v7.62.2
1020810217
[7.62.1]: https://github.com/MetaMask/metamask-mobile/compare/v7.62.0...v7.62.1

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.63.0"
191-
versionCode 3604
190+
versionName "7.63.1"
191+
versionCode 3625
192192
testBuildType System.getProperty('testBuildType', 'debug')
193193
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
194194
manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST"

android/app/src/main/AndroidManifest.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,5 +184,12 @@
184184
android:resource="@xml/filepaths"
185185
/>
186186
</provider>
187+
188+
<!-- Disable Notifee's BlockStateBroadcastReceiver to prevent crash during cold start -->
189+
<!-- This receiver tries to access React Native before it's initialized -->
190+
<receiver
191+
android:name="app.notifee.core.BlockStateBroadcastReceiver"
192+
android:enabled="false"
193+
tools:node="remove" />
187194
</application>
188195
</manifest>

app/components/Nav/App/App.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ import ModalConfirmation from '../../../component-library/components/Modals/Moda
3636
import Toast, {
3737
ToastContext,
3838
} from '../../../component-library/components/Toast';
39+
import PerpsWebSocketHealthToast, {
40+
WebSocketHealthToastProvider,
41+
} from '../../UI/Perps/components/PerpsWebSocketHealthToast';
3942
import AccountSelector from '../../../components/Views/AccountSelector';
4043
import AddressSelector from '../../../components/Views/AddressSelector';
4144
import { TokenSortBottomSheet } from '../../UI/Tokens/TokenSortBottomSheet/TokenSortBottomSheet';
@@ -1276,11 +1279,12 @@ const App: React.FC = () => {
12761279
}, []);
12771280

12781281
return (
1279-
<>
1282+
<WebSocketHealthToastProvider>
12801283
<AppFlow />
12811284
<Toast ref={toastRef} />
1285+
<PerpsWebSocketHealthToast />
12821286
<ProfilerManager />
1283-
</>
1287+
</WebSocketHealthToastProvider>
12841288
);
12851289
};
12861290

app/components/UI/DeepLinkModal/DeepLinkModal.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ describe('DeepLinkModal', () => {
143143
}),
144144
build: jest.fn().mockImplementation(function (this: MockBuilder) {
145145
return {
146-
name: 'Deep link Used',
146+
name: 'Deep Link Used',
147147
properties: {
148148
route: 'invalid',
149149
was_app_installed: true,

app/components/UI/Perps/Perps.testIds.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,3 +675,12 @@ export const PerpsOrderBookTableSelectorsIDs = {
675675
export const PerpsOrderBookDepthChartSelectorsIDs = {
676676
CONTAINER: 'perps-order-book-depth-chart',
677677
} as const;
678+
679+
// ========================================
680+
// PERPS WEBSOCKET HEALTH TOAST SELECTORS
681+
// ========================================
682+
683+
export const PerpsWebSocketHealthToastSelectorsIDs = {
684+
TOAST: 'perps-websocket-health-toast',
685+
RETRY_BUTTON: 'perps-websocket-health-toast-retry-button',
686+
} as const;

app/components/UI/Perps/__mocks__/providerMocks.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ export const createMockHyperLiquidProvider =
5252
subscribeToOrders: jest.fn(),
5353
subscribeToAccount: jest.fn(),
5454
setUserFeeDiscount: jest.fn(),
55+
// WebSocket connection state methods
56+
getWebSocketConnectionState: jest.fn(),
57+
subscribeToConnectionState: jest.fn().mockReturnValue(() => undefined),
58+
reconnect: jest.fn().mockResolvedValue(undefined),
5559
}) as unknown as jest.Mocked<HyperLiquidProvider>;
5660

5761
export const createMockOrderResult = () => ({

app/components/UI/Perps/components/PerpsStreamBridge.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
import React from 'react';
22
import { usePerpsWithdrawStatus } from '../hooks/usePerpsWithdrawStatus';
33
import { usePerpsDepositStatus } from '../hooks/usePerpsDepositStatus';
4+
import { useWebSocketHealthToast } from '../hooks/useWebSocketHealthToast';
45

56
/**
67
* PerpsStreamBridge - Bridges stream context to global hooks.
78
*
89
* This component acts as a bridge, allowing hooks to access the PerpsStream context
910
* by being rendered inside both PerpsConnectionProvider and PerpsStreamProvider.
11+
*
12+
* The WebSocket health toast is rendered at the App level via WebSocketHealthToastProvider
13+
* and PerpsWebSocketHealthToast to ensure it appears on top of all other content.
1014
*/
1115
const PerpsStreamBridge: React.FC = () => {
1216
// Enable withdrawal status monitoring and toasts
@@ -15,7 +19,9 @@ const PerpsStreamBridge: React.FC = () => {
1519
// Enable deposit status monitoring and toasts
1620
usePerpsDepositStatus();
1721

18-
// This component doesn't render anything
22+
// Enable WebSocket health monitoring (toast is rendered at App level)
23+
useWebSocketHealthToast();
24+
1925
return null;
2026
};
2127

0 commit comments

Comments
 (0)