# `EEVM.Handler.Validation`
[🔗](https://github.com/mw2000/eevm/blob/main/lib/eevm/handler/validation.ex#L1)

Pre-flight checks on a wire transaction.

This phase handles steps 1-3 of the transaction pipeline (Yellow Paper §6):

1. **Decode** the wire bytes (or accept an already-decoded typed struct).
2. **Recover sender** via secp256k1 ecrecover on the typed signing hash.
3. **Validate** intrinsic gas, nonce, balance, EOA sender, EIP-1559 fee
   constraints, blob/initcode size rules.

Outputs `{:ok, %EEVM.Context.Transaction{}}` ready for the next phase, or
`{:error, reason}` for any failure.

# `decoded_tx`

```elixir
@type decoded_tx() ::
  EEVM.Transaction.Legacy.t()
  | EEVM.Transaction.AccessList.t()
  | EEVM.Transaction.FeeMarket.t()
  | EEVM.Transaction.Blob.t()
  | EEVM.Transaction.SetCode.t()
```

# `wire_tx`

```elixir
@type wire_tx() :: decoded_tx() | binary()
```

# `build_tx_context`

```elixir
@spec build_tx_context(decoded_tx(), binary()) :: {:ok, EEVM.Context.Transaction.t()}
```

Build the `EEVM.Context.Transaction` the EVM sees from a decoded transaction.

# `decode_address`

```elixir
@spec decode_address(binary()) :: non_neg_integer()
```

Convert a 20-byte address to its integer form.

# `ensure_decoded`

```elixir
@spec ensure_decoded(wire_tx()) :: {:ok, decoded_tx()} | {:error, atom()}
```

Decode wire bytes into a typed transaction struct, or pass a struct through.

# `recover_sender`

```elixir
@spec recover_sender(decoded_tx(), non_neg_integer()) ::
  {:ok, binary()} | {:error, atom()}
```

Recover the 20-byte sender address; see `EEVM.Transaction.Signer.recover_sender/2`.

# `resolve_config`

```elixir
@spec resolve_config(keyword()) :: EEVM.Config.t()
```

Use `opts[:config]` if given, else build one from `opts[:hardfork]` (default `:cancun`).

# `validate`

```elixir
@spec validate(
  EEVM.Context.Transaction.t(),
  EEVM.Database.t(),
  EEVM.Context.Block.t(),
  EEVM.HardforkConfig.t()
) :: :ok | {:error, atom()}
```

Validate the transaction against state; see `EEVM.Transaction.Validator.validate/4`.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
