这是我已经处理了一段时间的问题。我的临时解决方案是在我的 Contracts 目录中创建一个 SafeMath.sol 文件并直接从那里导入它。然而,我一直在寻找一个“更清晰的解决方案”......旧的方式似乎是直接从 GitHub 链接导入它,如一些存储库和其他堆栈溢出帖子(如 such
)中所示但是,正确的方法似乎是安装相应的 oz 包(@openzeppelin/contracts-ethereum-package)并将文件直接导入到所需的合约中,即
import "@openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol";
但是,使用 VSCode,我仍然收到错误 Source "@openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol" not found: File import callback not support
也就是说,如何正确导入 SafeMath?
编辑:我正在使用
pragma solidity ^0.6.0;
我翻遍了
node_modules
寻找包裹@openzeppelin/contracts
。这是截至发布时当前正确的导入路径:
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
Solidity 版本 8 不再需要此功能
v 3.0 中的路径不同文档
我用的是这个:
import "@openzeppelin/contracts/math/SafeMath.sol";
而不是这个:
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
可按以下方式使用:
pragma solidity ^0.5.0;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.3.0/contracts/math/SafeMath.sol";
contract contractForSafeMath {
using SafeMath for uint;
uint256 addResult;
uint256 subResult;
uint256 mulResult;
uint256 divResult;
uint256 modResult;
uint public MAX_VALUE = 2**256 -1;
//overflow
uint256 overflowResult;
function getResults(uint256 a, uint256 b) public{
addResult = SafeMath.add(a,b);
subResult = SafeMath.sub(a,b);
mulResult = SafeMath.mul(a,b);
divResult = SafeMath.div(a,b);
modResult = SafeMath.mod(a,b);
overflowResult = SafeMath.add(SafeMath.add ( (a**b), SafeMath.mul (SafeMath.mul (b, a), b)), (b** b));
}
function addResultVal(uint a, uint b) public view returns(uint256){
return addResult;
}
function subResultVal() public view returns(uint256){
return subResult;
}
function mulResultVal() public view returns(uint256){
return mulResult;
}
function divResultVal() public view returns(uint256){
return divResult;
}
function modResultVal() public view returns(uint256){
return modResult;
}
function overflowResultVal() public view returns(uint256){
return overflowResult;
}
}
转到 github 页面,获取您想要的 openzeppelin 合约的任何导入(本例中为“SafeMath”),然后复制页面 url。 例如:
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol";
在 pragma Solidity 之后立即导入库。然后在合同开始后立即将其包含在内。
pragma solidity ^x.x.x;
import "openzeppelin-solidity/contracts/utils/math/SafeMath.sol";
contract TheNameOfYourContract {
using SafeMath for uint;
.
.
...
}
从
npx hardhat
(2.8.3) 创建项目,选择高级项目,然后具有如下所示的文件夹结构:
project
|--contracts
|--mycontract.sol
|--node_modules
|--{other files & folders}
如果我在 mycontract.sol 中导入这样的库,错误就会消失:
pragma solidity ^0.8.4;
import "../node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "../node_modules/@openzeppelin/contracts/utils/math/SafeMath.sol";
import "../node_modules/@openzeppelin/contracts/access/Ownable.sol";
... other code
但这至少不能通过安全帽编译。因此看来 Solhint (.solhint.json) 需要准确地知道导入路径,但它默认忽略 (.solhintignore) node_modules 文件夹。通过从 .solhintignore 中删除 node_modules 并重新启动 VS Code,它对我有用。
不再需要,但导入适用于 pragma Solidity ^0.6.0; 将会: 导入“@chainlink/contracts/src/v0.6/vendor/SafeMathChainlink.sol”;
我遇到了验证源代码和发布合同的问题: 我只是想知道我是否可以在不创建新合同的情况下修复它? ParserError:找不到源“@openzeppelin/contracts/utils/math/SafeMath.sol”:不支持文件导入回调 --> TechGig (1).sol:6:1: | 6 |导入“@openzeppelin/contracts/utils/math/SafeMath.sol” | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^
ParserError:找不到源“@openzeppelin/contracts/utils/math/SafeMath.sol”:不支持文件导入回调 --> TechGig.sol:6:1: | 6 |导入“@openzeppelin/contracts/utils/math/SafeMath.sol” | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^