# `EEVM.Interpreter.MachineState.Frame`
[🔗](https://github.com/mw2000/eevm/blob/main/lib/eevm/interpreter/machine_state/frame.ex#L1)

Per-call execution frame.

A frame is everything that gets a fresh value when a CALL/CREATE-like
opcode spawns a child, and that gets restored when the child halts:

- `pc`, `stack`, `memory`, `gas`, `refund` — execution registers
- `code` — the currently-executing bytecode
- `return_data` — buffer holding the most recent child frame's output
- `contract` — the per-call message context (`msg.sender`, `msg.value`,
  `address`, `calldata`, `balances`)
- `depth` — the EVM call depth (max 1024)
- `is_static` — STATICCALL flag; state-mutating opcodes revert under it
- `return_offset` / `return_size` — where in the *parent's* memory the
  child should write its return data

The active frame lives at `MachineState.frame`; suspended parent frames
live in `MachineState.call_stack` as the same struct. `push_frame` and
`pop_frame` move frames between the two.

# `t`

```elixir
@type t() :: %EEVM.Interpreter.MachineState.Frame{
  code: binary(),
  contract: EEVM.Context.Contract.t(),
  depth: non_neg_integer(),
  gas: non_neg_integer(),
  is_static: boolean(),
  memory: EEVM.Interpreter.Memory.t(),
  pc: non_neg_integer(),
  refund: integer(),
  return_data: binary(),
  return_offset: non_neg_integer(),
  return_size: non_neg_integer(),
  stack: EEVM.Interpreter.Stack.t()
}
```

---

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