使用Hardhat测试Solidity Payable函数时参数报错问题排查
问题分析与修复方案
错误原因
你的Solidity合约safeMint函数仅定义了两个参数(address to和uint256 tokenId),但测试代码中直接将ETH金额作为第三个位置参数传入。在ethers.js中,调用payable合约函数时,发送ETH必须通过覆盖参数(overrides)对象传递(而非普通位置参数)。你传入的cost是BigNumber类型,而ethers.js期望第三个参数是包含value字段的对象,这就导致了类型不匹配的错误。
修复后的测试代码
describe("mint", () => { it("should succeed when sending correct ETH amount", async function () { await contract.deployed(); const cost = ethers.utils.parseEther("0.1"); // 通过overrides对象的value字段传递ETH金额 await contract.safeMint("0x65.....", 1, { value: cost }); }); });
额外注意事项
- 确保合约内的
mintPrice变量值与测试中传入的0.1 ETH一致(即ethers.utils.parseEther("0.1")对应的数值),否则require(msg.value >= mintPrice)会触发错误。 - 原测试代码存在语法错误:
await contract.safeMint(...)缺少闭合括号,修复时需补上。
内容的提问来源于stack exchange,提问作者Maliha
相关产品推荐
相关产品推荐

