remix ERC223: этот контракт не реализует все функции и поэтому не может быть создан

Я не могу реализовать 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);
        вернуть истину;
    }
}

Ответы (1)

Измените это:

contract ContractReceiver

К этому:

contract ContractReceiver is ERC223

А затем развернуть ContractReceiverвместо ERC223.

Кроме того, вам лучше также изменить это:

contract ERC223

К этому:

interface ERC223

А затем переход uint public totalSupplyот ERC223к ContractReceiver.

На самом деле, возможно, вам придется это сделать; Сомневаюсь, что contract ERC223иначе скомпилируется.

Спасибо за ответ. Но я не мог бежать, как никогда.
@yoru: Remix указывает на ошибки компиляции. Вы должны как минимум уметь их читать и решать. Если у вас есть проблема с такого рода ошибками, то будет намного хуже, когда вы начнете иметь дело с ошибками времени выполнения (на которые вам никто не укажет, в отличие от ошибок компиляции). Если у вас все еще есть проблемы с определенной ошибкой компиляции, выдаваемой Remix, вам следует как минимум опубликовать ее здесь и попросить указать конкретное направление. Вместо этого вы сделали здесь «дамп моего кода и ожидали, что кто-то другой решит все за меня», что не побуждает никого помогать вам!
Спасибо за помощь. Я не нахожу ошибки компиляции. но я не могу развернуть ERC223. Но я могу развернуть другой контракт.
@yoru: Ты читал, что я написал? Вы не можете развернуть контракт ERC223, потому что он не реализует объявленные в нем функции! Вы должны либо реализовать их в этом контракте, либо реализовать их в наследующем контракте и вместо этого развернуть этот контракт.
Мне жаль. Я не силен в английском. Я внимательно прочитал.
@yoru: Вы понимаете, ПОЧЕМУ вы не можете развернуть этот контракт?
In fact, it is possible that you have to do it; I doubt that contract ERC223 will compile otherwise.@goodvibration Я всегда использую контракты вместо интерфейсов именно по той причине, что в них можно вставлять переменные, что особенно полезно для констант. Он будет скомпилирован как контракт.