## Prefer custom errors over revert strings

**Severity**: `Gas`
**ID**: `custom-errors`

Flags `require(cond)`, `require(cond, "message")`, `revert("message")`, and `revert()` calls;
suggests replacing them with a `revert CustomError(...)`.

### What it does

Reports `require` calls with no reason or whose second argument is a string literal, and
`revert(...)` calls that are either bare or have a string-literal argument.

### Why is this bad?

Custom errors:

* cost less gas than encoding/decoding a string,
* can carry typed parameters for richer diagnostics,
* shrink contract bytecode (string constants live in code).

Solidity 0.8.4+ supports custom errors natively.

### Example

#### Bad

```solidity
require(amount > 0, "amount must be > 0");
require(amount > 0);
revert("not authorized");
revert();
```

#### Good

```solidity
error AmountZero();
error NotAuthorized();

if (amount == 0) revert AmountZero();
if (!authorized) revert NotAuthorized();
```

### Notes

This is a `Gas`-severity lint and is **not** applied to test or script files.
