Skip to content

Commit 832d813

Browse files
release: 7.61.6 (#24239)
# 🚀 v7.61.6 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] > **Perps (HyperLiquid) — HIP-3 overhaul and TP/SL fixes** > > - Switches HIP-3 to individual `clearinghouseState` + `openOrders` subscriptions with DEX discovery wait/sync; `webData3` now only for OI caps (`HyperLiquidSubscriptionService.ts`) > - Preserves/re-extracts TP/SL from cached orders; adds price-based fallback for ambiguous `Trigger` types; includes `triggerPrice` and uses `triggerPx` when needed (`types`, `extractTPSLFromOrders`, adapter) > - Improves subscription restoration/cleanup, reference counting, L2 book handling, and extensive tests now use fake timers (`*.test.ts`) > > **Tron UI and resources** > > - Shows TRON APY conditionally in staking nav; only displays APR override when > 0 (`EarnInputView`, `EarnWithdrawInputView`, `Navbar`) > - `useTronResources`: avoid div-by-zero by using divisor max(1, max) while keeping `max`=0 for display; tests updated > > **Stake button copy & APY** > > - Updates label to `Convert to mUSD` and surfaces TRON APY on TRX staking (`StakeButton`, `en.json`) > > **Build/Versioning & deps** > > - Bumps version to `7.61.6` / code `3412` across Android/iOS/CI and `package.json` > - Updates `@metamask/tron-wallet-snap` to `^1.19.0`; minor Bitrise pipeline tweaks > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit d4b97da. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
2 parents e751553 + 7102eb7 commit 832d813

19 files changed

Lines changed: 1620 additions & 682 deletions

File tree

CHANGELOG.md

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

88
## [Unreleased]
99

10+
## [7.61.6]
11+
12+
### Fixed
13+
14+
- fix: fix apr issue display value cp-7.61.6 ([#24382](https://github.com/MetaMask/metamask-mobile/pull/24382))
15+
- chore: bump @metamask/tron-wallet-snap to version 1.19.0 cp-7.61.6 ([#24378](https://github.com/MetaMask/metamask-mobile/pull/24378))
16+
- fix(tron): max energy and bandwidth incorrectly set to 1 instead of 0 cp-7.61.6 ([#24376](https://github.com/MetaMask/metamask-mobile/pull/24376))
17+
- fix: include hip3 dexes when building position map on init ([#24300](https://github.com/MetaMask/metamask-mobile/pull/24300))
18+
- chore(perps): Refactor HL subscription service (#24015) ([#24274](https://github.com/MetaMask/metamask-mobile/pull/24274))
19+
- chore: fix apr issue with znon-zero values cp-7.61.6 ([#24261](https://github.com/MetaMask/metamask-mobile/pull/24261))
20+
1021
## [7.61.5]
1122

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

9678-
[Unreleased]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.5...HEAD
9689+
[Unreleased]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.6...HEAD
9690+
[7.61.6]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.5...v7.61.6
96799691
[7.61.5]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.4...v7.61.5
96809692
[7.61.4]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.3...v7.61.4
96819693
[7.61.3]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.2...v7.61.3

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.5"
191-
versionCode 3341
190+
versionName "7.61.6"
191+
versionCode 3412
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/UI/AssetOverview/TronEnergyBandwidthDetail/useTronResources.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,14 @@ describe('useTronResources', () => {
7676
expect(result.current.energy).toEqual({
7777
type: 'energy',
7878
current: 0,
79-
max: 1,
79+
max: 0,
8080
percentage: 0,
8181
});
8282

8383
expect(result.current.bandwidth).toEqual({
8484
type: 'bandwidth',
8585
current: 0,
86-
max: 1,
86+
max: 0,
8787
percentage: 0,
8888
});
8989
});

app/components/UI/AssetOverview/TronEnergyBandwidthDetail/useTronResources.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ function createResource(
2121
max: number,
2222
): TronResource {
2323
const currentBN = new BigNumber(current);
24-
const maxBN = new BigNumber(max);
25-
const percentageBN = currentBN.dividedBy(maxBN).multipliedBy(100);
24+
// Use max of 1 only for percentage calculation to avoid division by zero
25+
const divisor = new BigNumber(Math.max(1, max));
26+
const percentageBN = currentBN.dividedBy(divisor).multipliedBy(100);
2627

2728
const percentage = BigNumber.min(
2829
100,
@@ -32,7 +33,7 @@ function createResource(
3233
return {
3334
type,
3435
current,
35-
max,
36+
max, // Keep actual max for display (can be 0)
3637
percentage,
3738
};
3839
}
@@ -91,12 +92,13 @@ export const useTronResources = (): {
9192
const maxEnergyValue = parseValue(maxEnergy?.balance);
9293
const maxBandwidthValue = parseValue(maxBandwidth?.balance);
9394

94-
const energyMax = Math.max(1, maxEnergyValue);
95-
const bandwidthMax = Math.max(1, maxBandwidthValue);
96-
9795
return {
98-
energy: createResource('energy', energyCurrent, energyMax),
99-
bandwidth: createResource('bandwidth', bandwidthCurrent, bandwidthMax),
96+
energy: createResource('energy', energyCurrent, maxEnergyValue),
97+
bandwidth: createResource(
98+
'bandwidth',
99+
bandwidthCurrent,
100+
maxBandwidthValue,
101+
),
100102
};
101103
}, [tronResources]);
102104
};

app/components/UI/Earn/Views/EarnInputView/EarnInputView.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -881,7 +881,7 @@ const EarnInputView = () => {
881881
navBarEventOptions,
882882
///: BEGIN:ONLY_INCLUDE_IF(tron)
883883
earnToken,
884-
tronApyPercent,
884+
isTronEnabled ? tronApyPercent : null,
885885
///: END:ONLY_INCLUDE_IF
886886
),
887887
);
@@ -897,6 +897,7 @@ const EarnInputView = () => {
897897
earnToken?.name,
898898
earnToken,
899899
///: BEGIN:ONLY_INCLUDE_IF(tron)
900+
isTronEnabled,
900901
tronApyPercent,
901902
///: END:ONLY_INCLUDE_IF
902903
]);

app/components/UI/Earn/Views/EarnWithdrawInputView/EarnWithdrawInputView.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ const EarnWithdrawInputView = () => {
347347
navBarEventOptions,
348348
///: BEGIN:ONLY_INCLUDE_IF(tron)
349349
receiptTokenToUse,
350-
tronApyPercent,
350+
isTronEnabled ? tronApyPercent : null,
351351
///: END:ONLY_INCLUDE_IF
352352
),
353353
);
@@ -359,6 +359,7 @@ const EarnWithdrawInputView = () => {
359359
isLending,
360360
tokenLabel,
361361
///: BEGIN:ONLY_INCLUDE_IF(tron)
362+
isTronEnabled,
362363
receiptTokenToUse,
363364
tronApyPercent,
364365
///: END:ONLY_INCLUDE_IF

app/components/UI/Navbar/index.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2124,9 +2124,11 @@ export function getStakingNavbar(
21242124
}
21252125

21262126
///: BEGIN:ONLY_INCLUDE_IF(tron)
2127+
const parsedOverride = aprOverride ? parseFloat(aprOverride) : 0;
21272128
const apr =
2128-
aprOverride ??
2129-
`${parseFloat(earnToken?.experience?.apr ?? '0').toFixed(1)}%`;
2129+
parsedOverride > 0
2130+
? aprOverride
2131+
: `${parseFloat(earnToken?.experience?.apr ?? '0').toFixed(1)}%`;
21302132
///: END:ONLY_INCLUDE_IF
21312133

21322134
return {

app/components/UI/Perps/controllers/types/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,7 @@ export interface Order {
758758
detailedOrderType?: string; // Full order type from exchange (e.g., 'Take Profit Limit', 'Stop Market')
759759
isTrigger?: boolean; // Whether this is a trigger order (TP/SL)
760760
reduceOnly?: boolean; // Whether this is a reduce-only order
761+
triggerPrice?: string; // Trigger condition price for trigger orders (e.g., TP/SL trigger level)
761762
}
762763

763764
export interface Funding {

0 commit comments

Comments
 (0)