0

I'm building a crowdsale smart contract And I am using ropsen tesnet with remix.

My token address of this crowdsale is "0x6f734b9a097f17bc4c1f4348801587ce5e0177e2"

Every thing is OK,and I can call most of functions.Such as setStart,setEnd,hasEnded and so on.But when I called function buyTokens I got this error from remix:

transact to FastInvestTokenCrowdsale.buyTokens errored: Gas required exceeds limit: 300000. An important gas estimation might also be the sign of a problem in the contract code. Please check loops and be sure you did not sent value to a non payable function (that's also the reason of strong gas estimation).

Here is my crowdsale's coding:

/**
 *  Crowdsale for Fast Invest Tokens.
 *  Raised Ether will be stored safely at the wallet.
 *
 *  Based on OpenZeppelin framework.
 *  https://openzeppelin.org
 *
 *  Author: Paulius Tumosa
 **/

pragma solidity ^0.4.18;

/**
 * Safe Math library from OpenZeppelin framework
 * https://openzeppelin.org
 *
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        assert(c / a == b);
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }
}

contract token {
    function transferFrom(address from, address to, uint256 value) public returns (bool);
}

/**
 * @title FastInvestTokenCrowdsale
 *
 * Crowdsale have a start and end timestamps, where investors can make
 * token purchases and the crowdsale will assign them tokens based
 * on a token per ETH rate. Funds collected are forwarded to a wallet
 * as they arrive.
 */
contract FastInvestTokenCrowdsale {
    using SafeMath for uint256;

    address public owner;

    // The token being sold
    token public tokenReward;

    // Tokens will be transfered from this address
    address internal tokenOwner;

    // Address where funds are collected
    address internal wallet;

    // Start and end timestamps where investments are allowed
    uint256 public startTime;
    uint256 public endTime;

    // Amount of tokens sold
    uint256 public tokensSold = 0;

    // Amount of raised money in wei
    uint256 public weiRaised = 0;

    // Funding goal and soft cap
    uint256 constant public SOFT_CAP        = 38850000000000000000000000;
    uint256 constant public FUNDING_GOAL    = 388500000000000000000000000;

    // Tokens per ETH rates before and after the soft cap is reached
    uint256 constant public RATE = 1000;
    uint256 constant public RATE_SOFT = 1200;

    // The balances in ETH of all investors
    mapping (address => uint256) public balanceOf;

    /**
     * Event for token purchase logging
     *
     * @param purchaser who paid for the tokens
     * @param beneficiary who got the tokens
     * @param value weis paid for purchase
     * @param amount amount of tokens purchased
     */
    event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    function FastInvestTokenCrowdsale(address _tokenAddress, address _wallet, uint256 _start, uint256 _end) public {
        require(_tokenAddress != address(0));
        require(_wallet != address(0));

        owner = msg.sender;
        tokenOwner = msg.sender;
        wallet = _wallet;

        tokenReward = token(_tokenAddress);

        require(_start < _end);
        startTime = _start;
        endTime = _end;

    }

    // Fallback function can be used to buy tokens
    function () external payable {
        buyTokens(msg.sender);
    }

    // Low level token purchase function
    function buyTokens(address beneficiary) public payable {
        require(beneficiary != 0x0);
        require(validPurchase());

        uint256 weiAmount = msg.value;
        uint256 tokens = 0;

        // Calculate token amount
        if (tokensSold < SOFT_CAP) {
            tokens = weiAmount.mul(RATE_SOFT);

            if (tokensSold.add(tokens) > SOFT_CAP) {
                uint256 softTokens = SOFT_CAP.sub(tokensSold);
                uint256 amountLeft = weiAmount.sub(softTokens.div(RATE_SOFT));

                tokens = softTokens.add(amountLeft.mul(RATE));
            }

        } else  {
            tokens = weiAmount.mul(RATE);
        }

        require(tokens > 0);
        require(tokensSold.add(tokens) <= FUNDING_GOAL);

        forwardFunds();
        assert(tokenReward.transferFrom(tokenOwner, beneficiary, tokens));

        balanceOf[beneficiary] = balanceOf[beneficiary].add(weiAmount);

        // Update totals
        weiRaised  = weiRaised.add(weiAmount);
        tokensSold = tokensSold.add(tokens);

        TokenPurchase(msg.sender, beneficiary, weiAmount, tokens);
    }

    // Send ether to the fund collection wallet
    function forwardFunds() internal {
        wallet.transfer(msg.value);
    }

    // @return true if the transaction can buy tokens
    function validPurchase() internal view returns (bool) {
        bool withinPeriod = now >= startTime && now <= endTime;
        bool nonZeroPurchase = msg.value != 0;
        bool hasTokens = tokensSold < FUNDING_GOAL;

        return withinPeriod && nonZeroPurchase && hasTokens;
    }

    function setStart(uint256 _start) public onlyOwner {
        startTime = _start;
    }

    function setEnd(uint256 _end) public onlyOwner {
        require(startTime < _end);
        endTime = _end;
    }

    // @return true if crowdsale event has ended
    function hasEnded() public view returns (bool) {
        return now > endTime;
    }

}

I would appreciate it if someone could point me in the right direction.

It seems like that I will be always "Gas required exceeds limit" whatever the limit I set:

transact to FastInvestTokenCrowdsale.buyTokens errored: Gas required exceeds limit: 300000. An important gas estimation might also be the sign of a problem in the contract code. Please check loops and be sure you did not sent value to a non payable function (that's also the reason of strong gas estimation). transact to FastInvestTokenCrowdsale.buyTokens pending ... transact to FastInvestTokenCrowdsale.buyTokens errored: Gas required exceeds block gas limit: 3000000000000. An important gas estimation might also be the sign of a problem in the contract code. Please check loops and be sure you did not sent value to a non payable function (that's also the reason of strong gas estimation). transact to FastInvestTokenCrowdsale.buyTokens pending ... transact to FastInvestTokenCrowdsale.buyTokens errored: Gas required exceeds block gas limit: 3000000000000. An important gas estimation might also be the sign of a problem in the contract code. Please check loops and be sure you did not sent value to a non payable function (that's also the reason of strong gas estimation). transact to FastInvestTokenCrowdsale.buyTokens pending ... transact to FastInvestTokenCrowdsale.buyTokens errored: Gas required exceeds block gas limit: 300000000000000000000000000000000. An important gas estimation might also be the sign of a problem in the contract code. Please check loops and be sure you did not sent value to a non payable function (that's also the reason of strong gas estimation). transact to FastInvestTokenCrowdsale.buyTokens pending ... transact to FastInvestTokenCrowdsale.buyTokens errored: Gas required exceeds block gas limit: 300000000000000000000000000000000. An important gas estimation might also be the sign of a problem in the contract code. Please check loops and be sure you did not sent value to a non payable function (that's also the reason of strong gas estimation). transact to FastInvestTokenCrowdsale.buyTokens pending ... transact to FastInvestTokenCrowdsale.buyTokens errored: Gas required exceeds block gas limit: 30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000. An important gas estimation might also be the sign of a problem in the contract code. Please check loops and be sure you did not sent value to a non payable function (that's also the reason of strong gas estimation). transact to FastInvestTokenCrowdsale.buyTokens pending ... transact to FastInvestTokenCrowdsale.buyTokens errored: Gas required exceeds block gas limit: 30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000. An important gas estimation might also be the sign of a problem in the contract code. Please check loops and be sure you did not sent value to a non payable function (that's also the reason of strong gas estimation). transact to FastInvestTokenCrowdsale.buyTokens pending ... transact to FastInvestTokenCrowdsale.buyTokens errored: Gas required exceeds block gas limit: 30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000. An important gas estimation might also be the sign of a problem in the contract code. Please check loops and be sure you did not sent value to a non payable function (that's also the reason of strong gas estimation). transact to FastInvestTokenCrowdsale.buyTokens pending ... transact to FastInvestTokenCrowdsale.buyTokens errored: Gas required exceeds block gas limit: 30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000. An important gas estimation might also be the sign of a problem in the contract code. Please check loops and be sure you did not sent value to a non payable function (that's also the reason of strong gas estimation). transact to FastInvestTokenCrowdsale.buyTokens pending ... transact to FastInvestTokenCrowdsale.buyTokens errored: Gas required exceeds limit: 10. An important gas estimation might also be the sign of a problem in the contract code. Please check loops and be sure you did not sent value to a non payable function (that's also the reason of strong gas estimation). transact to FastInvestTokenCrowdsale.buyTokens pending ... transact to FastInvestTokenCrowdsale.buyTokens errored: Gas required exceeds limit: 1. An important gas estimation might also be the sign of a problem in the contract code. Please check loops and be sure you did not sent value to a non payable function (that's also the reason of strong gas estimation).

  • The `buyTokens` method seems to be ok in the Remix VM. Can you confirm the gas limit you are using? The title says 300,000,000 but the error message in your post says 300,000. Also, are you using a local provider or MetaMask? If you're using MetaMask, did you double check the gas limit in the plugin before approving the transaction (it will be different than the value in the Remix UI)? – Adam Kipnis Feb 14 '18 at 17:28
  • thanks for your comment.I wrote my title wrong and I've modified it.And could you tell me where I can set gas limit in the plugin?I can just set gas limit in the remix UI and I can't find in plugin.I'm new in smart contract,Thanks a lot – vincent wang Feb 15 '18 at 03:17
  • If you’re using MetaMask, it’ll be in the browser plugin UI when you approve the transaction. The value you enter in the Remix UI is only used when the environment is set to JavaScript VM. If you’re not familiar with the different Remix environments, see this: https://stackoverflow.com/a/48370298/8474917 – Adam Kipnis Feb 15 '18 at 03:26
  • thanks your reply again.But I eccount this error when I just enter the "buyTokens" button and I have no change to get one pluginUI :( – vincent wang Feb 15 '18 at 04:02

0 Answers0