前端调用智能合约报错non-payable method cannot override value
报错根因
该报错是ethers.js的本地校验拦截导致,和链上合约逻辑、传入的ETH金额计算无关:
- ethers.js判断合约方法是否支持转ETH,完全依赖初始化合约实例时传入的ABI定义,不会主动查询链上合约的实际方法修饰符
- 报错信息
non-payable method cannot override value的含义是:你当前传入的NFT.abi中,mintTo方法被标记为非payable类型,因此ethers直接拦截了带value参数的调用,不会将交易广播到链上 - 你代码里
value: ethers.utils.parseEther("0.00420")的写法是正确的,报错里打印的BigNumber值和该金额完全匹配,不存在参数格式错误
修复方案
- 修正ABI定义
打开项目中导入的NFT.abi文件,找到mintTo方法对应的条目,将stateMutability字段的值改为payable,正确的方法定义示例如下:{ "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" } ], "name": "mintTo", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "payable", "type": "function" } - 校验ABI完整性
建议直接从对应版本的合约编译产物中复制完整ABI,不要手动删减、拼接ABI内容,避免其他方法也出现类似的属性标记错误。 - 重启前端服务,重新触发铸造逻辑即可,你现有的合约调用、传参代码不需要额外修改。
内容的提问来源于stack exchange,提问作者AlienDecoy
相关产品推荐
相关产品推荐

