создать токен ERC-20 из функции контракта

Я хотел бы сделать функцию создания контракта с интерфейсом ERC-20. Но у меня есть несколько проблем.

Если кто-нибудь поможет мне, я буду признателен.

Вот код:

pragma solidity ^0.5.0;
import 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol';
/*
library SafeMath {
    function add(uint a, uint b) internal pure returns (uint c) {
        c = a + b;
        require(c >= a);
    }
    function sub(uint a, uint b) internal pure returns (uint c) {
        require(b <= a);
        c = a - b;
    }
    function mul(uint a, uint b) internal pure returns (uint c) {
        c = a * b;
        require(a == 0 || c / a == b);
    }
    function div(uint a, uint b) internal pure returns (uint c) {
        require(b > 0);
        c = a / b;
    }
}
*/
contract SubToken{
    function totalSupply() public view returns (uint);
    function balanceOf(address tokenOwner) public view returns (uint balance);
    //function allowance(address tokenOwner, address spender) public view returns (uint remaining);
    function transfer(address to, uint tokens) public returns (bool success) ;
    function approve(address spender, uint tokens) public returns (bool success);
    function transferFrom(address from, address to, uint tokens) public returns (bool success);

    event Transfer(address indexed from, address indexed to, uint tokens);
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);

}
contract MainContrat is SubToken {
    mapping(address => uint) balances;

    mapping(address => mapping(address => uint)) allowed;
    mapping(address => address[]) public created;

    mapping(address => SubToken) public tokenlist;

    address[] public contracts;
    address owner = msg.sender;

    using SafeMath for uint;

    string public symbol;
    string public  name;
    uint8 public decimals;
    uint _totalSupply;

    constructor(string memory _name,string memory _symbol,uint8 _decimals,uint256 _totalSupply)  public{
        name = _name;
        symbol = _symbol;
        decimals=_decimals;
        balances[msg.sender]=_totalSupply;
    }    

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address _owner) public view  returns (uint256 balance) {
        return balances[_owner];
    }


    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        emit Transfer(_from, _to, _value);
        return true;
    }
/*
    function createNew(string memory _name,string memory _symbol,uint8 _decimals,uint256 _totalSupply) public returns(address newToken){
        SubToken newSubToken = (new SubToken(_name,_symbol,_decimals,_totalSupply));
        created[msg.sender].push(address(newSubToken));
        newSubToken.transfer(msg.sender, _totalSupply);
        return address(newSubToken);

    }
    */
    /*
    function createNewContract() public returns(address){
    SubToken st = new SubToken();
    contracts.push(st);
    address(st);
    }
    */
    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    event Approval(address indexed _owner, address indexed _spender, uint256 _value);


}

contract factory{
    address[] public contracts;
    mapping(address => address[]) public created;

    function createNewContract(string memory _name,string memory _symbol,uint8 _decimals,uint256 _totalSupply) public returns(address){
    MainContrat st = new MainContrat(_name,_symbol,_decimals,_totalSupply);
    contracts.push(address(st));
    return address(st);
    }
}

У меня есть ошибки в моих функциях createContract. Ошибки это:

TypeError: Попытка создать экземпляр абстрактного контракта. SubToken st = новый SubToken(); ^----------^ browser/crtcont2.sol:29:5: Отсутствует реализация: функция одобряет (адреса отправителя, токены uint) общедоступные результаты (логический успех); ^---------------------------------------------------------------- --------------------------^ browser/crtcont2.sol:26:5: Отсутствует реализация: функция balanceOf(адрес tokenOwner) возвращает публичное представление ( неполный баланс); ^---------------------------------------------------------------- -----------------------^ browser/crtcont2.sol:25:5: Отсутствует реализация: функция totalSupply() возвращает публичное представление (uint); ^------------------------------------------------^ browser/crtcont2.sol:28:5: Отсутствует реализация: передача функции (адрес, токены uint) публичные возвраты (логический успех); ^---------------------------------------------------------------- ----------------------^ browser/crtcont2.sol:30:5: Отсутствует реализация: функция transferFrom(адрес от, адрес до, токены uint) public возвращает (булевый успех); ^---------------------------------------------------------------- -------------------------------------------------------^

потому что вы пытаетесь создать экземпляр абстрактного контракта.
Что я должен делать ? Вы можете помочь мне?
Ну да, я могу создать новый контракт, и это вдохновит меня :)
@BadrBellaj эй, я изменил свой код и получил те же результаты, не могли бы вы помочь мне еще раз, пожалуйста :)

Ответы (1)

вместо этого вы можете использовать фабричный класс, который создает токен, как показано ниже.

pragma solidity ^0.5.0;

library SafeMath {
    function add(uint a, uint b) internal pure returns (uint c) {
        c = a + b;
        require(c >= a);
    }
    function sub(uint a, uint b) internal pure returns (uint c) {
        require(b <= a);
        c = a - b;
    }
    function mul(uint a, uint b) internal pure returns (uint c) {
        c = a * b;
        require(a == 0 || c / a == b);
    }
    function div(uint a, uint b) internal pure returns (uint c) {
        require(b > 0);
        c = a / b;
    }
}
contract SubToken{
    function totalSupply() public view returns (uint);
    function balanceOf(address tokenOwner) public view returns (uint balance);
    //function allowance(address tokenOwner, address spender) public view returns (uint remaining);
    function transfer(address to, uint tokens) public returns (bool success) ;
    function approve(address spender, uint tokens) public returns (bool success);
    function transferFrom(address from, address to, uint tokens) public returns (bool success);

    event Transfer(address indexed from, address indexed to, uint tokens);
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);

}
contract token is SubToken {
    mapping(address => uint) _balances;
    mapping(address => mapping(address => uint)) allowed;
    mapping(address => SubToken) public tokenlist;
    address[] public contracts;
    address owner = msg.sender;

    using SafeMath for uint;
    string public symbol;
    string public  name;
    uint8 public decimals;
    uint _totalSupply;

    //constructor(string memory name,string memory symbol,uint8 decimals,uint256 _totalSupply) public{
    //    _balances[msg.sender]=_totalSupply;
    //}    

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address _owner) public view  returns (uint256 balance) {
        return _balances[_owner];
    }

    function transfer(address _to, uint256 _value) public returns (bool success) {

        return true;

    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        emit Transfer(_from, _to, _value);
        return true;
    }

    function approve(address _spender, uint256 _value) public returns (bool success) {
        return true;
    }

    //function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
    //    return approve[_owner][_spender];
    //}



    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

}

contract factory{
    address[] public contracts;

    function createNewContract() public returns(address){
    token st = new token();
    contracts.push(address(st));
    address(st);
    }
}

вы можете найти лучший пример по адресу https://github.com/ConsenSys/Tokens/tree/master/contracts/eip20 .