React中使用useDapp的useContractCall报Invalid contract call如何解决
问题原因及修复方案
1. 第一个报错TypeError: ethers__WEBPACK_IMPORTED_MODULE_0__.ethers.utils.Interface is not a constructor的解决
这个是ethers版本不兼容导致的语法差异:
- 如果你用的是ethers v5版本,Interface的正确引用路径是
ethers.utils.Interface - 如果你用的是ethers v6版本,才是直接用
ethers.Interface
你可以先检查项目里安装的ethers版本,对应修改即可。
2. 第二个Invalid contract call警告的解决
这个报错是合约调用参数不合法导致的,检查以下几个点:
- ABI定义不完整:你原来的human-readable ABI只写了方法名,没有标注方法类型和返回值,paused是view方法,返回bool类型,必须补充完整才能正确解析返回值
- 合约地址校验:确认你导入的
contractAddress是Rinkeby测试网上部署的正确合约地址,地址格式要符合0x开头的42位十六进制字符串,没有多余空格或特殊字符 - useDapp基础配置校验:
- 确保你的React应用根组件外层已经包裹了
DAppProvider,并且配置中包含了Rinkeby链 - 确保你当前连接的钱包网络切换到了Rinkeby测试网,和合约部署链一致
- 确保你的React应用根组件外层已经包裹了
- 如果你替换为
const iface = new ethers.Interface(abi);写法,要确认你导入的abi变量是完整的合约ABI数组,格式没有错误
修复后的完整示例代码
import { ethers } from "ethers"; import { useContractCall } from "@usedapp/core"; import { contractAddress } from '../../index.js' // 补全ABI的方法属性和返回值定义,v6版本去掉.utils即可 const iface = new ethers.utils.Interface([ "function paused() view returns (bool)" ]); export function usePaused() { const [paused] = useContractCall({ abi: iface, address: contractAddress, method: 'paused', args: [], }) ?? []; return paused; }
额外提示:Rinkeby测试网已经在2022年正式弃用,如果条件允许建议迁移到Sepolia等仍在维护的以太坊测试网。
内容的提问来源于stack exchange,提问作者user1725346
相关产品推荐
相关产品推荐

