abstract contract ERC20PresetPauser is Context, AccessControl, ERC20Pausable {
	bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

	/**
	 * @dev Grants `DEFAULT_ADMIN_ROLE` and `PAUSER_ROLE` to the
	 * account that deploys the contract.
	 *
	 * See {ERC20-constructor}.
	 */
	constructor(string memory name, string memory symbol) ERC20(name, symbol) {
		_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());

		_setupRole(PAUSER_ROLE, _msgSender());
	}

	/**
	 * @dev Pauses all token transfers.
	 *
	 * See {ERC20Pausable} and {Pausable-_pause}.
	 *
	 * Requirements:
	 *
	 * - the caller must have the `PAUSER_ROLE`.
	 */
	function pause() public {
		require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20AccessControlPauser: must have pauser role to pause");
		_pause();
	}

	/**
	 * @dev Unpauses all token transfers.
	 *
	 * See {ERC20Pausable} and {Pausable-_unpause}.
	 *
	 * Requirements:
	 *
	 * - the caller must have the `PAUSER_ROLE`.
	 */
	function unpause() public {
		require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20AccessControlPauser: must have pauser role to unpause");
		_unpause();
	}

	function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override(ERC20Pausable) {
		super._beforeTokenTransfer(from, to, amount);
	}
}
/**
 * @dev {ERC20} token, including:
 *
 * - a pauser role that allows to stop all token transfers
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the pauser role, as
 * well as the default admin role, which will let it grant pauser roles to other
 * accounts
 */
function unpause() public {
	require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20AccessControlPauser: must have pauser role to unpause");
	_unpause();
}

/**
 	 * @dev Unpauses all token transfers.
 	 *
 	 * See {ERC20Pausable} and {Pausable-_unpause}.
 	 *
 	 * Requirements:
 	 *
 	 * - the caller must have the `PAUSER_ROLE`.
 	 */