首页 > 解决方案 > 坚固性 | 在派生合约中正确使用“using a for b”语句

问题描述

我有一份使用 Open-Zeppelin SafeMath 的合同,但派生合同不承认该声明。

Base.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.7.4;

import "@openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol";

contract Base  {
    using SafeMath for uint256;
}

测试.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.7.4;

import "Base.sol";

contract Test is Base {
    function getnum(uint256 _number) external view returns (uint256) {
        return _number.add(_number);
    }
}

但我不断收到此错误:

Member "add" not found or not visible after argument-dependent lookup in uint256.

标签: soliditysmartcontractstruffleopenzeppelin

解决方案


using A for B声明者在solidity 0.7中发生了变化,现在我们必须在所有派生合约中重复声明:

using A for B仅影响提及它的合同。以前,效果是继承的。using现在,您必须在使用该功能的所有派生合约中重复该 ​​语句。

https://solidity.readthedocs.io/en/v0.7.4/070-break-changes.html#functions-and-events


推荐阅读