7

这是我一直在处理的一个问题。我的临时解决方案是在我的 Contracts 目录中创建一个 SafeMath.sol 文件并直接从那里导入它。但是,我一直在寻找一个“更清晰的解决方案”......旧方式似乎是直接从 GitHub 链接导入它,如在一些 repos 和其他类似这样的堆栈溢出帖子中所见

但是,这样做的正确方法似乎是安装相应的 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 supported

也就是说,我怎样才能正确导入 SafeMath?

编辑:我正在使用pragma solidity ^0.6.0;

4

7 回答 7

7

我翻阅node_modules了包裹@openzeppelin/contracts。这是发布时当前正确的导入路径:

import "@openzeppelin/contracts/utils/math/SafeMath.sol";
于 2021-04-18T21:24:44.757 回答
4

Solidity 版本 8 不再需要此功能

于 2021-01-27T22:20:53.277 回答
1

v 3.0文档中的路径不同

我用这个:

import "@openzeppelin/contracts/math/SafeMath.sol";

而不是这个:

import "@openzeppelin/contracts/utils/math/SafeMath.sol";
于 2022-01-10T05:54:44.213 回答
0

转到 github 页面以获取您希望对 openzeppelin-contracts 进行的任何导入,在本例中为“SafeMath”,然后复制页面 url。前任:

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol";
于 2021-09-19T07:47:32.483 回答
0

可以通过以下方式使用:

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;
    }
}
于 2021-07-18T20:52:26.147 回答
0

从(2.8.3)选择高级项目创建一个项目npx hardhat,然后具有如下文件夹结构:

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,它对我有用。

于 2022-01-23T15:58:30.543 回答
0

在 pragma solidity 之后立即导入库。然后在您的合同开始后立即包含它。

pragma solidity ^x.x.x;

import "openzeppelin-solidity/contracts/utils/math/SafeMath.sol";

contract TheNameOfYourContract {
    using SafeMath for uint;
    .
    .
    ...
}
于 2021-12-05T10:40:58.740 回答