ethers.js读取币安测试网合约报invalid fragment object错误如何解决
报错原因与修复方案
该错误属于ethers v5版本ABI解析阶段的参数校验错误,核心是你传入的ABI片段不符合ethers的解析规范,即使你确认使用的是子合约ABI,问题也出在ABI的导出、传递环节,常见原因和修复方案如下:
触发原因
- ABI格式错误:从Remix、Hardhat等工具复制ABI时混入了注释、多余字符,或者只复制了部分片段,导致JSON格式不合法;如果从编译产物json导入,错误传入了整个json对象,而非json内的
abi字段 - ABI混入不兼容片段:子合约的ABI中包含ethers v5.0.13不支持的语法,比如Solidity自定义错误、较新版本的自定义类型导出的ABI片段,旧版本ethers无法识别
- 合约初始化参数顺序错误:初始化
ethers.Contract实例时,把地址、ABI、provider的顺序传反
修复步骤
- 先校验你使用的ABI格式:确认是合法的JSON数组,每个元素都包含完整的
type、inputs、name等标准ABI字段,没有多余符号,无截断 - 确认合约初始化代码符合规范,参考写法:
// 币安测试网RPC初始化 const provider = new ethers.providers.JsonRpcProvider("https://data-seed-prebsc-1-s1.binance.org:8545/"); // 子合约参数 const SUB_CONTRACT_ADDRESS = "0x你的子合约实际部署地址"; const SUB_CONTRACT_ABI = [/* 仅传入子合约ABI数组,不要包裹多余外层 */]; // 初始化合约实例 const subContract = new ethers.Contract(SUB_CONTRACT_ADDRESS, SUB_CONTRACT_ABI, provider);
- 若子合约包含Solidity自定义错误,要么删除ABI中对应
type: "error"的片段,要么将ethers升级到v5.7.2版本,该版本对自定义错误的适配更完善 - 校验子合约地址合法性,确认是币安测试网上已部署的有效地址,无字符遗漏或多输
内容的提问来源于stack exchange,提问作者Deepak Raj
相关产品推荐
相关产品推荐

