如何正确导入SafeMath.sol到合约中

问题描述 投票:0回答:9

这是我已经处理了一段时间的问题。我的临时解决方案是在我的 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;

solidity openzeppelin
9个回答
13
投票

我翻遍了

node_modules
寻找包裹
@openzeppelin/contracts
。这是截至发布时当前正确的导入路径:

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

6
投票

Solidity 版本 8 不再需要此功能


1
投票

v 3.0 中的路径不同文档

我用的是这个:

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

而不是这个:

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

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

0
投票

转到 github 页面,获取您想要的 openzeppelin 合约的任何导入(本例中为“SafeMath”),然后复制页面 url。 例如:

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

0
投票

在 pragma Solidity 之后立即导入库。然后在合同开始后立即将其包含在内。

pragma solidity ^x.x.x;

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

contract TheNameOfYourContract {
    using SafeMath for uint;
    .
    .
    ...
}

0
投票

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


0
投票

不再需要,但导入适用于 pragma Solidity ^0.6.0; 将会: 导入“@chainlink/contracts/src/v0.6/vendor/SafeMathChainlink.sol”;


0
投票

我遇到了验证源代码和发布合同的问题: 我只是想知道我是否可以在不创建新合同的情况下修复它? 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” | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^

© www.soinside.com 2019 - 2024. All rights reserved.