使用Wagmi调用合约遇类型错误及CALL_EXCEPTION问题求助
解决方案
1. 优先修复链不匹配问题
你提到App.tsx里没配置Polygon Mumbai测试链,这是触发call revert exception的核心原因——Wagmi默认连接的链和合约部署链不一致,合约调用必然失败。
- 给Wagmi配置添加Mumbai链:
导入mumbai链配置后,在createConfig的chains数组中加入该链,示例代码:import { mumbai } from '@wagmi/chains'; import { createConfig, configureChains } from '@wagmi/core'; import { publicProvider } from '@wagmi/core/providers/public'; const { chains, publicClient, webSocketPublicClient } = configureChains( [mumbai], [publicProvider()], ); const config = createConfig({ autoConnect: true, publicClient, webSocketPublicClient, }); - 同时确保钱包已切换到Polygon Mumbai测试链,钱包链与配置链不匹配也会导致调用失败。
2. 参数类型问题的正确处理
IDE提示Type 'number' is not assignable to type 'BigNumber',是因为Solidity合约中uint类型参数对应Ethers/Wagmi里的BigNumber类型,直接传number会类型不兼容。
- 用Ethers.js的
BigNumber.from()转换参数是正确的,调用合约时明确指定链ID避免歧义:import { BigNumber } from 'ethers'; import { useReadContract } from 'wagmi'; const { data: isClaimedResult } = useReadContract({ address: '你的合约地址', abi: ['function isClaimed(uint256 tokenId) view returns (bool)'], functionName: 'isClaimed', args: [BigNumber.from(1)], chainId: mumbai.id, // 强制指定Mumbai链ID });
3. 额外排查项
如果上述操作后仍触发revert,检查以下内容:
- 确认合约地址是Polygon Mumbai链上的正确部署地址,不要混淆主网或其他测试链地址。
- 去PolygonScan Mumbai区块浏览器直接调用合约的
isClaimed函数,验证合约本身是否存在问题。 - 核对Wagmi版本,若使用v2版本,确保
useReadContract的参数格式符合当前版本要求。
内容的提问来源于stack exchange,提问作者MrOwl
相关产品推荐
相关产品推荐

