ERC-20-Token aus einer Vertragsfunktion erstellen

Ich möchte einen Funktionserstellungsvertrag mit der ERC-20-Schnittstelle erstellen. Aber ich habe ein paar Probleme.

Wenn mir jemand hilft, werde ich geschätzt.

Hier ist der Code:

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

Ich habe Fehler bei meinen createContract-Funktionen. Fehler ist:

TypeError: Versuch, eine Instanz eines abstrakten Vertrags zu erstellen. SubToken st = neues SubToken(); ^----------^ browser/crtcont2.sol:29:5: Fehlende Implementierung: Funktion genehmigen (Adresse Spender, uint Tokens) öffentliche Rückgaben (bool Erfolg); ^------------------------------------------------------------- ---------------------^ browser/crtcont2.sol:26:5: Fehlende Implementierung: Funktion balanceOf(address tokenOwner) public view gibt zurück ( Unt-Guthaben); ^------------------------------------------------------------- -----------------------^ browser/crtcont2.sol:25:5: Fehlende Implementierung: Funktion totalSupply() öffentliche Ansicht gibt zurück (uint); ^-------------------------------------------------------------^ browser/crtcont2.sol:28:5: Fehlende Implementierung: Funktionsübertragung (Adresse an, uint-Token) öffentliche Rückgaben (bool Erfolg); ^------------------------------------------------------------- ----------------------^ browser/crtcont2.sol:30:5: Fehlende Implementierung: Funktion transferFrom(Adresse von, Adresse an, uint-Token) öffentliche Rückgaben (boolescher Erfolg); ^------------------------------------------------------------- -----------------------------------^

weil Sie versuchen, einen abstrakten Vertrag zu instanziieren.
was soll ich machen ? Kannst du mir helfen?
Nun ja, ich kann einen neuen Vertrag erstellen und das gibt mir die Inspiration :)
@BadrBellaj hey, ich habe meinen Code geändert und ich habe die gleichen Ergebnisse erhalten, kannst du mir bitte noch einmal helfen :)

Antworten (1)

Sie können stattdessen eine Factory-Klasse verwenden, die Token wie folgt in diesem Design erstellt. Subtoken ist eine abstrakte Klasse, die von der Token-Klasse implementiert wird, und am Ende eine Factory-Klasse, die verschiedene Instanzen der Token-Klasse erstellt.

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

ein besseres Beispiel finden Sie unter https://github.com/ConsenSys/Tokens/tree/master/contracts/eip20