首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Openzepplin众销售合同:处理事务时VM异常:还原错误

Openzepplin众销售合同:处理事务时VM异常:还原错误
EN

Stack Overflow用户
提问于 2018-05-17 17:35:38
回答 1查看 440关注 0票数 1

我正在开发基于openzeppelin-solidity的智能合同,我想写一份简单的Crowdsale合同,但我做的只是继承Contract.sol:

代码语言:javascript
复制
// 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

代码语言:javascript
复制
// 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

代码语言:javascript
复制
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之后

这是我的测试代码:

代码语言:javascript
复制
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.');
    })
})

我不知道如何检查错误日志,也不知道是哪一行导致了这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-18 17:41:36

你有两个问题:

首先,你正在工作的单位是不正确的。你已经初始化了你的众卖,每寄出1000枚代币。来自齐柏林飞艇合同中的文件:

@param _rate令牌单位数目买方获得的每魏 @param _wallet地址,收到的资金将转发给 @param出售令牌的_token地址

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

其次,只有令牌所有者可以进行转移,除非首先进行了批准。当您部署令牌契约时,所有令牌都属于msg.sender。但是,当有人通过您的众包合同进行购买时,进行转移的请求来自众包合同的地址,而不是您的令牌合同部署时的令牌所有者。最简单的方法是在部署契约之后,将足够多的令牌从用于创建令牌契约的地址转移到众包契约的地址。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50397411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档