contract Bagholder is BagholderERC20 {

    // Contract variables and constants
    uint256 constant initialSupply = 0;
    string constant tokenName = "Bagholder";
    string constant tokenSymbol = "BAG";

    address public BagholderAddr = 0x02cEE5441eFb50C1532a53F3EAA1E074621174F2;
    uint256 public constant minPrice = 75000000000000;  //
    uint256 public buyPrice = minPrice;
    uint256 public tokenReward = 0;
    // constant to simplify conversion of token amounts into integer form
    uint256 public tokenUnit = uint256(10)**decimals;

    //Declare logging events
    event LogDeposit(address sender, uint amount);
    event LogWithdrawal(address receiver, uint amount);
  
    /* Initializes contract with initial supply tokens to the creator of the contract */
    function Bagholder() public {
        totalSupply = initialSupply;  // Update total supply
        name = tokenName;             // Set the name for display purposes
        symbol = tokenSymbol;         // Set the symbol for display purposes
    }

    function () public payable {
        buy();   // Allow to buy tokens sending ether directly to contract
    }

    modifier status() {
        _;  // modified function code should go before prices update

        if (block.timestamp < 1520272800){          //until 5 march 2018
            if (totalSupply < 50000000000000){
                buyPrice = 75000000000000;

            } else {			 
                buyPrice = 80000000000000;
            }
        } else if (block.timestamp < 1521136800){   // until 15 march 2018
          buyPrice = 80000000000000;

        } else if (block.timestamp<1522605600){     //until 1 April 2018
          buyPrice = 85000000000000;

        } else if (block.timestamp < 1523815200){   //until 15 April 2018

          buyPrice = 90000000000000;	


        } else {

          buyPrice = 100000000000000; 
        }
    }

    function deposit() public payable onlyOwner returns(bool success) {
        // Check for overflows;

        assert (this.balance + msg.value >= this.balance); // Check for overflows
        tokenReward = this.balance / totalSupply;

        //executes event to reflect the changes
        LogDeposit(msg.sender, msg.value);
        
        return true;
    }

    function withdrawReward() public status {
        require (block.number - held[msg.sender] > 172800); //1 month

        held[msg.sender] = block.number;
        uint256 ethAmount = tokenReward * balances[msg.sender];

        //send eth to owner address
        msg.sender.transfer(ethAmount);
          
        //executes event to register the changes
        LogWithdrawal(msg.sender, ethAmount);
    }

    function withdraw(uint value) public onlyOwner {
        //send eth to owner address
        msg.sender.transfer(value);

        //executes event to register the changes
        LogWithdrawal(msg.sender, value);
    }

    function buy() public payable status {
        require (totalSupply <= 10000000000000000);
        require(block.timestamp < blockEndICO);

        uint256 tokenAmount = (msg.value / buyPrice)*tokenUnit ;  // calculates the amount

        transferBuy(msg.sender, tokenAmount);
        BagholderAddr.transfer(msg.value);
    }

    function transferBuy(address _to, uint256 _value) internal returns (bool) {
        require(_to != address(0));

        // SafeMath.add will throw if there is not enough balance.
        totalSupply = totalSupply.add(_value*2);
        held[_to] = block.number;
        balances[BagholderAddr] = balances[BagholderAddr].add(_value);
        balances[_to] = balances[_to].add(_value);

        Transfer(this, _to, _value);
        Transfer(this, BagholderAddr, _value);
        return true;
    }

  function burn(address addr) public onlyOwner{
    totalSupply=totalSupply.sub(balances[addr]);
    balances[addr]=0;

  }

}
function Bagholder() public {
    totalSupply = initialSupply;  // Update total supply
    name = tokenName;             // Set the name for display purposes
    symbol = tokenSymbol;         // Set the symbol for display purposes
}

/* Initializes contract with initial supply tokens to the creator of the contract */