code: func (jst *Tracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *vm.Stack, contract *vm.Contract, depth int, err error) error {
  	if jst.err == nil {
  		// Initialize the context if it wasn't done yet
  		if !jst.inited {
  			jst.ctx["block"] = env.BlockNumber.Uint64()
  			jst.inited = true
  		}
  		// If tracing was interrupted, set the error and stop
  		if atomic.LoadUint32(&jst.interrupt) > 0 {
  			jst.err = jst.reason
  			return nil
  		}
  		jst.opWrapper.op = op
  		jst.stackWrapper.stack = stack
  		jst.memoryWrapper.memory = memory
  		jst.contractWrapper.contract = contract
  		jst.dbWrapper.db = env.StateDB
  
  		*jst.pcValue = uint(pc)
  		*jst.gasValue = uint(gas)
  		*jst.costValue = uint(cost)
  		*jst.depthValue = uint(depth)
  		*jst.refundValue = uint(env.StateDB.GetRefund())
  
  		jst.errorValue = nil
  		if err != nil {
  			jst.errorValue = new(string)
  			*jst.errorValue = err.Error()
  		}
  		_, err := jst.call("step", "log", "db")
  		if err != nil {
  			jst.err = wrapError("step", err)
  		}
  	}
  	return nil
  }
docs: // CaptureState implements the Tracer interface to trace a single step of VM execution.