crear token ERC-20 a partir de una función de contrato

Me gustaría hacer una función para crear un contrato con la interfaz ERC-20. Pero tengo algunos problemas.

Si alguien me ayuda, se lo agradeceré.

Aquí está el código:

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

Tengo errores en mis funciones createContract. errores es:

TypeError: tratando de crear una instancia de un contrato abstracto. Subtoken st = nuevo Subtoken(); ^----------^ browser/crtcont2.sol:29:5: Falta implementación: función de aprobación (dirección de gasto, uint tokens) devoluciones públicas (bool éxito); ^------------------------------------------------- --------------------------^ browser/crtcont2.sol:26:5: Falta la implementación: function balanceOf(address tokenOwner) vista pública devuelve ( saldo de unidad); ^------------------------------------------------- --------------^ browser/crtcont2.sol:25:5: Falta implementación: función totalSupply() vista pública devuelve (uint); ^------------------------------------------------^ browser/crtcont2.sol:28:5: Falta implementación: transferencia de función (dirección a, tokens uint) devoluciones públicas (bool éxito); ^------------------------------------------------- ----------------------^ browser/crtcont2.sol:30:5: Falta implementación: función transferFrom(dirección de, dirección a, uint tokens) retornos públicos (éxito bool); ^------------------------------------------------- ----------------------------------------^

porque está tratando de instanciar un contrato abstracto.
Qué tengo que hacer ? ¿Me puedes ayudar?
Bueno, sí, puedo crear un nuevo contrato y me da la inspiración :)
@BadrBellaj hey, cambié mi código y obtuve los mismos resultados, ¿pueden ayudarme de nuevo, por favor? :)

Respuestas (1)

en su lugar, puede usar una clase de fábrica que crea el token de la siguiente manera en este diseño, el subtoken es una clase abstracta, implementada por la clase de token y, al final, una clase de fábrica que creará diferentes instancias de la clase de token.

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

puede encontrar un mejor ejemplo en https://github.com/ConsenSys/Tokens/tree/master/contracts/eip20