I deployed the following piece of contract on testnet and everything works fine.But, when I send test ETH for the contract address, transaction fails. I tried with higher gas as well but failed as well. Don't know what's wrong?

pragma solidity ^0.4.11;

//Here goes the StandardToken and Ownable contract code

contract LOLPreToken is StandardToken, Ownable {
    using SafeMath for uint256;

    // Token Info.
    string  public constant name = "PPP Token";
    string  public constant symbol = "PPP";
    uint8   public constant decimals = 18;

    // Sale period.
    uint256 public startDate;
    uint256 public endDate;

    // Token Cap for each rounds
    uint256 public saleCap;

    // Address where funds are collected.
    address public wallet;

    // Amount of raised money in wei.
    uint256 public weiRaised;

    // Loldex user ID
    mapping(address => bytes32) public lolpreUserIDs;

    // Event
    event TokenPurchase(address indexed purchaser, uint256 value,
                        uint256 amount);
    event PreICOTokenPushed(address indexed buyer, uint256 amount);
    event UserIDChanged(address owner, bytes32 user_id);

    // Modifiers
    modifier uninitialized() {
        require(wallet == 0x0);

    function LOLPreToken() {

    function initialize(address _wallet, uint256 _start, uint256 _end,
                        uint256 _saleCap, uint256 _totalSupply)
                        onlyOwner uninitialized {
        require(_start >= getCurrentTimestamp());
        require(_start < _end);
        require(_wallet != 0x0);
        require(_totalSupply > _saleCap);

        startDate = _start;
        endDate = _end;
        saleCap = _saleCap;
        wallet = _wallet;
        totalSupply = _totalSupply;

        balances[wallet] = _totalSupply.sub(saleCap);
        balances[0x1] = saleCap;

    function supply() internal returns (uint256) {
        return balances[0x1];

    function getCurrentTimestamp() internal returns (uint256) {
        return now;

    function getRateAt(uint256 at) constant returns (uint256) {
        if (at < startDate) {
            return 0;        
        } else {
            return 2800; //LOLP@ 0.05 at present ETH@140$

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

    // For pushing pre-ICO records
    function push(address buyer, uint256 amount) onlyOwner {
        require(balances[wallet] >= amount);

        uint256 actualRate = 2800;  // pre-ICO has also fixed rate of 2800
        uint256 weiAmount = amount.div(actualRate);
        uint256 updatedWeiRaised = weiRaised.add(weiAmount);

        // Transfer
        balances[wallet] = balances[wallet].sub(amount);
        balances[buyer] = balances[buyer].add(amount);
        PreICOTokenPushed(buyer, amount);

        // Update state.
        weiRaised = updatedWeiRaised;

    function buyTokens(address sender, uint256 value) internal {
        require(value >= 0.1 ether);

        uint256 weiAmount = value;
        uint256 updatedWeiRaised = weiRaised.add(weiAmount);

        // Calculate token amount to be purchased
        //uint256 actualRate = getRateAt(getCurrentTimestamp());
        //uint256 amount = weiAmount.mul(actualRate);
        uint256 amount = weiAmount.mul(2800);

        // We have enough token to sale
        require(supply() >= amount);

        // Transfer
        balances[0x1] = balances[0x1].sub(amount);
        balances[sender] = balances[sender].add(amount);
        TokenPurchase(sender, weiAmount, amount);

        // Update state.
        weiRaised = updatedWeiRaised;

        // Forward the fund to fund collection wallet.

    function finalize() onlyOwner {

        // Transfer the rest of token to LOLdex
        balances[wallet] = balances[wallet].add(balances[0x1]);
        balances[0x1] = 0;

    function saleActive() public constant returns (bool) {
        return (getCurrentTimestamp() >= startDate &&
                getCurrentTimestamp() < endDate && supply() > 0);

    function setUserID(bytes32 user_id) {
        lolpreUserIDs[msg.sender] = user_id;
        UserIDChanged(msg.sender, user_id);
  • How do you send the test ETH to the contract? This might help to figure out how you are doing it and if there is the mistake. – Donut Mar 22 '19 at 10:46
  • I use Metamask Ropsten test net – LexyGreen Mar 22 '19 at 11:01
  • Could you link to the failed transaction? It's hard to just guess at the issue... perhaps you sent less than 0.1 ETH, perhaps the sale isn't active or the supply is 0, perhaps the token balance of the address 0x1 is insufficient to cover the purchase, perhaps the wallet is refusing the payment... – user19510 Mar 22 '19 at 14:37
  • My total supply is 3m and sale cape is 2m. When I check address 0x1 (0x0000000000000000000000000000000000000001) It has balance 2m. But, I am not sure why they put 0x1 address there, what does it mean? – LexyGreen Mar 22 '19 at 21:49
  • I did some debugging and it turns out I was putting total_supply and sale_cap in millions(2000000) not in wei. Now it works. But, still I am not sure about the address 0x1, why that address is used? – LexyGreen Mar 23 '19 at 0:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.