# `EEVM.Tracer.TraceStep`
[🔗](https://github.com/mw2000/eevm/blob/v0.1.0/lib/eevm/tracer.ex#L49)

A single recorded step: one opcode execution in the trace. Every field
except `error` describes the machine *before* the opcode runs.

| Field | Description |
|-------|-------------|
| `pc` | Program counter of the opcode in its frame's code |
| `op` | Opcode name as an atom, such as `:SSTORE`; `:UNKNOWN` for an undefined byte |
| `op_byte` | The opcode byte |
| `gas_remaining` | Gas left in the frame |
| `gas_cost` | The gas the opcode charged, static and dynamic, as geth's `gasCost` reports it: a CALL counts the gas it forwards, a CREATE does not (see "Gas cost" in `EEVM.Tracer`) |
| `stack` | The stack, **top first** (`to_json/1` writes it bottom first, as EIP-3155 does) |
| `memory_size` | Memory size in bytes |
| `depth` | Call depth, 0 for the top-level frame (`to_json/1` writes it 1-based, as EIP-3155 does) |
| `refund` | The gas refund counter |
| `return_data` | The return-data buffer: the output of the frame's last sub-call |
| `error` | The halt reason (an `t:EEVM.Error.halt_reason/0`) when this opcode halted the frame, else `nil` |

# `t`

```elixir
@type t() :: %EEVM.Tracer.TraceStep{
  depth: non_neg_integer(),
  error: atom() | nil,
  gas_cost: non_neg_integer(),
  gas_remaining: non_neg_integer(),
  memory_size: non_neg_integer(),
  op: atom(),
  op_byte: non_neg_integer(),
  pc: non_neg_integer(),
  refund: integer(),
  return_data: binary(),
  stack: [non_neg_integer()]
}
```

---

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