调用ERC20合约查询地址余额返回无效值报错的排查咨询
ERC20余额查询报错排查与修复方案
问题原因定位
你遇到的报错不是仅由ABI错误导致,核心触发点包括:
- 代码逻辑错误:你通过
new web3.eth.Contract(abi, tokenAddress)实例化的合约对象名称是weenusContract,但调用balanceOf方法时用的是未定义的contract对象,这是最直接的报错原因。 - ABI匹配问题:如果使用的ABI存在函数签名不匹配、字段缺失的情况,也会触发该类返回值校验错误。
- 节点与链参数错误:需确认Infura节点为以太坊主网节点、目标合约地址
0x101848D5C5bBca18E6b4431eEdF6B95E9ADF82FA确实部署在以太坊主网,且节点同步状态正常。
ABI替换优化方案
不需要使用完整的合约ABI,仅用标准ERC20最小ABI即可完成余额查询,可完全避免自定义ABI的适配问题,标准balanceOf方法ABI如下:
[ { "constant": true, "inputs": [{"name": "_owner", "type": "address"}], "name": "balanceOf", "outputs": [{"name": "balance", "type": "uint256"}], "payable": false, "stateMutability": "view", "type": "function" } ]
如果需要调用更多ERC20标准方法,可直接使用通用ERC20 ABI,无需依赖第三方提供的自定义ABI。
修正后代码示例
const tokenAddress = "0x101848D5C5bBca18E6b4431eEdF6B95E9ADF82FA"; // 标准ERC20 balanceOf ABI const erc20Abi = [ { "constant": true, "inputs": [{"name": "_owner", "type": "address"}], "name": "balanceOf", "outputs": [{"name": "balance", "type": "uint256"}], "payable": false, "stateMutability": "view", "type": "function" } ]; const web3Context = useWeb3(`wss://mainnet.infura.io/ws/v3/${infuraProjectId}`); const { networkId, networkName, accounts, providerName, lib } = web3Context; const web3 = new Web3(`wss://mainnet.infura.io/ws/v3/${infuraProjectId}`) const weenusContract = new web3.eth.Contract(erc20Abi, tokenAddress); const getTokenBalance = useCallback(async () => { let tokenBalance = 'unknown'; if(accounts && accounts.length > 0) { try { // 修正合约对象调用名称 tokenBalance = await weenusContract.methods.balanceOf(accounts[0]).call(); } catch (e) { console.error("余额查询失败:", e); } } setTokenBalance(tokenBalance); }, [accounts, weenusContract]) useEffect(()=>{ getTokenBalance(); }, [accounts, getTokenBalance])
内容的提问来源于stack exchange,提问作者user13474075
相关产品推荐
相关产品推荐

