簡體   English   中英

Openzepplin眾包合同獲得:處理事務時VM異常:恢復錯誤

[英]Openzepplin crowdsale contract got: VM Exception while processing transaction: revert error

我正在開發基於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出現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.');
    })
})

我不知道如何檢查錯誤日志以及不知道哪一行會導致此問題。

您有2個問題:

首先,您正在使用的單位不正確。 您已經初始化了眾籌活動,以每發送一次Wei出售1000個代幣。 從Zeppelin合同中的文檔中:

@param _rate買家每魏獲得的令牌單位數

@param _wallet將收集的資金轉發到的地址

@param _token所出售代幣的地址

您在交易中傳遞了1個以太幣,這意味着您試圖購買1000 *(10 ^ 18)令牌單位,但您只分配了總供應量3600萬。 您需要增加總供應量和/或降低費率。

其次,除非先完成批准,否則只有令牌所有者才能進行轉讓。 部署令牌合同時,所有令牌均由msg.sender擁有。 但是,當某人通過您的眾包合同進行購買時,進行轉賬的請求來自眾包合同的地址,而不是部署您的代幣合同時的代幣所有者。 解決此問題的最簡單方法是在部署合同之后,將用於眾籌的足夠的令牌從您用於創建令牌合同的地址轉移到眾籌合同的地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM