Skip to content

Commit 66d9386

Browse files
committed
Merge remote-tracking branch 'origin/main' into fix/mmmultisrp-208
2 parents eb9a54b + 865763b commit 66d9386

File tree

6 files changed

+82
-33
lines changed

6 files changed

+82
-33
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
name: "Check PR Max Lines"
2+
3+
on:
4+
pull_request:
5+
types: [opened, reopened, synchronize]
6+
7+
jobs:
8+
check-pr-max-lines:
9+
uses: metamask/github-tools/.github/workflows/pr-line-check.yml@main
10+
with:
11+
max_lines: 1000
12+
ignore_patterns: '(\.lock$)'

app/components/UI/Bridge/Views/BridgeView/index.tsx

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ import { selectSelectedNetworkClientId } from '../../../../../selectors/networkC
6666
import { useMetrics, MetaMetricsEvents } from '../../../../hooks/useMetrics';
6767
import { BridgeToken, BridgeViewMode } from '../../types';
6868
import { useSwitchTokens } from '../../hooks/useSwitchTokens';
69-
import { parseUnits } from 'ethers/lib/utils';
70-
import { BigNumber } from 'ethers';
69+
import useIsInsufficientBalance from '../../hooks/useInsufficientBalance';
7170

7271
export interface BridgeRouteParams {
7372
token?: BridgeToken;
@@ -113,7 +112,7 @@ const BridgeView = () => {
113112
isExpired,
114113
willRefresh,
115114
} = useBridgeQuoteData();
116-
const { quoteRequest, quotesLastFetched } = useSelector(
115+
const { quotesLastFetched } = useSelector(
117116
selectBridgeControllerState,
118117
);
119118
const { handleSwitchTokens } = useSwitchTokens();
@@ -156,13 +155,10 @@ const BridgeView = () => {
156155
const hasValidBridgeInputs =
157156
isValidSourceAmount && !!sourceToken && !!destToken;
158157

159-
// quoteRequest.insufficientBal is undefined for Solana quotes, so we need to manually check if the source amount is greater than the balance
160-
const hasInsufficientBalance =
161-
quoteRequest?.insufficientBal ||
162-
(isValidSourceAmount &&
163-
parseUnits(sourceAmount, sourceToken.decimals).gt(
164-
latestSourceBalance?.atomicBalance ?? BigNumber.from(0),
165-
));
158+
const hasInsufficientBalance = useIsInsufficientBalance({
159+
amount: sourceAmount,
160+
token: sourceToken,
161+
});
166162

167163
// Primary condition for keypad visibility - when input is focused or we don't have valid inputs
168164
const shouldDisplayKeypad =

app/components/UI/Bridge/components/TokenInputArea/index.tsx

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
import { renderNumber } from '../../../../../util/number';
1616
import { selectTokenMarketData } from '../../../../../selectors/tokenRatesController';
1717
import { selectNetworkConfigurations } from '../../../../../selectors/networkController';
18-
import { BigNumber, ethers } from 'ethers';
18+
import { ethers } from 'ethers';
1919
import { BridgeToken } from '../../types';
2020
import { Skeleton } from '../../../../../component-library/components/Skeleton';
2121
import Button, {
@@ -26,7 +26,6 @@ import Routes from '../../../../../constants/navigation/Routes';
2626
import { useNavigation } from '@react-navigation/native';
2727
import { BridgeDestNetworkSelectorRouteParams } from '../BridgeDestNetworkSelector';
2828
import {
29-
selectBridgeControllerState,
3029
setDestTokenExchangeRate,
3130
setSourceTokenExchangeRate,
3231
} from '../../../../../core/redux/slices/bridge';
@@ -35,8 +34,7 @@ import { selectMultichainAssetsRates } from '../../../../../selectors/multichain
3534
///: END:ONLY_INCLUDE_IF(keyring-snaps)
3635
import { getDisplayCurrencyValue } from '../../utils/exchange-rates';
3736
import { useBridgeExchangeRates } from '../../hooks/useBridgeExchangeRates';
38-
import { useLatestBalance } from '../../hooks/useLatestBalance';
39-
import { parseUnits } from 'ethers/lib/utils';
37+
import useIsInsufficientBalance from '../../hooks/useInsufficientBalance';
4038
import parseAmount from '../../../Ramp/utils/parseAmount';
4139

4240
const MAX_DECIMALS = 5;
@@ -150,24 +148,8 @@ export const TokenInputArea = forwardRef<
150148
const networkConfigurationsByChainId = useSelector(
151149
selectNetworkConfigurations,
152150
);
153-
const { quoteRequest } = useSelector(selectBridgeControllerState);
154151

155-
const latestBalance = useLatestBalance({
156-
address: token?.address,
157-
decimals: token?.decimals,
158-
chainId: token?.chainId,
159-
balance: token?.balance,
160-
});
161-
const isValidAmount =
162-
amount !== undefined && amount !== '.' && token?.decimals;
163-
164-
// quoteRequest.insufficientBal is undefined for Solana quotes, so we need to manually check if the source amount is greater than the balance
165-
const isInsufficientBalance =
166-
quoteRequest?.insufficientBal ||
167-
(isValidAmount &&
168-
parseUnits(amount, token.decimals).gt(
169-
latestBalance?.atomicBalance ?? BigNumber.from(0),
170-
));
152+
const isInsufficientBalance = useIsInsufficientBalance({ amount, token });
171153

172154
let nonEvmMultichainAssetRates = {};
173155
///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps)

app/components/UI/Bridge/hooks/useBridgeQuoteData/index.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { formatAmount } from '../../../SimulationDetails/formatAmount';
2424
import { BigNumber } from 'bignumber.js';
2525
import I18n from '../../../../../../locales/i18n';
2626
import useFiatFormatter from '../../../SimulationDetails/FiatDisplay/useFiatFormatter';
27+
import useIsInsufficientBalance from '../useInsufficientBalance';
2728
/**
2829
* Hook for getting bridge quote data without request logic
2930
*/
@@ -46,12 +47,14 @@ export const useBridgeQuoteData = () => {
4647
quotesLoadingStatus,
4748
quotesLastFetched,
4849
quotesRefreshCount,
49-
quoteRequest,
5050
} = bridgeControllerState;
5151

5252
const refreshRate = getQuoteRefreshRate(bridgeFeatureFlags, sourceToken);
5353
const maxRefreshCount = bridgeFeatureFlags?.maxRefreshCount ?? 5; // Default to 5 refresh attempts
54-
const { insufficientBal } = quoteRequest;
54+
const insufficientBal = useIsInsufficientBalance({
55+
amount: sourceAmount,
56+
token: sourceToken,
57+
});
5558

5659
const willRefresh = shouldRefreshQuote(
5760
insufficientBal ?? false,

app/components/UI/Bridge/hooks/useBridgeQuoteData/useBridgeQuoteData.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,27 @@ jest.mock('@metamask/bridge-controller', () => {
3131
};
3232
});
3333

34+
// Mock Engine context
35+
jest.mock('../../../../../core/Engine', () => ({
36+
context: {
37+
NetworkController: {
38+
findNetworkClientIdByChainId: jest.fn(() => 'mainnet'),
39+
getNetworkClientById: jest.fn(() => ({
40+
configuration: {
41+
chainId: '0x1',
42+
},
43+
})),
44+
},
45+
},
46+
}));
47+
48+
// Mock getProviderByChainId
49+
jest.mock('../../../../../util/notifications/methods/common', () => ({
50+
getProviderByChainId: jest.fn(() => ({
51+
getBalance: jest.fn().mockResolvedValue('1000000000000000000'),
52+
})),
53+
}));
54+
3455
describe('useBridgeQuoteData', () => {
3556
beforeEach(() => {
3657
jest.clearAllMocks();
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { useSelector } from 'react-redux';
2+
import { selectBridgeControllerState } from '../../../../../selectors/bridgeController';
3+
import { useLatestBalance } from '../useLatestBalance';
4+
import { BigNumber } from 'ethers';
5+
import { parseUnits } from 'ethers/lib/utils';
6+
import { BridgeToken } from '../../types';
7+
8+
interface UseIsInsufficientBalanceParams {
9+
amount: string | undefined;
10+
token: BridgeToken | undefined;
11+
}
12+
13+
const useIsInsufficientBalance = ({ amount, token }: UseIsInsufficientBalanceParams): boolean => {
14+
const { quoteRequest } = useSelector(selectBridgeControllerState);
15+
const latestBalance = useLatestBalance({
16+
address: token?.address,
17+
decimals: token?.decimals,
18+
chainId: token?.chainId,
19+
balance: token?.balance,
20+
});
21+
22+
const isValidAmount =
23+
amount !== undefined && amount !== '.' && token?.decimals;
24+
25+
// quoteRequest.insufficientBal is undefined for Solana quotes, so we need to manually check if the source amount is greater than the balance
26+
const isInsufficientBalance = quoteRequest?.insufficientBal ||
27+
(isValidAmount &&
28+
parseUnits(amount, token.decimals).gt(
29+
latestBalance?.atomicBalance ?? BigNumber.from(0),
30+
));
31+
32+
return Boolean(isInsufficientBalance);
33+
};
34+
35+
export default useIsInsufficientBalance;

0 commit comments

Comments
 (0)