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

使用@openzeppelin/contracts时遇MODULE_NOT_FOUND错误求助

问题排查与解决方案

核心错误原因

@openzeppelin/contracts 是Solidity合约源码库,仅用于编写和编译智能合约,不能直接在Node.js代码中通过require导入——它并非JavaScript模块,因此会触发MODULE_NOT_FOUND错误。你试图获取的ERC721.abi无法通过这种方式获取。

修复步骤

1. 正确获取ERC721合约ABI

你需要通过以下方式之一获取目标合约的ABI:

  • 若你自行部署了ERC721合约:在编译合约时(如使用Hardhat/Truffle),会生成包含ABI的JSON文件,直接导入该文件即可。
  • 使用标准ERC721的ABI:可以直接复制OpenZeppelin官方定义的ERC721合约ABI,或从区块链浏览器(如Etherscan)上已验证的合约页面复制ABI。

2. 修正代码中的其他问题

除ABI获取错误外,你的代码还有两处问题:

  • NodeHttpProvider在ethers v5及以上版本已被弃用,需改用JsonRpcProvider。
  • 标准ERC721合约没有mint(address, tokenId, tokenURI)这样的函数签名,需根据你实际部署的合约函数签名调整(比如常见的safeMint或自定义的mint方法)。

修正后的代码示例

假设你已获取到目标合约的ABI,代码调整如下:

const { ethers } = require("ethers");

// 替换为你实际的合约ABI,可从编译文件导入或直接定义
const ERC721_ABI = [
  // 示例:包含mint函数的ABI片段,需替换为你合约的实际ABI
  "function mint(address to, uint256 tokenId, string calldata tokenURI) external",
  // 其他必要的合约方法ABI...
];

// 初始化Provider和Signer
const provider = new ethers.providers.JsonRpcProvider("https://goerli.infura.io/v3/你的API密钥");
const signer = new ethers.Wallet("你的私钥", provider);

// 初始化合约实例
const contractAddress = "你的合约地址";
const erc721Contract = new ethers.Contract(contractAddress, ERC721_ABI, signer);

// 铸造代币
const tokenId = 1;
const tokenURI = "https://ipfs.io/ipfs/QmR34NuvQUrFVyq4uLtb4uvN2HnsNjUetmv6JYraHFsFxU?filename=nft.json";
erc721Contract.mint(signer.address, tokenId, tokenURI)
  .then((tx) => {
    console.log(`交易已提交,哈希:${tx.hash}`);
    return tx.wait(); // 等待交易确认
  })
  .then((receipt) => {
    console.log(`代币铸造完成,区块高度:${receipt.blockNumber}`);
  })
  .catch((err) => {
    console.error("铸造失败:", err);
  });

额外排查点

  • 确保你是在项目根目录(test.js所在的evaluation文件夹)执行的npm install @openzeppelin/contracts,检查该目录下是否存在node_modules文件夹。
  • 若使用Hardhat/Truffle等开发框架,建议直接通过框架的编译产物导入ABI,避免手动复制出错。

内容的提问来源于stack exchange,提问作者SaMLi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:30:30