contract AWG is ERC20Pausable, MinterRole, BurnerRole, Ownable, Feeless, IToken {

    /**
     * @dev Fired when a feeless transfer has been executed.
     */
    event TransferFeeless(address indexed account, uint256 indexed value);

    /**
     * @dev Fired when a feeless approve has been executed.
     */
    event ApproveFeeless(address indexed spender, uint256 indexed value);

    /**
     * @notice ERC20 convention.
     */
    uint8 public constant decimals = 18;

    /**
     * @notice ERC20 convention.
     */
    
    string public constant name = "AWG";
    
    /**
     * @notice ERC20 convention.
     */
    string public constant symbol = "AWG";

    /**
     * @dev See `MinterRole._addMinter`.
     */
    function addMinter(address account) external onlyOwner {
        _addMinter(account);
    }

    /**
     * @dev See `MinterRole._removeMinter`.
     */
    function removeMinter(address account) external onlyOwner {
        _removeMinter(account);
    }

    /**
     * @dev See `BurnerRole._addBurner`.
     */
    function addBurner(address account) external onlyOwner {
        _addBurner(account);
    }

    /**
     * @dev See `BurnerRole._removeBurner`.
     */
    function removeBurner(address account) external onlyOwner {
        _removeBurner(account);
    }

    /**
     * @notice The caller must have the `BurnerRole`.
     * @dev See `ERC20._burn`.
     */
    function burn(uint256 amount) external onlyBurner {
        _burn(msg.sender, amount);
    }

    /**
     * @notice The caller must have the `MinterRole`.
     * @dev See `ERC20._mint`.
     */
    function mint(address account, uint256 amount) external onlyMinter {
        _mint(account, amount);
    }

    /**
     * @notice Feeless ERC20 transfer.
     */
    function transferFeeless(address account, uint256 value) feeless whenNotPaused external {
        _transfer(msgSender, account, value);
        emit TransferFeeless(account, value);
    }

    /**
     * @notice Feeless ERC20 transfer.
     */
    function approveFeeless(address spender, uint256 value) feeless whenNotPaused external {
        _approve(msgSender, spender, value);
        emit ApproveFeeless(spender, value);
    }
    
}
/**
 * @title AWG Token
 * @notice ERC20 token implementation.
 * @dev Implements mintable, burnable and pausable token interfaces.
 */
function mint(address account, uint256 amount) external onlyMinter {
        _mint(account, amount);
    }
/**
 * @notice The caller must have the `MinterRole`.
 * @dev See `ERC20._mint`.
 */