【问题标题】:How to correctly import SafeMath.sol into contract如何正确将 SafeMath.sol 导入合约
【发布时间】:2020-06-19 12:40:29
【问题描述】:

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

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

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

【问题讨论】:

  • 我通过 npm 安装 lib @openzeppelin/contracts 并通过 import "@openzeppelin/contracts/math/SafeMath.sol"; 将 lib 导入我的合同
  • 实施没问题。我认为您这里有不同的问题,请检查其他 node_modules 是否被 VSCode 识别并首先调试该问题。
  • 在最近的 Solidity 更新中,整数类型变量不能再溢出了。阅读有关以下内容的更多信息:docs.soliditylang.org/en/v0.8.3/080-breaking-changes.html
  • solc-js 是愚蠢的,因为我一直在试图找出一种方法来提供该死的路径 2 小时

标签: solidity openzeppelin


【解决方案1】:

Solidity 版本 8 不再需要此功能

【讨论】:

  • 你能详细说明一下吗?我仍然遇到这个问题。我什至试图将文件放在同一目录中,但仍然出现错误。如果有人知道的话,真正的原因是什么?
【解决方案2】:

我查看了 node_modules 的包裹 @openzeppelin/contracts。以下是发布时当前正确的导入路径:

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

【讨论】:

    【解决方案3】:

    可以通过以下方式使用:

    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;
        }
    }
    

    【讨论】:

    • 您好,欢迎来到 stackoverflow,这里有一个改进帖子的建议:您可以添加语言标识符以突出显示代码并使其更具可读性。
    【解决方案4】:

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

    import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol";
    

    【讨论】:

      【解决方案5】:

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

      pragma solidity ^x.x.x;
      
      import "openzeppelin-solidity/contracts/utils/math/SafeMath.sol";
      
      contract TheNameOfYourContract {
          using SafeMath for uint;
          .
          .
          ...
      }
      

      【讨论】:

        猜你喜欢
        • 2015-01-13
        • 2016-03-19
        • 2017-03-23
        • 2017-07-25
        • 2018-12-05
        • 2019-11-15
        • 1970-01-01
        • 1970-01-01
        • 2018-10-29
        相关资源
        最近更新 更多