Skip to content

Commit dd7bf15

Browse files
jpuriOGPoyraz
andauthored
feat: read stablecoins from stable-tokens LD flag in useTokenFiatRates cp-8.3.0 (#33251)
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until this PR meets the canonical Definition of Ready For Review in `docs/readme/ready-for-review.md`. In short: the template must be materially complete (not just section titles present), all status checks must be currently passing, and the only expected follow-up commits must be reviewer-driven. --> <!-- mms-check directive vocabulary — read by .github/scripts/shared/pr-template-checks.ts at module load to build the validation plan. Directives are invisible in rendered markdown and must NOT be removed or edited without updating the validator registry. type=text Section must contain non-placeholder prose. type=changelog Section must have a valid CHANGELOG entry: line. type=issue-link Section must have a Fixes:/Closes:/Refs: line with a value. type=manual-testing Section must have real testing steps or an explicit N/A. type=screenshot Section must have evidence (image/URL) or an explicit N/A. type=checklist Section must have all checkboxes consciously checked. required=true|false Whether a missing/invalid section runs the validator at all. blocking=true|false Whether a failure of this check fails the CI workflow. Default: false — failures are shown as warnings in the sticky comment but do not block the PR. Sections without a directive are checked for structural presence only. --> ## **Description** On MM Pay UI read stablecoins from stable-tokens LD flag. ## **Changelog** <!-- mms-check: type=changelog required=true blocking=true --> <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: ## **Related issues** <!-- mms-check: type=issue-link required=true --> Fixes: https://consensyssoftware.atlassian.net/browse/CONF-1671 ## **Manual testing steps** NA ## **Screenshots/Recordings** NA ## **Pre-merge author checklist** <!-- mms-check: type=checklist required=true --> <!-- Every checklist item must be consciously assessed before marking this PR as "Ready for review". A checked box means you deliberately considered that responsibility, not that you literally performed every action listed. Unchecked boxes are ambiguous: they are not an implicit "N/A" and they are not a silent "skip". See `docs/readme/ready-for-review.md` for the full checklist semantics. --> - [X] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [X] I've completed the PR template to the best of my ability - [X] I've included tests if applicable - [X] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [X] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. #### Performance checks (if applicable) - [X] I've tested on Android - Ideally on a mid-range device; emulator is acceptable - [X] I've tested with a power user scenario - Use these [power-user SRPs](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/edit-v2/401401446401?draftShareId=9d77e1e1-4bdc-4be1-9ebb-ccd916988d93) to import wallets with many accounts and tokens - [X] I've instrumented key operations with Sentry traces for production performance metrics - See [`trace()`](/app/util/trace.ts) for usage and [`addToken`](/app/components/Views/AddAsset/components/AddCustomToken/AddCustomToken.tsx#L274) for an example For performance guidelines and tooling, see the [Performance Guide](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/400085549067/Performance+Guide+for+Engineers). ## **Pre-merge reviewer checklist** <!-- Reviewer checklist items follow the same semantics as the author checklist: an unchecked box is ambiguous, a checked box means the reviewer consciously assessed that responsibility. See `docs/readme/ready-for-review.md`. --> - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Changes how USD fiat rates and MM Pay deposit prefills are computed; wrong flag or route data could mis-price tokens or prefill amounts, though defaults mirror prior behavior. > > **Overview** > **Stablecoin fiat pricing** no longer uses a hardcoded per-chain address map in `useTokenFiatRates`. It now reads **`selectStablecoins`** from the remote **`stable-tokens`** LaunchDarkly flag (with the previous addresses as defaults and normalization for invalid flag shapes). > > **Deposit prefill** (100% vs 50% of balance) switches from **`isStablecoin`** in `token.ts` to **`isRouteToken`** in `relayFixedSpread`, which treats a pay token as “stable” when it appears on any relay fixed-spread route as source or target. That helper is new; **`isStablecoin` is removed** from `token.ts`. Related hooks/tests are updated accordingly. > > The **`stable-tokens`** flag is registered in the feature-flag registry (remote, not in prod by default). > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit dec93b9. 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: Goktug Poyraz <omergoktugpoyraz@gmail.com>
1 parent 955fd0a commit dd7bf15

10 files changed

Lines changed: 222 additions & 123 deletions

File tree

app/components/Views/confirmations/hooks/tokens/useTokenFiatRates.ts

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,10 @@ import {
66
selectCurrentCurrency,
77
} from '../../../../../selectors/currencyRateController';
88
import { selectNetworkConfigurations } from '../../../../../selectors/networkController';
9+
import { selectStablecoins } from '../../../../../selectors/featureFlagController/stableTokens';
910
import { useMemo } from 'react';
1011
import { useDeepMemo } from '../useDeepMemo';
1112
import { toChecksumAddress } from '../../../../../util/address';
12-
import { CHAIN_IDS } from '@metamask/transaction-controller';
13-
14-
// Pending conversion to a remote feature flag
15-
const STABLECOINS: Record<Hex, Hex[]> = {
16-
[CHAIN_IDS.MAINNET]: [
17-
'0xaca92e438df0b2401ff60da7e4337b687a2435da', // MUSD
18-
'0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', // USDC
19-
'0xdac17f958d2ee523a2206206994597c13d831ec7', // USDT
20-
],
21-
[CHAIN_IDS.ARBITRUM]: [
22-
'0xaf88d065e77c8cc2239327c5edb3a432268e5831', // USDC
23-
],
24-
[CHAIN_IDS.LINEA_MAINNET]: [
25-
'0xaca92e438df0b2401ff60da7e4337b687a2435da', // MUSD
26-
'0x176211869ca2b568f2a7d4ee941e073a821ee1ff', // USDC
27-
'0xa219439258ca9da29e9cc4ce5596924745e12b93', // USDT
28-
],
29-
[CHAIN_IDS.POLYGON]: [
30-
'0x2791bca1f2de4661ed88a30c99a7a9449aa84174', // USDC.e
31-
'0xc011a7e12a19f7b1f670d46f03b03f3342e82dfb', // pUSD
32-
],
33-
};
3413

3514
export interface TokenFiatRateRequest {
3615
address: Hex;
@@ -43,6 +22,7 @@ export function useTokenFiatRates(requests: TokenFiatRateRequest[]) {
4322
const tokenMarketDataByAddressByChainId = useSelector(selectTokenMarketData);
4423
const currencyRates = useSelector(selectCurrencyRates);
4524
const networkConfigurations = useSelector(selectNetworkConfigurations);
25+
const stablecoins = useSelector(selectStablecoins);
4626
const safeRequests = useDeepMemo(() => requests, [requests]);
4727

4828
const result = useMemo(
@@ -51,7 +31,7 @@ export function useTokenFiatRates(requests: TokenFiatRateRequest[]) {
5131
const currency = currencyOverride ?? selectedCurrency;
5232
const isUsd = currency.toLowerCase() === 'usd';
5333

54-
const isStablecoin = STABLECOINS[chainId]?.includes(
34+
const isStablecoin = stablecoins[chainId]?.includes(
5535
address.toLowerCase() as Hex,
5636
);
5737

@@ -82,6 +62,7 @@ export function useTokenFiatRates(requests: TokenFiatRateRequest[]) {
8262
networkConfigurations,
8363
safeRequests,
8464
selectedCurrency,
65+
stablecoins,
8566
tokenMarketDataByAddressByChainId,
8667
],
8768
);

app/components/Views/confirmations/hooks/transactions/useDepositPrefillAmount.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
selectDepositLimits,
1313
} from '../../../../../selectors/featureFlagController/confirmations';
1414
import { selectAccountOverrideByTransactionId } from '../../../../../selectors/transactionPayController';
15-
import { isStablecoin } from '../../utils/token';
15+
import { isRouteToken } from '../../utils/relayFixedSpread';
1616
import { useTransactionPayToken } from '../pay/useTransactionPayToken';
1717
import { useTransactionMetadataRequest } from './useTransactionMetadataRequest';
1818
import { getMoneyAccountDepositIntent } from '../../../../UI/Money/hooks/useMoneyAccount';
@@ -33,9 +33,9 @@ jest.mock(
3333
}),
3434
);
3535

36-
jest.mock('../../utils/token', () => ({
37-
...jest.requireActual('../../utils/token'),
38-
isStablecoin: jest.fn(),
36+
jest.mock('../../utils/relayFixedSpread', () => ({
37+
...jest.requireActual('../../utils/relayFixedSpread'),
38+
isRouteToken: jest.fn(),
3939
}));
4040

4141
jest.mock('../pay/useTransactionPayToken');
@@ -60,7 +60,7 @@ const useTransactionPayTokenMock = jest.mocked(useTransactionPayToken);
6060
const selectMetaMaskPayFlagsMock =
6161
selectMetaMaskPayFlags as unknown as jest.Mock;
6262
const selectDepositLimitsMock = selectDepositLimits as unknown as jest.Mock;
63-
const isStablecoinMock = isStablecoin as unknown as jest.Mock;
63+
const isRouteTokenMock = isRouteToken as unknown as jest.Mock;
6464
const selectAccountOverrideMock =
6565
selectAccountOverrideByTransactionId as unknown as jest.Mock;
6666
const getMoneyAccountDepositIntentMock = jest.mocked(
@@ -129,7 +129,7 @@ function setupMocks(
129129
},
130130
});
131131
selectDepositLimitsMock.mockReturnValue(depositLimits);
132-
isStablecoinMock.mockReturnValue(stablecoin);
132+
isRouteTokenMock.mockReturnValue(stablecoin);
133133
selectAccountOverrideMock.mockReturnValue(overrides.accountOverride);
134134
getMoneyAccountDepositIntentMock.mockReturnValue(
135135
depositIntent as ReturnType<typeof getMoneyAccountDepositIntent>,

app/components/Views/confirmations/hooks/transactions/useDepositPrefillAmount.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
TransactionMeta,
55
TransactionType,
66
} from '@metamask/transaction-controller';
7-
import { Hex } from '@metamask/utils';
87
import { useSelector } from 'react-redux';
98
import {
109
selectDepositLimits,
@@ -15,7 +14,7 @@ import {
1514
import { selectAccountOverrideByTransactionId } from '../../../../../selectors/transactionPayController';
1615
import { RootState } from '../../../../../reducers';
1716
import { hasTransactionType } from '../../utils/transaction';
18-
import { isStablecoin } from '../../utils/token';
17+
import { isRouteToken } from '../../utils/relayFixedSpread';
1918
import { useTransactionMetadataRequest } from './useTransactionMetadataRequest';
2019
import { useTransactionPayToken } from '../pay/useTransactionPayToken';
2120

@@ -73,11 +72,10 @@ export function useDepositPrefillAmount(): DepositPrefillResult {
7372
return undefined;
7473
}
7574

76-
const stable = isStablecoin(
77-
payToken.address as Hex,
78-
payToken.chainId as Hex,
79-
relayFixedSpread,
80-
);
75+
const stable = isRouteToken(relayFixedSpread, {
76+
chainId: payToken.chainId,
77+
address: payToken.address,
78+
});
8179
const percentage = stable ? 100 : 50;
8280

8381
const raw = new BigNumber(percentage)

app/components/Views/confirmations/hooks/transactions/useTransactionCustomAmount.test.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ import {
4545
selectMetaMaskPayFlags,
4646
selectDepositLimits,
4747
} from '../../../../../selectors/featureFlagController/confirmations';
48-
import { isStablecoin } from '../../utils/token';
48+
import { isRouteToken } from '../../utils/relayFixedSpread';
4949
import { getMoneyAccountDepositIntent } from '../../../../UI/Money/hooks/useMoneyAccount';
5050

5151
jest.mock(
@@ -58,9 +58,9 @@ jest.mock(
5858
selectDepositLimits: jest.fn(),
5959
}),
6060
);
61-
jest.mock('../../utils/token', () => ({
62-
...jest.requireActual('../../utils/token'),
63-
isStablecoin: jest.fn(),
61+
jest.mock('../../utils/relayFixedSpread', () => ({
62+
...jest.requireActual('../../utils/relayFixedSpread'),
63+
isRouteToken: jest.fn(),
6464
}));
6565
jest.mock('../../../../UI/Money/hooks/useMoneyAccount', () => ({
6666
...jest.requireActual('../../../../UI/Money/hooks/useMoneyAccount'),
@@ -221,7 +221,7 @@ describe('useTransactionCustomAmount', () => {
221221
},
222222
});
223223
(selectDepositLimits as unknown as jest.Mock).mockReturnValue({});
224-
(isStablecoin as unknown as jest.Mock).mockReturnValue(false);
224+
(isRouteToken as unknown as jest.Mock).mockReturnValue(false);
225225
});
226226

227227
it('returns pending amount provided by updatePendingAmount', async () => {
@@ -1451,7 +1451,7 @@ describe('useTransactionCustomAmount', () => {
14511451
});
14521452

14531453
it('prefills stablecoin with 100% of balance', async () => {
1454-
(isStablecoin as unknown as jest.Mock).mockReturnValue(true);
1454+
(isRouteToken as unknown as jest.Mock).mockReturnValue(true);
14551455
useTransactionPayTokenMock.mockReturnValue({
14561456
payToken: {
14571457
address: TOKEN_ADDRESS_MOCK,
@@ -1472,7 +1472,7 @@ describe('useTransactionCustomAmount', () => {
14721472
});
14731473

14741474
it('prefills non-stablecoin with 50% of balance', async () => {
1475-
(isStablecoin as unknown as jest.Mock).mockReturnValue(false);
1475+
(isRouteToken as unknown as jest.Mock).mockReturnValue(false);
14761476
useTransactionPayTokenMock.mockReturnValue({
14771477
payToken: {
14781478
address: TOKEN_ADDRESS_MOCK,
@@ -1493,7 +1493,7 @@ describe('useTransactionCustomAmount', () => {
14931493
});
14941494

14951495
it('caps at deposit limit when balance exceeds it', async () => {
1496-
(isStablecoin as unknown as jest.Mock).mockReturnValue(true);
1496+
(isRouteToken as unknown as jest.Mock).mockReturnValue(true);
14971497
useTransactionPayTokenMock.mockReturnValue({
14981498
payToken: {
14991499
address: TOKEN_ADDRESS_MOCK,
@@ -1533,7 +1533,7 @@ describe('useTransactionCustomAmount', () => {
15331533
});
15341534

15351535
it('resets amountFiat to zero when switching to zero-balance token', async () => {
1536-
(isStablecoin as unknown as jest.Mock).mockReturnValue(true);
1536+
(isRouteToken as unknown as jest.Mock).mockReturnValue(true);
15371537
useTransactionPayTokenMock.mockReturnValue({
15381538
payToken: {
15391539
address: TOKEN_ADDRESS_MOCK,
@@ -1569,7 +1569,7 @@ describe('useTransactionCustomAmount', () => {
15691569
});
15701570

15711571
it('only prefills once even if balance changes', async () => {
1572-
(isStablecoin as unknown as jest.Mock).mockReturnValue(true);
1572+
(isRouteToken as unknown as jest.Mock).mockReturnValue(true);
15731573
useTransactionPayTokenMock.mockReturnValue({
15741574
payToken: {
15751575
address: TOKEN_ADDRESS_MOCK,

app/components/Views/confirmations/utils/relayFixedSpread.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,23 @@ export const isSubsidizedSource = (
244244
* Reserved for callsites that know the destination of the transaction being
245245
* built; not yet wired in to the MM Pay picker.
246246
*/
247+
/**
248+
* Returns true when the given token appears in any route as either source or
249+
* target. Used to decide whether a pay token is a stablecoin for prefill
250+
* percentage logic.
251+
*/
252+
export const isRouteToken = (
253+
config: RelayFixedSpreadConfig,
254+
endpoint: RouteEndpoint,
255+
): boolean =>
256+
config.routes.some(
257+
(route) =>
258+
(addressesEqual(route.sourceChain, endpoint.chainId) &&
259+
addressesEqual(route.sourceToken, endpoint.address)) ||
260+
(addressesEqual(route.targetChain, endpoint.chainId) &&
261+
addressesEqual(route.targetToken, endpoint.address)),
262+
);
263+
247264
export const isSubsidizedRoute = (
248265
config: RelayFixedSpreadConfig,
249266
source: RouteEndpoint,
Lines changed: 36 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,111 +1,84 @@
11
import { CHAIN_IDS } from '@metamask/transaction-controller';
22
import { Hex } from '@metamask/utils';
3-
import { isStablecoin } from './token';
4-
import { RelayFixedSpreadConfig } from './relayFixedSpread';
3+
import { isRouteToken, RelayFixedSpreadConfig } from './relayFixedSpread';
54

65
const MOCK_CONFIG: RelayFixedSpreadConfig = {
76
routes: [
87
{
98
sourceChain: CHAIN_IDS.MAINNET as Hex,
10-
sourceToken: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48' as Hex, // USDC
9+
sourceToken: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48' as Hex,
1110
targetChain: CHAIN_IDS.MAINNET as Hex,
12-
targetToken: '0xdac17f958d2ee523a2206206994597c13d831ec7' as Hex, // USDT
11+
targetToken: '0xdac17f958d2ee523a2206206994597c13d831ec7' as Hex,
1312
},
1413
{
1514
sourceChain: CHAIN_IDS.BSC as Hex,
16-
sourceToken: '0x55d398326f99059ff775485246999027b3197955' as Hex, // USDT
15+
sourceToken: '0x55d398326f99059ff775485246999027b3197955' as Hex,
1716
targetChain: CHAIN_IDS.BSC as Hex,
18-
targetToken: '0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d' as Hex, // USDC
17+
targetToken: '0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d' as Hex,
1918
},
2019
{
2120
sourceChain: CHAIN_IDS.LINEA_MAINNET as Hex,
22-
sourceToken: '0x176211869ca2b568f2a7d4ee941e073a821ee1ff' as Hex, // USDC
21+
sourceToken: '0x176211869ca2b568f2a7d4ee941e073a821ee1ff' as Hex,
2322
targetChain: CHAIN_IDS.LINEA_MAINNET as Hex,
24-
targetToken: '0xa219439258ca9da29e9cc4ce5596924745e12b93' as Hex, // USDT
23+
targetToken: '0xa219439258ca9da29e9cc4ce5596924745e12b93' as Hex,
2524
},
2625
],
2726
};
2827

2928
const EMPTY_CONFIG: RelayFixedSpreadConfig = { routes: [] };
3029

31-
describe('isStablecoin', () => {
32-
it('returns true for USDC on Ethereum (0x1)', () => {
30+
describe('isRouteToken', () => {
31+
it('returns true for a source token', () => {
3332
expect(
34-
isStablecoin(
35-
'0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
36-
CHAIN_IDS.MAINNET as Hex,
37-
MOCK_CONFIG,
38-
),
33+
isRouteToken(MOCK_CONFIG, {
34+
chainId: CHAIN_IDS.MAINNET,
35+
address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
36+
}),
3937
).toBe(true);
4038
});
4139

42-
it('returns true for USDT on BSC (0x38)', () => {
40+
it('returns true for a target token', () => {
4341
expect(
44-
isStablecoin(
45-
'0x55d398326f99059ff775485246999027b3197955',
46-
CHAIN_IDS.BSC as Hex,
47-
MOCK_CONFIG,
48-
),
42+
isRouteToken(MOCK_CONFIG, {
43+
chainId: CHAIN_IDS.MAINNET,
44+
address: '0xdac17f958d2ee523a2206206994597c13d831ec7',
45+
}),
4946
).toBe(true);
5047
});
5148

52-
it('returns true for a target token in a route', () => {
49+
it('returns false for unknown address', () => {
5350
expect(
54-
isStablecoin(
55-
'0xdac17f958d2ee523a2206206994597c13d831ec7',
56-
CHAIN_IDS.MAINNET as Hex,
57-
MOCK_CONFIG,
58-
),
59-
).toBe(true);
60-
});
61-
62-
it('returns false for non-stablecoin address', () => {
63-
expect(
64-
isStablecoin(
65-
'0x0000000000000000000000000000000000000001',
66-
CHAIN_IDS.MAINNET as Hex,
67-
MOCK_CONFIG,
68-
),
51+
isRouteToken(MOCK_CONFIG, {
52+
chainId: CHAIN_IDS.MAINNET,
53+
address: '0x0000000000000000000000000000000000000001',
54+
}),
6955
).toBe(false);
7056
});
7157

7258
it('returns false for unknown chainId', () => {
7359
expect(
74-
isStablecoin(
75-
'0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
76-
'0xfffff' as Hex,
77-
MOCK_CONFIG,
78-
),
60+
isRouteToken(MOCK_CONFIG, {
61+
chainId: '0xfffff',
62+
address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
63+
}),
7964
).toBe(false);
8065
});
8166

8267
it('returns false with empty config', () => {
8368
expect(
84-
isStablecoin(
85-
'0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
86-
CHAIN_IDS.MAINNET as Hex,
87-
EMPTY_CONFIG,
88-
),
69+
isRouteToken(EMPTY_CONFIG, {
70+
chainId: CHAIN_IDS.MAINNET,
71+
address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
72+
}),
8973
).toBe(false);
9074
});
9175

92-
it('handles case-insensitive addresses (uppercase input)', () => {
93-
expect(
94-
isStablecoin(
95-
'0xA0B86991C6218B36C1D19D4A2E9EB0CE3606EB48',
96-
CHAIN_IDS.MAINNET as Hex,
97-
MOCK_CONFIG,
98-
),
99-
).toBe(true);
100-
});
101-
102-
it('matches lowercase route tokens against lowercase input', () => {
76+
it('handles case-insensitive addresses', () => {
10377
expect(
104-
isStablecoin(
105-
'0x176211869ca2b568f2a7d4ee941e073a821ee1ff',
106-
CHAIN_IDS.LINEA_MAINNET as Hex,
107-
MOCK_CONFIG,
108-
),
78+
isRouteToken(MOCK_CONFIG, {
79+
chainId: CHAIN_IDS.MAINNET,
80+
address: '0xA0B86991C6218B36C1D19D4A2E9EB0CE3606EB48',
81+
}),
10982
).toBe(true);
11083
});
11184
});

0 commit comments

Comments
 (0)