Skip to content

Commit 5fc1164

Browse files
committed
fix: fix solana token list render
1 parent e058be1 commit 5fc1164

File tree

4 files changed

+15
-111
lines changed

4 files changed

+15
-111
lines changed

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

+8-3
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ import { abiERC20 } from '@metamask/metamask-eth-abis';
44
import { Web3Provider } from '@ethersproject/providers';
55
import { formatUnits, getAddress, parseUnits } from 'ethers/lib/utils';
66
import { useSelector } from 'react-redux';
7-
import { selectSelectedInternalAccountFormattedAddress } from '../../../../../selectors/accountsController';
7+
import { selectSelectedInternalAccount, selectSelectedInternalAccountFormattedAddress } from '../../../../../selectors/accountsController';
88
import { getProviderByChainId } from '../../../../../util/notifications/methods/common';
99
import { BigNumber, constants, Contract } from 'ethers';
1010
import usePrevious from '../../../../hooks/usePrevious';
1111
///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps)
1212
import { isSolanaChainId } from '@metamask/bridge-controller';
13-
import { selectMultichainTokenList } from '../../../../../selectors/multichain/multichain';
13+
import { selectMultichainTokenListForAccountId } from '../../../../../selectors/multichain/multichain';
14+
import { RootState } from '../../../../../reducers';
1415
///: END:ONLY_INCLUDE_IF
1516

