Hardhat测试NftyplayLicense合约buyLicense函数报错求助
问题排查:buyLicense函数触发「invalid address or ENS name」错误
错误本质
这个报错的核心是某个需要传入合约的地址参数值为undefined——Ethers.js(Hardhat默认依赖的以太坊交互库)会严格校验地址格式,一旦参数是undefined就会抛出该异常。结合你用MetaMask生成订单和签名的场景,问题基本出在参数传递环节的地址字段缺失或赋值错误。
具体排查步骤
1. 校验订单对象的地址字段完整性
先确认MetaMask生成的订单里,所有地址相关字段(比如buyer、seller、targetContract等)是否都被正确捕获、存储并传入函数。可以在调用buyLicense前加日志打印所有参数:
console.log("传入buyLicense的参数:", order, signature);
重点检查日志里的地址字段:是否是0x开头的42位合法字符串,有没有出现undefined的情况。如果是序列化/反序列化订单时丢了字段,要修复存储逻辑。
2. 核对合约函数参数顺序与传入顺序
打开NftyplayLicense合约的buyLicense函数定义,确认参数顺序和你传入的参数顺序完全匹配。比如:
如果合约函数是:
function buyLicense(address buyer, Order calldata order, bytes calldata signature) external payable { // 合约逻辑 }
但你调用时只传了order和signature,就会导致第一个参数buyer为undefined,触发报错。必须保证传入参数的数量、顺序和合约定义一致。
3. 检查MetaMask签名的地址上下文
- 确认MetaMask当前连接的账户地址正确,签名操作是从预期账户发起的;
- 保证MetaMask连接的是Hardhat本地开发链(网络ID默认是31337),链上账户地址和你测试用的地址一致,避免跨链地址不兼容的问题。
4. 排查参数类型兼容性
- 前端调用时,直接传入MetaMask返回的字符串地址即可,不要做不必要的类型转换(比如转成数字);
- Hardhat测试脚本里,确保用
ethers.getSigner()获取的签名者地址是有效对象,不是undefined。
快速验证方法
在Hardhat控制台手动调用buyLicense,传入硬编码的合法地址和签名:
const licenseContract = await ethers.getContract("NftyplayLicense"); const testOrder = { buyer: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", // Hardhat默认测试账户地址 price: ethers.utils.parseEther("0.1"), // 补全其他订单字段 }; const testSignature = "0x..."; // 用有效签名 await licenseContract.buyLicense(testOrder, testSignature);
如果能成功执行,说明合约本身没问题,问题出在你的参数生成或传递逻辑上。
内容的提问来源于stack exchange,提问作者Bhavesh Joshi
相关产品推荐
相关产品推荐

