(null);
const {
data: rawBalances,
isLoading: loadingBalances,
isFetching: fetchingBalances,
} = useReadContracts({
contracts:
address &&
list?.tokens.map((token) => {
return {
abi: ERC20_ABI,
address: token.address as Address,
chainId: ChainId.Sepolia,
functionName: "balanceOf",
args: [address],
};
}),
allowFailure: true,
query: {
enabled: !!(list && address),
},
});
const selectedListWithBalances: TokenListWithBalance | null =
useMemo(() => {
if (!list) return null;
if (rawBalances && rawBalances.length === list.tokens.length) {
return {
...list,
tokens: list.tokens.map((token, index) => {
return {
...token,
balance: rawBalances[index].result as unknown as
| bigint
| null,
};
}),
};
}
return list;
}, [list, rawBalances]);
useEffect(() => {
let cancelled = false;
const fetchData = async () => {
let response = await fetch(
`${DATA_CDN_URL}/static/token-list.json`,
);
if (!response.ok) {
console.warn("could not fetch carrot token list");
return;
}
const carrotList = (await response.json()) as TokenListWithBalance;
response = await fetch(
"https://tokens.coingecko.com/uniswap/all.json",
);
if (!response.ok) {
console.warn("could not fetch coingecko token list");
return;
}
const coingeckoList =
(await response.json()) as TokenListWithBalance;
if (!cancelled) {
setLists([carrotList, coingeckoList]);
setList(carrotList);
}
};
void fetchData();
return () => {
cancelled = true;
};
}, []);
const handleConnect = useCallback(() => {
connect({ connector: injectedConnector });
}, [connect]);
const handleClick = useCallback(() => {
setOpen(!open);
}, [open]);
const handleDismiss = useCallback(() => {
setOpen(false);
}, []);
return (
<>
{address
? `Displaying balances for: ${address}`
: "No wallet connected"}
{connectionError && (
Connection error: {connectionError.message}
)}
{!!list && (
)}
>
);
};
export const ERC20TokenPicker: StoryObj = {
render: Component,
};