Ошибка импорта openzeppelin в жестких контрактах

Я пытаюсь развернуть контракт с некоторым импортом @openzeppelin / контрактов.

Контракт:

      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
}

Package.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 / находятся в моих node_modules, и я запустил npm I для повторной установки.

ожидаемый результат: импорт успешно упал.

фактический результат: сообщение об ошибке в терминале:

      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 ответа

У меня была эта проблема, и я решил ее, переместив весь «@ openzeppelin / контракты» в корень, где написан контракт.

Пример: у меня есть папка Contracts, а внутри нее - папка @openzeppelin и файл MyContract.sol. Затем я просто импортировал такой контракт:

import "./@openzeppelin/contracts/token/ERC20/ERC20.sol";

Существует небольшая разница между импортом кода в Solidity и коде Hardhat.

Код прочности

      import "@openzeppelin/contracts/ownership/Ownable.sol";

код каски

      import "@openzeppelin/contracts/access/Ownable.sol";

Измените путь в соответствии с вашими требованиями. Вы можете увидеть путь к контрактам в artificats/openzepeppelin/contracts. Поэтому импортируйте соответственно.

откройте каталог node_modules в папке вашего проекта и найдите «@openzepplin» под ним, найдите «контракты», если они не найдены, запустите эту команду

npm установить @openzeppelin/contracts

тогда вы увидите, что он решен и не показывает ошибку.

Следуя моему комментарию выше: я нашел немного лучшее исправление, вы можете создать символическую ссылку в своем корневом каталоге, где находится root:

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

если вы создадите там символическую ссылку, openzeppelin будет обновлен, и теперь вы можете получить доступ, не добавляя его в качестве относительного каталога, что мне нравится больше. Итак, теперь вы можете пойти с import '@openzeppelin/...', надеюсь, это поможет кому-то.

Другие вопросы по тегам