I write Crowdsale using this example. But I can't send a transaction, my test fails with an error:
Contract: Crowdsale should accept payments after start:
AssertionError: expected promise to be fulfilled but it was rejected with 'Error: VM Exception while processing the transaction: revert'
I tried to set gas price to the transaction like this crowdsale.sendTransaction({value, from: buyer, gas: 4712388})
but it doesn't help me.
My Crowdsale:
pragma solidity ^0.4.16;
interface token {
function transfer(address receiver, uint amount) external;
}
contract Crowdsale {
address public beneficiary;
uint public fundingGoal;
uint public amountRaised;
uint public deadline;
uint public price;
token public tokenReward;
mapping(address => uint256) public balanceOf;
event FundTransfer(address backer, uint amount, bool isContribution);
function Crowdsale(
address ifSuccessfulSendTo,
uint fundingGoalInEthers,
uint durationInMinutes,
uint etherCostOfEachToken,
address addressOfTokenUsedAsReward
) public {
beneficiary = ifSuccessfulSendTo;
fundingGoal = fundingGoalInEthers * 1 ether;
deadline = now + durationInMinutes * 1 minutes;
price = etherCostOfEachToken * 1 ether;
tokenReward = token(addressOfTokenUsedAsReward);
}
function () public payable {
uint amount = msg.value;
balanceOf[msg.sender] += amount;
amountRaised += amount;
tokenReward.transfer(msg.sender, amount / price);
FundTransfer(msg.sender, amount, true);
}
}
My tests (I use these tests as an example):
// You can find all those helpers here: https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/test/helpers
import ether from '../helpers/ether';
import { advanceBlock } from '../helpers/advanceToBlock';
import { increaseTimeTo, duration } from '../helpers/increaseTime';
import latestTime from '../helpers/latestTime';
const BigNumber = web3.BigNumber;
const should = require('chai')
.use(require('chai-as-promised'))
.use(require('chai-bignumber')(BigNumber))
.should();
const Crowdsale = artifacts.require('Crowdsale');
const Coin = artifacts.require('Coin');
contract('Crowdsale', accounts => {
let startTime;
let crowdsale;
let token;
const value = ether(8);
const buyer = accounts[1];
const tokenReward = accounts[2];
const beneficiary = accounts[2];
before(async () => {
// Advance to the next block to correctly read time in the solidity "now" function interpreted by testrpc
await advanceBlock();
});
beforeEach(async () => {
token = await Coin.new();
// Transfer an amount to address of token used as reward
const tokenRewardAmount = 1000000;
token.transfer(tokenReward, tokenRewardAmount);
startTime = latestTime() + duration.minutes(1);
crowdsale = await Crowdsale.new(beneficiary, 200, 30, 1, tokenReward);
});
it('should accept payments after start', async () => {
await increaseTimeTo(startTime);
await crowdsale.sendTransaction({value, from: buyer, gas: 4712388}).should.be.fulfilled;
});
});
My Coin:
pragma solidity ^0.4.19;
import 'zeppelin-solidity/contracts/token/ERC20/MintableToken.sol';
contract Coin is MintableToken {
uint8 public decimals = 0;
uint public initialSupply = 1000000 * 10 ** uint(decimals); // 1,000,000;
string public name = "My Coin";
string public symbol = "XMY";
function Coin() public {
totalSupply_ = initialSupply;
balances[msg.sender] = totalSupply_;
}
}
I am developing a “bookmaker” where a crowdsale represents an event. It means I will create dozens of crowdsales and I can't use Zeppelin's crowdsale since it mint a token. So, is there any other ways to create a crowdsale without minting tokens? I think there should be other ways since the example from Ethereum's webpage works without minting but because of some reason, it doesn't work for me. Where is my mistake? How can I solve the problem?
AssertionError: expected promise to be fulfilled but it was rejected with 'Error: VM Exception while processing transaction: revert'
. Then I changedto: crowdsale
toto: crowdsale.address
and it also fails. – Asleep