Ошибка транзакции. Исключение в коде контракта. Код операции REVERT при отправке ETH на краудсейл

Я хотел следовать руководству - https://blog.zeppelin.solutions/how-to-create-token-and-initial-coin-offering-contracts-using-truffle-openzeppelin-1b7a5dae99b6 - но был новый релиз - https://github.com/OpenZeppelin/zeppelin-solidity/releases/tag/v1.7.0 - вот и пытаюсь разобраться...

Фактический код проверяется на Etherscan.

Краудсейл: https://ropsten.etherscan.io/address/0x018ea8f3fef7bd14c7bff98e898842925f05e6ea#code

Монета: https://ropsten.etherscan.io/address/0x37ca578d3d847d27741b2ffc033419a7d11b7bef#code

Мой аккаунт отправляет ETH на краудсейл: https://ropsten.etherscan.io/address/0x85a363699c6864248a6ffca66e4a1a5ccf9f5567

Хэш транзакции: https://ropsten.etherscan.io/tx/0x7f99bca20b767073eb48ed2e6d01186c55bcc97ee8316523977e15c4286f6c5a

введите описание изображения здесь

Вот короткое видео, в котором я объясняю, что делаю: https://youtu.be/oKP9ea5PNho


Глядя на код: https://github.com/OpenZeppelin/zeppelin-solidity/blob/3c489127306d09dc08c6a22263134fb5413d2f80/contracts/crowdsale/Crowdsale.sol#L48

function Crowdsale(uint256 _rate, address _wallet, ERC20 _token) public

Я создаю монету и краудсейл следующим образом:

contract MailHustleCrowdsale is Crowdsale {

  uint256 _rate = 1000; 
  address _wallet = 0x315f80c7caacbe7fb1c14e65a634db89a33a9637;
  ERC20 _token = new MailHustleCoin();

  function MailHustleCrowdsale() Crowdsale(_rate, _wallet, _token) {          
  }
}

Я предполагаю, что ошибка где-то здесь, но не могу понять рабочий синтаксис...


Альтернативный подход:

Как сослаться на контракт монеты уже в сети?

Если включение оригинального исходного кода нецелесообразно, простой способ обойти это — просто создать контракт-заглушку поверх вашего собственного контракта, содержащий сигнатуру функции, которую вы хотите вызвать.

Для простоты я решил включить все в один файл.

Ответы (1)

Кредит принадлежит Видору:

Может быть, вы можете заработать репутацию Stack Overflow и поместить эти указатели в исходный вопрос?

слишком много хлопот, чтобы мало удовольствия

Я понял, я сделаю это тогда

Я понимаю, что знаю так мало, и мне не следует трогать код.


Один

function mint(address _to, uint256 _amount) onlyOwner canMint public returns (bool)

Чеканить может только владелец. Создание монеты должно быть в контракте краудсейла.

Два

function _deliverTokens(address _beneficiary, uint256 _tokenAmount) internal { require(MintableToken(token).mint(_beneficiary, _tokenAmount)); }

Вместо

function _deliverTokens(address _beneficiary, uint256 _tokenAmount) internal { token.transfer(_beneficiary, _tokenAmount); }

В настоящее время вы передаете токены с адреса отправителя, который имеет 0. Вы хотите выбрать стратегию чеканки, которая лучше

Вот работающий TX: https://ropsten.etherscan.io/tx/0x1b4c11eee16e06bc53a273a9a805ea11def461c9f81847edb2d8f95daa273ae5

(вы можете перейти к контракту, чтобы увидеть рабочий источник)


Вот лучший пример: https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/examples/SampleCrowdsale.sol