ERC223
Ich kann Vertrag nicht umsetzen . Remix sagte
"Dieser Vertrag implementiert nicht alle Funktionen und kann daher nicht erstellt werden."
Bitte sagen Sie mir, was es schlimm ist.
Pragma Solidität ^0.4.25; Bibliothek SafeMath { Funktion mul(uint256 a, uint256 b) interne reine Rückgaben (uint256) { wenn (a == 0) { 0 zurückgeben; } uint256 c = a * b; behaupten (c / a == b); gib c zurück; } Funktion div(uint256 a, uint256 b) interne reine Rückgaben (uint256) { uint256 c = a / b; gib c zurück; } Funktion sub(uint256 a, uint256 b) interne reine Rückgaben (uint256) { behaupten (b = a); gib c zurück; } } Vertrag Besitzbar { Adresse öffentlicher Eigentümer; event OwnershipTransferred (Adresse indiziert vorheriger Eigentümer, Adresse indiziert neuer Eigentümer); Funktion Ownable() öffentlich { Eigentümer = msg.sender; } Modifikator onlyOwner() { require(msg.sender == Eigentümer); _; } Funktion transferOwnership(Adresse newOwner) onlyOwner public { require(newOwner != address(0)); OwnershipTransferred(Besitzer, neuerBesitzer); Eigentümer = neuer Eigentümer; } } Vertrag ERC223 { uint public totalSupply; Funktion balanceOf (Adresse wen) öffentliche Ansicht gibt zurück (uint); Funktion totalSupply() öffentliche Ansicht gibt zurück (uint256 _supply); Funktionsübertragung (Adresse an, uint-Wert) Öffentliche Rückgaben (bool ok); Funktionsübertragung (Adresse an, uint-Wert, Bytes-Daten) Öffentliche Rückgaben (bool ok); Funktionsübertragung (Adresse an, uint-Wert, Bytedaten, Zeichenfolge customFallback) Öffentliche Rückgaben (bool ok); Ereignisübertragung (Adresse indiziert von, Adresse indiziert auf, uint-Wert, Bytes indizierte Daten); function name() öffentliche Ansicht gibt zurück (string _name); function symbol() öffentliche Ansicht gibt zurück (string _symbol); Funktion decimals() öffentliche Ansicht gibt zurück (uint8 _decimals); Funktion transferFrom (Adresse _from, Adresse _to, uint256 _value) öffentliche Rückgaben (bool Erfolg); Funktion genehmigen (Adresse _spender, uint256 _value) Öffentliche Rückgaben (bool Erfolg); Funktion Allowance (Adresse _owner, Adresse _spender) öffentliche Ansicht gibt zurück (uint256 verbleibend); event Transfer (address indexed _from, address indexed _to, uint256 _value); event Approval (address indexed _owner, address indexed _spender, uint _value); } Vertrag ContractReceiver { Struktur TKN { Adresse Absender; uint-Wert; Bytes Daten; Bytes4 Zeichen; } Funktions-TokenFallback (Adresse _from, uint _value, Bytes _data) public pure { TKN Speicher tkn; tkn.sender = _from; tkn.value = _value; tkn.data = _data; uint32 u = uint32(_data[3]) + (uint32(_data[2]) uint256) public balanceOf; Zuordnung (Adresse => Zuordnung (Adresse => uint256)) öffentliche Zulage; Zuordnung (Adresse => bool) öffentliches eingefrorenesKonto; Mapping (Adresse => uint256) public unlockUnixTime; Ereignis FrozenFunds (Adresse indiziertes Ziel, bool eingefroren); Ereignis LockedFunds (Adresse indiziertes Ziel, uint256 gesperrt); event Burn (Adresse indiziert von, uint256 Betrag); event Mint (Adresse indexiert auf, uint256 Betrag); Ereignis MintFinished (); Funktion New() öffentlich { Eigentümer = Gründer; balanceOf[Gründer] = totalSupply.mul(40).div(100); balanceOf[AirDrop] = totalSupply.mul(50).div(100); balanceOf[sale] = totalSupply.mul(10).div(100); } Funktionsname() öffentliche Ansicht gibt zurück (Zeichenfolge _name) { Rückgabename; } function symbol() öffentliche Ansicht gibt zurück (string _symbol) { Rückkehrsymbol; } Funktion decimals() öffentliche Ansicht gibt zurück (uint8 _decimals) { Dezimalstellen zurückgeben; } Funktion totalSupply() öffentliche Ansicht gibt zurück (uint256 _totalSupply) { Gesamtversorgung zurückgeben; } Funktion balanceOf(address _owner) öffentliche Ansicht gibt zurück (uint256 balance) { return balanceOf[_owner]; } Funktion freezeAccounts(address[] Ziele, bool isFrozen) onlyOwner public { erfordern (targets.length > 0); für (uint j = 0; j 0 && Ziele.Länge == unixTimes.Länge); for(uint j = 0; j 0 && eingefrorenesKonto[msg.sender] == falsch && eingefrorenesKonto[_to] == falsch && jetzt > unlockUnixTime[msg.sender] && jetzt > unlockUnixTime[_to]); if (isContract(_to)) { require(balanceOf[msg.sender] >= _value); balanceOf[msg.sender] = balanceOf[msg.sender].sub(_value); balanceOf[_to] = balanceOf[_to].add(_value); assert(_to.call.value(0)(bytes4(keccak256(_custom_fallback)), msg.sender, _value, _data)); Transfer(msg.sender, _to, _value, _data); Transfer(msg.sender, _to, _value); gib true zurück; } anders { RücktransferToAddress(_to, _value, _data); } } Funktion transfer (Adresse _to, uint _value, Bytes _data) öffentliche Rückgabe (bool Erfolg) { require(_value > 0 && eingefrorenesKonto[msg.sender] == falsch && eingefrorenesKonto[_to] == falsch && jetzt > unlockUnixTime[msg.sender] && jetzt > unlockUnixTime[_to]); if (isContract(_to)) { RücktransferToContract(_to, _value, _data); } anders { RücktransferToAddress(_to, _value, _data); } } Funktion transfer (Adresse _to, uint _value) öffentliche Rückgaben (boolescher Erfolg) { require(_value > 0 && eingefrorenesKonto[msg.sender] == falsch && eingefrorenesKonto[_to] == falsch && jetzt > unlockUnixTime[msg.sender] && jetzt > unlockUnixTime[_to]); Bytes Speicher leer; if (isContract(_to)) { return transferToContract(_to, _value, empty); } anders { return transferToAddress(_to, _value, empty); } } Funktion isContract(address _addr) Privatansicht gibt zurück (bool is_contract) { Einheitslänge; Montage { Länge := extcodesize(_addr) } return (Länge > 0); } Funktion transferToAddress (Adresse _to, uint _value, Bytes _data) private Rückgabe (bool Erfolg) { require(balanceOf[msg.sender] >= _value); balanceOf[msg.sender] = balanceOf[msg.sender].sub(_value); balanceOf[_to] = balanceOf[_to].add(_value); Transfer(msg.sender, _to, _value, _data); Transfer(msg.sender, _to, _value); gib true zurück; } Funktion transferToContract (Adresse _to, uint _value, Bytes _data) private Rückgaben (bool Erfolg) { require(balanceOf[msg.sender] >= _value); balanceOf[msg.sender] = balanceOf[msg.sender].sub(_value); balanceOf[_to] = balanceOf[_to].add(_value); ContractReceiver Empfänger = ContractReceiver(_to); receiver.tokenFallback (msg.sender, _value, _data); Transfer(msg.sender, _to, _value, _data); Transfer(msg.sender, _to, _value); gib true zurück; } Funktion transferFrom (Adresse _from, Adresse _to, uint256 _value) öffentliche Rückgabe (bool Erfolg) { require(_to != Adresse(0) && _value > 0 && balanceOf[_from] >= _value && Zulage[_from][msg.sender] >= _value && eingefrorenesKonto[_from] == falsch && eingefrorenesKonto[_to] == falsch && jetzt > unlockUnixTime[_from] && jetzt > unlockUnixTime[_to]); balanceOf[_from] = balanceOf[_from].sub(_value); balanceOf[_to] = balanceOf[_to].add(_value); Allowance[_from][msg.sender] = Allowance[_from][msg.sender].sub(_value); Transfer(_from, _to, _value); gib true zurück; } Funktion genehmigen (Adresse _spender, uint256 _value) öffentliche Rückgaben (boolescher Erfolg) { Zulage[msg.sender][_spender] = _value; Genehmigung (msg.sender, _spender, _value); gib true zurück; } Funktion Allowance (Adresse _owner, Adresse _spender) öffentliche Ansicht gibt zurück (uint256 verbleibend) { Rückkehrerlaubnis[_owner][_spender]; } Funktion Burn (Adresse _from, uint256 _unitAmount) onlyOwner public { require(_unitAmount > 0 && balanceOf[_from] >= _unitAmount); balanceOf[_from] = balanceOf[_from].sub(_unitAmount); totalSupply = totalSupply.sub(_unitAmount); Burn(_from, _unitAmount); } Modifikator canMint() { require(!mintingFinished); _; } function mint(address _to, uint256 _unitAmount) onlyOwner canMint public return (bool) { require(_unitAmount > 0); totalSupply = totalSupply.add(_unitAmount); balanceOf[_to] = balanceOf[_to].add(_unitAmount); Minze (_to, _unitAmount); Transfer(Adresse(0), _to, _unitAmount); gib true zurück; } function finishMinting() onlyOwner canMint öffentliche Rückgabe (bool) { mintingFinished = wahr; MintFertig (); gib true zurück; } Funktion "distributeAirdrop(address[] Adressen, uint256 Betrag)" öffentliche Rückgaben (bool) { erfordern (Menge > 0 && adressen.länge > 0 && eingefrorenesKonto[msg.sender] == falsch && jetzt > unlockUnixTime[msg.sender]); Betrag = Betrag.mul(1e8); uint256 Gesamtbetrag = Betrag.mul (Adressen.Länge); require(balanceOf[msg.sender] >= totalAmount); for (uint j = 0; j unlockUnixTime[adressen[j]]); balanceOf[adressen[j]] = balanceOf[adressen[j]].add(betrag); Transfer(msg.sender, Adressen[j], Betrag); } balanceOf[msg.sender] = balanceOf[msg.sender].sub(totalAmount); gib true zurück; } Funktion verteileAirdrop(Adresse[] Adressen, uint[] Beträge) Öffentliche Rückgaben (bool) { require(adressen.länge > 0 && Adressen.Länge == Beträge.Länge && eingefrorenesKonto[msg.sender] == falsch && jetzt > unlockUnixTime[msg.sender]); uint256 Gesamtbetrag = 0; for(uint j = 0; j 0 && Adressen[j] != 0x0 && eingefrorenesKonto[adressen[j]] == falsch && jetzt > unlockUnixTime[adressen[j]]); Beträge[j] = Beträge[j].mul(1e8); Gesamtbetrag = Gesamtbetrag.add (Beträge [j]); } require(balanceOf[msg.sender] >= totalAmount); für (j = 0; j 0 && Adressen.Länge == Beträge.Länge); uint256 Gesamtbetrag = 0; für (uint j = 0; j 0 && Adressen[j] != 0x0 && eingefrorenesKonto[adressen[j]] == falsch && jetzt > unlockUnixTime[adressen[j]]); Beträge[j] = Beträge[j].mul(1e8); require(balanceOf[adressen[j]] >= Beträge[j]); balanceOf[adressen[j]] = balanceOf[adressen[j]].sub(beträge[j]); Gesamtbetrag = Gesamtbetrag.add (Beträge [j]); Überweisung(Adressen[j], msg.sender, Beträge[j]); } balanceOf[msg.sender] = balanceOf[msg.sender].add(totalAmount); gib true zurück; } }
Ändere das:
contract ContractReceiver
Dazu:
contract ContractReceiver is ERC223
Und dann ContractReceiver
statt ERC223
.
Außerdem sollten Sie dies besser ändern:
contract ERC223
Dazu:
interface ERC223
Und dann uint public totalSupply
von ERC223
zu bewegen ContractReceiver
.
Tatsächlich ist es möglich, dass Sie es tun müssen; Ich bezweifle, dass das contract ERC223
sonst kompilieren wird.
Du
gute Stimmung
Du
gute Stimmung
ERC223
, da er die darin deklarierten Funktionen nicht implementiert! Sie sollten sie entweder in diesem Vertrag oder im erbenden Vertrag implementieren und stattdessen diesen Vertrag bereitstellen.Du
gute Stimmung
Schwarze Skala
In fact, it is possible that you have to do it; I doubt that contract ERC223 will compile otherwise.
@goodvibration Ich verwende immer Verträge anstelle von Schnittstellen, genau aus dem Grund, dass Sie Variablen darin einbetten können, was besonders für Konstanten nützlich ist. Es wird gut als Vertrag kompilieren.