diff --git a/packages/web3-shared/evm/contracts/useERC1155TokenContract.ts b/packages/web3-shared/evm/contracts/useERC1155TokenContract.ts index a4b9512b8507..24a16d9404c5 100644 --- a/packages/web3-shared/evm/contracts/useERC1155TokenContract.ts +++ b/packages/web3-shared/evm/contracts/useERC1155TokenContract.ts @@ -1,7 +1,8 @@ import ERC1155 from '@masknet/web3-contracts/abis/ERC1155.json' import type { AbiItem } from 'web3-utils' import { useContract } from '../hooks' +import type { ChainId } from '../types' -export function useERC1155TokenContract(address: string) { - return useContract(address, ERC1155 as AbiItem[]) +export function useERC1155TokenContract(address: string, chainId?: ChainId) { + return useContract(address, ERC1155 as AbiItem[], chainId) } diff --git a/packages/web3-shared/evm/hooks/useERC20TokenDetailed.ts b/packages/web3-shared/evm/hooks/useERC20TokenDetailed.ts index 257a26986673..5577105a6757 100644 --- a/packages/web3-shared/evm/hooks/useERC20TokenDetailed.ts +++ b/packages/web3-shared/evm/hooks/useERC20TokenDetailed.ts @@ -8,17 +8,19 @@ import type { ERC20Bytes32 } from '@masknet/web3-contracts/types/ERC20Bytes32' import { useERC20TokenContract, useERC20TokenContracts } from '../contracts/useERC20TokenContract' import { useERC20TokenBytes32Contract, useERC20TokenBytes32Contracts } from '../contracts/useERC20TokenBytes32Contract' import { parseStringOrBytes32, createERC20Token, createNativeToken } from '../utils' +import { useEthereumTokenType } from './useEthereumTokenType' export function useERC20TokenDetailed(address?: string, token?: Partial, targetChainId?: ChainId) { const currentChainId = useChainId() const chainId = targetChainId ?? currentChainId const erc20TokenContract = useERC20TokenContract(address, chainId) const erc20TokenBytes32Contract = useERC20TokenBytes32Contract(address, chainId) + const tokenType = useEthereumTokenType(address, chainId) return useAsyncRetry(async () => { if (!address) return if (!EthereumAddress.isValid(address)) return - + if (tokenType !== EthereumTokenType.ERC20) return return getERC20TokenDetailed(address, chainId, erc20TokenContract, erc20TokenBytes32Contract, token) }, [chainId, token, erc20TokenContract, erc20TokenBytes32Contract, address]) } diff --git a/packages/web3-shared/evm/hooks/useEthereumTokenType.ts b/packages/web3-shared/evm/hooks/useEthereumTokenType.ts index 7a7715bb54cf..ce7b623593bf 100644 --- a/packages/web3-shared/evm/hooks/useEthereumTokenType.ts +++ b/packages/web3-shared/evm/hooks/useEthereumTokenType.ts @@ -3,33 +3,33 @@ import { useERC1155TokenContract, useERC721TokenContract } from '../contracts' import { useWeb3 } from './useWeb3' import { useERC165 } from '.' -import { EthereumTokenType } from '../types' +import { ChainId, EthereumTokenType } from '../types' const ERC721_ENUMERABLE_INTERFACE_ID = '0x780e9d63' const ERC1155_ENUMERABLE_INTERFACE_ID = '0xd9b67a26' -function useCheckContract(address: string) { - const web3 = useWeb3() +function useCheckContract(address: string, chainId?: ChainId) { + const web3 = useWeb3({ chainId }) return useAsyncRetry(async () => { const result = await web3.eth.getCode(address) return result !== '0x' }, [address, web3]) } -function useCheckERC721(address: string) { - const erc721Contract = useERC721TokenContract(address) +function useCheckERC721(address: string, chainId?: ChainId) { + const erc721Contract = useERC721TokenContract(address, chainId) return useERC165(erc721Contract, address, ERC721_ENUMERABLE_INTERFACE_ID) } -function useCheckERC1155(address: string) { - const erc1155Contract = useERC1155TokenContract(address) +function useCheckERC1155(address: string, chainId?: ChainId) { + const erc1155Contract = useERC1155TokenContract(address, chainId) return useERC165(erc1155Contract, address, ERC1155_ENUMERABLE_INTERFACE_ID) } -export function useEthereumTokenType(address = ''): EthereumTokenType | undefined { - const { value: isContract, loading: loadingContract } = useCheckContract(address) - const { value: isERC721, loading: loadingERC721 } = useCheckERC721(address) - const { value: isERC1155, loading: loadingERC1155 } = useCheckERC1155(address) +export function useEthereumTokenType(address = '', chainId?: ChainId): EthereumTokenType | undefined { + const { value: isContract, loading: loadingContract } = useCheckContract(address, chainId) + const { value: isERC721, loading: loadingERC721 } = useCheckERC721(address, chainId) + const { value: isERC1155, loading: loadingERC1155 } = useCheckERC1155(address, chainId) if (loadingERC1155 || loadingERC721 || loadingContract) return return isERC1155