调用合约payable mint方法时出现non-payable无法覆盖value错误求助
解决合约mint方法测试报错方案
错误根源
合约代码里的mint明明声明了payable,但测试用的合约实例ABI未正确标记该方法为可接收ETH,导致传入value参数时触发non-payable method cannot override value错误。
修复步骤
重新编译合约
用编译工具重新生成ABI:- Hardhat环境执行:
npx hardhat compile - Truffle环境执行:
truffle compile
确保测试文件导入的是编译后最新的合约ABI,避免引用旧版本。
- Hardhat环境执行:
验证ABI正确性
找到编译生成的ETHDaddy.json文件,检查abi数组内的mint方法定义,必须包含"stateMutability": "payable":{ "inputs": [{"internalType": "uint256", "name": "_id", "type": "uint256"}], "name": "mint", "outputs": [], "stateMutability": "payable", "type": "function" }若缺失该字段,说明编译过程异常,排查合约代码语法错误或编译工具版本兼容性(当前用的是ethers.js contracts/5.7.0,确保编译工具与ethers版本匹配)。
确认合约实例创建逻辑
测试文件中创建合约实例时,必须使用最新ABI:const ETHDaddy = await ethers.getContractFactory("ETHDaddy"); // 部署新合约或连接已部署合约 const ethDaddy = await ETHDaddy.deploy(); await ethDaddy.deployed();
额外排查
- 若连接的是已部署合约,确保传入的ABI是最新编译产物,而非旧备份文件。
AMOUNT需为有效BigNumber(比如ethers.utils.parseEther("0.1")),但从错误信息看该参数格式正常,大概率不是问题。
内容的提问来源于stack exchange,提问作者Subhampreet Mohanty
相关产品推荐
相关产品推荐

