代币合约不会迁移,因为它是抽象的

Token contract won't migrate since it is abstract

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

我该怎么做才能解决这个问题?我尝试让我的令牌合约也从 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”文件中,而不是单独部署它们。 * 继承抽象的合约必须准确地实现其所有方法签名。 * 只实现部分继承抽象的合约也被认为是抽象的。

如果仔细观察 ERC20Detailed contract,您会注意到 ERC20Detailed is IERC20。在简单的英语中,它表示 "this ERC20Detailed inherits all functionalities from IERC20".

现在,看看 Solidity 中的 IERC20 contract. You will notice all functions there were terminated with ; with no logic. This is what we call as Abstract Contracts

您的 front-end 合约(代币)想要使用来自的所有功能:

  • ERC20 详细 - 在其文件中包含所有实现
  • 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 contract has all implementations for IERC20 contract. You can give it a try in Remix first this code

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