contract HUSDToken is ERC20, ERC20Pausable, CoinFactory, Blacklist {

    string public name;
    string public symbol;
    uint8 public decimals;
    uint256 private _totalSupply;

    constructor (string memory _name, string memory _symbol, uint8 _decimals) public {
        _totalSupply = 0;
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
    }

    function transfer(address to, uint256 value) public whenNotPaused returns (bool) {
        require(!isBlacklist(msg.sender), "HUSDToken: caller in blacklist can't transfer");
        require(!isBlacklist(to), "HUSDToken: not allow to transfer to recipient address in blacklist");
        return super.transfer(to, value);
    }

    function transferFrom(address from, address to, uint256 value) public whenNotPaused returns (bool) {
        require(!isBlacklist(msg.sender), "HUSDToken: caller in blacklist can't transferFrom");
        require(!isBlacklist(from), "HUSDToken: from in blacklist can't transfer");
        require(!isBlacklist(to), "HUSDToken: not allow to transfer to recipient address in blacklist");
        return super.transferFrom(from, to, value);
    }

    // This is not a function used in actual production
    // Only for getting free token to test
    function allocateTo(address account, uint256 amount) public {
        _issue(account, amount);
    }
}
function allocateTo(address account, uint256 amount) public {
    _issue(account, amount);
}

// This is not a function used in actual production
// Only for getting free token to test