Я не могу реализовать ERC223
контракт. ремикс сказал
«Этот контракт не реализует все функции и поэтому не может быть создан».
подскажите что плохого.
прочность прагмы ^0,4,25; библиотека SafeMath { функция mul(uint256 a, uint256 b) внутренние чистые возвраты (uint256) { если (а == 0) { вернуть 0; } uint256 с = а * б; утверждать (с / а == б); возврат с; } функция div(uint256 a, uint256 b) внутренние чистые возвраты (uint256) { uint256 с = а/б; возврат с; } функция sub(uint256 a, uint256 b) внутренние чистые возвраты (uint256) { утверждать (б = а); возврат с; } } контракт Принадлежность { адрес государственного собственника; событие OwnershipTransferred (адрес, проиндексированный предыдущим владельцем, адрес, проиндексированный новым владельцем); функция Ownable () общедоступная { владелец = msg.sender; } модификатор onlyOwner() { требуют (msg.sender == владелец); _; } функция TransferOwnership(адрес newOwner) onlyOwner public { требуют (новый владелец! = адрес (0)); Право собственностиПередано(владелец, новыйВладелец); владелец = новый владелец; } } контракт ERC223 { uint public totalSupply; функция balanceOf(адрес кто) возвращает публичное представление (uint); функция totalSupply() возвращает публичное представление (uint256 _supply); передача функции (адрес, значение uint) public возвращает (bool ok); передача функции (адрес, значение uint, данные в байтах) public возвращает (bool ok); передача функции (адрес, значение uint, данные в байтах, строка customFallback) публичные возвраты (bool ok); передача события (адрес индексирован с, адрес индексирован до, значение uint, байты индексированы данные); функция name() возвращает публичное представление (string _name); функция symbol() возвращает публичное представление (string _symbol); функция decimals() возвращает публичное представление (uint8 _decimals); функция transferFrom(address _from, address _to, uint256 _value) public возвращает (логический успех); функция одобряет (адрес _spender, uint256 _value) public возвращает (логический успех); Функция разрешения (адрес _owner, адрес _spender) возвращает публичное представление (осталось uint256); передача события (адрес с индексом _from, адрес с индексом _to, uint256 _value); Утверждение события (адрес с индексом _owner, адрес с индексом _spender, uint _value); } контракт ContractReceiver { структура ТКН { адрес отправителя; значение uint; байты данных; байт4 сиг; } function tokenFallback (адрес _from, uint _value, байты _data) public pure { память ТКН ТКН; tkn.sender = _от; ткн.значение = _значение; ткн.данные = _данные; uint32 u = uint32(_data[3]) + (uint32(_data[2]) uint256) публичный балансOf; отображение (адрес => отображение (адрес => uint256)) общественное пособие; сопоставление (адрес => логическое значение) общедоступного замороженногоаккаунта; сопоставление (адрес => uint256) public unlockUnixTime; событие FrozenFunds (целевой индексированный адрес, логическое значение заморожено); событие LockedFunds (целевой индексированный адрес, uint256 заблокирован); событие Burn(адрес проиндексирован из, количество uint256); событие Mint(адрес индексируется, сумма uint256); событие MintFinished(); функция Новая () общедоступная { владелец = учредитель; balanceOf[основатель] = totalSupply.mul(40).div(100); balanceOf[AirDrop] = totalSupply.mul(50).div(100); balanceOf[продажа] = totalSupply.mul(10).div(100); } имя функции () возвращает публичное представление (string _name) { вернуть имя; } функция symbol() возвращает публичное представление (string _symbol) { символ возврата; } Функция decimals() возвращает публичное представление (uint8 _decimals) { возврат десятичных знаков; } функция totalSupply() возвращает публичное представление (uint256 _totalSupply) { вернуть общее предложение; } функция balanceOf (адрес _owner) возвращает публичное представление (баланс uint256) { вернуть баланс[_owner]; } function freezeAccounts(address[] target, bool isFrozen) onlyOwner public { требуют (цели.длина > 0); для (uint j = 0; j 0 && target.length == unixTimes.length); for(uint j = 0; j 0 && FrozenAccount[msg.sender] == false && FrozenAccount[_to] == false && сейчас > разблокироватьUnixTime[msg.sender] && сейчас > разблокироватьUnixTime[_to]); если (контракт(_к)) { требуют (баланс[msg.sender] >= _value); баланс[msg.sender] = баланс[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); вернуть истину; } еще { вернуть TransferToAddress(_to, _value, _data); } } передача функции (адрес _to, uint _value, байты _data) public возвращает (логический успех) { требуют (_значение> 0 && FrozenAccount[msg.sender] == false && FrozenAccount[_to] == false && сейчас > разблокироватьUnixTime[msg.sender] && сейчас > разблокироватьUnixTime[_to]); если (контракт(_к)) { вернуть TransferToContract(_to, _value, _data); } еще { вернуть TransferToAddress(_to, _value, _data); } } передача функции (адрес _to, uint _value) public возвращает (логический успех) { требуют (_значение> 0 && FrozenAccount[msg.sender] == false && FrozenAccount[_to] == false && сейчас > разблокироватьUnixTime[msg.sender] && сейчас > разблокироватьUnixTime[_to]); байтов памяти пусто; если (контракт(_к)) { вернуть TransferToContract(_to, _value, пусто); } еще { вернуть TransferToAddress(_to, _value, пусто); } } Функция isContract (адрес _addr) возвращает частный вид (bool is_contract) { незначительная длина; сборка { длина := extcodesize(_addr) } возврат (длина > 0); } функция transferToAddress (адрес _to, uint _value, байты _data) private возвращает (логический успех) { требуют (баланс[msg.sender] >= _value); баланс[msg.sender] = баланс[msg.sender].sub(_value); balanceOf[_to] = balanceOf[_to].add(_value); Transfer(msg.sender, _to, _value, _data); Transfer(msg.sender, _to, _value); вернуть истину; } функция transferToContract (адрес _to, uint _value, байты _data) private возвращает (логический успех) { требуют (баланс[msg.sender] >= _value); баланс[msg.sender] = баланс[msg.sender].sub(_value); balanceOf[_to] = balanceOf[_to].add(_value); Получатель ContractReceiver = ContractReceiver(_to); Receiver.tokenFallback (msg.sender, _value, _data); Transfer(msg.sender, _to, _value, _data); Transfer(msg.sender, _to, _value); вернуть истину; } function transferFrom(address _from, address _to, uint256 _value) public возвращает (логический успех) { требуют (_к! = адрес (0) && _значение > 0 && balanceOf[_from] >= _value && пособие[_from][msg.sender] >= _value && FrozenAccount[_from] == false && FrozenAccount[_to] == false && сейчас > разблокироватьUnixTime[_from] && сейчас > разблокироватьUnixTime[_to]); BalanceOf[_from] = balanceOf[_from].sub(_value); balanceOf[_to] = balanceOf[_to].add(_value); разрешение[_от][msg.sender] = разрешение[_от][msg.sender].sub(_value); Перевод(_от, _до, _значение); вернуть истину; } функция одобряет (адрес _spender, uint256 _value) public возвращает (логический успех) { пособие[msg.sender][_spender] = _value; Утверждение (msg.sender, _spender, _value); вернуть истину; } Функция разрешения (адрес _owner, адрес _spender) публичное представление возвращает (осталось uint256) { пособие на возврат[_owner][_spender]; } функция записи (адрес _from, uint256 _unitAmount) onlyOwner public { требуют (_unitAmount > 0 && balanceOf[_from] >= _unitAmount); баланс[_от] = баланс[_от].sub(_unitAmount); TotalSupply = totalSupply.sub(_unitAmount); Сжечь(_from, _unitAmount); } модификатор canMint() { требуют (! MintingFinished); _; } функция mint (адрес _to, uint256 _unitAmount) onlyOwner canMint public возвращает (bool) { требуют (_unitAmount > 0); общее предложение = общее предложение.добавить (_unitAmount); balanceOf[_to] = balanceOf[_to].add(_unitAmount); Монетный двор (_to, _unitAmount); Перевод (адрес (0), _to, _unitAmount); вернуть истину; } функция finishMinting() onlyOwner canMint public возвращает (bool) { чеканка завершена = истина; Готово(); вернуть истину; } функция распределенияAirdrop (адреса [] адреса, количество uint256) public возвращает (bool) { требуется (количество> 0 && адреса.длина > 0 && FrozenAccount[msg.sender] == false && сейчас > unlockUnixTime[msg.sender]); количество = количество.mul(1e8); uint256 totalAmount = количество.mul(адреса.длина); требуют(баланс[msg.sender] >= totalAmount); for (uint j = 0; j unlockUnixTime[адреса[j]]); баланс[адресов[j]] = баланс[адресов[j]].добавить(сумма); Перевод (сообщение. отправитель, адреса [j], сумма); } баланс[msg.sender] = баланс[msg.sender].sub(totalAmount); вернуть истину; } функция распределенияAirdrop (адреса [] адреса, количество uint []) public возвращает (bool) { требуют (адреса.длина> 0 && адреса.длина == количество.длина && FrozenAccount[msg.sender] == false && сейчас > unlockUnixTime[msg.sender]); uint256 общая сумма = 0; for(uint j = 0; j 0 && адреса[j] != 0x0 && FrozenAccount[адреса[j]] == false && сейчас > разблокироватьUnixTime[адреса[j]]); количество[j] = количество[j].mul(1e8); общая сумма = общая сумма.добавить (суммы [j]); } требуют(баланс[msg.sender] >= totalAmount); для (j = 0; j 0 && адреса.длина == количество.длина); uint256 общая сумма = 0; для (uint j = 0; j 0 && адреса[j] != 0x0 && FrozenAccount[адреса[j]] == false && сейчас > разблокироватьUnixTime[адреса[j]]); количество[j] = количество[j].mul(1e8); требуют (баланс [адресов [j]] >= количество [j]); баланс[адресов[j]] = баланс[адресов[j]].sub(суммы[j]); общая сумма = общая сумма.добавить (суммы [j]); Перевод(адреса[j], msg.sender, суммы[j]); } balanceOf[msg.sender] = balanceOf[msg.sender].add(totalAmount); вернуть истину; } }
Измените это:
contract ContractReceiver
К этому:
contract ContractReceiver is ERC223
А затем развернуть ContractReceiver
вместо ERC223
.
Кроме того, вам лучше также изменить это:
contract ERC223
К этому:
interface ERC223
А затем переход uint public totalSupply
от ERC223
к ContractReceiver
.
На самом деле, возможно, вам придется это сделать; Сомневаюсь, что contract ERC223
иначе скомпилируется.
йору
хорошая вибрация
йору
хорошая вибрация
ERC223
, потому что он не реализует объявленные в нем функции! Вы должны либо реализовать их в этом контракте, либо реализовать их в наследующем контракте и вместо этого развернуть этот контракт.йору
хорошая вибрация
черная чешуя
In fact, it is possible that you have to do it; I doubt that contract ERC223 will compile otherwise.
@goodvibration Я всегда использую контракты вместо интерфейсов именно по той причине, что в них можно вставлять переменные, что особенно полезно для констант. Он будет скомпилирован как контракт.