Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
bf726b6
feat: MUSD-997 first time deposit animation (#31859)
Matt561 Jun 17, 2026
36a6ec0
feat: bumped @metamask/money-account-balance-service to v2.1.0 (#31918)
Matt561 Jun 17, 2026
d3a73e1
chore: QuickBuy rate tag flip and amount skeleton loading (#31911)
zone-live Jun 17, 2026
82ad265
chore: polish top traders leaderboard, profile, and trades UI (#31904)
zone-live Jun 17, 2026
1945ab4
refactor(explore): standardize Explore homepage section layout (#31245)
brianacnguyen Jun 17, 2026
cc064f4
fix(card): use push animation from Money Home except CardWelcome upse…
Brunonascdev Jun 17, 2026
cd47b5a
feat(home): add homepage discovery pills A/B test (#31932)
wachunei Jun 17, 2026
41b498f
fix: set pending operation address using the from address cp-7.82.0 (…
montelaidev Jun 17, 2026
976b7c1
fix(predict): extended sports outcome grouping, spread ordering, and …
caieu Jun 17, 2026
75f7f2d
refactor: remove old Snap keyring `createAccount` calls (#31846)
ccharly Jun 17, 2026
baeb028
fix(rewards): update VIP referee dashboard (#31921)
sophieqgu Jun 17, 2026
ccd8940
perf(network-enablement): memoize useNetworkEnablement return + popul…
andrepimenta Jun 17, 2026
ca28a46
refactor: remove old snap clients (#31939)
ccharly Jun 17, 2026
db91fd6
refactor(bridge): dedupe hasMinimumRequiredVersion into shared util (…
asalsys Jun 17, 2026
676e748
fix(predict): odds prices stale on feed cards and event page during l…
caieu Jun 17, 2026
c667566
feat(card): redirect cashback setup to Money Account in supported reg…
Brunonascdev Jun 17, 2026
4a36741
ci: add Playwright Appium test health report workflow (#31815)
cmd-ob Jun 18, 2026
0389783
feat(money): add education gate selector for US non-cardholders (#31952)
Brunonascdev Jun 18, 2026
84b8b0d
feat(card): hide wallet card entry when Money account is visible (#31…
Brunonascdev Jun 18, 2026
8db338a
fix(rewards): navigation predict the pitch cp-7.82.0 (#31943)
sophieqgu Jun 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions .github/workflows/flaky-test-report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,33 @@ on:
schedule:
# Once every day from Monday-Friday at 08:00 UTC
- cron: 0 8 * * 1-5
# 10:00 UTC (Europe morning), Monday–Friday — Playwright test health report
- cron: '0 10 * * 1-5'
# 15:00 UTC (US morning), Monday–Friday — Playwright test health report
- cron: '0 15 * * 1-5'
workflow_dispatch:
inputs:
job:
description: Which test report to generate
type: choice
options:
- detox
- appium
default: detox
lookback_days:
description: Number of days of main CI runs to scan (Appium report only)
type: string
default: '1'

permissions:
contents: read
actions: read

jobs:
flaky-test-report:
if: >-
(github.event_name == 'schedule' && github.event.schedule == '0 8 * * 1-5') ||
(github.event_name == 'workflow_dispatch' && inputs.job == 'detox')
runs-on: ubuntu-latest
steps:
- name: Generate flaky test report
Expand All @@ -21,3 +40,19 @@ jobs:
workflow-id: ci.yml
github-token: ${{ secrets.GITHUB_TOKEN }}
slack-webhook-flaky-tests: ${{ secrets.SLACK_WEBHOOK_FLAKY_TESTS }}

playwright-test-health-report:
if: >-
(github.event_name == 'schedule' && (github.event.schedule == '0 10 * * 1-5' || github.event.schedule == '0 15 * * 1-5')) ||
(github.event_name == 'workflow_dispatch' && inputs.job == 'appium')
runs-on: ubuntu-latest
steps:
- name: Generate Playwright test health report
uses: MetaMask/github-tools/.github/actions/playwright-test-health-report@4a2ddd75e9a8182261f0f07fbfc332cc856c89a0
with:
repository: ${{ github.event.repository.name }}
workflow-ids: ci.yml
github-token: ${{ secrets.GITHUB_TOKEN }}
slack-webhook: ${{ secrets.SLACK_WEBHOOK_PLAYWRIGHT_HEALTH_REPORT }}
lookback-days: ${{ github.event_name == 'workflow_dispatch' && inputs.lookback_days || '1' }}
report-title: Playwright Test Health Report (Mobile Appium)
2 changes: 2 additions & 0 deletions .js.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -145,9 +145,11 @@ export MM_MUSD_CONVERSION_MIN_ASSET_BALANCE_REQUIRED="0.01"

# Money Hub
export MM_MONEY_HUB_ENABLED="false"
# Money
export MM_MONEY_PAYMENT_TOKENS_BLOCKLIST=""
export MM_MONEY_DEPOSIT_NO_FEE_TOKENS=""
export MM_MONEY_DEPOSIT_MIN_ASSET_BALANCE="0.01"
export MM_MONEY_FIRST_TIME_DEPOSIT_ANIMATION_ENABLED="true"

# Activates remote feature flag override mode.
# Remote feature flag values won't be updated,
Expand Down
Binary file not shown.
10 changes: 10 additions & 0 deletions app/components/Nav/Main/MainNavigator.js
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ import {
} from '../../UI/Money/routes';
import MoneyOnboardingView from '../../UI/Money/Views/MoneyOnboardingView';
import MoneyPotentialEarningsView from '../../UI/Money/Views/MoneyPotentialEarningsView';
import MoneyFirstTimeDepositView from '../../UI/Money/Views/MoneyFirstTimeDepositView';
import { selectMoneyEnableMoneyAccountFlag } from '../../UI/Money/selectors/featureFlags';
import { selectIsMoneyAccountGeoEligible } from '../../UI/Money/selectors/eligibility';
import { BridgeTransactionDetails } from '../../UI/Bridge/components/TransactionDetails/TransactionDetails';
Expand Down Expand Up @@ -1221,6 +1222,15 @@ const MainNavigator = () => {
component={MoneyOnboardingView}
options={{ headerShown: false, ...fadeNativeOptions }}
/>
<NativeStack.Screen
name={Routes.MONEY.FIRST_TIME_DEPOSIT}
component={MoneyFirstTimeDepositView}
options={{
...clearNativeStackNavigatorOptions,
...transparentModalScreenOptions,
gestureEnabled: false,
}}
/>
<NativeStack.Screen
name={Routes.MONEY.POTENTIAL_EARNINGS}
component={MoneyPotentialEarningsView}
Expand Down
5 changes: 5 additions & 0 deletions app/components/Nav/Main/MainNavigator.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,11 @@ jest.mock('../../../selectors/featureFlagController/marketInsights', () => ({
mockSelectMarketInsightsPerpsEnabled(state),
}));

jest.mock('../../UI/Money/Views/MoneyFirstTimeDepositView', () => ({
__esModule: true,
default: () => null,
}));

jest.mock('../../hooks/useAnalytics/useAnalytics');

jest.mock('../../UI/Money/components/MoneyTabPressTracker', () => ({
Expand Down
9 changes: 3 additions & 6 deletions app/components/UI/Bridge/_mocks_/initialState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,9 @@ import { ethers } from 'ethers';
import { formatChainIdToCaip, StatusTypes } from '@metamask/bridge-controller';
import { AccountTreeControllerState } from '@metamask/account-tree-controller';

jest.mock(
'../../../../core/redux/slices/bridge/utils/hasMinimumRequiredVersion',
() => ({
hasMinimumRequiredVersion: jest.fn().mockReturnValue(true),
}),
);
jest.mock('../../../../util/remoteFeatureFlag', () => ({
hasMinimumRequiredVersion: jest.fn().mockReturnValue(true),
}));

export const ethChainId = '0x1' as Hex;
export const optimismChainId = '0xa' as Hex;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,9 @@ jest.mock('../../../../../hooks', () => ({

// Mock hasMinimumRequiredVersion so that selectBridgeFeatureFlags does not call
// compareVersions (which requires a real app version string unavailable in tests).
jest.mock(
'../../../../../core/redux/slices/bridge/utils/hasMinimumRequiredVersion',
() => ({
hasMinimumRequiredVersion: jest.fn().mockReturnValue(true),
}),
);
jest.mock('../../../../../util/remoteFeatureFlag', () => ({
hasMinimumRequiredVersion: jest.fn().mockReturnValue(true),
}));

// Mock navigation
const mockNavigate = jest.fn();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,9 @@ jest.mock('@react-navigation/native', () => ({
useNavigation: () => ({ replace: mockReplace }),
}));

jest.mock(
'../../../../../core/redux/slices/bridge/utils/hasMinimumRequiredVersion',
() => ({
hasMinimumRequiredVersion: jest.fn().mockReturnValue(true),
}),
);
jest.mock('../../../../../util/remoteFeatureFlag', () => ({
hasMinimumRequiredVersion: jest.fn().mockReturnValue(true),
}));

import { useParams } from '../../../../../util/navigation/navUtils';
import { useLatestBalance } from '../../hooks/useLatestBalance';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,9 @@ jest.mock('../../utils/quoteUtils', () => ({
shouldRefreshQuote: jest.fn(),
}));

jest.mock(
'../../../../../core/redux/slices/bridge/utils/hasMinimumRequiredVersion',
() => ({
hasMinimumRequiredVersion: jest.fn(() => true),
}),
);
jest.mock('../../../../../util/remoteFeatureFlag', () => ({
hasMinimumRequiredVersion: jest.fn(() => true),
}));

jest.mock('@metamask/bridge-controller', () => {
const actual = jest.requireActual('@metamask/bridge-controller');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,9 @@ jest.mock('../../../../../core/Engine', () => ({
},
}));

jest.mock(
'../../../../../core/redux/slices/bridge/utils/hasMinimumRequiredVersion',
() => ({
hasMinimumRequiredVersion: jest.fn().mockReturnValue(true),
}),
);
jest.mock('../../../../../util/remoteFeatureFlag', () => ({
hasMinimumRequiredVersion: jest.fn().mockReturnValue(true),
}));

describe('useBridgeQuoteEvents', () => {
beforeEach(() => {
Expand Down
9 changes: 3 additions & 6 deletions app/components/UI/Bridge/hooks/useInitialBridgeTokens.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,9 @@ jest.mock('../../../../core/Engine', () => ({
}));

const mockHasMinimumRequiredVersion = jest.fn();
jest.mock(
'../../../../core/redux/slices/bridge/utils/hasMinimumRequiredVersion',
() => ({
hasMinimumRequiredVersion: () => mockHasMinimumRequiredVersion(),
}),
);
jest.mock('../../../../util/remoteFeatureFlag', () => ({
hasMinimumRequiredVersion: () => mockHasMinimumRequiredVersion(),
}));

const mockPopularTokens = [
createMockPopularToken({
Expand Down
Loading
Loading