contract ICEToken is StandardToken, SafeMath {

    string public constant name = "IDICE";
    string public constant symbol = "ICE";
    uint256 public constant decimals = 18;
    string public version = "1.0";

    address public ethFundDeposit;
    address public iceFundDeposit;

    bool public isFinalized;
    uint256 public fundingStartBlock;
    uint256 public fundingEndBlock;
    uint256 public constant iceFund = 500 * (10**3) * 10**decimals;

    function tokenRate() constant returns(uint) {
        if (block.number>=fundingStartBlock && block.number<fundingStartBlock+252) return 200;
        if (block.number>=fundingStartBlock && block.number<fundingStartBlock+36878) return 170; // first week
        return 130;
    }

    uint256 public constant tokenCreationCap =  5 * (10**6) * 10**decimals; /// 5M Tokens maximum


    // events
    event CreateICE(address indexed _to, uint256 _value);

    // constructor
    function ICEToken(
        address _ethFundDeposit,
        address _iceFundDeposit,
        uint256 _fundingStartBlock,
        uint256 _fundingEndBlock)
    {
      isFinalized = false;
      ethFundDeposit = _ethFundDeposit;
      iceFundDeposit = _iceFundDeposit;
      fundingStartBlock = _fundingStartBlock;
      fundingEndBlock = _fundingEndBlock;
      totalSupply = iceFund;
      balances[iceFundDeposit] = iceFund;
      CreateICE(iceFundDeposit, iceFund);
    }


    function makeTokens() payable  {
      if (isFinalized) throw;
      if (block.number < fundingStartBlock) throw;
      if (block.number > fundingEndBlock) throw;
      if (msg.value == 0) throw;

      uint256 tokens = safeMult(msg.value, tokenRate());

      uint256 checkedSupply = safeAdd(totalSupply, tokens);

      if (tokenCreationCap < checkedSupply) throw;

      totalSupply = checkedSupply;
      balances[msg.sender] += tokens;
      CreateICE(msg.sender, tokens);
    }

    function() payable {
        makeTokens();
    }

    function finalize() external {
      if (isFinalized) throw;
      if (msg.sender != ethFundDeposit) throw;

      if(block.number <= fundingEndBlock && totalSupply != tokenCreationCap) throw;

      isFinalized = true;
      if(!ethFundDeposit.send(this.balance)) throw;
    }



}
function ICEToken(
    address _ethFundDeposit,
    address _iceFundDeposit,
    uint256 _fundingStartBlock,
    uint256 _fundingEndBlock)
{
  isFinalized = false;
  ethFundDeposit = _ethFundDeposit;
  iceFundDeposit = _iceFundDeposit;
  fundingStartBlock = _fundingStartBlock;
  fundingEndBlock = _fundingEndBlock;
  totalSupply = iceFund;
  balances[iceFundDeposit] = iceFund;
  CreateICE(iceFundDeposit, iceFund);
}

// constructor