Договор краудсейла Openzepplin получен: исключение виртуальной машины при обработке транзакции: ошибка возврата - PullRequest
0 голосов
/ 17 мая 2018

Я разрабатываю умный контракт, основанный на openzeppelin-solidity, и хочу написать простой контракт Crowdsale, только я это наследовал Contract.sol:

// FloatFlowerTokenCrowdsale.sol
pragma solidity 0.4.23;

import "openzeppelin-solidity/contracts/crowdsale/Crowdsale.sol";

contract FloatFlowerTokenCrowdsale is Crowdsale{
  constructor(ERC20 _token) public Crowdsale(1000, msg.sender, _token) 
  {

  }
}

Вот мой FloatFlowerToken.sol

// FloatFlowerToken.sol
pragma solidity 0.4.23;

import "openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol";

contract FloatFlowerToken is StandardToken {
  string public name = "FLOATFLOWER TOKEN";
  string public symbol = "FFT";
  uint8 public decimals = 18;

  constructor() public {
    totalSupply_ = 36000000;
    balances[msg.sender] = totalSupply_;
  }
}

А это мой 2_deploy_contract.js

const FloatFlowerToken = artifacts.require('./FloatFlowerToken.sol');
const FloatFlowerTokenCrowdsale =
    artifacts.require('./FloatFlowerTokenCrowdsale.sol');

module.exports = function(deployer, network, accounts) {
    return deployer
        .then(() => {
            return deployer.deploy(FloatFlowerToken);
        })
        .then(() => {
            return deployer.deploy(FloatFlowerTokenCrowdsale, FloatFlowerToken.address);
        })
};

После того, как я выполнил truffle test, и я получил ошибку Error: VM Exception while processing transaction: revert

А вот мой тестовый код:

it('one ETH should buy 1000 FLOATFLOWER TOKEN in Crowdsale', function(done) {
    FloatFlowerTokenCrowdsale.deployed().then(async function(instance) {
        const data = await instance.sendTransaction({from: accounts[7], value: web3.toWei(1, "ether")}, function(error, txhash) {
            console.log(error);
        });
        const tokenAddress = await instance.token.call();
        const FloatFlowerToken = FloatFlowerToken.at(tokenAddress);
        const tokenAmount = await FloatFlowerToken.balanceOf(accounts[7]);
        assert.equal(tokenAmount.toNumber(), 1000000000000000000000, 'The sender didn\'t receive the tokens as crowdsale rate.');
    })
})

Я не знаю, как проверить журнал ошибок и узнать, какая строка вызывает эту проблему.

1 Ответ

0 голосов
/ 18 мая 2018

У вас есть 2 проблемы:

Во-первых, единицы, с которыми вы работаете, неверны.Вы инициализировали свою краудсейл, чтобы продавать 1000 жетонов за каждую отправленную Вей.Из документации в контракте Zeppelin:

@ param _rate Количество токенов, которые покупатель получает за wei

@ param _wallet Адрес, где будут собраны средстваперенаправлен на

@ param _token Адрес продаваемого токена

В вашей транзакции вы передаете 1 эфир, что означает, что вы пытаетесь купить 1000 * (10 ^18) токенов, но вы выделили всего 36000000 единиц.Вам нужно увеличить общий запас и / или снизить ставку.

Во-вторых, только владельцы токенов могут осуществлять перевод, если сначала не было одобрено.При развертывании контракта с токенами все токены принадлежат msg.sender.Однако, когда кто-то совершает покупку по вашему контракту с краудсейлом, запрос на передачу поступает с адреса контракта с краудсейлом, а не с владельцем токена, когда ваш контракт с токеном был развернут.Простейший способ обойти это - после развертывания ваших контрактов перевести достаточно токенов для краудсейла с адреса, который вы использовали для создания контракта токена, на адрес контракта краудсейла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...