3

我正在尝试使用一些 @openzeppelin/contracts 导入来部署合同。

合同:

pragma solidity ^0.8.0;
import "../node_modules/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "../node_modules/@openzeppelin/contracts/utils/Counters.sol";
import "../node_modules/@openzeppelin/contracts/access/Ownable.sol";

contract EthOrb is ERC721URIStorage, Ownable {
//code
}

包.json:

{
  "name": "eth-orb-contracts",
  "version": "1.0.0",
  "description": "smart contracts for dapps",
  "main": "hardhat.config.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "hardhat": "^2.2.0"
  },
  "dependencies": {
    "@openzeppelin/contracts": "^4.0.0"
  }
}

@openzeppelin/contracts 在我的 node_modules 中,我运行了一个 npm 我再次安装。

预期结果:成功导入deps。

实际结果:终端中的错误消息:

Compiling 14 files with 0.8.0
ParserError: Source "node_modules/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol" not found: File outside of allowed directories.
 --> contracts/EthOrb.sol:5:1:
  |
5 | import "../node_modules/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


ParserError: Source "node_modules/@openzeppelin/contracts/utils/Counters.sol" not found: File outside of allowed directories.
 --> contracts/EthOrb.sol:6:1:
  |
6 | import "../node_modules/@openzeppelin/contracts/utils/Counters.sol";
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


ParserError: Source "node_modules/@openzeppelin/contracts/access/Ownable.sol" not found: File outside of allowed directories.
 --> contracts/EthOrb.sol:7:1:
  |
7 | import "../node_modules/@openzeppelin/contracts/access/Ownable.sol";
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


Error HH600: Compilation failed

编辑:删除 '../node_modules' 也不能解决这个问题。

这会产生 lint 错误:

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

错误是:

Compiling 14 files with 0.8.0
ParserError: Source "node_modules/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol" not found: File outside of allowed directories.
 --> contracts/EthOrb.sol:5:1:
  |
5 | import "../node_modules/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


ParserError: Source "node_modules/@openzeppelin/contracts/utils/Counters.sol" not found: File outside of allowed directories.
 --> contracts/EthOrb.sol:6:1:
  |
6 | import "../node_modules/@openzeppelin/contracts/utils/Counters.sol";
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


ParserError: Source "node_modules/@openzeppelin/contracts/access/Ownable.sol" not found: File outside of allowed directories.
 --> contracts/EthOrb.sol:7:1:
  |
7 | import "../node_modules/@openzeppelin/contracts/access/Ownable.sol";
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


Error HH600: Compilation failed
4

2 回答 2

2

我刚刚遇到了这个问题,并通过将整个“@openzeppelin/contracts”移动到合同编写的根目录来解决它。

示例:我有一个 Contracts 文件夹,其中有 @openzeppelin 文件夹和 MyContract.sol 文件。然后我只是像这样导入合同:

导入“./@openzeppelin/contracts/token/ERC20/ERC20.sol”;

于 2021-04-29T20:02:36.297 回答
0

根据我上面的评论:我发现了一个更好的修复方法,您可以在 root 所在的根目录中创建一个符号链接:

root
   contracts
   tests
   artifacts 
   ...
   ln -s node_modules/@openzeppelin

如果你在那里创建一个符号链接 openzeppelin 将得到更新,你现在可以访问而不将它作为一个相对目录,我更喜欢。所以你现在可以去import '@openzeppelin/...',希望这对某人有帮助。

于 2022-02-20T12:25:12.703 回答