Openzepplin crowdsale合同得到:处理事务时VM异常:恢复错误

时间:2018-05-17 17:35:38

标签: blockchain ethereum solidity truffle

我正在开发基于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 :(得分:2)

你有两个问题:

首先,您正在使用的单位不正确。你已经初始化了你的众筹,为每一个Wei发送了1000个令牌。从Zeppelin合同中的文件:

  

@param _rate买方每维度获得的令牌单位数量

     

@param _wallet将收集的资金转发到

的地址      

@param _token正在出售的令牌的地址

你在交易中传入1以太,这意味着你试图购买1000 *(10 ^ 18)个令牌单位,但你只分配了36000000总供应量。您需要增加总供应量和/或降低费率。

其次,除非首先完成批准,否则只有令牌所有者可以进行转移。部署令牌合同时,所有令牌都归msg.sender所有。但是,当有人通过您的众筹合同进行购买时,进行转移的请求来自众包合同的地址,而不是令牌合同部署时的令牌所有者。解决这个问题最简单的方法是在部署合同之后,将用于创建令牌合同的地址的众筹代码转移到众筹合同的地址。