Skip to content

fix: show account balances for selected XChain swap destination address #31684

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Apr 9, 2025
4 changes: 3 additions & 1 deletion ui/hooks/bridge/useTokensWithFiltering.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,17 +53,19 @@ type FilterPredicate = (
* @param tokenToExclude.symbol
* @param tokenToExclude.address
* @param tokenToExclude.chainId
* @param accountId - the accountId to use for the token list
*/
export const useTokensWithFiltering = (
chainId?: ChainId | Hex | CaipChainId,
tokenToExclude?: null | Pick<BridgeToken, 'symbol' | 'address' | 'chainId'>,
accountId?: string,
) => {
const topAssetsFromFeatureFlags = useSelector((state: BridgeAppState) =>
getTopAssetsFromFeatureFlags(state, chainId),
);

const { assetsWithBalance: multichainTokensWithBalance } =
useMultichainBalances();
useMultichainBalances(accountId);

const cachedTokens = useSelector(selectERC20TokensByChain);

Expand Down
40 changes: 28 additions & 12 deletions ui/hooks/useMultichainBalances.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,16 @@ import {
getMultichainBalances,
} from '../selectors/multichain';
import { AssetType } from '../../shared/constants/transaction';
import { getSelectedEvmInternalAccount } from '../selectors/selectors';
import {
getInternalAccount,
getSelectedEvmInternalAccount,
} from '../selectors/selectors';
import { useMultichainSelector } from './useMultichainSelector';

// TODO replace this with getMultichainAssets
const useNonEvmAssetsWithBalances = (): (
const useNonEvmAssetsWithBalances = (
accountId?: string,
): (
| Omit<TokenWithBalance, 'address' | 'chainId' | 'primary' | 'secondary'> & {
chainId: `${string}:${string}`;
decimals: number;
Expand All @@ -34,7 +39,6 @@ const useNonEvmAssetsWithBalances = (): (
symbol: string;
}
)[] => {
const nonEvmAccount = useSelector(getLastSelectedNonEvmAccount);
// non-evm tokens owned by non-evm account, includes native and non-native assets
const assetsByAccountId = useSelector(getAccountAssets);
const assetMetadataById = useSelector(getAssetsMetadata);
Expand All @@ -47,12 +51,12 @@ const useNonEvmAssetsWithBalances = (): (
const assetRates = useSelector(getAssetsRates);

const nonEvmTokensWithFiatBalances = useMemo(() => {
if (!nonEvmAccount?.id) {
if (!accountId) {
return [];
}

const assetIds = assetsByAccountId?.[nonEvmAccount.id];
const balancesByAssetId = nonEvmBalancesByAccountId?.[nonEvmAccount.id];
const assetIds = assetsByAccountId?.[accountId];
const balancesByAssetId = nonEvmBalancesByAccountId?.[accountId];
if (!balancesByAssetId || !assetIds) {
return [];
}
Expand Down Expand Up @@ -84,23 +88,35 @@ const useNonEvmAssetsWithBalances = (): (
assetMetadataById,
assetRates,
assetsByAccountId,
nonEvmAccount?.id,
accountId,
nonEvmBalancesByAccountId,
]);

return nonEvmTokensWithFiatBalances;
};

// This hook is used to get the balances of all tokens and native tokens across all chains
// This also returns the total fiat balances by chainId/caipChainId
export const useMultichainBalances = () => {
/**
* This hook is used to get the balances of all tokens and native tokens across all chains
* This also returns the total fiat balances by chainId/caipChainId
*
* @param accountId - the accountId to use for the token list, if not provided, the selected account will be used
*/
export const useMultichainBalances = (accountId?: string) => {
// EVM data
const selectedAccount = useSelector(getSelectedEvmInternalAccount);
const requestedAccount = useSelector((state) =>
getInternalAccount(state, accountId ?? ''),
);
const evmAccount = accountId ? requestedAccount : selectedAccount;

const evmBalancesWithFiatByChainId = useSelector((state) =>
getTokenBalancesEvm(state, selectedAccount.address),
getTokenBalancesEvm(state, evmAccount?.address),
);
// Non-EVM data
const nonEvmBalancesWithFiatByChainId = useNonEvmAssetsWithBalances();
const nonEvmAccount = useSelector(getLastSelectedNonEvmAccount);
const nonEvmBalancesWithFiatByChainId = useNonEvmAssetsWithBalances(
accountId ?? nonEvmAccount?.id,
);

// return TokenWithFiat sorted by fiat balance amount
const assetsWithBalance = useMemo(() => {
Expand Down
8 changes: 7 additions & 1 deletion ui/pages/bridge/prepare/prepare-bridge-page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,13 @@ const PrepareBridgePage = () => {
const {
filteredTokenListGenerator: toTokenListGenerator,
isLoading: isToTokensLoading,
} = useTokensWithFiltering(toChain?.chainId ?? fromChain?.chainId, fromToken);
} = useTokensWithFiltering(
toChain?.chainId ?? fromChain?.chainId,
fromToken,
selectedDestinationAccount !== null && 'id' in selectedDestinationAccount
? selectedDestinationAccount.id
: undefined,
);

const { flippedRequestProperties } = useRequestProperties();
const trackCrossChainSwapsEvent = useCrossChainSwapsEventTracker();
Expand Down
Loading