You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 01:05:21