1617
export async function fetchAtomicTokenBalance(
@@ -66,10 +67,14 @@ export const useLatestBalance = (
6667
const selectedAddress = useSelector(selectSelectedInternalAccountFormattedAddress);
6768
const previousToken = usePrevious(token);
6869

70+
const selectedAccount = useSelector(selectSelectedInternalAccount);
71+
6972
///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps)
7073
// Returns native SOL and SPL tokens, contains balance and fiat values
7174
// Balance and fiat values are not truncated
72-
const nonEvmTokens = useSelector(selectMultichainTokenList);
75+
const nonEvmTokens = useSelector((state: RootState) =>
76+
selectMultichainTokenListForAccountId(state, selectedAccount?.id),
77+
);
7378
///: END:ONLY_INCLUDE_IF
7479

7580
const chainId = token.chainId;

app/components/UI/Tokens/index.tsx

+7-3
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import {
3535
selectEvmTokenFiatBalances,
3636
selectEvmTokens,
3737
///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps)
38-
selectMultichainTokenList,
38+
selectMultichainTokenListForAccountId,
3939
///: END:ONLY_INCLUDE_IF
4040
} from '../../../selectors/multichain';
4141
import { TraceName, endTrace, trace } from '../../../util/trace';
@@ -45,6 +45,7 @@ import { selectIsEvmNetworkSelected } from '../../../selectors/multichainNetwork
4545
import { AssetPollingProvider } from '../../hooks/AssetPolling/AssetPollingProvider';
4646
import { TokenListControlBar } from './TokenListControlBar';
4747
import { selectSelectedInternalAccount } from '../../../selectors/accountsController';
48+
import { RootState } from '../../../reducers';
4849

4950
interface TokenListNavigationParamList {
5051
AddAsset: { assetType: string };
@@ -74,12 +75,15 @@ const Tokens = memo(() => {
7475
const [tokenToRemove, setTokenToRemove] = useState<TokenI>();
7576
const [refreshing, setRefreshing] = useState(false);
7677
const [isAddTokenEnabled, setIsAddTokenEnabled] = useState(true);
78+
const selectedAccount = useSelector(selectSelectedInternalAccount);
7779

7880
// non-evm
7981
///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps)
80-
const nonEvmTokens = useSelector(selectMultichainTokenList);
82+
const nonEvmTokens = useSelector((state: RootState) =>
83+
selectMultichainTokenListForAccountId(state, selectedAccount?.id),
84+
);
8185
///: END:ONLY_INCLUDE_IF
82-
const selectedAccount = useSelector(selectSelectedInternalAccount);
86+
8387

8488
const tokenListData = isEvmSelected ? evmTokens : nonEvmTokens;
8589

app/selectors/multichain/multichain.test.ts

-96
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
selectMultichainBalances,
1111
MULTICHAIN_NETWORK_TO_ASSET_TYPES,
1212
selectMultichainTransactions,
13-
selectMultichainTokenList,
1413
selectSelectedAccountMultichainNetworkAggregatedBalance,
1514
selectSolanaAccountTransactions,
1615
selectMultichainHistoricalPrices,
@@ -588,101 +587,6 @@ describe('MultichainNonEvm Selectors', () => {
588587
});
589588
});
590589

591-
describe('selectMultichainTokenList', () => {
592-
it('returns a list of tokens', () => {
593-
const selectedInternalAccountId = 'ae247df6-3911-47f7-9e36-28e6a7d96078';
594-
const state = getNonEvmState();
595-
const mockBalances = {
596-
[selectedInternalAccountId]: {
597-
[MultichainNativeAssets.Bitcoin]: { amount: '10', unit: 'BTC' },
598-
},
599-
};
600-
const mockAssets = {
601-
[selectedInternalAccountId]: [MultichainNativeAssets.Bitcoin],
602-
};
603-
const mockAssetsMetadata = {
604-
[MultichainNativeAssets.Bitcoin]: {
605-
name: 'Bitcoin',
606-
symbol: 'BTC',
607-
units: [{ name: 'Bitcoin', symbol: 'BTC', decimals: 8 }],
608-
iconUrl: 'https://example.com/btc.png',
609-
fungible: true as const,
610-
},
611-
};
612-
const mockAssetsRates = {
613-
[MultichainNativeAssets.Bitcoin]: { rate: '2000', conversionTime: 0 },
614-
};
615-
state.engine.backgroundState.MultichainBalancesController.balances =
616-
mockBalances;
617-
state.engine.backgroundState.MultichainAssetsController.accountsAssets =
618-
mockAssets;
619-
state.engine.backgroundState.MultichainAssetsController.assetsMetadata =
620-
mockAssetsMetadata;
621-
state.engine.backgroundState.MultichainAssetsRatesController.conversionRates =
622-
mockAssetsRates;
623-
624-
const tokenList = selectMultichainTokenList(state);
625-
626-
expect(tokenList.length).toEqual(1);
627-
expect(tokenList[0].name).toEqual('Bitcoin');
628-
expect(tokenList[0].symbol).toEqual('BTC');
629-
expect(tokenList[0].balance).toEqual('10');
630-
});
631-
632-
it('filters out tokens not matching nonEVM network chain ID', () => {
633-
const selectedInternalAccountId = 'ae247df6-3911-47f7-9e36-28e6a7d96078';
634-
const state = getNonEvmState();
635-
636-
const nonMatchingAssetId =
637-
'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f'; // Ethereum Mainnet
638-
639-
state.engine.backgroundState.MultichainBalancesController.balances = {
640-
[selectedInternalAccountId]: {
641-
[nonMatchingAssetId]: { amount: '5', unit: 'DAI' },
642-
},
643-
};
644-
state.engine.backgroundState.MultichainAssetsController.accountsAssets = {
645-
[selectedInternalAccountId]: [nonMatchingAssetId],
646-
};
647-
648-
const tokenList = selectMultichainTokenList(state);
649-
expect(tokenList).toEqual([]);
650-
});
651-
652-
it('returns an empty array if selected account is undefined', () => {
653-
const state = getNonEvmState();
654-
state.engine.backgroundState.AccountsController.internalAccounts.selectedAccount =
655-
'foo';
656-
657-
const tokenList = selectMultichainTokenList(state);
658-
659-
expect(tokenList).toEqual([]);
660-
});
661-
662-
it('uses fallback metadata when asset metadata is missing', () => {
663-
const selectedInternalAccountId = 'ae247df6-3911-47f7-9e36-28e6a7d96078';
664-
const state = getNonEvmState();
665-
666-
const btcCaip = 'bip122:000000000019d6689c085ae165831e93/slip44:0';
667-
668-
state.engine.backgroundState.MultichainBalancesController.balances = {
669-
[selectedInternalAccountId]: {
670-
[btcCaip]: { amount: '1', unit: 'BTC' },
671-
},
672-
};
673-
state.engine.backgroundState.MultichainAssetsController.accountsAssets = {
674-
[selectedInternalAccountId]: [btcCaip],
675-
};
676-
state.engine.backgroundState.MultichainAssetsController.assetsMetadata =
677-
{}; // fallback will be used
678-
679-
const tokenList = selectMultichainTokenList(state);
680-
expect(tokenList[0].name).toBe('BTC');
681-
expect(tokenList[0].symbol).toBe('BTC');
682-
expect(tokenList[0].balance).toBe('1');
683-
});
684-
});
685-
686590
describe('selectMultichainNetworkAggregatedBalance', () => {
687591
beforeEach(() => {
688592
jest.clearAllMocks();

app/selectors/multichain/multichain.ts

-9
Original file line numberDiff line numberDiff line change
@@ -283,15 +283,6 @@ export const selectMultichainTokenListForAccountId = createDeepEqualSelector(
283283
return tokens;
284284
},
285285
);
286-
287-
export const selectMultichainTokenList = createDeepEqualSelector(
288-
(state: RootState) => state,
289-
selectSelectedInternalAccount,
290-
(state, selectedAccount) => {
291-
return selectMultichainTokenListForAccountId(state, selectedAccount?.id);
292-
},
293-
);
294-
295286
export interface MultichainNetworkAggregatedBalance {
296287
totalNativeTokenBalance: Balance | undefined;
297288
totalBalanceFiat: number | undefined;

0 commit comments

Comments
 (0)