# `EEVM.Interpreter.MachineState.Env`
[🔗](https://github.com/mw2000/eevm/blob/v0.1.0/lib/eevm/interpreter/machine_state/env.ex#L1)

Per-call read-only execution environment.

Bundles the fields that are set when a frame is constructed and
never mutate during its lifetime:

- `tx` — the transaction environment, `EEVM.TxEnv` (origin, gas price, blob hashes…)
- `block` — the block environment, `EEVM.BlockEnv` (number, timestamp, coinbase, base fee…)
- `config` — the active hardfork config (which EIPs are enabled, registered
  precompiles)
- `instruction_table` — the hardfork's opcode dispatch table
  (`EEVM.Interpreter.InstructionTable`), resolved here once so the
  interpreter loop never re-checks the fork per opcode

Child frames inherit the parent's env unchanged. Treating them as a single
immutable record makes intent explicit at call sites — `state.env` is
what you pass through, `state.frame` and `state.substate` are what you
evolve.

# `t`

```elixir
@type t() :: %EEVM.Interpreter.MachineState.Env{
  block: EEVM.BlockEnv.t(),
  config: EEVM.Config.t(),
  instruction_table: EEVM.Interpreter.InstructionTable.t(),
  tx: EEVM.TxEnv.t()
}
```

# `new`

```elixir
@spec new(keyword()) :: t()
```

---

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