contract MainContract is BaseContract, ContractConstants, Pausable{

    bool private isRealized;

    /**
     * @dev Constructor 
     */
    constructor () public {
      init();
    }

    /**
     * @return get token name
     */
    function name() public pure returns (string memory _name){
      return TOKEN_NAME;
    }

    /**
     * @return get token symbol
     */
    function symbol() public pure returns (string memory _symbol){
      return TOKEN_SYMBOL;
    }

    /**
     * @return get token decimals 
     */
    function decimals() public pure returns (uint _decimals){
      return TOKEN_DECIMALS; 
    }

    /**
     * @dev Ovveride base method transferFrom
     */
    function transferFrom(address _from, address _to, uint256 value) public whenNotPaused returns (bool _success){
       membersCount  = membersCount.add(1);
       return super.transferFrom(_from, _to, value);
    }  

    /**
     * @dev Override base method transfer
     */
    function transfer(address _to, uint256 value) public whenNotPaused returns (bool _success){
      membersCount  = membersCount.add(1);
      return super.transfer(_to, value);
    }

    /**
     * @dev Function whose calling on initialize contract
     */
    function init() private {
        if(PAUSED){
          pause();
        }
        setPrices(TOKEN_SELL_PRICE, TOKEN_BUY_PRICE);
        setPricesDecimals(TOKEN_SELL_PRICE_DECIMALS, TOKEN_BUY_PRICE_DECIMAL);
        addRound('ROUND_1', 'ROUND_1', 30000000 * uint256(TOKEN_DECIMALS_MULTIPLIER), 1577743200000, true);
        if (msg.sender == TOKEN_OWNER){
          mint(TOKEN_OWNER, TOKEN_TOTAL_SUPPLY * uint256(TOKEN_DECIMALS_MULTIPLIER)); 
          isRealized = true;         
        }
        transferOwnership(TOKEN_OWNER);
    }

    /**
     * @dev Release tokens by ovner
     */
    function releaseTokens() public onlyOwner returns(bool){
        require(!isRealized);
        mint(TOKEN_OWNER, TOKEN_TOTAL_SUPPLY * uint256(TOKEN_DECIMALS_MULTIPLIER));
    }

    function () external payable {
        checkRound();
        buy(msg.sender, msg.value);
    }

}
/**
 * @title MainContract
 * @dev Base contract which using for initializing new contaract
 */
function symbol() public pure returns (string memory _symbol){
  return TOKEN_SYMBOL;
}

/**
 * @return get token symbol
 */