Skip to content

Commit 0897b15

Browse files
fix(token-select): decouple sortByBalance from balance fetching
1 parent d8c5ae2 commit 0897b15

3 files changed

Lines changed: 69 additions & 6 deletions

File tree

src/components/sharedComponents/TokenSelect/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ const TokenSelect = withSuspenseAndRetry<Props>(
130130
const { isLoadingBalances, tokensByChainId } = useTokens({
131131
chainId,
132132
withBalance: showBalance || resolvedSortByBalance,
133+
sortByBalance: resolvedSortByBalance,
133134
})
134135

135136
const { searchResult, searchTerm, setSearchTerm } = useTokenSearch(

src/hooks/useTokens.test.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,31 @@ describe('updateTokensBalances', () => {
117117
expect(tokens[1].symbol).toBe('USDC')
118118
expect(tokens[2].symbol).toBe('DAI')
119119
})
120+
121+
it('preserves source order when sortByBalance is false', () => {
122+
const prices: TokensResponse = {
123+
tokens: {
124+
1: [
125+
makeLifiToken(LOCAL_NATIVE, 'ETH', 18, '2300'),
126+
makeLifiToken(usdcAddress, 'USDC', 6, '1'),
127+
makeLifiToken(daiAddress, 'DAI', 18, '1'),
128+
],
129+
},
130+
}
131+
const balances: TokenAmount[] = [
132+
{ ...makeLifiToken(LOCAL_NATIVE, 'ETH', 18, '2300'), amount: 0n },
133+
{ ...makeLifiToken(usdcAddress, 'USDC', 6, '1'), amount: 5_000_000n },
134+
{ ...makeLifiToken(daiAddress, 'DAI', 18, '1'), amount: 0n },
135+
]
136+
137+
const { tokens } = updateTokensBalances(threeTokens, [balances, prices], {
138+
sortByBalance: false,
139+
})
140+
141+
expect(tokens[0].symbol).toBe('ETH')
142+
expect(tokens[1].symbol).toBe('USDC')
143+
expect(tokens[2].symbol).toBe('DAI')
144+
})
120145
})
121146

122147
describe('updateTokensWithRawBalances', () => {
@@ -172,4 +197,24 @@ describe('updateTokensWithRawBalances', () => {
172197
expect(tokens[0].extensions?.balance).toBe(500n)
173198
expect(tokens[0].extensions?.priceUSD).toBeUndefined()
174199
})
200+
201+
it('preserves source order when sortByBalance is false', () => {
202+
const rawBalances: Record<number, Record<string, bigint>> = {
203+
11155111: {
204+
[LOCAL_NATIVE]: 0n,
205+
[usdcAddress]: 1_000_000n,
206+
},
207+
}
208+
const sepoliaTokens: Tokens = [
209+
{ chainId: 11155111, address: LOCAL_NATIVE, name: 'Ether', symbol: 'ETH', decimals: 18 },
210+
{ chainId: 11155111, address: usdcAddress, name: 'USD Coin', symbol: 'USDC', decimals: 6 },
211+
]
212+
213+
const { tokens } = updateTokensWithRawBalances(sepoliaTokens, rawBalances, {
214+
sortByBalance: false,
215+
})
216+
217+
expect(tokens[0].symbol).toBe('ETH')
218+
expect(tokens[1].symbol).toBe('USDC')
219+
})
175220
})

src/hooks/useTokens.ts

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export const lifiConfig = createConfig({
4949
* @param {Address} [params.account] - Account address for balance fetching (defaults to connected wallet)
5050
* @param {Chain['id']} [params.chainId] - Specific chain ID to filter tokens (defaults to all supported chains)
5151
* @param {boolean} [params.withBalance=true] - Whether to fetch token balances
52+
* @param {boolean} [params.sortByBalance=true] - Whether to sort tokens by balance. When false, source order is preserved even if balances are fetched.
5253
*
5354
* @returns {Object} Token data and loading state
5455
* @returns {Token[]} returns.tokens - Array of tokens with price and balance information
@@ -78,12 +79,15 @@ export const useTokens = (
7879
account,
7980
chainId,
8081
withBalance,
82+
sortByBalance = true,
8183
}: {
8284
account?: Address
8385
chainId?: Chain['id']
8486
withBalance?: boolean
87+
sortByBalance?: boolean
8588
} = {
8689
withBalance: true,
90+
sortByBalance: true,
8791
},
8892
) => {
8993
const { address } = useWeb3Status()
@@ -188,10 +192,16 @@ export const useTokens = (
188192
const cache = useMemo(() => {
189193
if (withBalance && account) {
190194
if (!isLoadingPrices && !isLoadingBalances && tokensBalances && tokensPricesByChain) {
191-
return updateTokensBalances(tokensData.tokens, [tokensBalances, tokensPricesByChain])
195+
return updateTokensBalances(tokensData.tokens, [tokensBalances, tokensPricesByChain], {
196+
sortByBalance,
197+
})
192198
}
193199
if (useOnchainFallback && !isLoadingOnchainBalances && onchainBalances && chainId) {
194-
return updateTokensWithRawBalances(tokensData.tokens, { [chainId]: onchainBalances })
200+
return updateTokensWithRawBalances(
201+
tokensData.tokens,
202+
{ [chainId]: onchainBalances },
203+
{ sortByBalance },
204+
)
195205
}
196206
}
197207
return tokensData
@@ -202,6 +212,7 @@ export const useTokens = (
202212
isLoadingOnchainBalances,
203213
isLoadingPrices,
204214
onchainBalances,
215+
sortByBalance,
205216
tokensBalances,
206217
tokensData,
207218
tokensPricesByChain,
@@ -228,6 +239,7 @@ export const useTokens = (
228239
export function updateTokensBalances(
229240
tokens: Tokens,
230241
results: [Array<TokenAmount>, TokensResponse],
242+
{ sortByBalance = true }: { sortByBalance?: boolean } = {},
231243
) {
232244
const [balanceTokens, prices] = results
233245

@@ -273,9 +285,11 @@ export function updateTokensBalances(
273285
})
274286
logger.timeEnd('extending tokens with balance info')
275287

276-
logger.time('sorting tokens by balance')
277-
tokensWithBalances.sort(sortFn)
278-
logger.timeEnd('sorting tokens by balance')
288+
if (sortByBalance) {
289+
logger.time('sorting tokens by balance')
290+
tokensWithBalances.sort(sortFn)
291+
logger.timeEnd('sorting tokens by balance')
292+
}
279293

280294
logger.time('updating tokens cache')
281295
const tokensByChain = tokensWithBalances.reduce(
@@ -306,6 +320,7 @@ export function updateTokensBalances(
306320
export function updateTokensWithRawBalances(
307321
tokens: Tokens,
308322
rawBalances: Record<number, Record<string, bigint>>,
323+
{ sortByBalance = true }: { sortByBalance?: boolean } = {},
309324
) {
310325
const tokensWithBalances = tokens.map(
311326
(token): Token => ({
@@ -316,7 +331,9 @@ export function updateTokensWithRawBalances(
316331
}),
317332
)
318333

319-
tokensWithBalances.sort(sortByBalancePresenceFn)
334+
if (sortByBalance) {
335+
tokensWithBalances.sort(sortByBalancePresenceFn)
336+
}
320337

321338
const tokensByChainId = tokensWithBalances.reduce(
322339
(acc, token) => {

0 commit comments

Comments
 (0)