Ошибка импорта 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/...'
, надеюсь, это поможет кому-то.