abstract contract FeeToken is Controller {
    using DSMath for uint256;

    uint256 private constant TX_FEE = 0.0025 ether;

    mapping(address => bool) public feeless;

    constructor() public Controller() {
        feeless[owner()] = true;
    }

    function _consumeFee(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (uint256 output) {
        output = amount;
        if (!feeless[recipient]) {
            uint256 fee = output.wmul(TX_FEE);
            output -= fee;
            _transferFee(sender, fee);
        }
    }

    function setFeeless(address account, bool isFeeless)
        external
        onlyOperator()
    {
        feeless[account] = isFeeless;
    }

    function _transferFee(address from, uint256 amount) internal virtual;

    // Utility Pure Functions

    function getAmountPlusFee(uint256 amount) external pure returns (uint256) {
        return amount.wdiv(1 ether - TX_FEE) * 100;
    }

    function getTransactionFee(uint256 amount) external pure returns (uint256) {
        return amount.wmul(TX_FEE);
    }
}
function getAmountPlusFee(uint256 amount) external pure returns (uint256) {
    return amount.wdiv(1 ether - TX_FEE) * 100;
}

// Utility Pure Functions