crear contrato a partir de función/contrato

**Hola, chicos ! Solo trato de hacer un contrato para crear un contrato.

Se suponía que era la interfaz ERC-20, así que mi primer contrato para esto.

Pero no sé cómo puedo hacer las funciones _mint y createContract

Tengo errores asi que alguien me puede ayudar? Estaré agradecido** pragma solidez ^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);
    function mint(address from, uint amount) public returns(bool success);
    constructor(string memory name,string memory symbol,uint8 decimals,uint256 initialSupply) 
    public{
        mint(msg.sender, initialSupply);

    }

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

}
contract MainContrat{
    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 initialSupply) public{
        _mint(msg.sender, initialSupply);
    }    

    function _mint(address account, uint256 amount) internal {
        //require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        //emit Transfer(address(0), account, amount);
    }
    function createNewContract(string memory name,string memory symbol,uint8 decimals,uint256 initialSupply) public returns(address newContract){
    SubToken st = new SubToken(name,symbol,decimals,initialSupply);
    contracts.push(st);
    return st;
    }
}

los errores están aquí: browser/crtcont2.sol:49:19: TypeError: Intentando crear una instancia de un contrato abstracto. Subtoken st = nuevo Subtoken(); ^----------^ browser/crtcont2.sol:14:5: Falta implementación: asignación de función (tokenOwner de dirección, gastador de dirección) devoluciones de vista pública (uint restante); ^------------------------------------------------- ------------------------------------------^ navegador/crtcont2.sol:16 :5: Implementación faltante: función de aprobación (dirección de gasto, tokens uint) devoluciones públicas (bool éxito); ^------------------------------------------------- --------------------------^ navegador/crtcont2.sol:13:5: Falta implementación: función balanceOf(dirección tokenOwner) vista pública devuelve ( saldo de unidad); ^------------------------------------------------- --------------^ browser/crtcont2.sol:18:5: Falta implementación: function mint(dirección de, uint cantidad) public return(bool éxito); ^------------------------------------------------- ------------------^ browser/crtcont2.sol:12:5: Falta implementación: función totalSupply() vista pública devuelve (uint); ^------------------------------------------------^ browser/crtcont2.sol:15:5: Implementación faltante: transferencia de función (dirección a, tokens uint) devoluciones públicas (bool éxito); ^------------------------------------------------- ----------------------^ browser/crtcont2.sol:17:5: Falta implementación: function transferFrom(dirección de, dirección a, uint tokens) retornos públicos (éxito bool); ^------------------------------------------------- ----------------------------------------^ ^------------------------------------------------- ------------------^ browser/crtcont2.sol:12:5: Falta implementación: función totalSupply() vista pública devuelve (uint); ^------------------------------------------------^ browser/crtcont2.sol:15:5: Implementación faltante: transferencia de función (dirección a, tokens uint) devoluciones públicas (bool éxito); ^------------------------------------------------- ----------------------^ browser/crtcont2.sol:17:5: Falta implementación: function transferFrom(dirección de, dirección a, uint tokens) retornos públicos (éxito bool); ^------------------------------------------------- ----------------------------------------^ ^------------------------------------------------- ------------------^ browser/crtcont2.sol:12:5: Falta implementación: función totalSupply() vista pública devuelve (uint); ^------------------------------------------------^ browser/crtcont2.sol:15:5: Implementación faltante: transferencia de función (dirección a, tokens uint) devoluciones públicas (bool éxito); ^------------------------------------------------- ----------------------^ browser/crtcont2.sol:17:5: Falta implementación: function transferFrom(dirección de, dirección a, uint tokens) retornos públicos (éxito bool); ^------------------------------------------------- ----------------------------------------^ Implementación faltante: transferencia de función (dirección a, tokens uint) devoluciones públicas (éxito bool); ^------------------------------------------------- ----------------------^ browser/crtcont2.sol:17:5: Falta implementación: function transferFrom(dirección de, dirección a, uint tokens) retornos públicos (éxito bool); ^------------------------------------------------- ----------------------------------------^ Implementación faltante: transferencia de función (dirección a, tokens uint) devoluciones públicas (éxito bool); ^------------------------------------------------- ----------------------^ browser/crtcont2.sol:17:5: Falta implementación: function transferFrom(dirección de, dirección a, uint tokens) retornos públicos (éxito bool); ^------------------------------------------------- ----------------------------------------^
browser/crtcont2.sol:50:20: TypeError: tipo no válido para el argumento en la llamada de función. Conversión implícita no válida del subtoken del contrato a la dirección solicitada. contratos.push(st); ^^ browser/crtcont2.sol:51:12: TypeError: el contrato de tipo de argumento de retorno SubToken no se puede convertir implícitamente a la dirección del tipo esperado (tipo de la primera variable de retorno). vuelta st; ^^

se supondrá que es mi constructor, pero no sé cómo puedo solucionarlo :(

Respuestas (1)

Parece que para corregir sus errores tendrá que hacer algunas cosas:

Primero, para cada función en SubContract, deberá definirlas. Por ejemplo,

totalSupply()

necesita algo de código que lo acompañe, por lo que el compilador sabe qué hacer cuando llama a esa función. Todos los errores de "interfaz faltante" van con eso. necesitas definir

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);
function mint(address from, uint amount) public returns(bool success);

A continuación, deberá enviar "st" a una dirección usando "address(st)" en la parte inferior de su código. Donde tu código dice:

contracts.push(st);
return st;

el compilador espera una dirección, así que use esto en lugar de "st"

address(st)

Hola, Deric, cambié mi código pero los resultados no cambiaron.