Невозможно импортировать openzeppelin node_modules: обратный вызов импорта файла не поддерживается
Всякий раз, когда я пытаюсь скомпилировать свой твердый контракт, ошибка
ParserError: Source \"@OpenZeppelin/contracts/math/SafeMath.sol\" not found: File import callback not supported
бросается.
pragma solidity ^0.7.0;
import "@OpenZeppelin/contracts/token/ERC20/ERC20.sol";
import "@OpenZeppelin/contracts/math/SafeMath.sol";
Есть идеи, что может быть причиной этого?
9 ответов
Убедитесь, что вы открыли VS Code в корневом каталоге проекта.
В моем случае именно так выглядел мой каталог VS Code, когда я получаю ту же ошибку.
projects
|___MyContract
|__contracts
|__Contract.sol
Повторное открытие кода VS в
MyContract
каталог исправляет это.
MyContract
|__contracts
|__Contract.sol
У меня сейчас такая же проблема. Я использую трюфель + узел, и я исправил его, изменив путь импорта на относительный путь, например,
pragma solidity ^0.7.0;
import "../node_modules/OpenZeppelin/contracts/token/ERC20/ERC20.sol";
import "../node_modules/OpenZeppelin/contracts/math/SafeMath.sol";
Я не уверен на 100%, почему это произошло, но надеюсь, что помог вам.
После установки OpenZeppelin закройте IDE и снова откройте ее.
Для некоторых сред SafeMath имеет другой путь
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
что сработало для меня;(Я использую код Windows10 и Visual Studio) - щелкните значок расширения - найдите расширение Solidity - выберите кнопку удаления и щелкните стрелку раскрывающегося списка - выберите установить другую версию - выберите версию 0.0.135 - После установки нажмите «Требуется перезагрузка»
Убедитесь, что вы установили openzeppelin
npm install --save @openzeppelin/contracts@v3.0.0
Это сработало для меня -
Измените настройки расширения Solidity в VSCode.
Настройки по умолчанию включают: "solidity.packageDefaultDependenciesContractsDirectory": "contracts" Пользователям необходимо изменить настройку с Contracts на пустую строку. "solidity.packageDefaultDependenciesContractsDirectory": ""
Источник - https://github.com/juanfranblanco/vscode-solidity/issues/178
на самом деле проблема в том, что компилятор Solidity глуп и не следует автоматически по пути, вам нужно указать все разрешенные пути вручную (https://docs.soliditylang.org/en/latest/using-the-compiler.html), каждый каждый один из них и полностью в файл (не может указать папку более высокого уровня) используйте компиляцию npx hardat, если можете, это лучше
Попробуй это:
import "{Project Name}/node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol";