contract AGREToken is TradeableToken, MintableToken, HasNoContracts, HasNoTokens { //MintableToken is StandardToken, Ownable
    string public symbol = "AGRE";
    string public name = "Aggregate Coin";
    uint8 public constant decimals = 18;

    address public founder;    //founder address to allow him transfer tokens while minting
    function init(address _founder, uint32 _buyFeeMilliPercent, uint32 _sellFeeMilliPercent, uint256 _minBuyAmount, uint256 _minSellAmount) onlyOwner public {
        founder = _founder;
        setBuyFee(_buyFeeMilliPercent);
        setSellFee(_sellFeeMilliPercent);
        setMinBuyAmount(_minBuyAmount);
        setMinSellAmount(_minSellAmount);
    }

    /**
     * Allow transfer only after crowdsale finished
     */
    modifier canTransfer() {
        require(mintingFinished || msg.sender == founder);
        _;
    }
    
    function transfer(address _to, uint256 _value) canTransfer public returns(bool) {
        return super.transfer(_to, _value);
    }

    function transferFrom(address _from, address _to, uint256 _value) canTransfer public returns(bool) {
        return super.transferFrom(_from, _to, _value);
    }
}
function init(address _founder, uint32 _buyFeeMilliPercent, uint32 _sellFeeMilliPercent, uint256 _minBuyAmount, uint256 _minSellAmount) onlyOwner public {
    founder = _founder;
    setBuyFee(_buyFeeMilliPercent);
    setSellFee(_sellFeeMilliPercent);
    setMinBuyAmount(_minBuyAmount);
    setMinSellAmount(_minSellAmount);
}

//founder address to allow him transfer tokens while minting