Невозможно импортировать 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";
Другие вопросы по тегам