Skip to content

Commit 92165b5

Browse files
chloeYuemetamaskbotrunway-github[bot]caieuinfiniteflower
authored
chore(release): stable sync after merging 7.73.2 (#29326)
## Summary Merges `stable` into the `release/7.74.00` line after [#29233](#29233) landed **7.73.2** on `stable`, so [#28948](#28948) (`release/7.74.00` → `stable`) can merge without mass conflicts. CHANGELOG entry: null <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Medium risk because it updates release CI gating and modifies Predict trading feature-flag resolution/analytics plus onboarding auth/marketing-consent flows, which can impact build automation and user-facing trading/login behavior. > > **Overview** > Merges `stable` changes into the `release/7.74.0` line, including updates to the auto RC build workflow to gate version bumps/build triggers/commenting on a label check and to simplify the RC comment step (shallower checkout and removal of test plan JSON upload/AI key envs). > > Predict trading changes include new CLOB v2/legacy-host flag plumbing (controller + selectors), refactoring order analytics emission to build regular vs sensitive properties, and several buy-with-any-token UX/flow tweaks (pay-with row visibility, suppressing pay-token alerts while editing, init/cleanup behavior). > > Also updates onboarding/auth flows (wallet deletion resets newer onboarding state fields, OAuth rehydration now awaits marketing opt-in sync, removes legacy iOS Google warning saga/state/selectors), adjusts Token Details analytics to include A/B test attribution and ensures swaps navigation resets scroll, and includes assorted test/snapshot updates, ramps selector coverage for non-EVM addresses, and localization/changelog/version metadata updates. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit b11b7c9. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: metamaskbot <metamaskbot@users.noreply.github.com> Co-authored-by: runway-github[bot] <73448015+runway-github[bot]@users.noreply.github.com> Co-authored-by: Caainã Jeronimo <caainaje@gmail.com> Co-authored-by: infiniteflower <139582705+infiniteflower@users.noreply.github.com> Co-authored-by: sahar-fehri <sahar.fehri@consensys.net> Co-authored-by: Prithpal Sooriya <prithpal.sooriya@users.noreply.github.com> Co-authored-by: Prithpal Sooriya <prithpal.sooriya@gmail.com> Co-authored-by: António Regadas <antonio.regadas@consensys.net> Co-authored-by: George Marshall <george.marshall@consensys.net> Co-authored-by: tommasini <tommasini15@gmail.com> Co-authored-by: TylerC <tyler.chong@consensys.net> Co-authored-by: ieow <4881057+ieow@users.noreply.github.com> Co-authored-by: tommasini <46944231+tommasini@users.noreply.github.com> Co-authored-by: Wei Sun <wei.sun@consensys.net> Co-authored-by: Cal-L <cal.leung@consensys.net> Co-authored-by: Michal Szorad <michal.szorad@consensys.net> Co-authored-by: Bryan Fullam <bryan.fullam@consensys.net> Co-authored-by: João Loureiro <175489935+joaoloureirop@users.noreply.github.com> Co-authored-by: Vince Howard <vincenguyenhoward@gmail.com> Co-authored-by: abretonc7s <107169956+abretonc7s@users.noreply.github.com> Co-authored-by: Matthew Grainger <46547583+Matt561@users.noreply.github.com> Co-authored-by: Matthew Grainger <matthew.grainger@consensys.net> Co-authored-by: Xiaoming Wang <7315988+dawnseeker8@users.noreply.github.com> Co-authored-by: Arafet (CN - Hong Kong) <52028926+arafetbenmakhlouf@users.noreply.github.com> Co-authored-by: Nico MASSART <NicolasMassart@users.noreply.github.com> Co-authored-by: Gaurav Goel <grvgoel19@gmail.com> Co-authored-by: MetaMask Bot <37885440+metamaskbot@users.noreply.github.com> Co-authored-by: geositta <matthew.denton@consensys.net> Co-authored-by: Javier Garcia Vera <javier.vera@consensys.net> Co-authored-by: Luis Taniça <matallui@gmail.com>
1 parent 2ec25c1 commit 92165b5

13 files changed

Lines changed: 328 additions & 4 deletions

File tree

CHANGELOG.md

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

88
## [Unreleased]
99

10+
## [7.73.2]
11+
12+
### Added
13+
14+
- Added Polymarket CLOB v2 support (#29076)
15+
16+
### Fixed
17+
18+
- Fixed Perps $0 balance display for accounts funded via HyperLiquid spot USDC (#29110)
19+
- Fixed Perps balance not refreshing after trades, funding, or transfers for HyperLiquid users, and corrected total balance inflation on Unified-mode accounts (#29226)
20+
21+
## [7.73.1]
22+
23+
### Fixed
24+
25+
- Fixed google and Apple login issue
26+
27+
## [7.73.0]
28+
29+
### Added
30+
31+
- Added runway production workflows (#27887)
32+
- Added feature-flagged "withdraw to any token" flow for Perps, allowing users to withdraw Perps funds to any supported token via MetaMask Pay (#28265)
33+
- Added a token safety banner and warning modal in Swaps that alerts users when the destination token is flagged as suspicious or malicious before proceeding with a swap (#27834)
34+
- Added trending stocks deep link routing (#27869)
35+
- Added Perps withdraw confirmation flow (#28236)
36+
- Added UCL soccer league support with 3-way draw predictions (#28121)
37+
- Added Google Wallet in-app provisioning for MetaMask Card on Android (#25742)
38+
- Added a Claim bonus action on the home Cash section when users have no mUSD but have a claimable Merkl bonus, with the amount shown in the selected fiat currency (#27909)
39+
- Added verified badges to swap asset picker tokens (#27878)
40+
- Added a success confirmation toast when users opt in to a rewards campaign (#28033)
41+
- Added Perps withdraw transaction display and activity support (#28026)
42+
- Added unrealized P&L summary on the wallet homepage for Perpetuals and Predictions, and aligned the Perps home “Your positions” subtitle with the same layout (#27844)
43+
- Import SRP screens always show BIP39 word suggestions when the keyboard is open, with no remote feature flag (#28139)
44+
45+
### Changed
46+
47+
- Updated Swaps and Bridge error messaging with specific, actionable error banners when a quote stream ends with a known failure reason (#28127)
48+
- Updated how the ramp provider is selected (#27942)
49+
- Improved analytics consistency during social login onboarding (#28015)
50+
51+
### Fixed
52+
53+
- Fixed Transaction Finalized tracking by deriving mm_pay metrics from controller state (#28164)
54+
- Fixed Bitcoin PSBT build errors to include the underlying cause for better diagnostics (#28282)
55+
- Fixed stuck pending withdraw (#26537)
56+
- Fixed duplicate WalletConnect relay messages when switching chains (#27978)
57+
- Fixed the bridge keypad staying open when no amount was entered (#28325)
58+
- Fixed abrupt navigation transition to Swaps and Bridge screens by adding smooth slide-from-right animation (#28347)
59+
- Fixed white header and footer on Ramp buy/sell screens in dark mode (#28267)
60+
- Fixed a bug that caused Perps to reconnect too aggressively and surface intermittent websocket connection errors (#28258)
61+
- Fixed navigation screens flashing incorrect background color during transitions (#28307)
62+
- Fixed frequent "insufficient funds" errors in perps pay-with-any-token flow by validating relay quote totals before allowing order submission (#28318)
63+
- Fixed scroll in the "Private Key" list for Android devices (#27891)
64+
- Fixed OAuth rehydration so the post-unlock device authentication prompt completes before navigating to the wallet home screen (#27960)
65+
- Fixed bottom disclaimer text overflowing on the Predict Buy Preview screen (#28212)
66+
- Fixed hardware wallet infinite loop when Ledger disconnects or the Ethereum app is closed during transaction signing (#28163)
67+
- Fixed homepage Predictions section so open positions and claim amounts respect privacy mode (#28203)
68+
- Fixed cancel and speed up initial gas readiness (#27905)
69+
- Fixed an issue where opening Market Insights could pause audio already playing on the device (#28148)
70+
- Fixed bridge zero-state trending scrolling when dragging from the amount area (#28103)
71+
- Fixed a bug where depositing into Perps from Token Details could fail if the Arbitrum network had not been added to the wallet (#27484)
72+
- Fixed flip position fee estimate being ~2x lower than actual fee charged (#28013)
73+
- Fixed payment methods and provider availability for newly added tokens by refreshing providers via react-query (15min TTL) on mount and separating the provider list by token support (#27958)
74+
- Fixed a bug that kept the swap screen scrolled down after opening Swap from a trending token details page (#27928)
75+
- Fixed custom slippage input so keypad edits respect cursor placement and trailing decimals are sanitized before saving (#27920)
76+
- Fixed alert when device biometrics change (#25423)
77+
- Fixed limit price preset buttons (Mid, Bid, Ask, percentage) truncating one decimal place for low-price assets like XRP (#27907)
78+
- Fixed a bug that was causing issues with TRC20 token transfers (#27922)
79+
- Fixed Ondo campaign opt-in to respect cutoff date (#28000)
80+
1081
## [7.72.1]
1182

1283
### Fixed
@@ -11162,7 +11233,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1116211233
- [#957](https://github.com/MetaMask/metamask-mobile/pull/957): fix timeouts (#957)
1116311234
- [#954](https://github.com/MetaMask/metamask-mobile/pull/954): Bugfix: onboarding navigation (#954)
1116411235

11165-
[Unreleased]: https://github.com/MetaMask/metamask-mobile/compare/v7.72.1...HEAD
11236+
[Unreleased]: https://github.com/MetaMask/metamask-mobile/compare/v7.73.2...HEAD
11237+
[7.73.2]: https://github.com/MetaMask/metamask-mobile/compare/v7.73.1...v7.73.2
11238+
[7.73.1]: https://github.com/MetaMask/metamask-mobile/compare/v7.73.0...v7.73.1
11239+
[7.73.0]: https://github.com/MetaMask/metamask-mobile/compare/v7.72.1...v7.73.0
1116611240
[7.72.1]: https://github.com/MetaMask/metamask-mobile/compare/v7.72.0...v7.72.1
1116711241
[7.72.0]: https://github.com/MetaMask/metamask-mobile/compare/v7.71.1...v7.72.0
1116811242
[7.71.1]: https://github.com/MetaMask/metamask-mobile/compare/v7.71.0...v7.71.1

app/components/UI/Predict/controllers/PredictController.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import { GEO_BLOCKED_COUNTRIES } from '../constants/geoblock';
5757
import { PREDICT_BALANCE_PLACEHOLDER_ADDRESS } from '../constants/transactions';
5858
import { PolymarketProvider } from '../providers/polymarket/PolymarketProvider';
5959
import {
60+
LEGACY_V2_CLOB_BASE_URL,
6061
MATIC_CONTRACTS,
6162
POLYMARKET_PROVIDER_ID,
6263
} from '../providers/polymarket/constants';

app/components/UI/Predict/selectors/featureFlags/index.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
selectPredictUpDownEnabledFlag,
1414
selectPredictWithAnyTokenEnabledFlag,
1515
} from '.';
16+
import { LEGACY_V2_CLOB_BASE_URL } from '../../providers/polymarket/constants';
1617
import mockedEngine from '../../../../../core/__mocks__/MockedEngine';
1718
import {
1819
mockedState,

app/components/UI/Predict/selectors/featureFlags/index.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,3 +181,17 @@ export const selectPredictBottomSheetEnabledFlag = createSelector(
181181
),
182182
) ?? false,
183183
);
184+
185+
/**
186+
* Selector for Predict CLOB v2 legacy host override.
187+
*
188+
* When `predictClobV2` is enabled and `predictClobV2UseLegacyClobHost` is also enabled,
189+
* returns the legacy v2 CLOB host URL for internal RC testing during the migration window.
190+
* Otherwise returns `undefined` so the protocol uses the canonical host.
191+
*
192+
* @returns {string | undefined} The legacy v2 CLOB host URL, or undefined.
193+
*/
194+
export const selectPredictClobV2ClobBaseUrlFlag = createSelector(
195+
selectPredictFeatureFlags,
196+
(flags) => flags.predictClobV2ClobBaseUrl,
197+
);

app/components/UI/Predict/views/PredictBuyWithAnyToken/PredictBuyWithAnyToken.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ const PredictBuyWithAnyToken = (props: PredictBuyPreviewProps) => {
185185
maxBetAmount,
186186
isConfirming,
187187
isPayFeesLoading,
188+
isInputFocused,
188189
blockingPayAlertMessage,
189190
});
190191

app/components/UI/Predict/views/PredictBuyWithAnyToken/hooks/usePredictBuyActions.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,15 @@ export const usePredictBuyActions = ({
272272
}
273273
}, [currentState, navigation, isSheetMode, onClose]);
274274

275+
useEffect(() => {
276+
if (currentState === ActiveOrderState.DEPOSITING) {
277+
if (didInitiateOrderRef.current) {
278+
didInitiateOrderRef.current = false;
279+
navigation.dispatch(StackActions.pop());
280+
}
281+
}
282+
}, [currentState, navigation]);
283+
275284
return {
276285
handleConfirm,
277286
placeOrder: handlePlaceOrder,

app/components/UI/Predict/views/PredictBuyWithAnyToken/hooks/usePredictBuyError.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,20 @@ describe('usePredictBuyError', () => {
213213
);
214214
});
215215

216+
it('suppresses pay token balance alert while input is focused', () => {
217+
mockIsPredictBalanceSelected = false;
218+
219+
const { result } = renderHook(() =>
220+
usePredictBuyError({
221+
...defaultParams,
222+
blockingPayAlertMessage: 'Insufficient payment token balance',
223+
isInputFocused: true,
224+
}),
225+
);
226+
227+
expect(result.current.errorMessage).toBeUndefined();
228+
});
229+
216230
it('returns undefined when activeOrder has no error', () => {
217231
mockActiveOrder = {};
218232

app/components/UI/Predict/views/PredictBuyWithAnyToken/hooks/usePredictBuyError.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ interface UsePredictBuyInfoParams {
1717
isInsufficientBalance: boolean;
1818
maxBetAmount: number;
1919
isPayFeesLoading: boolean;
20+
isInputFocused?: boolean;
2021
blockingPayAlertMessage: string | null;
2122
}
2223

@@ -29,6 +30,7 @@ export const usePredictBuyError = ({
2930
isInsufficientBalance,
3031
maxBetAmount,
3132
isPayFeesLoading,
33+
isInputFocused,
3234
blockingPayAlertMessage,
3335
}: UsePredictBuyInfoParams) => {
3436
const { activeOrder, clearOrderError } = usePredictActiveOrder();
@@ -41,7 +43,11 @@ export const usePredictBuyError = ({
4143
return undefined;
4244
}
4345

44-
const ready = !isPayFeesLoading && !isPredictBalanceSelected;
46+
// Suppress the pay-token alert while the user is actively editing the
47+
// amount. The deposit amount only syncs to TransactionPayController when
48+
// the input loses focus, so the alert may reflect an outdated amount.
49+
const ready =
50+
!isPayFeesLoading && !isPredictBalanceSelected && !isInputFocused;
4551

4652
if (ready && !!blockingPayAlertMessage) {
4753
return {
@@ -63,6 +69,7 @@ export const usePredictBuyError = ({
6369
preview,
6470
isPayFeesLoading,
6571
isPredictBalanceSelected,
72+
isInputFocused,
6673
blockingPayAlertMessage,
6774
activeOrder?.error,
6875
]);

app/components/UI/Ramp/Views/NativeFlow/BasicInfo.test.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ jest.mock('@react-navigation/native', () => ({
1616
}));
1717

1818
jest.mock('../../../../../../locales/i18n', () => ({
19+
__esModule: true,
20+
default: { locale: 'en-US' },
1921
strings: (key: string) => key,
2022
I18nEvents: { addListener: jest.fn() },
2123
}));

builds.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ _secrets: &secrets # Infrastructure
101101
MM_BRAZE_SDK_ENDPOINT: 'MM_BRAZE_SDK_ENDPOINT'
102102
# Expo
103103
EXPO_PROJECT_ID: 'EXPO_PROJECT_ID'
104+
EXPO_TOKEN: 'EXPO_TOKEN'
104105

105106
# Signing config (AWS Secrets Manager) - omit for dev/simulator builds
106107
# android_keystore_path: filename in android/keystores/ (build.gradle expects fixed paths)

0 commit comments

Comments
 (0)