1

我正在研究荷兰式拍卖风格的 ICO 合同,我目前正在尝试迁移我的 ERC20 合同的早期阶段以测试基本功能(它是否具有正确的名称、符号和小数点)。合同可以编译,但我无法迁移它,因为它是一个“抽象合同”。我的代币合约继承自 ERC20Detailed,即 Open Zeppelin 合约,后者又继承自 IERC20 接口合约。我能做些什么来解决这个问题?我尝试让我的 Token 合约也从 ERC20 继承基础合约,但它说标识符已经声明。我看到了来自 Truffle 终端输出的可能响应,但我很好奇为什么我的实现不起作用,并且希望在理解 Solidity 接口和抽象合约方面获得更多帮助。

我能做些什么来解决这个问题?我尝试让我的 Token 合约也从 ERC20 继承基础合约,但它说标识符已经声明。

pragma solidity ^0.5.8;

import "node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";


contract Token is ERC20Detailed{
    constructor(string memory _name, string memory _symbol, uint8 _decimals)
        ERC20Detailed(_name, _symbol, _decimals)
        public
        {

        }


}

Bash 终端的输出

“Token”是抽象合约或接口,无法部署。* 将抽象导入到使用它们的“.sol”文件中,而不是单独部署它们。* 继承抽象的合约必须准确地实现它的所有方法签名。* 仅实现部分继承抽象的合约也被认为是抽象的。

4

1 回答 1

5

如果您仔细查看ERC20 详细合同,您会注意到ERC20Detailed is IERC20。用简单的英语,它说“这个 ERC20Detailed 继承了 IERC20 的所有功能”

现在,看看IERC20 合约;您会注意到那里的所有功能都以没有逻辑的方式终止。这就是我们所说的 Solidity 中的抽象合约

您的前端合约 (Token) 想要使用以下所有功能:

  • ERC20Detailed - 在其文件中包含所有实现
  • IERC20(通过 ERC20Detailed) - 文件中没有实现

这就是你得到This contract does not implement all functions and thus cannot be created错误的原因。

要解决此问题,请尝试以下方法:

pragma solidity ^0.5.8;

import "path-to/ERC20/ERC20.sol";
import "path-to/ERC20/ERC20Detailed.sol";

contract Token is ERC20, ERC20Detailed {
   constructor(string memory name, string memory symbol, uint8 decimals) 
    ERC20Detailed(name,symbol,decimals) 
    public {
        // TODO    
    }
}

ERC20 合约具有 IERC20 合约的所有实现。您可以先在Remix中尝试以下代码

pragma solidity ^0.5.8;

import "github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";

contract Token is ERC20, ERC20Detailed {
   constructor(string memory name, string memory symbol, uint8 decimals) 
    ERC20Detailed(name,symbol,decimals) 
    public {
        // TODO    
    }
}

在此处输入图像描述

于 2019-07-12T09:14:07.913 回答