Контракт с токеном не переносится, поскольку он является абстрактным - PullRequest
0 голосов
/ 11 июля 2019

Я работаю над контрактом ICO в стиле голландского аукциона и в настоящее время пытаюсь перенести раннюю стадию моего контракта ERC20, чтобы проверить основные функции (имеет ли оно правильное имя, символ и десятичные дроби).Контракт компилируется, но я не могу его перенести, так как это «абстрактный контракт».Мой контракт токенов наследуется от 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

«Токен» является абстрактным контрактом или интерфейсом и не может быть развернут.* Импортируйте абстракции в файл .sol, в котором они используются вместо того, чтобы развертывать их отдельно.* Контракты, которые наследуют абстракцию, должны точно реализовывать все сигнатуры своих методов.* Контракт, который реализует только часть унаследованной абстракции, также считается абстрактным.

1 Ответ

1 голос
/ 12 июля 2019

Если вы присмотритесь к ERC20Подробный контракт , вы заметите ERC20Detailed is IERC20. На простом английском языке это говорит "этот ERC20Detailed наследует все функциональные возможности от IERC20" .

Теперь взгляните на контракт IERC20 . Вы заметите, что все функции были завершены с ; без логики. Это то, что мы называем Абстрактные контракты в Солидности.

Ваш внешний контракт (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 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    
    }
}

enter image description here

...